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 // >> 27 // $Id: G4TrackingManager.cc,v 1.22 2006/11/14 10:58:47 tsasaki Exp $ >> 28 // GEANT4 tag $Name: geant4-09-01 $ >> 29 // >> 30 //--------------------------------------------------------------- >> 31 // >> 32 // G4TrackingManager.cc 27 // 33 // 28 // Contact: 34 // Contact: 29 // Questions and comments to this code shoul 35 // Questions and comments to this code should be sent to 30 // Katsuya Amako (e-mail: Katsuya.Amako@k 36 // Katsuya Amako (e-mail: Katsuya.Amako@kek.jp) 31 // Takashi Sasaki (e-mail: Takashi.Sasaki@ 37 // Takashi Sasaki (e-mail: Takashi.Sasaki@kek.jp) 32 // ------------------------------------------- << 38 // >> 39 //--------------------------------------------------------------- 33 40 34 #include "G4TrackingManager.hh" 41 #include "G4TrackingManager.hh" 35 << 36 #include "G4Trajectory.hh" 42 #include "G4Trajectory.hh" 37 #include "G4RichTrajectory.hh" << 38 #include "G4SmoothTrajectory.hh" 43 #include "G4SmoothTrajectory.hh" >> 44 #include "G4RichTrajectory.hh" 39 #include "G4ios.hh" 45 #include "G4ios.hh" >> 46 class G4VSteppingVerbose; 40 47 41 ////////////////////////////////////// 48 ////////////////////////////////////// 42 G4TrackingManager::G4TrackingManager() 49 G4TrackingManager::G4TrackingManager() 43 ////////////////////////////////////// 50 ////////////////////////////////////// >> 51 : fpUserTrackingAction(NULL), fpTrajectory(NULL), >> 52 StoreTrajectory(0), verboseLevel(0), EventIsAborted(false) 44 { 53 { 45 messenger = new G4TrackingMessenger(this); << 46 fpSteppingManager = new G4SteppingManager(); 54 fpSteppingManager = new G4SteppingManager(); >> 55 messenger = new G4TrackingMessenger(this); 47 } 56 } 48 57 49 /////////////////////////////////////// 58 /////////////////////////////////////// 50 G4TrackingManager::~G4TrackingManager() 59 G4TrackingManager::~G4TrackingManager() 51 /////////////////////////////////////// 60 /////////////////////////////////////// 52 { 61 { 53 delete messenger; 62 delete messenger; 54 delete fpSteppingManager; 63 delete fpSteppingManager; 55 delete fpUserTrackingAction; << 64 if (fpUserTrackingAction) delete fpUserTrackingAction; 56 } 65 } 57 66 58 ////////////////////////////////////////////// 67 //////////////////////////////////////////////////////////////// 59 void G4TrackingManager::ProcessOneTrack(G4Trac 68 void G4TrackingManager::ProcessOneTrack(G4Track* apValueG4Track) 60 ////////////////////////////////////////////// 69 //////////////////////////////////////////////////////////////// 61 { 70 { 62 // Receiving a G4Track from the EventManager << 63 // responsibility to trace the track till it << 64 71 >> 72 // Receiving a G4Track from the EventManager, this funciton has the >> 73 // responsibility to trace the track till it stops. 65 fpTrack = apValueG4Track; 74 fpTrack = apValueG4Track; 66 EventIsAborted = false; 75 EventIsAborted = false; 67 76 68 // Clear secondary particle vector << 77 // Clear 2ndary particle vector 69 // << 78 // GimmeSecondaries()->clearAndDestroy(); 70 for (auto& itr : *GimmeSecondaries()) { << 79 // std::vector<G4Track*>::iterator itr; 71 delete itr; << 80 size_t itr; 72 } << 81 // for(itr=GimmeSecondaries()->begin();itr=GimmeSecondaries()->end();itr++){ 73 GimmeSecondaries()->clear(); << 82 for(itr=0;itr<GimmeSecondaries()->size();itr++){ 74 << 83 delete (*GimmeSecondaries())[itr]; 75 if (verboseLevel > 0 && (G4VSteppingVerbose: << 84 } 76 << 85 GimmeSecondaries()->clear(); 77 // Give SteppingManger the pointer to the tr << 86 78 // << 87 if(verboseLevel>0 && (G4VSteppingVerbose::GetSilent()!=1) ) TrackBanner(); >> 88 >> 89 // Give SteppingManger the pointer to the track which will be tracked 79 fpSteppingManager->SetInitialStep(fpTrack); 90 fpSteppingManager->SetInitialStep(fpTrack); 80 91 81 // Pre tracking user intervention process << 92 // Pre tracking user intervention process. 82 << 93 fpTrajectory = 0; 83 fpTrajectory = nullptr; << 94 if( fpUserTrackingAction != NULL ) { 84 if (fpUserTrackingAction != nullptr) { << 95 fpUserTrackingAction->PreUserTrackingAction(fpTrack); 85 fpUserTrackingAction->PreUserTrackingActio << 86 } 96 } 87 << 88 // we need this to scope the G4Track::Profil << 89 // the PreUserTrackingAction and PostUserTra << 90 { << 91 #ifdef G4_STORE_TRAJECTORY 97 #ifdef G4_STORE_TRAJECTORY 92 // Construct a trajectory if it is request << 98 // Construct a trajectory if it is requested 93 // << 99 if(StoreTrajectory&&(!fpTrajectory)) { 94 if ((StoreTrajectory != 0) && (fpTrajector << 100 // default trajectory concrete class object 95 // default trajectory concrete class obj << 101 switch (StoreTrajectory) { 96 switch (StoreTrajectory) { << 102 default: 97 default: << 103 case 1: fpTrajectory = new G4Trajectory(fpTrack); break; 98 case 1: << 104 case 2: fpTrajectory = new G4SmoothTrajectory(fpTrack); break; 99 fpTrajectory = new G4Trajectory(fpTr << 105 case 3: fpTrajectory = new G4RichTrajectory(fpTrack); break; 100 break; << 101 case 2: << 102 fpTrajectory = new G4SmoothTrajector << 103 break; << 104 case 3: << 105 fpTrajectory = new G4RichTrajectory( << 106 break; << 107 case 4: << 108 fpTrajectory = new G4RichTrajectory( << 109 break; << 110 } << 111 } 106 } >> 107 } 112 #endif 108 #endif 113 109 114 // Give SteppingManger the maxmimum number << 110 // Give SteppingManger the maxmimum number of processes 115 fpSteppingManager->GetProcessNumber(); << 111 fpSteppingManager->GetProcessNumber(); 116 112 117 // Give track the pointer to the Step << 113 // Give track the pointer to the Step 118 fpTrack->SetStep(fpSteppingManager->GetSte << 114 fpTrack->SetStep(fpSteppingManager->GetStep()); 119 115 120 // Inform beginning of tracking to physics << 116 // Inform beginning of tracking to physics processes 121 fpTrack->GetDefinition()->GetProcessManage << 117 fpTrack->GetDefinition()->GetProcessManager()->StartTracking(fpTrack); 122 118 123 // Track the particle Step-by-Step while i << 119 // Track the particle Step-by-Step while it is alive 124 // << 120 G4StepStatus stepStatus; 125 while ((fpTrack->GetTrackStatus() == fAliv << 121 126 fpTrack->IncrementCurrentStepNumber(); << 122 while( (fpTrack->GetTrackStatus() == fAlive) || 127 fpSteppingManager->Stepping(); << 123 (fpTrack->GetTrackStatus() == fStopButAlive) ){ >> 124 >> 125 fpTrack->IncrementCurrentStepNumber(); >> 126 stepStatus = fpSteppingManager->Stepping(); 128 #ifdef G4_STORE_TRAJECTORY 127 #ifdef G4_STORE_TRAJECTORY 129 if (StoreTrajectory != 0) { << 128 if(StoreTrajectory) fpTrajectory-> 130 fpTrajectory->AppendStep(fpSteppingMan << 129 AppendStep(fpSteppingManager->GetStep()); 131 } << 132 #endif 130 #endif 133 if (EventIsAborted) { << 131 if(EventIsAborted) { 134 fpTrack->SetTrackStatus(fKillTrackAndS << 132 fpTrack->SetTrackStatus( fKillTrackAndSecondaries ); 135 } << 136 } 133 } 137 // Inform end of tracking to physics proce << 138 fpTrack->GetDefinition()->GetProcessManage << 139 } 134 } >> 135 // Inform end of tracking to physics processes >> 136 fpTrack->GetDefinition()->GetProcessManager()->EndTracking(); 140 137 141 // Post tracking user intervention process. 138 // Post tracking user intervention process. 142 if (fpUserTrackingAction != nullptr) { << 139 if( fpUserTrackingAction != NULL ) { 143 fpUserTrackingAction->PostUserTrackingActi << 140 fpUserTrackingAction->PostUserTrackingAction(fpTrack); 144 } 141 } 145 142 146 // Destruct the trajectory if it was created 143 // Destruct the trajectory if it was created 147 #ifdef G4VERBOSE 144 #ifdef G4VERBOSE 148 if ((StoreTrajectory != 0) && verboseLevel > << 145 if(StoreTrajectory&&verboseLevel>10) fpTrajectory->ShowTrajectory(); 149 fpTrajectory->ShowTrajectory(); << 150 } << 151 #endif 146 #endif 152 if ((StoreTrajectory == 0) && (fpTrajectory << 147 if( (!StoreTrajectory)&&fpTrajectory ) { 153 delete fpTrajectory; << 148 delete fpTrajectory; 154 fpTrajectory = nullptr; << 149 fpTrajectory = 0; 155 } 150 } 156 } 151 } 157 152 158 ////////////////////////////////////// << 159 void G4TrackingManager::SetTrajectory(G4VTraje 153 void G4TrackingManager::SetTrajectory(G4VTrajectory* aTrajectory) 160 ////////////////////////////////////// << 161 { 154 { 162 #ifndef G4_STORE_TRAJECTORY 155 #ifndef G4_STORE_TRAJECTORY 163 G4Exception("G4TrackingManager::SetTrajector << 156 G4Exception("G4TrackingManager::SetTrajectory is invoked without G4_STORE_TRAJECTORY compilor option"); 164 "Invoked without G4_STORE_TRAJECTORY optio << 165 #endif 157 #endif 166 fpTrajectory = aTrajectory; 158 fpTrajectory = aTrajectory; 167 } 159 } 168 160 169 ////////////////////////////////////// 161 ////////////////////////////////////// 170 void G4TrackingManager::EventAborted() 162 void G4TrackingManager::EventAborted() 171 ////////////////////////////////////// 163 ////////////////////////////////////// 172 { 164 { 173 fpTrack->SetTrackStatus(fKillTrackAndSeconda << 165 fpTrack->SetTrackStatus( fKillTrackAndSecondaries ); 174 EventIsAborted = true; 166 EventIsAborted = true; 175 } 167 } 176 168 177 ////////////////////////////////////// << 169 178 void G4TrackingManager::TrackBanner() 170 void G4TrackingManager::TrackBanner() 179 ////////////////////////////////////// << 180 { 171 { 181 G4cout << G4endl; << 172 G4cout << G4endl; 182 G4cout << "********************************* << 173 G4cout << "*******************************************************" 183 << "********************************* << 174 << "**************************************************" 184 G4cout << "* G4Track Information: " << 175 << G4endl; 185 << " Particle = " << fpTrack->GetDef << 176 G4cout << "* G4Track Information: " 186 << " Track ID = " << fpTrack->GetTr << 177 << " Particle = " << fpTrack->GetDefinition()->GetParticleName() 187 << " Parent ID = " << fpTrack->GetP << 178 << "," 188 G4cout << "********************************* << 179 << " Track ID = " << fpTrack->GetTrackID() 189 << "********************************* << 180 << "," 190 G4cout << G4endl; << 181 << " Parent ID = " << fpTrack->GetParentID() >> 182 << G4endl; >> 183 G4cout << "*******************************************************" >> 184 << "**************************************************" >> 185 << G4endl; >> 186 G4cout << G4endl; 191 } 187 } 192 188 193 ////////////////////////////////////// << 189 194 void G4TrackingManager::SetStoreTrajectory(G4i << 190 195 ////////////////////////////////////// << 191 196 { << 192 197 StoreTrajectory = value; << 193 198 } << 199 194 200 195