Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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