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
G4ReactionProduct.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// J.L. Chuma, TRIUMF, 31-Oct-1996
27// last modified: 19-Dec-1996
28// Modified by J.L.Chuma, 05-May-97
29// M. Kelsey 29-Aug-2011 -- Use G4Allocator for better memory management
30
31#include "G4ReactionProduct.hh"
32
34{
36 return _instance;
37}
38
40 theParticleDefinition(NULL),
41 formationTime(0.0),
42 hasInitialStateParton(false),
43 mass(0.0),
44 totalEnergy(0.0),
45 kineticEnergy(0.0),
46 timeOfFlight(0.0),
47 side(0),
48 theCreatorModel(-1),
49 theParentResonanceDef(nullptr),
50 theParentResonanceID(0),
51 NewlyAdded(false),
52 MayBeKilled(true)
53 {
54 SetMomentum( 0.0, 0.0, 0.0 );
55 SetPositionInNucleus( 0.0, 0.0, 0.0 );
56 }
57
59 const G4ParticleDefinition *aParticleDefinition )
60 {
61 SetMomentum( 0.0, 0.0, 0.0 );
62 SetPositionInNucleus( 0.0, 0.0, 0.0 );
63 formationTime = 0.0;
64 hasInitialStateParton = false;
65 theParticleDefinition = aParticleDefinition;
66 mass = aParticleDefinition->GetPDGMass();
67 totalEnergy = mass;
68 kineticEnergy = 0.0;
69 (aParticleDefinition->GetPDGEncoding()<0) ? timeOfFlight=-1.0 : timeOfFlight=1.0;
70 side = 0;
71 theCreatorModel = -1;
72 theParentResonanceDef = nullptr;
73 theParentResonanceID = 0;
74 NewlyAdded = false;
75 MayBeKilled = true;
76 }
77
79 const G4ReactionProduct &right )
80 {
81 theParticleDefinition = right.theParticleDefinition;
82 positionInNucleus = right.positionInNucleus;
83 formationTime = right.formationTime;
84 hasInitialStateParton = right.hasInitialStateParton;
85 momentum = right.momentum;
86 mass = right.mass;
87 totalEnergy = right.totalEnergy;
88 kineticEnergy = right.kineticEnergy;
89 timeOfFlight = right.timeOfFlight;
90 side = right.side;
91 theCreatorModel = right.theCreatorModel;
92 theParentResonanceDef = right.theParentResonanceDef;
93 theParentResonanceID = right.theParentResonanceID;
94 NewlyAdded = right.NewlyAdded;
95 MayBeKilled = right.MayBeKilled;
96 }
97
99 const G4ReactionProduct &right )
100 {
101 if( this != &right ) {
102 theParticleDefinition = right.theParticleDefinition;
103 positionInNucleus = right.positionInNucleus;
104 formationTime = right.formationTime;
105 hasInitialStateParton = right.hasInitialStateParton;
106 momentum = right.momentum;
107 mass = right.mass;
108 totalEnergy = right.totalEnergy;
109 kineticEnergy = right.kineticEnergy;
110 timeOfFlight = right.timeOfFlight;
111 side = right.side;
112 theCreatorModel = right.theCreatorModel;
113 theParentResonanceDef = right.theParentResonanceDef;
114 theParentResonanceID = right.theParentResonanceID;
115 NewlyAdded = right.NewlyAdded;
116 MayBeKilled = right.MayBeKilled;
117 }
118 return *this;
119 }
120
122 const G4DynamicParticle &right )
123 {
124 theParticleDefinition = right.GetDefinition();
125 SetPositionInNucleus( 0.0, 0.0, 0.0 );
126 formationTime = 0.0;
127 hasInitialStateParton = false;
128 momentum = right.GetMomentum();
129 mass = right.GetDefinition()->GetPDGMass();
130 totalEnergy = right.GetTotalEnergy();
131 kineticEnergy = right.GetKineticEnergy();
132 (right.GetDefinition()->GetPDGEncoding()<0) ? timeOfFlight=-1.0 : timeOfFlight=1.0;
133 side = 0;
134 theCreatorModel = -1;
135 theParentResonanceDef = nullptr;
136 theParentResonanceID = 0;
137 NewlyAdded = false;
138 MayBeKilled = true;
139 return *this;
140 }
141
143 const G4HadProjectile &right )
144 {
145 theParticleDefinition = right.GetDefinition();
146 SetPositionInNucleus( 0.0, 0.0, 0.0 );
147 formationTime = 0.0;
148 hasInitialStateParton = false;
149 momentum = right.Get4Momentum().vect();
150 mass = right.GetDefinition()->GetPDGMass();
151 totalEnergy = right.Get4Momentum().e();
152 kineticEnergy = right.GetKineticEnergy();
153 (right.GetDefinition()->GetPDGEncoding()<0) ? timeOfFlight=-1.0 : timeOfFlight=1.0;
154 side = 0;
155 theCreatorModel = -1;
156 theParentResonanceDef = nullptr;
157 theParentResonanceID = 0;
158 NewlyAdded = false;
159 MayBeKilled = true;
160 return *this;
161 }
162
164 const G4ParticleDefinition *aParticleDefinition )
165 { G4double aKineticEnergy = GetKineticEnergy();
166 G4double pp = GetMomentum().mag();
167 G4ThreeVector aMomentum = GetMomentum();
168 SetDefinition( aParticleDefinition );
169 SetKineticEnergy( aKineticEnergy );
170 if( pp > DBL_MIN )
171 SetMomentum( aMomentum * (std::sqrt(aKineticEnergy*aKineticEnergy +
172 2*aKineticEnergy*GetMass())/pp) );
173 }
174
176 const G4ParticleDefinition *aParticleDefinition )
177 {
178 theParticleDefinition = aParticleDefinition;
179 mass = aParticleDefinition->GetPDGMass();
180 totalEnergy = mass;
181 kineticEnergy = 0.0;
182 (aParticleDefinition->GetPDGEncoding()<0) ?
183 timeOfFlight=-1.0 : timeOfFlight=1.0;
184 }
185
187 const G4double x, const G4double y, const G4double z )
188 {
189 momentum.setX( x );
190 momentum.setY( y );
191 momentum.setZ( z );
192 }
193
195 const G4double x, const G4double y )
196 {
197 momentum.setX( x );
198 momentum.setY( y );
199 }
200
202 {
203 momentum.setZ( z );
204 }
205
207 {
208 SetMomentum( 0.0, 0.0, 0.0 );
209 totalEnergy = 0.0;
210 kineticEnergy = 0.0;
211 mass = 0.0;
212 timeOfFlight = 0.0;
213 side = 0;
214 theCreatorModel = -1;
215 theParentResonanceDef = nullptr;
216 theParentResonanceID = 0;
217 NewlyAdded = false;
218 SetPositionInNucleus( 0.0, 0.0, 0.0 );
219 formationTime = 0.0;
220 hasInitialStateParton = false;
221 }
222
224 const G4ReactionProduct &p1, const G4ReactionProduct &p2 )
225 {
226 G4ThreeVector p1M = p1.momentum;
227 G4ThreeVector p2M = p2.momentum;
228 G4double p1x = p1M.x(); G4double p1y = p1M.y(); G4double p1z = p1M.z();
229 G4double p2x = p2M.x(); G4double p2y = p2M.y(); G4double p2z = p2M.z();
230 G4double a = ( (p1x*p2x+p1y*p2y+p1z*p2z)/(p2.totalEnergy+p2.mass) -
231 p1.totalEnergy ) / p2.mass;
232 G4double x = p1x+a*p2x;
233 G4double y = p1y+a*p2y;
234 G4double z = p1z+a*p2z;
235 G4double p = std::sqrt(x*x+y*y+z*z);
236 SetMass( p1.mass );
237 SetTotalEnergy( std::sqrt( (p1.mass+p)*(p1.mass+p) - 2.*p1.mass*p ) );
238 //SetTotalEnergy( std::sqrt( p1.mass*p1.mass + x*x + y*y + z*z ) );
239 SetMomentum( x, y, z );
240 }
241
243 const G4ReactionProduct& p ) const
244 {
245 G4ThreeVector tM = momentum;
246 G4ThreeVector pM = p.momentum;
247 G4double tx = tM.x(); G4double ty = tM.y(); G4double tz = tM.z();
248 G4double px = pM.x(); G4double py = pM.y(); G4double pz = pM.z();
249 G4double a = std::sqrt( ( px*px + py*py + pz*pz ) * ( tx*tx + ty*ty + tz*tz ) );
250 if( a == 0.0 ) {
251 return 0.0;
252 } else {
253 a = ( tx*px + ty*py + tz*pz ) / a;
254 if( std::abs(a) > 1.0 ) { a<0.0 ? a=-1.0 : a=1.0; }
255 return std::acos( a );
256 }
257 }
258
260 const G4ReactionProduct& p1, const G4ReactionProduct& p2 )
261 {
262 G4double totEnergy = p1.totalEnergy + p2.totalEnergy;
263 G4double x = p1.momentum.x() + p2.momentum.x();
264 G4double y = p1.momentum.y() + p2.momentum.y();
265 G4double z = p1.momentum.z() + p2.momentum.z();
266 G4double newMass = totEnergy*totEnergy - ( x*x + y*y + z*z );
267 if( newMass < 0.0 )
268 newMass = -1. * std::sqrt( -newMass );
269 else
270 newMass = std::sqrt( newMass );
271 G4ReactionProduct result;
272 result.SetMass( newMass );
273 result.SetMomentum( x, y, z );
274 result.SetTotalEnergy( totEnergy );
275 result.SetPositionInNucleus( 0.0, 0.0, 0.0 );
276 result.SetFormationTime(0.0);
277 result.HasInitialStateParton(false);
278 return result;
279 }
280
282 const G4ReactionProduct& p1, const G4ReactionProduct& p2 )
283 {
284 G4double totEnergy = p1.totalEnergy - p2.totalEnergy;
285 G4double x = p1.momentum.x() - p2.momentum.x();
286 G4double y = p1.momentum.y() - p2.momentum.y();
287 G4double z = p1.momentum.z() - p2.momentum.z();
288 G4double newMass = totEnergy*totEnergy - ( x*x + y*y + z*z );
289 if( newMass < 0.0 )
290 newMass = -1. * std::sqrt( -newMass );
291 else
292 newMass = std::sqrt( newMass );
293 G4ReactionProduct result;
294 result.SetMass( newMass );
295 result.SetMomentum( x, y, z );
296 result.SetTotalEnergy( totEnergy );
297 result.SetPositionInNucleus( 0.0, 0.0, 0.0 );
298 result.SetFormationTime(0.0);
299 result.HasInitialStateParton(false);
300 return result;
301 }
302 /* end of code */
303
G4Allocator< G4ReactionProduct > *& aRPAllocator()
G4ReactionProduct operator+(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
G4ReactionProduct operator-(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
double G4double
Definition: G4Types.hh:83
double z() const
double x() const
void setY(double)
double y() const
void setZ(double)
double mag() const
void setX(double)
Hep3Vector vect() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4double GetTotalEnergy() const
G4ThreeVector GetMomentum() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
void SetMomentum(const G4double x, const G4double y, const G4double z)
void SetTotalEnergy(const G4double en)
G4double GetKineticEnergy() const
void HasInitialStateParton(G4bool aFlag)
G4ThreeVector GetMomentum() const
G4ReactionProduct & operator=(const G4ReactionProduct &right)
void SetPositionInNucleus(G4double x, G4double y, G4double z)
void Lorentz(const G4ReactionProduct &p1, const G4ReactionProduct &p2)
void SetDefinitionAndUpdateE(const G4ParticleDefinition *aParticleDefinition)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetKineticEnergy(const G4double en)
G4double Angle(const G4ReactionProduct &p) const
void SetFormationTime(G4double aTime)
G4double GetMass() const
void SetMass(const G4double mas)
#define DBL_MIN
Definition: templates.hh:54
#define G4ThreadLocalStatic
Definition: tls.hh:76