Geant4  10.02
G4PairProductionRelModel.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: G4PairProductionRelModel.hh 73607 2013-09-02 10:04:03Z gcosmo $
27 //
28 // -------------------------------------------------------------------
29 //
30 // GEANT4 Class header file
31 //
32 //
33 // File name: G4PairProductionRelModel
34 //
35 // Author: Andreas Schaelicke
36 //
37 // Creation date: 02.04.2009
38 //
39 // Modifications:
40 //
41 // Class Description:
42 //
43 // Implementation of gamma convertion to e+e- in the field of a nucleus
44 // relativistic approximation
45 //
46 
47 // -------------------------------------------------------------------
48 //
49 
50 #ifndef G4PairProductionRelModel_h
51 #define G4PairProductionRelModel_h 1
52 
53 #include <CLHEP/Units/PhysicalConstants.h>
54 
55 #include "G4VEmModel.hh"
56 #include "G4PhysicsTable.hh"
57 #include "G4NistManager.hh"
58 
60 
62 {
63 
64 public:
65 
67  const G4String& nam = "BetheHeitlerLPM");
68 
69  virtual ~G4PairProductionRelModel();
70 
71  virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
72 
73  virtual void InitialiseLocal(const G4ParticleDefinition*,
74  G4VEmModel* masterModel);
75 
77  const G4ParticleDefinition*,
78  G4double kinEnergy,
79  G4double Z,
80  G4double A=0.,
81  G4double cut=0.,
83 
84  virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
85  const G4MaterialCutsCouple*,
86  const G4DynamicParticle*,
87  G4double tmin,
88  G4double maxEnergy);
89 
90  virtual void SetupForMaterial(const G4ParticleDefinition*,
91  const G4Material*,G4double);
92 
93  // * fast inline functions *
94  inline void SetCurrentElement(G4double /*Z*/);
95 
96  // set / get methods
97  inline void SetLPMconstant(G4double val);
98  inline G4double LPMconstant() const;
99 
100  inline void SetLPMflag(G4bool);
101  inline G4bool LPMflag() const;
102 
103 protected:
104 
105  // screening functions
106  inline G4double Phi1(G4double delta) const;
107  inline G4double Phi2(G4double delta) const;
108  inline G4double ScreenFunction1(G4double ScreenVariable);
109  inline G4double ScreenFunction2(G4double ScreenVariable);
110  inline G4double DeltaMax() const;
111  inline G4double DeltaMin(G4double) const;
112 
113  // lpm functions
115 
117 
118  G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
119  G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
120 
121  // hide assignment operator
124 
126 
131 
134 
135  // cash
139 
140  // LPM effect
143 
144  // consts
146 
147  static const G4double xgi[8], wgi[8];
148  static const G4double Fel_light[5];
149  static const G4double Finel_light[5];
150  static const G4double facFel;
151  static const G4double facFinel;
152 
153  static const G4double preS1, logTwo;
154 
155 };
156 
157 
158 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
159 
160 inline
162 {
163  fLPMconstant = val;
164 }
165 
166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
167 
168 inline
170 {
171  return fLPMconstant;
172 }
173 
174 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
175 
176 inline
178 {
179  fLPMflag = val;
180 }
181 
182 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
183 
184 inline
186 {
187  return fLPMflag;
188 }
189 
190 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
191 
193 {
194  if(Z != currentZ) {
195  currentZ = Z;
196 
197  G4int iz = G4int(Z);
198  z13 = nist->GetZ13(iz);
199  z23 = z13*z13;
200  lnZ = nist->GetLOGZ(iz);
201 
202  if (iz <= 4) {
203  Fel = Fel_light[iz];
204  Finel = Finel_light[iz] ;
205  }
206  else {
207  Fel = facFel - lnZ/3. ;
208  Finel = facFinel - 2.*lnZ/3. ;
209  }
211  }
212 }
213 
214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
215 
217 {
218  G4double screenVal;
219 
220  if (delta > 1.)
221  screenVal = 21.12 - 4.184*std::log(delta+0.952);
222  else
223  screenVal = 20.868 - delta*(3.242 - 0.625*delta);
224 
225  return screenVal;
226 }
227 
228 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
229 
231 {
232  G4double screenVal;
233 
234  if (delta > 1.)
235  screenVal = 21.12 - 4.184*std::log(delta+0.952);
236  else
237  screenVal = 20.209 - delta*(1.930 + 0.086*delta);
238 
239  return screenVal;
240 }
241 
243 
244 // compute the value of the screening function 3*PHI1 - PHI2
245 
246 {
247  G4double screenVal;
248 
249  if (ScreenVariable > 1.)
250  screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
251  else
252  screenVal = 42.392 - ScreenVariable*(7.796 - 1.961*ScreenVariable);
253 
254  return screenVal;
255 }
256 
257 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
258 
260 
261 // compute the value of the screening function 1.5*PHI1 + 0.5*PHI2
262 
263 {
264  G4double screenVal;
265 
266  if (ScreenVariable > 1.)
267  screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
268  else
269  screenVal = 41.405 - ScreenVariable*(5.828 - 0.8945*ScreenVariable);
270 
271  return screenVal;
272 }
273 
274 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
275 
276 
278 {
279  // k > 50 MeV
280  G4double FZ = 8.*(lnZ/3. + fCoulomb);
281  return std::exp( (42.24-FZ)/8.368 ) + 0.952;
282 }
283 
285 {
286  return 4.*136./z13*(CLHEP::electron_mass_c2/k);
287 }
288 
289 
290 
291 #endif
G4double Phi1(G4double delta) const
G4double ComputeXSectionPerAtom(G4double totalEnergy, G4double Z)
G4double Phi2(G4double delta) const
G4PairProductionRelModel(const G4ParticleDefinition *p=0, const G4String &nam="BetheHeitlerLPM")
G4double GetZ13(G4double Z)
G4double GetfCoulomb() const
Definition: G4Element.hh:190
static const G4double Finel_light[5]
G4ParticleDefinition * thePositron
int G4int
Definition: G4Types.hh:78
static const G4double xgi[8]
G4PairProductionRelModel & operator=(const G4PairProductionRelModel &right)
G4double ScreenFunction1(G4double ScreenVariable)
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double)
virtual void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel)
double A(double temperature)
static const G4double wgi[8]
bool G4bool
Definition: G4Types.hh:79
G4double iz
Definition: TRTMaterials.hh:39
G4double DeltaMin(G4double) const
void CalcLPMFunctions(G4double k, G4double eplus)
G4double ScreenFunction2(G4double ScreenVariable)
static const G4double emax
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
G4ParticleChangeForGamma * fParticleChange
G4double GetLOGZ(G4int Z)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX)
G4ParticleDefinition * theElectron
double G4double
Definition: G4Types.hh:76
static const double eplus
Definition: G4SIunits.hh:196
#define DBL_MAX
Definition: templates.hh:83
static const G4double Fel_light[5]
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z)
const G4Element * GetCurrentElement() const
Definition: G4VEmModel.hh:467