From 71c7582c45c8b7624ef7be16288349c056b1a6dd Mon Sep 17 00:00:00 2001 From: Lars Bogner Date: Thu, 11 Jun 2026 11:07:56 +0200 Subject: [PATCH] fix circular module dep: thread trackID counter via pointer instead of include G4tracking cannot include G4EventManager.hh because G4event already depends on G4tracking, creating a circular dependency. Fix: pass a raw G4int* pointer to the event-level trackIDCounter from G4EventManager through G4TrackingManager::SetTrackIDCounter into G4SteppingManager, where ProcessSecondariesFromParticleChange uses it to pre-assign track IDs without any new include. Co-Authored-By: Claude Sonnet 4.6 --- source/event/include/G4EventManager.hh | 3 --- source/event/src/G4EventManager.cc | 7 ++----- source/tracking/include/G4SteppingManager.hh | 3 +++ source/tracking/include/G4TrackingManager.hh | 1 + source/tracking/src/G4SteppingManager.cc | 5 +++-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/source/event/include/G4EventManager.hh b/source/event/include/G4EventManager.hh index 29679e0a22..e91ccd50b3 100644 --- a/source/event/include/G4EventManager.hh +++ b/source/event/include/G4EventManager.hh @@ -59,9 +59,6 @@ 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 5943606ddf..d3b4855435 100644 --- a/source/event/src/G4EventManager.cc +++ b/source/event/src/G4EventManager.cc @@ -172,6 +172,8 @@ void G4EventManager::DoProcessing(G4Event* anEvent, } #endif + trackManager->SetTrackIDCounter(&trackIDCounter); + std::unordered_set trackingManagersToFlush; do @@ -401,11 +403,6 @@ 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) { diff --git a/source/tracking/include/G4SteppingManager.hh b/source/tracking/include/G4SteppingManager.hh index 80a75ecdb0..3f74264d2d 100644 --- a/source/tracking/include/G4SteppingManager.hh +++ b/source/tracking/include/G4SteppingManager.hh @@ -90,6 +90,7 @@ class G4SteppingManager void SetUserAction(G4UserSteppingAction* apAction); G4Track* GetTrack() const; void SetVerboseLevel(G4int vLevel); + void SetTrackIDCounter(G4int* counter) { fTrackIDCounter = counter; } void SetVerbose(G4VSteppingVerbose*); G4Step* GetStep() const; void SetNavigator(G4Navigator* value); @@ -195,6 +196,8 @@ class G4SteppingManager G4double sumEnergyChange = 0.0; + G4int* fTrackIDCounter = nullptr; // pointer into G4EventManager::trackIDCounter, set via SetTrackIDCounter + G4VParticleChange* fParticleChange = nullptr; G4Track* fTrack = nullptr; G4TrackVector* fSecondary = nullptr; diff --git a/source/tracking/include/G4TrackingManager.hh b/source/tracking/include/G4TrackingManager.hh index 5a1d352148..8eb8a21bb7 100644 --- a/source/tracking/include/G4TrackingManager.hh +++ b/source/tracking/include/G4TrackingManager.hh @@ -78,6 +78,7 @@ class G4TrackingManager void SetStoreTrajectory(G4int value); G4SteppingManager* GetSteppingManager() const; + void SetTrackIDCounter(G4int* counter) { fpSteppingManager->SetTrackIDCounter(counter); } G4UserTrackingAction* GetUserTrackingAction() const; diff --git a/source/tracking/src/G4SteppingManager.cc b/source/tracking/src/G4SteppingManager.cc index 6768bbfac2..6e3b92ad5c 100644 --- a/source/tracking/src/G4SteppingManager.cc +++ b/source/tracking/src/G4SteppingManager.cc @@ -32,7 +32,6 @@ // -------------------------------------------------------------------- #include "G4SteppingManager.hh" -#include "G4EventManager.hh" #include "G4ForceCondition.hh" #include "G4GPILSelection.hh" @@ -603,7 +602,9 @@ G4int G4SteppingManager::ProcessSecondariesFromParticleChange() // Pre-assign track ID so it is visible in UserSteppingAction via // GetSecondaryInCurrentStep(); G4EventManager::StackTracks skips re-assignment. - tempSecondaryTrack->SetTrackID(G4EventManager::GetEventManager()->ReserveNextTrackID()); + if (fTrackIDCounter) { + tempSecondaryTrack->SetTrackID(++(*fTrackIDCounter)); + } // If this 2ndry particle has 'zero' kinetic energy, make sure // it invokes a rest process at the beginning of the tracking