diff --git a/fairroot/base/sim/FairDetector.cxx b/fairroot/base/sim/FairDetector.cxx index e8642ca45d..ca0629df2a 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 @@ -93,25 +94,7 @@ void FairDetector::Initialize() DefineSensitiveVolumes(); } - Int_t fMCid; - FairGeoNode* fN; - TString cutName; - TString copysign = "#"; - for (auto aVol : fAllSensitiveVolumes) { - 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/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.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 df28518edb..9c558f2e74 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,20 @@ 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; } + + /** + * \brief Internal helper for FairDetector + */ + void UpdateSensitiveVolumesForModule(FairModule& mod); + private: FairRunSim(const FairRunSim& M); FairRunSim& operator=(const FairRunSim&) { return *this; } @@ -239,6 +255,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