diff --git a/Detectors/CPV/simulation/include/CPVSimulation/Detector.h b/Detectors/CPV/simulation/include/CPVSimulation/Detector.h index c9ece3ba482ec..3bd41f89c7ea2 100644 --- a/Detectors/CPV/simulation/include/CPVSimulation/Detector.h +++ b/Detectors/CPV/simulation/include/CPVSimulation/Detector.h @@ -157,6 +157,7 @@ class Detector : public o2::base::DetImpl // Simulation std::vector* mHits = nullptr; //! Collection of CPV hits + int mTrackRefLastTrackID = -1; //! last track that received a TrackReference in the current event template friend class o2::base::DetImpl; diff --git a/Detectors/CPV/simulation/src/Detector.cxx b/Detectors/CPV/simulation/src/Detector.cxx index ee6ceef3de1e3..1203aad5526f9 100644 --- a/Detectors/CPV/simulation/src/Detector.cxx +++ b/Detectors/CPV/simulation/src/Detector.cxx @@ -106,6 +106,7 @@ void Detector::Reset() if (!o2::utils::ShmManager::Instance().isOperational()) { mHits->clear(); } + mTrackRefLastTrackID = -1; } void Detector::Register() { FairRootManager::Instance()->RegisterAny(addNameTo("Hit").data(), mHits, kTRUE); } @@ -123,6 +124,13 @@ Bool_t Detector::ProcessHits(FairVolume* v) // ported from AliRoot 2019 // ------------------------------------------------------------------------ + if (fMC->IsTrackEntering() && !fMC->IsNewTrack() && fMC->TrackCharge() != 0) { // one reference per charged particle, first entry from outside + auto o2stack = static_cast(fMC->GetStack()); + if (o2stack->GetCurrentTrackNumber() != mTrackRefLastTrackID) { + mTrackRefLastTrackID = o2stack->GetCurrentTrackNumber(); + o2stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); + } + } // analyze only charged if (fMC->TrackCharge() == 0) { fMC->SetMaxStep(1.e10); diff --git a/Detectors/FIT/FDD/simulation/include/FDDSimulation/Detector.h b/Detectors/FIT/FDD/simulation/include/FDDSimulation/Detector.h index 485197b30d0bb..363c05dd4fec4 100644 --- a/Detectors/FIT/FDD/simulation/include/FDDSimulation/Detector.h +++ b/Detectors/FIT/FDD/simulation/include/FDDSimulation/Detector.h @@ -71,6 +71,7 @@ class Detector : public o2::base::DetImpl /// Container for data points std::vector* mHits = nullptr; + int mTrackRefLastTrackID = -1; //! last track that received a TrackReference in the current event Detector& operator=(const Detector&); diff --git a/Detectors/FIT/FDD/simulation/src/Detector.cxx b/Detectors/FIT/FDD/simulation/src/Detector.cxx index 3bb945ddd1bba..174a62785494e 100644 --- a/Detectors/FIT/FDD/simulation/src/Detector.cxx +++ b/Detectors/FIT/FDD/simulation/src/Detector.cxx @@ -103,6 +103,13 @@ void Detector::InitializeO2Detector() Bool_t Detector::ProcessHits(FairVolume* vol) { // This is step manager + if (fMC->IsTrackEntering() && !fMC->IsNewTrack() && fMC->TrackCharge() != 0) { // one reference per charged particle, first entry from outside + auto o2stack = static_cast(fMC->GetStack()); + if (o2stack->GetCurrentTrackNumber() != mTrackRefLastTrackID) { + mTrackRefLastTrackID = o2stack->GetCurrentTrackNumber(); + o2stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); + } + } // do not track neutral particles if (!(fMC->TrackCharge())) { return kFALSE; @@ -373,4 +380,5 @@ void Detector::Reset() if (!o2::utils::ShmManager::Instance().isOperational()) { mHits->clear(); } + mTrackRefLastTrackID = -1; } diff --git a/Detectors/FIT/FT0/simulation/include/FT0Simulation/Detector.h b/Detectors/FIT/FT0/simulation/include/FT0Simulation/Detector.h index ebfe6e4a1ba3a..75f3c7a1f188f 100644 --- a/Detectors/FIT/FT0/simulation/include/FT0Simulation/Detector.h +++ b/Detectors/FIT/FT0/simulation/include/FT0Simulation/Detector.h @@ -179,6 +179,7 @@ class Detector : public o2::base::DetImpl /// Container for data points std::vector* mHits = nullptr; + int mTrackRefLastTrackID = -1; //! last track that received a TrackReference in the current event // Define volume IDs int mREGVolID = -1; diff --git a/Detectors/FIT/FT0/simulation/src/Detector.cxx b/Detectors/FIT/FT0/simulation/src/Detector.cxx index 3b7bff8d51633..f0f87f4a55c22 100644 --- a/Detectors/FIT/FT0/simulation/src/Detector.cxx +++ b/Detectors/FIT/FT0/simulation/src/Detector.cxx @@ -1123,6 +1123,13 @@ Bool_t Detector::ProcessHits(FairVolume* v) Int_t copy; Int_t volID = fMC->CurrentVolID(copy); + if (fMC->IsTrackEntering() && !fMC->IsNewTrack() && fMC->TrackCharge() != 0 && volID == mTOPVolID) { // one reference per charged particle, first entry from outside + auto o2stack = static_cast(fMC->GetStack()); + if (o2stack->GetCurrentTrackNumber() != mTrackRefLastTrackID) { + mTrackRefLastTrackID = o2stack->GetCurrentTrackNumber(); + o2stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); + } + } TVirtualMCStack* stack = fMC->GetStack(); Int_t quadrant, mcp; @@ -1203,6 +1210,7 @@ void Detector::Reset() if (!o2::utils::ShmManager::Instance().isOperational()) { mHits->clear(); } + mTrackRefLastTrackID = -1; } void Detector::CreateMaterials() diff --git a/Detectors/FIT/FV0/simulation/include/FV0Simulation/Detector.h b/Detectors/FIT/FV0/simulation/include/FV0Simulation/Detector.h index f9126061bf214..fdff96b6eafa8 100644 --- a/Detectors/FIT/FV0/simulation/include/FV0Simulation/Detector.h +++ b/Detectors/FIT/FV0/simulation/include/FV0Simulation/Detector.h @@ -107,6 +107,7 @@ class Detector : public o2::base::DetImpl private: /// Container for hits std::vector* mHits = nullptr; + int mTrackRefLastTrackID = -1; //! last track that received a TrackReference in the current event /// Geometry pointer Geometry* mGeometry = nullptr; //! diff --git a/Detectors/FIT/FV0/simulation/src/Detector.cxx b/Detectors/FIT/FV0/simulation/src/Detector.cxx index 07eb9053bf3b8..a91c599f30020 100644 --- a/Detectors/FIT/FV0/simulation/src/Detector.cxx +++ b/Detectors/FIT/FV0/simulation/src/Detector.cxx @@ -80,6 +80,13 @@ Bool_t Detector::ProcessHits(FairVolume* v) { // This method is called from the MC stepping + if (fMC->IsTrackEntering() && !fMC->IsNewTrack() && fMC->TrackCharge() != 0) { // one reference per charged particle, first entry from outside + auto o2stack = static_cast(fMC->GetStack()); + if (o2stack->GetCurrentTrackNumber() != mTrackRefLastTrackID) { + mTrackRefLastTrackID = o2stack->GetCurrentTrackNumber(); + o2stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); + } + } // Track only charged particles and photons bool isPhotonTrack = false; Int_t particlePdg = fMC->TrackPid(); @@ -150,6 +157,7 @@ void Detector::Reset() if (!o2::utils::ShmManager::Instance().isOperational()) { mHits->clear(); } + mTrackRefLastTrackID = -1; } void Detector::EndOfEvent() diff --git a/Detectors/ITSMFT/MFT/simulation/include/MFTSimulation/Detector.h b/Detectors/ITSMFT/MFT/simulation/include/MFTSimulation/Detector.h index 1e0a58fc80217..3c44705f747c0 100644 --- a/Detectors/ITSMFT/MFT/simulation/include/MFTSimulation/Detector.h +++ b/Detectors/ITSMFT/MFT/simulation/include/MFTSimulation/Detector.h @@ -148,6 +148,7 @@ class Detector : public o2::base::DetImpl private: /// Container for hit data std::vector* mHits; + int mTrackRefLastTrackID = -1; //! last track that received a TrackReference in the current event Detector(const Detector&); Detector& operator=(const Detector&); diff --git a/Detectors/ITSMFT/MFT/simulation/src/Detector.cxx b/Detectors/ITSMFT/MFT/simulation/src/Detector.cxx index 7a5243fde8063..3de16362130d6 100644 --- a/Detectors/ITSMFT/MFT/simulation/src/Detector.cxx +++ b/Detectors/ITSMFT/MFT/simulation/src/Detector.cxx @@ -96,6 +96,13 @@ Bool_t Detector::ProcessHits(FairVolume* vol) { // This method is called from the MC stepping + if (fMC->IsTrackEntering() && !fMC->IsNewTrack() && fMC->TrackCharge() != 0) { // one reference per charged particle, first entry from outside + auto o2stack = static_cast(fMC->GetStack()); + if (o2stack->GetCurrentTrackNumber() != mTrackRefLastTrackID) { + mTrackRefLastTrackID = o2stack->GetCurrentTrackNumber(); + o2stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); + } + } // do not track neutral particles if (!(fMC->TrackCharge())) { return kFALSE; @@ -744,4 +751,5 @@ void Detector::Reset() if (!o2::utils::ShmManager::Instance().isOperational()) { mHits->clear(); } + mTrackRefLastTrackID = -1; } diff --git a/Detectors/PHOS/simulation/src/Detector.cxx b/Detectors/PHOS/simulation/src/Detector.cxx index a8ff99b3805f1..086c4dd600a3d 100644 --- a/Detectors/PHOS/simulation/src/Detector.cxx +++ b/Detectors/PHOS/simulation/src/Detector.cxx @@ -163,6 +163,7 @@ Bool_t Detector::ProcessHits(FairVolume* v) if (isNewPartile) { // mark track to be kept by stack stack->addHit(GetDetId()); + stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); // PHOS entry (new superparent) } Double_t lostenergy = fMC->Edep(); diff --git a/Detectors/TOF/simulation/include/TOFSimulation/Detector.h b/Detectors/TOF/simulation/include/TOFSimulation/Detector.h index 1aa0efb6ef61c..1dfd730efe716 100644 --- a/Detectors/TOF/simulation/include/TOFSimulation/Detector.h +++ b/Detectors/TOF/simulation/include/TOFSimulation/Detector.h @@ -158,8 +158,9 @@ class Detector : public o2::base::DetImpl Int_t mEventNr; // event count Int_t mTOFSectors[o2::tof::Geo::NSECTORS]; - Bool_t mTOFHoles; // flag to allow for holes in front of the PHOS - Int_t mLastChannelID = -1; ///< Last channel seen by the hit + Bool_t mTOFHoles; // flag to allow for holes in front of the PHOS + Int_t mLastChannelID = -1; ///< Last channel seen by the hit + Int_t mTrackRefLastTrackID = -1; //! last track that received a TrackReference in the current event /// container for data points std::vector* mHits; //! diff --git a/Detectors/TOF/simulation/src/Detector.cxx b/Detectors/TOF/simulation/src/Detector.cxx index a9af40e208d81..5e9938e7fc084 100644 --- a/Detectors/TOF/simulation/src/Detector.cxx +++ b/Detectors/TOF/simulation/src/Detector.cxx @@ -75,6 +75,13 @@ void Detector::InitializeO2Detector() Bool_t Detector::ProcessHits(FairVolume* v) { // This method is called from the MC stepping for the sensitive volume only + if (fMC->IsTrackEntering() && !fMC->IsNewTrack() && fMC->TrackCharge() != 0) { // one reference per charged particle, first entry from outside + auto o2stack = static_cast(fMC->GetStack()); + if (o2stack->GetCurrentTrackNumber() != mTrackRefLastTrackID) { + mTrackRefLastTrackID = o2stack->GetCurrentTrackNumber(); + o2stack->addTrackReference(o2::TrackReference(*fMC, GetDetId())); + } + } if (static_cast(fMC->TrackCharge()) == 0) { // set a very large step size for neutral particles return kFALSE; // take only charged particles @@ -130,6 +137,7 @@ void Detector::Reset() mHits->clear(); } mLastChannelID = -1; + mTrackRefLastTrackID = -1; } void Detector::CreateMaterials()