pre-assign secondary track IDs in ProcessSecondariesFromParticleChange
Add G4EventManager::ReserveNextTrackID() to atomically increment and return the next track ID counter. Call it from G4SteppingManager:: ProcessSecondariesFromParticleChange() so that each secondary has its track ID set before UserSteppingAction fires. G4EventManager::StackTracks is updated to skip re-assignment when GetTrackID() != 0 (pre-assigned). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user