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
G4DynamicParticle.hh
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// G4DynamicParticle
27//
28// Class description:
29//
30// A G4DynamicParticle aggregates the information to describe the dynamics
31// of a G4Particle, such as energy, momentum, polarization and proper time,
32// as well as the "particle definition", holding all the static information.
33// It contains the purely dynamic aspects of a moving particle.
34
35// History:
36// - 2 December 1995, G.Cosmo - first design, based on object model.
37// - 29 January 1996, M.Asai - first implementation.
38// - 1996 - 2007, H.Kurashige - revisions.
39// - 15 March 2019, M.Novak - log-kinetic energy value is computed only
40// on demand if its stored value is not up-to-date.
41// --------------------------------------------------------------------
42#ifndef G4DynamicParticle_hh
43#define G4DynamicParticle_hh 1
44
45#include <cmath>
48
49#include "globals.hh"
50#include "G4ios.hh"
51
53#include "G4Allocator.hh"
54#include "G4LorentzVector.hh"
55#include "G4Log.hh"
56
57#include "G4ParticleMomentum.hh" // NOTE: means "momentum direction" not
58 // "momentum vector". It is a G4ThreeVector
60
62class G4DecayProducts;
63
65{
66 public:
67
68 //- constructors
70
71 G4DynamicParticle(const G4ParticleDefinition* aParticleDefinition,
72 const G4ThreeVector& aMomentumDirection,
73 G4double aKineticEnergy);
74 G4DynamicParticle(const G4ParticleDefinition* aParticleDefinition,
75 const G4ThreeVector& aParticleMomentum);
76 G4DynamicParticle(const G4ParticleDefinition* aParticleDefinition,
77 const G4LorentzVector& aParticleMomentum);
78 G4DynamicParticle(const G4ParticleDefinition* aParticleDefinition,
79 G4double aTotalEnergy,
80 const G4ThreeVector& aParticleMomentum);
81 G4DynamicParticle(const G4ParticleDefinition* aParticleDefinition,
82 const G4ThreeVector& aMomentumDirection,
83 G4double aKineticEnergy,
84 const G4double dynamicalMass);
85
87
88 //- destructor
90
91 //- operators
93 G4bool operator==(const G4DynamicParticle& right) const;
94 G4bool operator!=(const G4DynamicParticle& right) const;
95
96 //- Move constructor & operator
99
100 //- new/delete operators are oberloded to use G4Allocator
101 inline void* operator new(size_t);
102 inline void operator delete(void* aDynamicParticle);
103
104 //- Set/Get methods
105
106 inline const G4ThreeVector& GetMomentumDirection() const;
107 // Returns the normalized direction of the momentum
108 inline void SetMomentumDirection(const G4ThreeVector& aDirection);
109 // Sets the normalized direction of the momentum
111 // Sets the normalized direction of the momentum by coordinates
112
114 // Returns the current particle momentum vector
115 void SetMomentum( const G4ThreeVector& momentum);
116 // set the current particle momentum vector
117
119 // Returns the current particle energy-momentum 4vector
120 void Set4Momentum( const G4LorentzVector& momentum);
121 // Set the current particle energy-momentum 4vector
122
124 // Returns the module of the momentum vector
125 inline G4double GetTotalEnergy() const;
126 // Returns the total energy of the particle
127
129 // Returns the kinetic energy of a particle
131 // Returns:
132 // - natural logarithm of the particle kinetic energy (E_k) if E_k > 0
133 // - LOG_EKIN_MIN otherwise
134 inline void SetKineticEnergy(G4double aEnergy);
135 // Sets the kinetic energy of a particle
136 inline G4double GetBeta() const;
137 // Access Lorentz beta
138
139 inline G4double GetProperTime() const;
140 // Returns the current particle proper time
141 inline void SetProperTime( G4double );
142 // Set the current particle Proper Time
143
144 inline const G4ThreeVector& GetPolarization() const;
145 inline void SetPolarization(const G4ThreeVector&);
146 inline void SetPolarization(G4double polX, G4double polY, G4double polZ);
147 // Set/Get polarization vector
148
149 inline G4double GetMass() const;
150 inline void SetMass(G4double mass);
151 // Set/Get dynamical mass
152 // The dynamical mass is set to PDG mass in default
153
154 inline G4double GetCharge() const;
155 inline void SetCharge(G4double charge);
156 inline void SetCharge(G4int chargeInUnitOfEplus);
157 // Set/Get dynamical charge
158 // The dynamical mass is set to PDG charge in default
159
160 inline G4double GetSpin() const;
161 inline void SetSpin(G4double spin);
162 inline void SetSpin(G4int spinInUnitOfHalfInteger);
163 // Set/Get dynamical spin
164 // The dynamical spin is set to PDG spin in default
165
167 inline void SetMagneticMoment(G4double magneticMoment);
168 // Set/Get dynamical MagneticMoment
169 // The dynamical mass is set to PDG MagneticMoment in default
170
172 // Get electron occupancy
173 // ElectronOccupancy is valid only if the particle is ion
174 inline G4int GetTotalOccupancy() const;
175 inline G4int GetOccupancy(G4int orbit) const;
176 inline void AddElectron(G4int orbit, G4int number = 1);
177 inline void RemoveElectron(G4int orbit, G4int number = 1);
178
180 void SetDefinition(const G4ParticleDefinition* aParticleDefinition);
181 // Set/Get particle definition
182 // Following method of GetDefinition() remains
183 // because of backward compatiblity. May be removed in future
185
187 inline void SetPreAssignedDecayProducts(G4DecayProducts* aDecayProducts);
188 // Set/Get pre-assigned decay channel
189
192 // Set/Get pre-assigned proper time when the particle will decay
193
194 void DumpInfo(G4int mode = 0) const;
195 // Print out information
196 // - mode 0 : default )(minimum)
197 // - mode 1 : 0 + electron occupancy
198
199 inline void SetVerboseLevel(G4int value);
200 inline G4int GetVerboseLevel() const;
201 // Set/Get controle flag for output message
202 // - 0: Silent
203 // - 1: Warning message
204 // - 2: More
205
207 inline void SetPDGcode(G4int c);
208
210 // Return the pointer to the corresponding G4PrimaryParticle object
211 // if this particle is a primary particle OR is defined as a
212 // pre-assigned decay product. Otherwise return nullptr.
213
214 inline G4int GetPDGcode() const;
215 // Return the PDG code of this particle. If the particle is known to
216 // Geant4, its PDG code defined in G4ParticleDefinition is returned.
217 // If it is unknown (i.e. PDG code in G4ParticleDefinition is 0), the
218 // PDG code defined in the corresponding primary particle or
219 // pre-assigned decay product will be returned if available.
220 // Otherwise (e.g. for geantino) returns 0.
221
222 protected:
223
226
227 private:
228
229 inline void ComputeBeta() const;
230
231 G4ThreeVector theMomentumDirection;
232 // The normalized momentum vector
233
234 G4ThreeVector thePolarization;
235
236 const G4ParticleDefinition* theParticleDefinition = nullptr;
237 // Contains the static information of this particle
238
239 G4ElectronOccupancy* theElectronOccupancy = nullptr;
240
241 G4DecayProducts* thePreAssignedDecayProducts = nullptr;
242
243 G4PrimaryParticle* primaryParticle = nullptr;
244 // This void pointer is used by G4EventManager to maintain the
245 // link between pre-assigned decay products and corresponding
246 // primary particle
247
248 G4double theKineticEnergy = 0.0;
249
250 mutable G4double theLogKineticEnergy = DBL_MAX;
251
252 mutable G4double theBeta = -1.0;
253
254 G4double theProperTime = 0.0;
255
256 G4double theDynamicalMass = 0.0;
257
258 G4double theDynamicalCharge = 0.0;
259
260 G4double theDynamicalSpin = 0.0;
261
262 G4double theDynamicalMagneticMoment = 0.0;
263
264 G4double thePreAssignedDecayTime = -1.0;
265
266 G4int verboseLevel = 1;
267
268 G4int thePDGcode = 0;
269};
270
271#include "G4DynamicParticle.icc"
272
273#endif
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4int GetTotalOccupancy() const
G4double GetMass() const
void SetPreAssignedDecayProducts(G4DecayProducts *aDecayProducts)
void SetPolarization(const G4ThreeVector &)
void SetCharge(G4double charge)
void SetMomentumDirection(const G4ThreeVector &aDirection)
void DumpInfo(G4int mode=0) const
G4int GetOccupancy(G4int orbit) const
void SetPDGcode(G4int c)
const G4ThreeVector & GetMomentumDirection() const
void SetProperTime(G4double)
G4bool operator==(const G4DynamicParticle &right) const
G4PrimaryParticle * GetPrimaryParticle() const
G4double GetSpin() const
G4double GetCharge() const
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetSpin(G4int spinInUnitOfHalfInteger)
void SetMagneticMoment(G4double magneticMoment)
void SetPolarization(G4double polX, G4double polY, G4double polZ)
void SetMass(G4double mass)
const G4DecayProducts * GetPreAssignedDecayProducts() const
G4double GetLogKineticEnergy() const
void SetCharge(G4int chargeInUnitOfEplus)
const G4ParticleDefinition * GetParticleDefinition() const
G4ParticleDefinition * GetDefinition() const
void SetSpin(G4double spin)
void SetMomentumDirection(G4double px, G4double py, G4double pz)
G4LorentzVector Get4Momentum() const
G4double GetKineticEnergy() const
G4double GetTotalEnergy() const
G4double GetBeta() const
G4bool operator!=(const G4DynamicParticle &right) const
void Set4Momentum(const G4LorentzVector &momentum)
void SetMomentum(const G4ThreeVector &momentum)
G4int GetVerboseLevel() const
G4double GetProperTime() const
void SetPrimaryParticle(G4PrimaryParticle *p)
G4ThreeVector GetMomentum() const
void SetPreAssignedDecayProperTime(G4double)
G4DynamicParticle & operator=(const G4DynamicParticle &right)
G4double GetPreAssignedDecayProperTime() const
G4double GetMagneticMoment() const
G4double GetTotalMomentum() const
void AddElectron(G4int orbit, G4int number=1)
G4double GetElectronMass() const
const G4ThreeVector & GetPolarization() const
void RemoveElectron(G4int orbit, G4int number=1)
void SetKineticEnergy(G4double aEnergy)
G4int GetPDGcode() const
const G4ElectronOccupancy * GetElectronOccupancy() const
void SetVerboseLevel(G4int value)
#define DBL_MAX
Definition: templates.hh:62