Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4TrackingManager class implementation 26 // G4TrackingManager class implementation 27 // 27 // 28 // Contact: 28 // Contact: 29 // Questions and comments to this code shoul 29 // Questions and comments to this code should be sent to 30 // Katsuya Amako (e-mail: Katsuya.Amako@k 30 // Katsuya Amako (e-mail: Katsuya.Amako@kek.jp) 31 // Takashi Sasaki (e-mail: Takashi.Sasaki@ 31 // Takashi Sasaki (e-mail: Takashi.Sasaki@kek.jp) 32 // ------------------------------------------- 32 // -------------------------------------------------------------------- 33 33 34 #include "G4TrackingManager.hh" 34 #include "G4TrackingManager.hh" 35 << 36 #include "G4Trajectory.hh" 35 #include "G4Trajectory.hh" 37 #include "G4RichTrajectory.hh" << 38 #include "G4SmoothTrajectory.hh" 36 #include "G4SmoothTrajectory.hh" >> 37 #include "G4RichTrajectory.hh" 39 #include "G4ios.hh" 38 #include "G4ios.hh" >> 39 #include "G4Profiler.hh" >> 40 #include "G4TiMemory.hh" 40 41 41 ////////////////////////////////////// 42 ////////////////////////////////////// 42 G4TrackingManager::G4TrackingManager() 43 G4TrackingManager::G4TrackingManager() 43 ////////////////////////////////////// 44 ////////////////////////////////////// 44 { 45 { 45 messenger = new G4TrackingMessenger(this); 46 messenger = new G4TrackingMessenger(this); 46 fpSteppingManager = new G4SteppingManager(); 47 fpSteppingManager = new G4SteppingManager(); 47 } 48 } 48 49 49 /////////////////////////////////////// 50 /////////////////////////////////////// 50 G4TrackingManager::~G4TrackingManager() 51 G4TrackingManager::~G4TrackingManager() 51 /////////////////////////////////////// 52 /////////////////////////////////////// 52 { 53 { 53 delete messenger; 54 delete messenger; 54 delete fpSteppingManager; 55 delete fpSteppingManager; 55 delete fpUserTrackingAction; 56 delete fpUserTrackingAction; 56 } 57 } 57 58 58 ////////////////////////////////////////////// 59 //////////////////////////////////////////////////////////////// 59 void G4TrackingManager::ProcessOneTrack(G4Trac 60 void G4TrackingManager::ProcessOneTrack(G4Track* apValueG4Track) 60 ////////////////////////////////////////////// 61 //////////////////////////////////////////////////////////////// 61 { 62 { 62 // Receiving a G4Track from the EventManager 63 // Receiving a G4Track from the EventManager, this funciton has the 63 // responsibility to trace the track till it 64 // responsibility to trace the track till it stops 64 65 65 fpTrack = apValueG4Track; 66 fpTrack = apValueG4Track; 66 EventIsAborted = false; 67 EventIsAborted = false; 67 68 68 // Clear secondary particle vector 69 // Clear secondary particle vector 69 // 70 // 70 for (auto& itr : *GimmeSecondaries()) { << 71 for(std:: size_t itr=0; itr<GimmeSecondaries()->size(); ++itr) 71 delete itr; << 72 { 72 } << 73 delete (*GimmeSecondaries())[itr]; 73 GimmeSecondaries()->clear(); << 74 } 74 << 75 GimmeSecondaries()->clear(); 75 if (verboseLevel > 0 && (G4VSteppingVerbose: << 76 76 << 77 if(verboseLevel>0 && (G4VSteppingVerbose::GetSilent()!=1) ) TrackBanner(); >> 78 77 // Give SteppingManger the pointer to the tr 79 // Give SteppingManger the pointer to the track which will be tracked 78 // 80 // 79 fpSteppingManager->SetInitialStep(fpTrack); 81 fpSteppingManager->SetInitialStep(fpTrack); 80 82 81 // Pre tracking user intervention process 83 // Pre tracking user intervention process 82 84 83 fpTrajectory = nullptr; 85 fpTrajectory = nullptr; 84 if (fpUserTrackingAction != nullptr) { << 86 if( fpUserTrackingAction != nullptr ) >> 87 { 85 fpUserTrackingAction->PreUserTrackingActio 88 fpUserTrackingAction->PreUserTrackingAction(fpTrack); 86 } 89 } 87 90 88 // we need this to scope the G4Track::Profil 91 // we need this to scope the G4Track::ProfilerConfig b/t 89 // the PreUserTrackingAction and PostUserTra 92 // the PreUserTrackingAction and PostUserTrackingAction 90 { 93 { >> 94 #if defined(GEANT4_USE_TIMEMORY) >> 95 ProfilerConfig profiler{ fpTrack }; >> 96 #endif >> 97 91 #ifdef G4_STORE_TRAJECTORY 98 #ifdef G4_STORE_TRAJECTORY 92 // Construct a trajectory if it is request 99 // Construct a trajectory if it is requested 93 // 100 // 94 if ((StoreTrajectory != 0) && (fpTrajector << 101 if(StoreTrajectory && (fpTrajectory == nullptr)) >> 102 { 95 // default trajectory concrete class obj 103 // default trajectory concrete class object 96 switch (StoreTrajectory) { << 104 switch(StoreTrajectory) >> 105 { 97 default: 106 default: 98 case 1: 107 case 1: 99 fpTrajectory = new G4Trajectory(fpTr 108 fpTrajectory = new G4Trajectory(fpTrack); 100 break; 109 break; 101 case 2: 110 case 2: 102 fpTrajectory = new G4SmoothTrajector 111 fpTrajectory = new G4SmoothTrajectory(fpTrack); 103 break; 112 break; 104 case 3: 113 case 3: 105 fpTrajectory = new G4RichTrajectory( 114 fpTrajectory = new G4RichTrajectory(fpTrack); 106 break; 115 break; 107 case 4: 116 case 4: 108 fpTrajectory = new G4RichTrajectory( 117 fpTrajectory = new G4RichTrajectory(fpTrack); 109 break; 118 break; 110 } 119 } 111 } 120 } 112 #endif 121 #endif 113 122 114 // Give SteppingManger the maxmimum number 123 // Give SteppingManger the maxmimum number of processes 115 fpSteppingManager->GetProcessNumber(); 124 fpSteppingManager->GetProcessNumber(); 116 125 117 // Give track the pointer to the Step 126 // Give track the pointer to the Step 118 fpTrack->SetStep(fpSteppingManager->GetSte 127 fpTrack->SetStep(fpSteppingManager->GetStep()); 119 128 120 // Inform beginning of tracking to physics 129 // Inform beginning of tracking to physics processes 121 fpTrack->GetDefinition()->GetProcessManage 130 fpTrack->GetDefinition()->GetProcessManager()->StartTracking(fpTrack); 122 131 123 // Track the particle Step-by-Step while i 132 // Track the particle Step-by-Step while it is alive 124 // 133 // 125 while ((fpTrack->GetTrackStatus() == fAliv << 134 while((fpTrack->GetTrackStatus() == fAlive) || >> 135 (fpTrack->GetTrackStatus() == fStopButAlive)) >> 136 { 126 fpTrack->IncrementCurrentStepNumber(); 137 fpTrack->IncrementCurrentStepNumber(); 127 fpSteppingManager->Stepping(); 138 fpSteppingManager->Stepping(); 128 #ifdef G4_STORE_TRAJECTORY 139 #ifdef G4_STORE_TRAJECTORY 129 if (StoreTrajectory != 0) { << 140 if(StoreTrajectory) >> 141 { 130 fpTrajectory->AppendStep(fpSteppingMan 142 fpTrajectory->AppendStep(fpSteppingManager->GetStep()); 131 } 143 } 132 #endif 144 #endif 133 if (EventIsAborted) { << 145 if(EventIsAborted) >> 146 { 134 fpTrack->SetTrackStatus(fKillTrackAndS 147 fpTrack->SetTrackStatus(fKillTrackAndSecondaries); 135 } 148 } 136 } 149 } 137 // Inform end of tracking to physics proce 150 // Inform end of tracking to physics processes 138 fpTrack->GetDefinition()->GetProcessManage 151 fpTrack->GetDefinition()->GetProcessManager()->EndTracking(); 139 } 152 } 140 153 141 // Post tracking user intervention process. 154 // Post tracking user intervention process. 142 if (fpUserTrackingAction != nullptr) { << 155 if( fpUserTrackingAction != nullptr ) >> 156 { 143 fpUserTrackingAction->PostUserTrackingActi 157 fpUserTrackingAction->PostUserTrackingAction(fpTrack); 144 } 158 } 145 159 146 // Destruct the trajectory if it was created 160 // Destruct the trajectory if it was created 147 #ifdef G4VERBOSE 161 #ifdef G4VERBOSE 148 if ((StoreTrajectory != 0) && verboseLevel > << 162 if(StoreTrajectory&&verboseLevel>10) >> 163 { 149 fpTrajectory->ShowTrajectory(); 164 fpTrajectory->ShowTrajectory(); 150 } 165 } 151 #endif 166 #endif 152 if ((StoreTrajectory == 0) && (fpTrajectory << 167 if( (!StoreTrajectory) && (fpTrajectory != nullptr) ) >> 168 { 153 delete fpTrajectory; 169 delete fpTrajectory; 154 fpTrajectory = nullptr; 170 fpTrajectory = nullptr; 155 } 171 } 156 } 172 } 157 173 158 ////////////////////////////////////// 174 ////////////////////////////////////// 159 void G4TrackingManager::SetTrajectory(G4VTraje 175 void G4TrackingManager::SetTrajectory(G4VTrajectory* aTrajectory) 160 ////////////////////////////////////// 176 ////////////////////////////////////// 161 { 177 { 162 #ifndef G4_STORE_TRAJECTORY 178 #ifndef G4_STORE_TRAJECTORY 163 G4Exception("G4TrackingManager::SetTrajector << 179 G4Exception("G4TrackingManager::SetTrajectory()", 164 "Invoked without G4_STORE_TRAJECTORY optio << 180 "Tracking0015", FatalException, >> 181 "Invoked without G4_STORE_TRAJECTORY option set!"); 165 #endif 182 #endif 166 fpTrajectory = aTrajectory; 183 fpTrajectory = aTrajectory; 167 } 184 } 168 185 169 ////////////////////////////////////// 186 ////////////////////////////////////// 170 void G4TrackingManager::EventAborted() 187 void G4TrackingManager::EventAborted() 171 ////////////////////////////////////// 188 ////////////////////////////////////// 172 { 189 { 173 fpTrack->SetTrackStatus(fKillTrackAndSeconda << 190 fpTrack->SetTrackStatus( fKillTrackAndSecondaries ); 174 EventIsAborted = true; 191 EventIsAborted = true; 175 } 192 } 176 193 177 ////////////////////////////////////// 194 ////////////////////////////////////// 178 void G4TrackingManager::TrackBanner() 195 void G4TrackingManager::TrackBanner() 179 ////////////////////////////////////// 196 ////////////////////////////////////// 180 { 197 { 181 G4cout << G4endl; 198 G4cout << G4endl; 182 G4cout << "********************************* 199 G4cout << "*******************************************************" 183 << "********************************* << 200 << "**************************************************" >> 201 << G4endl; 184 G4cout << "* G4Track Information: " 202 G4cout << "* G4Track Information: " 185 << " Particle = " << fpTrack->GetDef << 203 << " Particle = " << fpTrack->GetDefinition()->GetParticleName() 186 << " Track ID = " << fpTrack->GetTr << 204 << "," 187 << " Parent ID = " << fpTrack->GetP << 205 << " Track ID = " << fpTrack->GetTrackID() >> 206 << "," >> 207 << " Parent ID = " << fpTrack->GetParentID() >> 208 << G4endl; 188 G4cout << "********************************* 209 G4cout << "*******************************************************" 189 << "********************************* << 210 << "**************************************************" >> 211 << G4endl; 190 G4cout << G4endl; 212 G4cout << G4endl; 191 } 213 } 192 << 193 ////////////////////////////////////// << 194 void G4TrackingManager::SetStoreTrajectory(G4i << 195 ////////////////////////////////////// << 196 { << 197 StoreTrajectory = value; << 198 } << 199 << 200 214