Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // This example is provided by the Geant4-DNA collaboration 27 // Any report or published results obtained using the Geant4-DNA software 28 // shall cite the following Geant4-DNA collaboration publication: 29 // Med. Phys. 37 (2010) 4692-4708 30 // and papers 31 // M. Batmunkh et al. J Radiat Res Appl Sci 8 (2015) 498-507 32 // O. Belov et al. Physica Medica 32 (2016) 1510-1520 33 // The Geant4-DNA web site is available at http://geant4-dna.org 34 // 35 // ------------------------------------------------------------------- 36 // November 2016 37 // ------------------------------------------------------------------- 38 // 39 // 40 /// \file ITTrackingInteractivity.hh 41 /// \brief Implementation of the ITTrackingInteractivity class 42 43 #include "ITTrackingInteractivity.hh" 44 45 #include "G4Event.hh" 46 #include "G4EventManager.hh" 47 #include "G4IT.hh" 48 #include "G4RichTrajectory.hh" 49 #include "G4SmoothTrajectory.hh" 50 #include "G4TrackingInformation.hh" 51 #include "G4Trajectory.hh" 52 #include "G4UserSteppingAction.hh" 53 #include "G4UserTrackingAction.hh" 54 #include "G4VSteppingVerbose.hh" 55 #include "G4VTrajectory.hh" 56 #include "G4VisManager.hh" 57 58 class G4Trajectory_Lock 59 { 60 friend class ITTrackingInteractivity; 61 62 G4Trajectory_Lock() : fpTrajectory(0) { ; } 63 64 ~G4Trajectory_Lock() { ; } 65 66 G4VTrajectory* fpTrajectory; 67 }; 68 69 ITTrackingInteractivity::ITTrackingInteractivity() 70 { 71 fStoreTrajectory = 0; 72 fVerboseLevel = 0; 73 74 fpUserTrackingAction = 0; 75 fpUserSteppingAction = 0; 76 77 //////////////////////////// 78 // In case you want to use same tracking/stepping action 79 // for normal and IT stepping 80 /* 81 fpUserTrackingAction = 82 trackingManager->GetUserTrackingAction(); 83 fpUserSteppingAction = 84 G4EventManager::GetEventManager()->GetUserSteppingAction(); 85 */ 86 //////////////////////////// 87 } 88 89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 91 ITTrackingInteractivity::~ITTrackingInteractivity() 92 { 93 G4EventManager* eventManager = G4EventManager::GetEventManager(); 94 95 if (eventManager) { 96 G4UserTrackingAction* std_trackAct = eventManager->GetUserTrackingAction(); 97 if (fpUserTrackingAction != std_trackAct && fpUserTrackingAction) delete fpUserTrackingAction; 98 99 G4UserSteppingAction* std_stepAct = eventManager->GetUserSteppingAction(); 100 if (fpUserSteppingAction != std_stepAct && fpUserSteppingAction) delete fpUserSteppingAction; 101 } 102 else { 103 if (fpUserSteppingAction) { 104 delete fpUserSteppingAction; 105 } 106 107 if (fpUserTrackingAction) { 108 delete fpUserTrackingAction; 109 } 110 } 111 } 112 113 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 114 115 void ITTrackingInteractivity::Initialize() 116 { 117 G4TrackingManager* trackingManager = G4EventManager::GetEventManager()->GetTrackingManager(); 118 fStoreTrajectory = trackingManager->GetStoreTrajectory(); 119 fVerboseLevel = trackingManager->GetVerboseLevel(); 120 } 121 122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 123 124 void ITTrackingInteractivity::StartTracking(G4Track* track) 125 { 126 #ifdef G4VERBOSE 127 if (fVerboseLevel) { 128 TrackBanner(track, "G4ITTrackingManager::StartTracking : "); 129 } 130 #endif 131 132 if (fVerboseLevel > 0 && (G4VSteppingVerbose::GetSilent() != 1)) TrackBanner(track); 133 134 // Pre tracking user intervention process. 135 if (fpUserTrackingAction != 0) { 136 fpUserTrackingAction->PreUserTrackingAction(track); 137 } 138 // #ifdef G4_STORE_TRAJECTORY 139 G4TrackingInformation* trackingInfo = GetIT(track)->GetTrackingInfo(); 140 G4Trajectory_Lock* trajectory_lock = trackingInfo->GetTrajectory_Lock(); 141 142 // Construct a trajectory if it is requested 143 if (fStoreTrajectory && (!trajectory_lock)) { 144 trajectory_lock = new G4Trajectory_Lock(); 145 trackingInfo->SetTrajectory_Lock(trajectory_lock); 146 G4VTrajectory* trajectory = 0; 147 // default trajectory concrete class object 148 switch (fStoreTrajectory) { 149 default: 150 case 1: 151 trajectory = new G4Trajectory(track); 152 break; 153 case 2: 154 trajectory = new G4SmoothTrajectory(track); 155 break; 156 case 3: 157 trajectory = new G4RichTrajectory(track); 158 break; 159 } 160 trajectory_lock->fpTrajectory = trajectory; 161 } 162 // #endif 163 } 164 165 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 166 167 void ITTrackingInteractivity::AppendStep(G4Track* track, G4Step* step) 168 { 169 //////////////////////////// 170 // If you want to use sensitive detector 171 /* 172 G4VPhysicalVolume* currentVolume = 173 step->GetPreStepPoint()->GetPhysicalVolume(); 174 G4SteppingControl stepControlFlag = step->GetControlFlag(); 175 176 if( currentVolume != 0 && stepControlFlag != AvoidHitInvocation) 177 { 178 G4VSensitiveDetector* sensitive = step->GetPreStepPoint()-> 179 GetSensitiveDetector(); 180 if( sensitive != 0 ) 181 { 182 sensitive->Hit(fpStep); 183 } 184 } 185 */ 186 //////////////////////////// 187 188 if (fpUserSteppingAction) fpUserSteppingAction->UserSteppingAction(step); 189 190 //////////////////////////// 191 // If you want to use regional stepping action 192 /* 193 G4UserSteppingAction* regionalAction 194 = fpStep->GetPreStepPoint()->GetPhysicalVolume()-> 195 GetLogicalVolume()->GetRegion()-> 196 GetRegionalSteppingAction(); 197 if( regionalAction ) regionalAction->UserSteppingAction(fpStep); 198 */ 199 //////////////////////////// 200 201 if (fStoreTrajectory) { 202 G4TrackingInformation* trackingInfo = GetIT(track)->GetTrackingInfo(); 203 G4Trajectory_Lock* trajectory_lock = trackingInfo->GetTrajectory_Lock(); 204 trajectory_lock->fpTrajectory->AppendStep(step); 205 } 206 } 207 208 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 209 210 void ITTrackingInteractivity::EndTracking(G4Track* track) 211 { 212 #ifdef G4VERBOSE 213 if (fVerboseLevel) { 214 TrackBanner(track, "G4ITTrackingManager::EndTracking : "); 215 } 216 #endif 217 // Post tracking user intervention process. 218 if (fpUserTrackingAction != 0) { 219 fpUserTrackingAction->PostUserTrackingAction(track); 220 } 221 222 // #ifdef G4_STORE_TRAJECTORY 223 G4TrackingInformation* trackingInfo = GetIT(track)->GetTrackingInfo(); 224 G4Trajectory_Lock* trajectory_lock = trackingInfo->GetTrajectory_Lock(); 225 226 if (trajectory_lock) { 227 G4VTrajectory*& trajectory = trajectory_lock->fpTrajectory; 228 229 if (fStoreTrajectory && trajectory) { 230 #ifdef G4VERBOSE 231 if (fVerboseLevel > 10) trajectory->ShowTrajectory(); 232 #endif 233 G4TrackStatus istop = track->GetTrackStatus(); 234 235 if (trajectory && (istop != fStopButAlive) && (istop != fSuspend)) { 236 G4Event* currentEvent = G4EventManager::GetEventManager()->GetNonconstCurrentEvent(); 237 238 if (currentEvent) { 239 G4TrajectoryContainer* trajectoryContainer = currentEvent->GetTrajectoryContainer(); 240 241 if (!trajectoryContainer) { 242 trajectoryContainer = new G4TrajectoryContainer; 243 currentEvent->SetTrajectoryContainer(trajectoryContainer); 244 } 245 trajectoryContainer->insert(trajectory); 246 } 247 else { 248 fTrajectories.push_back(trajectory); 249 } 250 } 251 } 252 // Destruct the trajectory if it was created 253 else if ((!fStoreTrajectory) && trajectory) { 254 delete trajectory; 255 trajectory = 0; 256 } 257 delete trajectory_lock; 258 trackingInfo->SetTrajectory_Lock(0); 259 } 260 // #endif 261 } 262 263 void ITTrackingInteractivity::Finalize() 264 { 265 for (std::vector<G4VTrajectory*>::iterator it = fTrajectories.begin(); it != fTrajectories.end(); 266 it++) 267 { 268 G4VisManager::GetConcreteInstance()->Draw(**it); 269 } 270 } 271