Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Track.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// G4Track class implementation
27//
28// Author: Katsuya Amako, KEK - 1996
29// Revisions: Hisaya Kurashige, 1998-2011
30// --------------------------------------------------------------------
31
32#include "G4Track.hh"
35
36#include <iostream>
37#include <iomanip>
38
39// --------------------------------------------------------------------
41{
42 G4ThreadLocalStatic G4Allocator<G4Track>* _instance = nullptr;
43 return _instance;
44}
45
46// --------------------------------------------------------------------
47G4Track::G4Track(G4DynamicParticle* apValueDynamicParticle,
48 G4double aValueTime,
49 const G4ThreeVector& aValuePosition)
50 : fPosition(aValuePosition)
51 , fGlobalTime(aValueTime)
52 , fVelocity(c_light)
53{
54 fpDynamicParticle = (apValueDynamicParticle) != nullptr
55 ? apValueDynamicParticle : new G4DynamicParticle();
56 // check if the particle type is Optical Photon
57 is_OpticalPhoton =
58 (fpDynamicParticle->GetDefinition()->GetPDGEncoding() == -22);
59}
60
61// --------------------------------------------------------------------
63 : fVelocity(c_light)
64 , fpDynamicParticle(new G4DynamicParticle())
65{}
66
67// --------------------------------------------------------------------
69 : fVelocity(c_light)
70{
71 *this = right;
72}
73
74// --------------------------------------------------------------------
76{
77 delete fpDynamicParticle;
78 delete fpUserInformation;
79 ClearAuxiliaryTrackInformation();
80}
81
82// --------------------------------------------------------------------
84{
85 if(this != &right)
86 {
87 fPosition = right.fPosition;
88 fGlobalTime = right.fGlobalTime;
89 fLocalTime = right.fLocalTime;
90 fTrackLength = right.fTrackLength;
91 fWeight = right.fWeight;
92 fStepLength = right.fStepLength;
93
94 // additional fields required for geometrical splitting
95 fpTouchable = right.fpTouchable;
96 fpNextTouchable = right.fpNextTouchable;
97 fpOriginTouchable = right.fpOriginTouchable;
98
99 // Track ID (and Parent ID) is not copied and set to zero for new track
100 fTrackID = 0;
101 fParentID = 0;
102
103 // CurrentStepNumber is set to be 0
104 fCurrentStepNumber = 0;
105
106 // Creator model ID
107 fCreatorModelID = right.fCreatorModelID;
108
109 // Parent resonance
110 fParentResonanceDef = right.fParentResonanceDef;
111 fParentResonanceID = right.fParentResonanceID;
112
113 // velocity information
114 fVelocity = right.fVelocity;
115
116 // dynamic particle information
117 delete fpDynamicParticle;
118 fpDynamicParticle = new G4DynamicParticle(*(right.fpDynamicParticle));
119
120 // track status and flags for tracking
121 fTrackStatus = right.fTrackStatus;
122 fBelowThreshold = right.fBelowThreshold;
123 fGoodForTracking = right.fGoodForTracking;
124
125 // Step information (Step Length, Step Number, pointer to the Step,)
126 // are not copied
127 fpStep = nullptr;
128
129 // vertex information
130 fVtxPosition = right.fVtxPosition;
131 fpLVAtVertex = right.fpLVAtVertex;
132 fVtxKineticEnergy = right.fVtxKineticEnergy;
133 fVtxMomentumDirection = right.fVtxMomentumDirection;
134
135 // CreatorProcess and UserInformation are not copied
136 fpCreatorProcess = nullptr;
137 delete fpUserInformation;
138 fpUserInformation = nullptr;
139
140 prev_mat = right.prev_mat;
141 groupvel = right.groupvel;
142 prev_velocity = right.prev_velocity;
143 prev_momentum = right.prev_momentum;
144
145 is_OpticalPhoton = right.is_OpticalPhoton;
146 useGivenVelocity = right.useGivenVelocity;
147
148 ClearAuxiliaryTrackInformation();
149 }
150 return *this;
151}
152
153// --------------------------------------------------------------------
155{
156 *this = right;
157}
158
159// --------------------------------------------------------------------
161{
162 G4double velocity = c_light;
163
164 G4Material* mat = nullptr;
165 G4bool update_groupvel = false;
166 if(fpStep != nullptr)
167 {
168 mat = this->GetMaterial(); // Fix for repeated volumes
169 }
170 else
171 {
172 if(fpTouchable)
173 {
174 mat = fpTouchable->GetVolume()->GetLogicalVolume()->GetMaterial();
175 }
176 }
177 // check if previous step is in the same volume
178 // and get new GROUPVELOCITY table if necessary
179 if((mat != nullptr) && ((mat != prev_mat) || (groupvel == nullptr)))
180 {
181 groupvel = nullptr;
182 if(mat->GetMaterialPropertiesTable() != nullptr)
184 update_groupvel = true;
185 }
186 prev_mat = mat;
187
188 if(groupvel != nullptr)
189 {
190 // light velocity = c/(rindex+d(rindex)/d(log(E_phot)))
191 // values stored in GROUPVEL material properties vector
192 velocity = prev_velocity;
193
194 // check if momentum is same as in the previous step
195 // and calculate group velocity if necessary
196 G4double current_momentum = fpDynamicParticle->GetTotalMomentum();
197 if(update_groupvel || (current_momentum != prev_momentum))
198 {
199 velocity = groupvel->Value(current_momentum);
200 prev_velocity = velocity;
201 prev_momentum = current_momentum;
202 }
203 }
204
205 return velocity;
206}
207
208// --------------------------------------------------------------------
211{
212 if(fpAuxiliaryTrackInformationMap == nullptr)
213 {
214 fpAuxiliaryTrackInformationMap =
215 new std::map<G4int, G4VAuxiliaryTrackInformation*>;
216 }
218 {
220 ED << "Process/model ID <" << id << "> is invalid.";
221 G4Exception("G4VAuxiliaryTrackInformation::G4VAuxiliaryTrackInformation()",
222 "TRACK0982", FatalException, ED);
223 }
224 (*fpAuxiliaryTrackInformationMap)[id] = info;
225}
226
227// --------------------------------------------------------------------
230{
231 if(fpAuxiliaryTrackInformationMap == nullptr)
232 return nullptr;
233
234 auto itr = fpAuxiliaryTrackInformationMap->find(id);
235 if(itr == fpAuxiliaryTrackInformationMap->cend())
236 return nullptr;
237 return (*itr).second;
238}
239
240// --------------------------------------------------------------------
242{
243 if(fpAuxiliaryTrackInformationMap != nullptr &&
244 fpAuxiliaryTrackInformationMap->find(id) != fpAuxiliaryTrackInformationMap->cend())
245 {
246 fpAuxiliaryTrackInformationMap->erase(id);
247 }
248}
249
250// --------------------------------------------------------------------
252{
253 if(fpAuxiliaryTrackInformationMap != nullptr)
254 {
257 }
258}
259
260// --------------------------------------------------------------------
261void G4Track::ClearAuxiliaryTrackInformation()
262{
263 if(fpAuxiliaryTrackInformationMap == nullptr)
264 return;
265 for(const auto& itr : *fpAuxiliaryTrackInformationMap)
266 {
267 delete itr.second;
268 }
269 delete fpAuxiliaryTrackInformationMap;
270 fpAuxiliaryTrackInformationMap = nullptr;
271}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
G4Allocator< G4Track > *& aTrackAllocator()
Definition: G4Track.cc:40
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4ParticleDefinition * GetDefinition() const
G4double GetTotalMomentum() const
G4Material * GetMaterial() const
G4MaterialPropertyVector * GetProperty(const char *key) const
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
Definition: G4Material.hh:251
static G4int GetModelIndex(const G4int modelID)
static G4int GetModelID(const G4int modelIndex)
G4double Value(const G4double energy, std::size_t &lastidx) const
G4double CalculateVelocityForOpticalPhoton() const
Definition: G4Track.cc:160
void SetAuxiliaryTrackInformation(G4int id, G4VAuxiliaryTrackInformation *info) const
Definition: G4Track.cc:209
void CopyTrackInfo(const G4Track &)
Definition: G4Track.cc:154
void RemoveAuxiliaryTrackInformation(G4int id)
Definition: G4Track.cc:241
G4VAuxiliaryTrackInformation * GetAuxiliaryTrackInformation(G4int id) const
Definition: G4Track.cc:229
G4Material * GetMaterial() const
G4Track()
Definition: G4Track.cc:62
G4Track & operator=(const G4Track &)
Definition: G4Track.cc:83
~G4Track()
Definition: G4Track.cc:75
G4LogicalVolume * GetLogicalVolume() const
virtual G4VPhysicalVolume * GetVolume(G4int depth=0) const
Definition: G4VTouchable.cc:34
#define G4ThreadLocalStatic
Definition: tls.hh:76