diff --git a/source/event/include/G4EventManager.hh b/source/event/include/G4EventManager.hh index f32f64f5d9..29679e0a22 100644 --- a/source/event/include/G4EventManager.hh +++ b/source/event/include/G4EventManager.hh @@ -59,6 +59,10 @@ class G4EventManager static G4EventManager* GetEventManager(); // This method returns the singleton pointer of G4EventManager. + G4int ReserveNextTrackID(); + // Pre-assign the next sequential track ID to a secondary being born inside + // G4SteppingManager, so that its ID is available in UserSteppingAction. + G4EventManager(); ~G4EventManager(); diff --git a/source/event/src/G4EventManager.cc b/source/event/src/G4EventManager.cc index 504b50e6ba..5943606ddf 100644 --- a/source/event/src/G4EventManager.cc +++ b/source/event/src/G4EventManager.cc @@ -401,6 +401,11 @@ G4int G4EventManager::StoreSubEvent(G4Event* evt, G4int& subEvtType, G4SubEvent* return evt->StoreSubEvent(subEvtType,se); } +G4int G4EventManager::ReserveNextTrackID() +{ + return ++trackIDCounter; +} + void G4EventManager::StackTracks(G4TrackVector* trackVector, G4bool IDhasAlreadySet) { @@ -409,9 +414,13 @@ void G4EventManager::StackTracks(G4TrackVector* trackVector, if( trackVector->empty() ) return; for( auto newTrack : *trackVector ) { - ++trackIDCounter; - if(!IDhasAlreadySet) + if(IDhasAlreadySet) { + ++trackIDCounter; // advance counter for primaries whose IDs are set externally + } + else if(newTrack->GetTrackID() == 0) + { + ++trackIDCounter; // normal secondary: assign as usual newTrack->SetTrackID( trackIDCounter ); if(newTrack->GetDynamicParticle()->GetPrimaryParticle() != nullptr) { @@ -420,6 +429,7 @@ void G4EventManager::StackTracks(G4TrackVector* trackVector, pp->SetTrackID(trackIDCounter); } } + // else: ID was pre-assigned by ReserveNextTrackID() in G4SteppingManager — skip newTrack->SetOriginTouchableHandle(newTrack->GetTouchableHandle()); trackContainer->PushOneTrack( newTrack ); #ifdef G4VERBOSE diff --git a/source/tracking/src/G4SteppingManager.cc b/source/tracking/src/G4SteppingManager.cc index 9898b89da3..6768bbfac2 100644 --- a/source/tracking/src/G4SteppingManager.cc +++ b/source/tracking/src/G4SteppingManager.cc @@ -32,6 +32,7 @@ // -------------------------------------------------------------------- #include "G4SteppingManager.hh" +#include "G4EventManager.hh" #include "G4ForceCondition.hh" #include "G4GPILSelection.hh" @@ -600,6 +601,10 @@ G4int G4SteppingManager::ProcessSecondariesFromParticleChange() // Set the process pointer which created this track tempSecondaryTrack->SetCreatorProcess(creatorProcess); + // Pre-assign track ID so it is visible in UserSteppingAction via + // GetSecondaryInCurrentStep(); G4EventManager::StackTracks skips re-assignment. + tempSecondaryTrack->SetTrackID(G4EventManager::GetEventManager()->ReserveNextTrackID()); + // If this 2ndry particle has 'zero' kinetic energy, make sure // it invokes a rest process at the beginning of the tracking //