source: trunk/source/track/src/G4Track.cc@ 1251

Last change on this file since 1251 was 1196, checked in by garnier, 16 years ago

update CVS release candidate geant4.9.3.01

File size: 7.2 KB
Line 
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// $Id: G4Track.cc,v 1.32 2009/04/08 08:07:24 kurasige Exp $
28// GEANT4 tag $Name: geant4-09-03-cand-01 $
29//
30//
31//---------------------------------------------------------------
32//
33// G4Track.cc
34//
35//---------------------------------------------------------------
36// Add copy constructor Hisaya Feb. 07 01
37// Fix GetVelocity Hisaya Feb. 17 01
38// Modification for G4TouchableHandle 22 Oct. 2001 R.Chytracek//
39// Fix GetVelocity (bug report #741) Horton-Smith Apr 14 2005
40// Remove massless check in GetVelocity 02 Apr. 09 H.Kurashige
41
42#include "G4Track.hh"
43
44G4Allocator<G4Track> aTrackAllocator;
45
46///////////////////////////////////////////////////////////
47G4Track::G4Track(G4DynamicParticle* apValueDynamicParticle,
48 G4double aValueTime,
49 const G4ThreeVector& aValuePosition)
50///////////////////////////////////////////////////////////
51 : fCurrentStepNumber(0), fPosition(aValuePosition),
52 fGlobalTime(aValueTime), fLocalTime(0.),
53 fTrackLength(0.),
54 fParentID(0), fTrackID(0),
55 fpDynamicParticle(apValueDynamicParticle),
56 fTrackStatus(fAlive),
57 fBelowThreshold(false), fGoodForTracking(false),
58 fStepLength(0.0), fWeight(1.0),
59 fpStep(0),
60 fVtxKineticEnergy(0.0),
61 fpLVAtVertex(0), fpCreatorProcess(0),
62 fpUserInformation(0)
63{
64}
65
66//////////////////
67G4Track::G4Track()
68//////////////////
69 : fCurrentStepNumber(0),
70 fGlobalTime(0), fLocalTime(0.),
71 fTrackLength(0.),
72 fParentID(0), fTrackID(0),
73 fpDynamicParticle(0),
74 fTrackStatus(fAlive),
75 fBelowThreshold(false), fGoodForTracking(false),
76 fStepLength(0.0), fWeight(1.0),
77 fpStep(0),
78 fVtxKineticEnergy(0.0),
79 fpLVAtVertex(0), fpCreatorProcess(0),
80 fpUserInformation(0)
81{
82}
83//////////////////
84G4Track::G4Track(const G4Track& right)
85//////////////////
86{
87 *this = right;
88}
89
90///////////////////
91G4Track::~G4Track()
92///////////////////
93{
94 delete fpDynamicParticle;
95 delete fpUserInformation;
96}
97
98//////////////////
99G4Track & G4Track::operator=(const G4Track &right)
100//////////////////
101{
102 if (this != &right) {
103 fPosition = right.fPosition;
104 fGlobalTime = right.fGlobalTime;
105 fLocalTime = right.fLocalTime;
106 fTrackLength = right.fTrackLength;
107 fWeight = right.fWeight;
108 fStepLength = right.fStepLength;
109
110 // Track ID (and Parent ID) is not copied and set to zero for new track
111 fTrackID = 0;
112 fParentID =0;
113
114 // CurrentStepNumber is set to be 0
115 fCurrentStepNumber = 0;
116
117 // dynamic particle information
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=0;
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 = 0;
137 fpUserInformation = 0;
138 }
139 return *this;
140}
141
142///////////////////
143void G4Track::CopyTrackInfo(const G4Track& right)
144//////////////////
145{
146 *this = right;
147}
148
149#include "G4ParticleTable.hh"
150///////////////////
151G4double G4Track::GetVelocity() const
152///////////////////
153{
154 static G4bool isFirstTime = true;
155 static G4ParticleDefinition* fOpticalPhoton =0;
156
157 static G4Material* prev_mat =0;
158 static G4MaterialPropertyVector* groupvel =0;
159 static G4double prev_velocity =0;
160 static G4double prev_momentum =0;
161
162
163 if ( isFirstTime ) {
164 isFirstTime = false;
165 // set fOpticalPhoton
166 fOpticalPhoton = G4ParticleTable::GetParticleTable()->FindParticle("opticalphoton");
167 }
168
169 G4double velocity ;
170
171 G4double mass = fpDynamicParticle->GetMass();
172
173 velocity = c_light ;
174
175 // special case for photons
176 if ( (fOpticalPhoton !=0) &&
177 (fpDynamicParticle->GetDefinition()==fOpticalPhoton) ){
178
179 G4Material* mat=0;
180 G4bool update_groupvel = false;
181 if ( this->GetStep() ){
182 mat= this->GetMaterial(); // Fix for repeated volumes
183 }else{
184 if (fpTouchable!=0){
185 mat=fpTouchable->GetVolume()->GetLogicalVolume()->GetMaterial();
186 }
187 }
188 // check if previous step is in the same volume
189 // and get new GROUPVELOVITY table if necessary
190 if ((mat != prev_mat)||(groupvel==0)) {
191 groupvel = 0;
192 if(mat->GetMaterialPropertiesTable() != 0)
193 groupvel = mat->GetMaterialPropertiesTable()->GetProperty("GROUPVEL");
194 update_groupvel = true;
195 }
196 prev_mat = mat;
197
198 if (groupvel != 0 ) {
199 // light velocity = c/(rindex+d(rindex)/d(log(E_phot)))
200 // values stored in GROUPVEL material properties vector
201 velocity = prev_velocity;
202
203 // check if momentum is same as in the previous step
204 // and calculate group velocity if necessary
205 if( update_groupvel || (fpDynamicParticle->GetTotalMomentum() != prev_momentum) ) {
206 velocity =
207 groupvel->GetProperty(fpDynamicParticle->GetTotalMomentum());
208 prev_velocity = velocity;
209 prev_momentum = fpDynamicParticle->GetTotalMomentum();
210 }
211 }
212
213 } else {
214 if (mass<DBL_MIN) {
215 velocity = c_light;
216 } else {
217 G4double T = fpDynamicParticle->GetKineticEnergy();
218 velocity = c_light*std::sqrt(T*(T+2.*mass))/(T+mass);
219 }
220 }
221
222 return velocity ;
223}
Note: See TracBrowser for help on using the repository browser.