Geant4 11.3.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4TrackingManager.cc
Go to the documentation of this file.
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// G4TrackingManager class implementation
27//
28// Contact:
29// Questions and comments to this code should be sent to
30// Katsuya Amako (e-mail: [email protected])
31// Takashi Sasaki (e-mail: [email protected])
32// --------------------------------------------------------------------
33
34#include "G4TrackingManager.hh"
35
36#include "G4Trajectory.hh"
37#include "G4RichTrajectory.hh"
38#include "G4SmoothTrajectory.hh"
39#include "G4ios.hh"
40
41//////////////////////////////////////
43//////////////////////////////////////
44{
45 messenger = new G4TrackingMessenger(this);
46 fpSteppingManager = new G4SteppingManager();
47}
48
49///////////////////////////////////////
51///////////////////////////////////////
52{
53 delete messenger;
54 delete fpSteppingManager;
55 delete fpUserTrackingAction;
56}
57
58////////////////////////////////////////////////////////////////
60////////////////////////////////////////////////////////////////
61{
62 // Receiving a G4Track from the EventManager, this funciton has the
63 // responsibility to trace the track till it stops
64
65 fpTrack = apValueG4Track;
66 EventIsAborted = false;
67
68 // Clear secondary particle vector
69 //
70 for (auto& itr : *GimmeSecondaries()) {
71 delete itr;
72 }
73 GimmeSecondaries()->clear();
74
75 if (verboseLevel > 0 && (G4VSteppingVerbose::GetSilent() != 1)) TrackBanner();
76
77 // Give SteppingManger the pointer to the track which will be tracked
78 //
79 fpSteppingManager->SetInitialStep(fpTrack);
80
81 // Pre tracking user intervention process
82
83 fpTrajectory = nullptr;
84 if (fpUserTrackingAction != nullptr) {
85 fpUserTrackingAction->PreUserTrackingAction(fpTrack);
86 }
87
88 // we need this to scope the G4Track::ProfilerConfig b/t
89 // the PreUserTrackingAction and PostUserTrackingAction
90 {
91#ifdef G4_STORE_TRAJECTORY
92 // Construct a trajectory if it is requested
93 //
94 if ((StoreTrajectory != 0) && (fpTrajectory == nullptr)) {
95 // default trajectory concrete class object
96 switch (StoreTrajectory) {
97 default:
98 case 1:
99 fpTrajectory = new G4Trajectory(fpTrack);
100 break;
101 case 2:
102 fpTrajectory = new G4SmoothTrajectory(fpTrack);
103 break;
104 case 3:
105 fpTrajectory = new G4RichTrajectory(fpTrack);
106 break;
107 case 4:
108 fpTrajectory = new G4RichTrajectory(fpTrack);
109 break;
110 }
111 }
112#endif
113
114 // Give SteppingManger the maxmimum number of processes
115 fpSteppingManager->GetProcessNumber();
116
117 // Give track the pointer to the Step
118 fpTrack->SetStep(fpSteppingManager->GetStep());
119
120 // Inform beginning of tracking to physics processes
121 fpTrack->GetDefinition()->GetProcessManager()->StartTracking(fpTrack);
122
123 // Track the particle Step-by-Step while it is alive
124 //
125 while ((fpTrack->GetTrackStatus() == fAlive) || (fpTrack->GetTrackStatus() == fStopButAlive)) {
126 fpTrack->IncrementCurrentStepNumber();
127 fpSteppingManager->Stepping();
128#ifdef G4_STORE_TRAJECTORY
129 if (StoreTrajectory != 0) {
130 fpTrajectory->AppendStep(fpSteppingManager->GetStep());
131 }
132#endif
133 if (EventIsAborted) {
134 fpTrack->SetTrackStatus(fKillTrackAndSecondaries);
135 }
136 }
137 // Inform end of tracking to physics processes
138 fpTrack->GetDefinition()->GetProcessManager()->EndTracking();
139 }
140
141 // Post tracking user intervention process.
142 if (fpUserTrackingAction != nullptr) {
143 fpUserTrackingAction->PostUserTrackingAction(fpTrack);
144 }
145
146 // Destruct the trajectory if it was created
147#ifdef G4VERBOSE
148 if ((StoreTrajectory != 0) && verboseLevel > 10) {
149 fpTrajectory->ShowTrajectory();
150 }
151#endif
152 if ((StoreTrajectory == 0) && (fpTrajectory != nullptr)) {
153 delete fpTrajectory;
154 fpTrajectory = nullptr;
155 }
156}
157
158//////////////////////////////////////
160//////////////////////////////////////
161{
162#ifndef G4_STORE_TRAJECTORY
163 G4Exception("G4TrackingManager::SetTrajectory()", "Tracking0015", FatalException,
164 "Invoked without G4_STORE_TRAJECTORY option set!");
165#endif
166 fpTrajectory = aTrajectory;
167}
168
169//////////////////////////////////////
171//////////////////////////////////////
172{
173 fpTrack->SetTrackStatus(fKillTrackAndSecondaries);
174 EventIsAborted = true;
175}
176
177//////////////////////////////////////
178void G4TrackingManager::TrackBanner()
179//////////////////////////////////////
180{
181 G4cout << G4endl;
182 G4cout << "*******************************************************"
183 << "**************************************************" << G4endl;
184 G4cout << "* G4Track Information: "
185 << " Particle = " << fpTrack->GetDefinition()->GetParticleName() << ","
186 << " Track ID = " << fpTrack->GetTrackID() << ","
187 << " Parent ID = " << fpTrack->GetParentID() << G4endl;
188 G4cout << "*******************************************************"
189 << "**************************************************" << G4endl;
190 G4cout << G4endl;
191}
192
193//////////////////////////////////////
195//////////////////////////////////////
196{
197 StoreTrajectory = value;
198}
199
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
@ fKillTrackAndSecondaries
@ fAlive
@ fStopButAlive
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
const G4String & GetParticleName() const
G4int GetTrackID() const
G4ParticleDefinition * GetDefinition() const
G4int GetParentID() const
G4TrackVector * GimmeSecondaries() const
void SetStoreTrajectory(G4int value)
void ProcessOneTrack(G4Track *apValueG4Track)
void SetTrajectory(G4VTrajectory *aTrajectory)