From c920cca3d298298204c3091c32e7762f8b66b28f Mon Sep 17 00:00:00 2001 From: Christian Tacke <58549698+ChristianTackeGSI@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:47:27 +0200 Subject: [PATCH 1/2] refactor(Base): Move FairModule::fAllSensitiveVolumes to FairRunSim Instead of using a thread local, let's use something that is tied to the "simulaion session" (as noted in some places). FairRunSim has all the Modules anyway, so let it also have the list of sensitive Volumes. --- fairroot/base/sim/FairDetector.cxx | 3 ++- fairroot/base/sim/FairMCApplication.cxx | 2 +- fairroot/base/sim/FairModule.cxx | 6 +++--- fairroot/base/sim/FairModule.h | 16 +++++++++++----- fairroot/base/steer/FairRunSim.h | 16 ++++++++++++++++ 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/fairroot/base/sim/FairDetector.cxx b/fairroot/base/sim/FairDetector.cxx index e8642ca45d..b4444d9806 100644 --- a/fairroot/base/sim/FairDetector.cxx +++ b/fairroot/base/sim/FairDetector.cxx @@ -14,6 +14,7 @@ #include "FairGeoNode.h" // for FairGeoNode #include "FairRootManager.h" +#include "FairRunSim.h" #include "FairVolume.h" // for FairVolume #include // for TFolder @@ -97,7 +98,7 @@ void FairDetector::Initialize() FairGeoNode* fN; TString cutName; TString copysign = "#"; - for (auto aVol : fAllSensitiveVolumes) { + for (auto aVol : GetRunSim().RangeAllSensitiveVolumes()) { cutName = aVol->GetName(); Ssiz_t pos = cutName.Index(copysign, 1); if (pos > 1) { diff --git a/fairroot/base/sim/FairMCApplication.cxx b/fairroot/base/sim/FairMCApplication.cxx index c453d2aaef..535a1c2bdb 100644 --- a/fairroot/base/sim/FairMCApplication.cxx +++ b/fairroot/base/sim/FairMCApplication.cxx @@ -880,7 +880,7 @@ void FairMCApplication::InitGeometry() fMCEventHeader->SetRunID(runId); // Fill sensitive volumes in fVolMap - for (auto fv : FairModule::fAllSensitiveVolumes) { + for (auto fv : fRun->RangeAllSensitiveVolumes()) { if (!fv) { continue; } diff --git a/fairroot/base/sim/FairModule.cxx b/fairroot/base/sim/FairModule.cxx index 190db6d375..0bc289f11f 100644 --- a/fairroot/base/sim/FairModule.cxx +++ b/fairroot/base/sim/FairModule.cxx @@ -52,8 +52,6 @@ #include #include // for std::ignore -thread_local std::vector FairModule::fAllSensitiveVolumes; - void FairModule::ConstructGeometry() { LOG(warn) @@ -216,9 +214,10 @@ void FairModule::SetGeometryFileName(TString fname, TString) void FairModule::RegisterSensitiveVolume(FairVolume& vol) { + assert(fRunSim); vol.setModId(fModId); vol.SetModule(this); - fAllSensitiveVolumes.push_back(&vol); + fRunSim->RegisterSensitiveVolume(vol); ++fNbOfSensitiveVol; } @@ -277,6 +276,7 @@ void FairModule::ProcessNodes(TList* nodes) void FairModule::AddSensitiveVolume(TGeoVolume* vol) { + assert(vol); auto volName = vol->GetName(); LOG(debug2) << "AddSensitiveVolume " << volName; diff --git a/fairroot/base/sim/FairModule.h b/fairroot/base/sim/FairModule.h index 0292f38545..3d08940fda 100644 --- a/fairroot/base/sim/FairModule.h +++ b/fairroot/base/sim/FairModule.h @@ -23,9 +23,9 @@ #include // for TList (ptr only), TListIter #include // for TNamed #include // for TObjArray -#include // for TRefArray #include // for TString, operator!= #include +#include #include #include #include @@ -144,10 +144,6 @@ class FairModule : public TNamed static thread_local inline FairVolumeList* vList{nullptr}; //! /**total number of volumes in a simulaion session*/ static thread_local inline Int_t fNbOfVolumes{0}; //! - /** - * For internal use only: list of all sensitive volumes in a simulaion session - */ - static thread_local std::vector fAllSensitiveVolumes; //! TString fMotherVolumeName{""}; //! /** @@ -195,6 +191,16 @@ class FairModule : public TNamed */ FairRootManager& GetRootManager(); + /** + * \brief Get RunSim of this Module + * \note Only valid after being added to a RunSim + */ + FairRunSim& GetRunSim() + { + assert(fRunSim); + return *fRunSim; + } + /** * \brief Get Geometry Loader * \note Only valid during ConstructGeometry diff --git a/fairroot/base/steer/FairRunSim.h b/fairroot/base/steer/FairRunSim.h index df28518edb..6bd0ddfa38 100644 --- a/fairroot/base/steer/FairRunSim.h +++ b/fairroot/base/steer/FairRunSim.h @@ -21,6 +21,7 @@ #include #include #include +#include class FairField; class FairGeoLoader; @@ -28,6 +29,7 @@ class FairMCEventHeader; class FairMesh; class FairModule; class FairPrimaryGenerator; +class FairVolume; /** * \brief Configure the Simulation session @@ -223,6 +225,15 @@ class FairRunSim : public FairRun void ls(Option_t* option = "") const override; + /** + * \brief Internal: Add Sensitive Volume + */ + void RegisterSensitiveVolume(FairVolume& vol) { fAllSensitiveVolumes.push_back(&vol); } + /** + * \brief Internal: Iterate over all sensitive Volumes + */ + auto const& RangeAllSensitiveVolumes() const { return fAllSensitiveVolumes; } + private: FairRunSim(const FairRunSim& M); FairRunSim& operator=(const FairRunSim&) { return *this; } @@ -239,6 +250,11 @@ class FairRunSim : public FairRun std::unique_ptr fGeoLoader; //! + /** + * For internal use only: list of all sensitive volumes in a simulaion session + */ + std::vector fAllSensitiveVolumes; //! + protected: Int_t count{0}; //!< Internal counter FairMCApplication* fApp{nullptr}; //!< Main VMC application From a0a41dfa72c3f542ad8c2fb9b4f5c8bcf22c5037 Mon Sep 17 00:00:00 2001 From: Christian Tacke <58549698+ChristianTackeGSI@users.noreply.github.com> Date: Wed, 4 Sep 2024 21:39:39 +0200 Subject: [PATCH 2/2] refactor(Base): Part of FairDetector::Initialize to FairRunSim A part of FairDetector::Initialize updates the sensitive volumes related to that Detector(Module). Instead of handling this inline, move the code to a new member function on FairRunSim. --- fairroot/base/sim/FairDetector.cxx | 20 +------------------- fairroot/base/steer/FairRunSim.cxx | 22 ++++++++++++++++++++++ fairroot/base/steer/FairRunSim.h | 5 +++++ 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/fairroot/base/sim/FairDetector.cxx b/fairroot/base/sim/FairDetector.cxx index b4444d9806..ca0629df2a 100644 --- a/fairroot/base/sim/FairDetector.cxx +++ b/fairroot/base/sim/FairDetector.cxx @@ -94,25 +94,7 @@ void FairDetector::Initialize() DefineSensitiveVolumes(); } - Int_t fMCid; - FairGeoNode* fN; - TString cutName; - TString copysign = "#"; - for (auto aVol : GetRunSim().RangeAllSensitiveVolumes()) { - cutName = aVol->GetName(); - Ssiz_t pos = cutName.Index(copysign, 1); - if (pos > 1) { - cutName.Resize(pos); - } - if (aVol->getModId() == GetModId()) { - fMCid = TVirtualMC::GetMC()->VolId(cutName.Data()); - aVol->setMCid(fMCid); - fN = aVol->getGeoNode(); - if (fN) { - fN->setMCid(fMCid); - } - } - } + GetRunSim().UpdateSensitiveVolumesForModule(*this); // Initialize cached pointer to MC (on master in sequential mode) fMC = TVirtualMC::GetMC(); diff --git a/fairroot/base/steer/FairRunSim.cxx b/fairroot/base/steer/FairRunSim.cxx index c5cd15913c..e75309bdaa 100644 --- a/fairroot/base/steer/FairRunSim.cxx +++ b/fairroot/base/steer/FairRunSim.cxx @@ -28,6 +28,7 @@ #include "FairRunIdGenerator.h" // for FairRunIdGenerator #include "FairRuntimeDb.h" // for FairRuntimeDb #include "FairTask.h" // for FairTask +#include "FairVolume.h" #include // for TIter #include // for gGeoManager @@ -431,3 +432,24 @@ void FairRunSim::ls(Option_t* option) const } TMCThreadLocal FairRunSim* FairRunSim::fginstance = nullptr; + +void FairRunSim::UpdateSensitiveVolumesForModule(FairModule& mod) +{ + TString copysign = "#"; + for (auto aVol : fAllSensitiveVolumes) { + if (aVol->getModId() != mod.GetModId()) { + continue; + } + TString cutName{aVol->GetName()}; + Ssiz_t pos = cutName.Index(copysign, 1); + if (pos > 1) { + cutName.Resize(pos); + } + Int_t mcid = TVirtualMC::GetMC()->VolId(cutName.Data()); + aVol->setMCid(mcid); + FairGeoNode* node = aVol->getGeoNode(); + if (node) { + node->setMCid(mcid); + } + } +} diff --git a/fairroot/base/steer/FairRunSim.h b/fairroot/base/steer/FairRunSim.h index 6bd0ddfa38..9c558f2e74 100644 --- a/fairroot/base/steer/FairRunSim.h +++ b/fairroot/base/steer/FairRunSim.h @@ -234,6 +234,11 @@ class FairRunSim : public FairRun */ auto const& RangeAllSensitiveVolumes() const { return fAllSensitiveVolumes; } + /** + * \brief Internal helper for FairDetector + */ + void UpdateSensitiveVolumesForModule(FairModule& mod); + private: FairRunSim(const FairRunSim& M); FairRunSim& operator=(const FairRunSim&) { return *this; }