File indexing completed on 2025-02-23 09:22:47
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "SpecializedTrackingManager.hh"
0031
0032 #include "G4EventManager.hh"
0033 #include "G4ProcessManager.hh"
0034 #include "G4RegionStore.hh"
0035 #include "G4StackManager.hh"
0036 #include "G4SystemOfUnits.hh"
0037 #include "G4TrackingManager.hh"
0038
0039
0040
0041 SpecializedTrackingManager::SpecializedTrackingManager() {}
0042
0043
0044
0045 SpecializedTrackingManager::~SpecializedTrackingManager() {}
0046
0047
0048
0049 void SpecializedTrackingManager::BuildPhysicsTable(const G4ParticleDefinition& part)
0050 {
0051 if (fBackRegion == nullptr) {
0052 fBackRegion = G4RegionStore::GetInstance()->GetRegion("Back", false);
0053 }
0054
0055 G4ProcessManager* pManager = part.GetProcessManager();
0056 G4ProcessManager* pManagerShadow = part.GetMasterProcessManager();
0057
0058 G4ProcessVector* pVector = pManager->GetProcessList();
0059 for (std::size_t j = 0; j < pVector->size(); ++j) {
0060 if (pManagerShadow == pManager) {
0061 (*pVector)[j]->BuildPhysicsTable(part);
0062 }
0063 else {
0064 (*pVector)[j]->BuildWorkerPhysicsTable(part);
0065 }
0066 }
0067 }
0068
0069
0070
0071 void SpecializedTrackingManager::PreparePhysicsTable(const G4ParticleDefinition& part)
0072 {
0073 G4ProcessManager* pManager = part.GetProcessManager();
0074 G4ProcessManager* pManagerShadow = part.GetMasterProcessManager();
0075
0076 G4ProcessVector* pVector = pManager->GetProcessList();
0077 for (std::size_t j = 0; j < pVector->size(); ++j) {
0078 if (pManagerShadow == pManager) {
0079 (*pVector)[j]->PreparePhysicsTable(part);
0080 }
0081 else {
0082 (*pVector)[j]->PrepareWorkerPhysicsTable(part);
0083 }
0084 }
0085 }
0086
0087
0088
0089 void SpecializedTrackingManager::HandOverOneTrack(G4Track* aTrack)
0090 {
0091 if (aTrack->GetKineticEnergy() < 100 * MeV) {
0092
0093
0094
0095
0096 G4EventManager* eventManager = G4EventManager::GetEventManager();
0097 G4TrackingManager* trackManager = eventManager->GetTrackingManager();
0098
0099 trackManager->ProcessOneTrack(aTrack);
0100 if (aTrack->GetTrackStatus() != fStopAndKill) {
0101 G4Exception("SpecializedTrackingManager::HandOverOneTrack", "NotStopped", FatalException,
0102 "track was not stopped");
0103 }
0104
0105 G4TrackVector* secondaries = trackManager->GimmeSecondaries();
0106 eventManager->StackTracks(secondaries);
0107 delete aTrack;
0108 return;
0109 }
0110
0111 fBufferedTracks.push_back(aTrack);
0112 }
0113
0114
0115
0116 void SpecializedTrackingManager::FlushEvent()
0117 {
0118 G4EventManager* eventManager = G4EventManager::GetEventManager();
0119 G4TrackingManager* trackManager = eventManager->GetTrackingManager();
0120 G4SteppingManager* steppingManager = trackManager->GetSteppingManager();
0121 G4TrackVector* secondaries = trackManager->GimmeSecondaries();
0122
0123 for (G4Track* aTrack : fBufferedTracks) {
0124
0125 for (std::size_t itr = 0; itr < secondaries->size(); ++itr) {
0126 delete (*secondaries)[itr];
0127 }
0128 secondaries->clear();
0129
0130 steppingManager->SetInitialStep(aTrack);
0131
0132 G4UserTrackingAction* userTrackingAction = trackManager->GetUserTrackingAction();
0133 if (userTrackingAction != nullptr) {
0134 userTrackingAction->PreUserTrackingAction(aTrack);
0135 }
0136
0137
0138 steppingManager->GetProcessNumber();
0139
0140
0141 aTrack->SetStep(steppingManager->GetStep());
0142
0143
0144 aTrack->GetDefinition()->GetProcessManager()->StartTracking(aTrack);
0145
0146
0147 while ((aTrack->GetTrackStatus() == fAlive) || (aTrack->GetTrackStatus() == fStopButAlive)) {
0148 G4Region* region = aTrack->GetVolume()->GetLogicalVolume()->GetRegion();
0149 if (region == fBackRegion) {
0150 StepInBackRegion(aTrack);
0151 }
0152 else {
0153 StepOutside(aTrack);
0154 }
0155 }
0156
0157 aTrack->GetDefinition()->GetProcessManager()->EndTracking();
0158
0159 if (userTrackingAction != nullptr) {
0160 userTrackingAction->PostUserTrackingAction(aTrack);
0161 }
0162
0163 eventManager->StackTracks(secondaries);
0164 delete aTrack;
0165 }
0166
0167 fBufferedTracks.clear();
0168 }
0169
0170
0171
0172 void SpecializedTrackingManager::StepInBackRegion(G4Track* aTrack)
0173 {
0174 G4EventManager* eventManager = G4EventManager::GetEventManager();
0175 G4TrackingManager* trackManager = eventManager->GetTrackingManager();
0176 G4SteppingManager* steppingManager = trackManager->GetSteppingManager();
0177
0178
0179
0180
0181
0182 while ((aTrack->GetTrackStatus() == fAlive) || (aTrack->GetTrackStatus() == fStopButAlive)) {
0183 aTrack->IncrementCurrentStepNumber();
0184 steppingManager->Stepping();
0185
0186 if (aTrack->GetTrackStatus() != fStopAndKill) {
0187
0188
0189 aTrack->SetTouchableHandle(aTrack->GetNextTouchableHandle());
0190 G4Region* region = aTrack->GetVolume()->GetLogicalVolume()->GetRegion();
0191 if (region != fBackRegion) {
0192 return;
0193 }
0194
0195 if (aTrack->GetKineticEnergy() < 100 * MeV) {
0196
0197 aTrack->SetTrackStatus(fStopAndKill);
0198 }
0199 }
0200 }
0201 }
0202
0203
0204
0205 void SpecializedTrackingManager::StepOutside(G4Track* aTrack)
0206 {
0207 G4EventManager* eventManager = G4EventManager::GetEventManager();
0208 G4TrackingManager* trackManager = eventManager->GetTrackingManager();
0209 G4SteppingManager* steppingManager = trackManager->GetSteppingManager();
0210
0211
0212
0213 while ((aTrack->GetTrackStatus() == fAlive) || (aTrack->GetTrackStatus() == fStopButAlive)) {
0214 aTrack->IncrementCurrentStepNumber();
0215 steppingManager->Stepping();
0216
0217 if (aTrack->GetTrackStatus() != fStopAndKill) {
0218
0219
0220 aTrack->SetTouchableHandle(aTrack->GetNextTouchableHandle());
0221 G4Region* region = aTrack->GetVolume()->GetLogicalVolume()->GetRegion();
0222 if (region == fBackRegion) {
0223 return;
0224 }
0225 }
0226 }
0227 }