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 // 27 /// \file ITTrackingInteractivity.hh 28 /// \brief Implementation of the ITTrackingInteractivity class 29 30 #include "ITTrackingInteractivity.hh" 31 32 #include "G4Event.hh" 33 #include "G4EventManager.hh" 34 #include "G4IT.hh" 35 #include "G4RichTrajectory.hh" 36 #include "G4SmoothTrajectory.hh" 37 #include "G4TrackingInformation.hh" 38 #include "G4Trajectory.hh" 39 #include "G4VSteppingVerbose.hh" 40 #include "G4VTrajectory.hh" 41 #include "G4VisManager.hh" 42 43 class G4Trajectory_Lock 44 { 45 friend class ITTrackingInteractivity; 46 G4Trajectory_Lock() : fpTrajectory(0) { ; } 47 48 ~G4Trajectory_Lock() { ; } 49 50 G4VTrajectory* fpTrajectory; 51 }; 52 53 ITTrackingInteractivity::ITTrackingInteractivity() 54 : G4ITTrackingInteractivity(), fStoreTrajectory(0) 55 { 56 fpUserTrackingAction.reset( 57 G4EventManager::GetEventManager()->GetTrackingManager()->GetUserTrackingAction()); 58 } 59 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 61 62 ITTrackingInteractivity::~ITTrackingInteractivity() {} 63 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 65 66 void ITTrackingInteractivity::Initialize() 67 { 68 G4TrackingManager* trackingManager = G4EventManager::GetEventManager()->GetTrackingManager(); 69 fStoreTrajectory = trackingManager->GetStoreTrajectory(); 70 fVerboseLevel = trackingManager->GetVerboseLevel(); 71 } 72 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 74 75 void ITTrackingInteractivity::StartTracking(G4Track* track) 76 { 77 #ifdef G4VERBOSE 78 if (fVerboseLevel) { 79 TrackBanner(track, "G4ITTrackingManager::StartTracking : "); 80 } 81 #endif 82 83 if (fVerboseLevel > 0 && (G4VSteppingVerbose::GetSilent() != 1)) { 84 TrackBanner(track); 85 } 86 if (fpUserTrackingAction != nullptr) { 87 fpUserTrackingAction->PreUserTrackingAction(track); 88 } 89 90 G4TrackingInformation* trackingInfo = GetIT(track)->GetTrackingInfo(); 91 G4Trajectory_Lock* trajectory_lock = trackingInfo->GetTrajectory_Lock(); 92 93 if (fStoreTrajectory && (!trajectory_lock)) { 94 trajectory_lock = new G4Trajectory_Lock(); 95 trackingInfo->SetTrajectory_Lock(trajectory_lock); 96 G4VTrajectory* trajectory = 0; 97 switch (fStoreTrajectory) { 98 default: 99 case 1: 100 trajectory = new G4Trajectory(track); 101 break; 102 case 2: 103 trajectory = new G4SmoothTrajectory(track); 104 break; 105 case 3: 106 trajectory = new G4RichTrajectory(track); 107 break; 108 } 109 trajectory_lock->fpTrajectory = trajectory; 110 } 111 } 112 113 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 114 115 void ITTrackingInteractivity::AppendStep(G4Track* track, G4Step* step) 116 { 117 if (fpUserSteppingAction != nullptr) { 118 fpUserSteppingAction->UserSteppingAction(step); 119 } 120 121 if (fStoreTrajectory) { 122 G4TrackingInformation* trackingInfo = GetIT(track)->GetTrackingInfo(); 123 G4Trajectory_Lock* trajectory_lock = trackingInfo->GetTrajectory_Lock(); 124 trajectory_lock->fpTrajectory->AppendStep(step); 125 } 126 } 127 128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 129 130 void ITTrackingInteractivity::EndTracking(G4Track* track) 131 { 132 #ifdef G4VERBOSE 133 if (fVerboseLevel) { 134 TrackBanner(track, "G4ITTrackingManager::EndTracking : "); 135 } 136 #endif 137 if (fpUserTrackingAction != nullptr) { 138 fpUserTrackingAction->PostUserTrackingAction(track); 139 } 140 G4TrackingInformation* trackingInfo = GetIT(track)->GetTrackingInfo(); 141 G4Trajectory_Lock* trajectory_lock = trackingInfo->GetTrajectory_Lock(); 142 143 if (trajectory_lock) { 144 G4VTrajectory*& trajectory = trajectory_lock->fpTrajectory; 145 146 if (fStoreTrajectory && trajectory) { 147 #ifdef G4VERBOSE 148 if (fVerboseLevel > 10) { 149 trajectory->ShowTrajectory(); 150 } 151 #endif 152 G4TrackStatus istop = track->GetTrackStatus(); 153 154 if (trajectory && (istop != fStopButAlive) && (istop != fSuspend)) { 155 G4Event* currentEvent = G4EventManager::GetEventManager()->GetNonconstCurrentEvent(); 156 if (currentEvent != nullptr) { 157 G4TrajectoryContainer* trajectoryContainer = currentEvent->GetTrajectoryContainer(); 158 if (!trajectoryContainer) { 159 trajectoryContainer = new G4TrajectoryContainer; 160 currentEvent->SetTrajectoryContainer(trajectoryContainer); 161 } 162 trajectoryContainer->insert(trajectory); 163 } 164 else { 165 fTrajectories.push_back(trajectory); 166 } 167 } 168 } 169 else if ((!fStoreTrajectory) && trajectory) { 170 delete trajectory; 171 trajectory = nullptr; 172 } 173 delete trajectory_lock; 174 trackingInfo->SetTrajectory_Lock(0); 175 } 176 } 177 178 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 179 180 void ITTrackingInteractivity::Finalize() 181 { 182 for (std::vector<G4VTrajectory*>::iterator it = fTrajectories.begin(); it != fTrajectories.end(); 183 it++) 184 { 185 G4VisManager::GetConcreteInstance()->Draw(**it); 186 } 187 } 188