ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4PrimaryParticle.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4PrimaryParticle.hh
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 //
28 //
29 
30 
31 #ifndef G4PrimaryParticle_h
32 #define G4PrimaryParticle_h 1
33 
34 #include "globals.hh"
35 #include "G4Allocator.hh"
36 #include "G4ThreeVector.hh"
37 
38 #include "pwdefs.hh"
39 
42 
43 // class description:
44 //
45 // This is a class which represents a primary particle.
46 // This is completely deferent class from G4Track or G4DynamicParticle.
47 // This class is designed with taking into account the possibility of
48 // making this class persistent, i.e. kept with G4Event class object
49 // to ODBMS. Thus this class is almost free from any other Geant4 classes.
50 // The only exception is a pointer to G4ParticleDefinition but it can be
51 // rebuilt by the PDGcode.
52 //
53 // Primary particles are stored in G4PrimaryVertex object with a form
54 // of linked list. Also, an object of this PrimaryParticle class can have
55 // one or more objects of this class as its daughters with a form of
56 // linked list.
57 // A parimary particle represented by this class object needs not to be
58 // a particle of type which Geant4 can simulate.
59 // case a) mother particle is not a particle Geant4 can simulate
60 // daughters associated to the mother will be examined.
61 // case b) mother particle is a perticle Geant4 can simulate
62 // daughters associated to the mother will be converted to G4Dynamic
63 // particle and be set to the mother G4Track. For this case, dauthers
64 // are used as the "pre-fixed" decay channel.
65 //
66 
68 {
69  public:
70  inline void *operator new(size_t);
71  inline void operator delete(void *aStackedTrack);
72 
73  public: // with description
75  G4PrimaryParticle(G4int Pcode);
77  G4double px,G4double py,G4double pz);
82  G4double px,G4double py,G4double pz);
84  G4double px,G4double py,G4double pz,G4double E);
85 
86  public:
87  virtual ~G4PrimaryParticle();
88 
89  // copy constructor and assignment operator
90  // nextParticle and daughterParticle is copied by object (i.e. deep copy)
91  // userInfo will nt be copied
94 
95  // equal operator returns 'true' only if the same object (i.e comarison by pointer value)
96  G4bool operator==(const G4PrimaryParticle &right) const;
97  G4bool operator!=(const G4PrimaryParticle &right) const;
98 
99  public: // with description
100  void Print() const;
101  // Print the properties of the particle.
102 
103 
104  public: // with description
105  // followings are get/set methods available.
106  // "trackID" will be set if this particle is sent to G4EventManager
107  // and converted to G4Track. Otherwise = -1.
108  // The mass and charge in G4ParticleDefinition will be used in default.
109  // "SetMass" and "SetCharge" methods are used to set dynamical mass and charge
110  // G4DynamicParticle."GetMass" and "GetCharge" methods will return
111  // those in G4ParticleDefinition if users do not set dynamical ones.
112 
113  G4int GetPDGcode() const;
114  void SetPDGcode(G4int Pcode);
116  void SetG4code(const G4ParticleDefinition * Gcode);
118  void SetParticleDefinition(const G4ParticleDefinition * pdef);
119  G4double GetMass() const;
120  void SetMass(G4double mas);
121  G4double GetCharge() const;
122  void SetCharge(G4double chg);
123  G4double GetKineticEnergy() const;
124  void SetKineticEnergy(G4double eKin);
125  const G4ThreeVector& GetMomentumDirection() const;
126  void SetMomentumDirection(const G4ThreeVector& p);
127  G4double GetTotalMomentum() const;
128  void Set4Momentum(G4double px, G4double py, G4double pz, G4double E);
129  G4double GetTotalEnergy() const;
130  void SetTotalEnergy(G4double eTot );
131  G4ThreeVector GetMomentum() const;
132  void SetMomentum(G4double px, G4double py, G4double pz);
133  G4double GetPx() const;
134  G4double GetPy() const;
135  G4double GetPz() const;
136  G4PrimaryParticle * GetNext() const;
137  void SetNext(G4PrimaryParticle * np);
138  void ClearNext();
139  G4PrimaryParticle * GetDaughter() const;
140  void SetDaughter(G4PrimaryParticle * np);
141  G4int GetTrackID() const;
142  void SetTrackID(G4int id);
144  void SetPolarization(const G4ThreeVector& pol);
145  void SetPolarization(G4double px,G4double py,G4double pz);
146  G4double GetPolX() const;
147  G4double GetPolY() const;
148  G4double GetPolZ() const;
149  G4double GetWeight() const;
150  void SetWeight(G4double w);
151  G4double GetProperTime() const;
152  void SetProperTime(G4double t);
155 
156  private:
159 
162 
165 
166  G4int trackID; // This will be set if this particle is
167  // sent to G4EventManager and converted to
168  // G4Track. Otherwise = -1.
169 
178 
179 };
180 
182 
183 inline void * G4PrimaryParticle::operator new(size_t)
184 {
186  {
188  }
189  return (void *) aPrimaryParticleAllocator()->MallocSingle();
190 }
191 
192 inline void G4PrimaryParticle::operator delete(void * aPrimaryParticle)
193 {
194  aPrimaryParticleAllocator()->FreeSingle((G4PrimaryParticle *) aPrimaryParticle);
195 }
196 
198 { return mass; }
199 
201 { return charge; }
202 
204 { return PDGcode; }
205 
207 { return const_cast<G4ParticleDefinition*>(G4code); }
208 
210 { return G4code; }
211 
213 {
214  if (mass<0.) return kinE;
215  else return std::sqrt(kinE*(kinE+2.*mass));
216 }
217 
219 { return GetTotalMomentum()*direction;}
220 
222 { return direction;}
223 
225 { direction = p;}
226 
228 { return GetTotalMomentum()*direction.x();}
229 
231 { return GetTotalMomentum()*direction.y();}
232 
234 { return GetTotalMomentum()*direction.z();}
235 
237 {
238  if (mass<0.) return kinE;
239  else return kinE+mass;
240 }
241 
243 {
244  if (mass<0.) kinE = eTot;
245  else kinE = eTot - mass;
246 }
247 
249 { return kinE; }
250 
252 { kinE = eKin; }
253 
255 { return nextParticle; }
256 
258 { return daughterParticle; }
259 
261 { return trackID; }
262 
264 { return G4ThreeVector(polX,polY,polZ); }
265 
267 { return polX; }
268 
270 { return polY; }
271 
273 { return polZ; }
274 
276 { return Weight0; }
277 
279 { Weight0 = w; }
280 
282 { properTime = t; }
283 
285 { return properTime; }
286 
288 { userInfo = anInfo; }
289 
291 { return userInfo; }
292 
294 {
295  SetParticleDefinition(Gcode);
296 }
297 
299 {
300  if (nextParticle == 0) { nextParticle = np; }
301  else { nextParticle->SetNext(np); }
302 }
303 
305 {
306  nextParticle = nullptr;
307 }
308 
310 {
311  if(daughterParticle == 0) { daughterParticle = np; }
312  else { daughterParticle->SetNext(np); }
313 }
314 
316 { trackID = id; }
317 
319 { mass = mas; }
320 
322 { charge = chg; }
323 
325 {
326  polX = px;
327  polY = py;
328  polZ = pz;
329 }
330 
332 {
333  polX = pol.x();
334  polY = pol.y();
335  polZ = pol.z();
336 }
337 
338 #endif