Geant4  10.00.p01
G4EmCorrections.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 // $Id: G4EmCorrections.hh 70371 2013-05-29 15:18:07Z gcosmo $
27 //
28 // -------------------------------------------------------------------
29 //
30 // GEANT4 Class header file
31 //
32 //
33 // File name: G4EmCorrections
34 //
35 // Author: Vladimir Ivanchenko
36 //
37 // Creation date: 13.01.2005
38 //
39 // Modifications:
40 // 28.04.2006 General cleanup, add finite size corrections (V.Ivanchenko)
41 // 13.05.2006 Add corrections for ion stopping (V.Ivanhcenko)
42 // 20.05.2008 Removed Finite Size correction (V.Ivanchenko)
43 // 12.09.2008 Added inlined interfaces to effective charge (V.Ivanchenko)
44 // 19.04.2012 Fix reproducibility problem (A.Ribon)
45 //
46 // Class Description:
47 //
48 // This class provides calculation of EM corrections to ionisation
49 //
50 
51 // -------------------------------------------------------------------
52 //
53 
54 #ifndef G4EmCorrections_h
55 #define G4EmCorrections_h 1
56 
57 #include <CLHEP/Units/PhysicalConstants.h>
58 
59 #include "globals.hh"
60 #include "G4ionEffectiveCharge.hh"
61 #include "G4Material.hh"
62 #include "G4ParticleDefinition.hh"
63 #include "G4NistManager.hh"
64 
65 class G4VEmModel;
66 class G4PhysicsVector;
67 class G4IonTable;
70 
72 {
73 
74 public:
75 
77 
78  virtual ~G4EmCorrections();
79 
81  const G4Material*,
82  G4double kineticEnergy,
83  G4double cutEnergy);
84 
86  const G4MaterialCutsCouple*,
87  G4double kineticEnergy);
88 
90  const G4Material*,
91  G4double kineticEnergy);
92 
94  const G4Material*,
95  G4double kineticEnergy);
96 
98  const G4Material*,
99  G4double kineticEnergy);
100 
102  const G4Material*,
103  G4double kineticEnergy);
104 
106  const G4Material*,
107  G4double kineticEnergy);
108 
110  const G4Material*,
111  G4double kineticEnergy);
112 
114  const G4Material*,
115  G4double kineticEnergy);
116 
118  const G4Material*,
119  G4double kineticEnergy);
120 
122  const G4Material*,
123  G4double kineticEnergy);
124 
126  const G4Material*,
127  G4double kineticEnergy);
128 
130  const G4Material*,
131  G4double kineticEnergy);
132 
134  const G4Material*,
135  G4double kineticEnergy);
136 
138  const G4Material*,
139  G4double kineticEnergy,
140  G4bool fluct = true);
141 
143  G4PhysicsVector* dVector);
144 
145  void InitialiseForNewRun();
146 
147  // effective charge correction using stopping power data
149  const G4Material*,
150  G4double kineticEnergy);
151 
152  // effective charge of an ion
154  const G4Material*,
155  G4double kineticEnergy);
156 
157  inline
159  const G4Material*,
160  G4double kineticEnergy);
161 
162  // ionisation models for ions
163  inline void SetIonisationModels(G4VEmModel* m1 = 0, G4VEmModel* m2 = 0);
164 
166 
167 private:
168 
169  void Initialise();
170 
171  void BuildCorrectionVector();
172 
174  const G4Material*,
175  G4double kineticEnergy);
176 
177  G4double KShell(G4double theta, G4double eta);
178 
179  G4double LShell(G4double theta, G4double eta);
180 
182 
184 
186  G4double y1, G4double y2,
187  G4double z11, G4double z21, G4double z12, G4double z22);
188 
190  G4double m1, G4double m2);
191 
192  // hide assignment operator
195 
196  G4double ed[104];
197  G4double a[104];
201 
203 
208 
212 
219 
225 
227  G4double CK[20][29];
228  G4double CL[26][28];
231  G4double Z23[100];
232 
236 
237  std::vector<const G4Material*> currmat;
238  std::map< G4int, std::vector<G4double> > thcorr;
239  size_t ncouples;
240 
247 
266 
268 
273 
274  // Ion stopping data
278  std::vector<G4int> Zion;
279  std::vector<G4int> Aion;
280  std::vector<G4String> materialName;
281 
282  std::vector<const G4ParticleDefinition*> ionList;
283 
284  std::vector<const G4Material*> materialList;
285  std::vector<G4PhysicsVector*> stopData;
287 };
288 
290 {
291  G4int iddd = n-1;
292  do {iddd--;} while (iddd>0 && x<y[iddd]);
293  return iddd;
294 }
295 
297  G4double y1, G4double y2)
298 {
299  return y1 + (y2 - y1)*(xv - x1)/(x2 - x1);
300 }
301 
303  G4double x1, G4double x2,
304  G4double y1, G4double y2,
305  G4double z11, G4double z21,
306  G4double z12, G4double z22)
307 {
308  return (z11*(x2-xv)*(y2-yv) + z22*(xv-x1)*(yv-y1) +
309  0.5*(z12*((x2-xv)*(yv-y1)+(xv-x1)*(y2-yv))+
310  z21*((xv-x1)*(y2-yv)+(yv-y1)*(x2-xv))))
311  / ((x2-x1)*(y2-y1));
312 }
313 
314 inline void
316 {
317  if(mod1) { ionLEModel = mod1; }
318  if(mod2) { ionHEModel = mod2; }
319 }
320 
322 {
323  return nIons;
324 }
325 
326 inline G4double
328  const G4Material* mat,
329  G4double kineticEnergy)
330 {
331  return effCharge.EffectiveCharge(p,mat,kineticEnergy);
332 }
333 
334 inline G4double
336  const G4Material* mat,
337  G4double kineticEnergy)
338 {
339  return effCharge.EffectiveChargeSquareRatio(p,mat,kineticEnergy);
340 }
341 
343  const G4Material* mat,
344  G4double kineticEnergy)
345 {
346  if(kineticEnergy != kinEnergy || p != particle) {
347  particle = p;
348  kinEnergy = kineticEnergy;
349  mass = p->GetPDGMass();
350  tau = kineticEnergy / mass;
351  gamma = 1.0 + tau;
352  bg2 = tau * (tau+2.0);
353  beta2 = bg2/(gamma*gamma);
354  beta = std::sqrt(beta2);
355  ba2 = beta2/alpha2;
356  G4double ratio = CLHEP::electron_mass_c2/mass;
357  tmax = 2.0*CLHEP::electron_mass_c2*bg2 /(1. + 2.0*gamma*ratio + ratio*ratio);
359  //if(charge < 1.5) {q2 = charge*charge;}
360  //else {
361  // q2 = effCharge.EffectiveChargeSquareRatio(p,mat,kinEnergy);
362  // charge = std::sqrt(q2);
363  //}
364  if(charge > 1.5) { charge = effCharge.EffectiveCharge(p,mat,kinEnergy); }
365  q2 = charge*charge;
366  }
367  if(mat != material) {
368  material = mat;
372  }
373 }
374 
375 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
376 
377 #endif
G4double COSXI[14]
const G4ElementVector * theElementVector
G4double CK[20][29]
G4double HighOrderCorrections(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy, G4double cutEnergy)
G4VEmModel * ionLEModel
G4double DensityCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double ed[104]
G4double theZieglerFactor
std::vector< G4Element * > G4ElementVector
void SetIonisationModels(G4VEmModel *m1=0, G4VEmModel *m2=0)
std::vector< const G4Material * > currmat
G4double KShell(G4double theta, G4double eta)
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4LPhysicsFreeVector * ThetaK
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy)
const G4Material * material
G4double MottCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double GetParticleCharge(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double EffectiveChargeCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
std::vector< G4int > Aion
G4NistManager * nist
G4double BlochCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4EmCorrections & operator=(const G4EmCorrections &right)
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:188
int G4int
Definition: G4Types.hh:78
G4double SpinCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4LPhysicsFreeVector * ThetaL
G4VEmModel * ionHEModel
G4double TheL[26]
void AddStoppingData(G4int Z, G4int A, const G4String &materialName, G4PhysicsVector *dVector)
std::map< G4int, std::vector< G4double > > thcorr
G4double Value2(G4double xv, G4double yv, G4double x1, G4double x2, G4double y1, G4double y2, G4double z11, G4double z21, G4double z12, G4double z22)
G4double NuclearStoppingPower(G4double e, G4double z1, G4double z2, G4double m1, G4double m2)
static const double m2
Definition: G4SIunits.hh:111
G4int Index(G4double x, G4double *y, G4int n)
G4double NuclearDEDX(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy, G4bool fluct=true)
bool G4bool
Definition: G4Types.hh:79
G4double IonBarkasCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
std::vector< G4String > materialName
G4double BarkasCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double IonHighOrderCorrections(const G4ParticleDefinition *, const G4MaterialCutsCouple *, G4double kineticEnergy)
const G4int n
const G4ParticleDefinition * particle
static const G4double A[nN]
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:214
const G4ParticleDefinition * curParticle
std::vector< const G4Material * > materialList
G4double EffectiveCharge(const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy)
void SetupKinematics(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double ShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
const G4double * atomDensity
G4double TheK[20]
G4double GetPDGMass() const
void BuildCorrectionVector()
std::vector< const G4ParticleDefinition * > ionList
G4double COSEB[14]
G4IonTable * ionTable
G4double KShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double LShell(G4double theta, G4double eta)
G4double LShellCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double a[104]
std::vector< G4PhysicsVector * > stopData
G4LPhysicsFreeVector * BarkasCorr
G4double Z23[100]
G4ionEffectiveCharge effCharge
size_t GetNumberOfElements() const
Definition: G4Material.hh:184
G4double ComputeIonCorrections(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
double G4double
Definition: G4Types.hh:76
G4double ShellCorrectionSTD(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
const G4Material * curMaterial
static const double eplus
Definition: G4SIunits.hh:178
G4PhysicsVector * curVector
G4double GetPDGCharge() const
G4int GetNumberOfStoppingVectors()
G4double Value(G4double xv, G4double x1, G4double x2, G4double y1, G4double y2)
virtual ~G4EmCorrections()
G4double Bethe(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double CL[26][28]
std::vector< G4int > Zion
G4double Eta[29]