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
|
||||
|
||||
Reference in New Issue
Block a user