Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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$
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 
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 
74  const G4ParticleDefinition*,
75  G4double kinEnergy,
76  G4double Z,
77  G4double A=0.,
78  G4double cut=0.,
79  G4double emax=DBL_MAX);
80 
81  virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
82  const G4MaterialCutsCouple*,
83  const G4DynamicParticle*,
84  G4double tmin,
85  G4double maxEnergy);
86 
87  virtual void SetupForMaterial(const G4ParticleDefinition*,
88  const G4Material*,G4double);
89 
90  // * fast inline functions *
91  inline void SetCurrentElement(G4double /*Z*/);
92 
93  // set / get methods
94  inline void SetLPMconstant(G4double val);
95  inline G4double LPMconstant() const;
96 
97  inline void SetLPMflag(G4bool);
98  inline G4bool LPMflag() const;
99 
100 protected:
101  // screening functions
102  inline G4double Phi1(G4double delta) const;
103  inline G4double Phi2(G4double delta) const;
104  inline G4double DeltaMax() const;
105  inline G4double DeltaMin(G4double) const;
106  // lpm functions
108 
109  // obsolete
110  G4double ScreenFunction1(G4double ScreenVariable);
111  G4double ScreenFunction2(G4double ScreenVariable);
112 
114 
115  G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
116  G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z);
117 
118  // hide assignment operator
121 
123 
128 
131 
132  // cash
136 
137  // LPM effect
140 
141  // consts
143 
144  static const G4double xgi[8], wgi[8];
145  static const G4double Fel_light[5];
146  static const G4double Finel_light[5];
147  static const G4double facFel;
148  static const G4double facFinel;
149 
150  static const G4double preS1, logTwo;
151 
152 };
153 
154 
155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
156 
157 inline
159 {
160  fLPMconstant = val;
161 }
162 
163 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
164 
165 inline
167 {
168  return fLPMconstant;
169 }
170 
171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
172 
173 inline
175 {
176  fLPMflag = val;
177 }
178 
179 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
180 
181 inline
183 {
184  return fLPMflag;
185 }
186 
187 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
188 
190 {
191  if(Z != currentZ) {
192  currentZ = Z;
193 
194  G4int iz = G4int(Z);
195  z13 = nist->GetZ13(iz);
196  z23 = z13*z13;
197  lnZ = nist->GetLOGZ(iz);
198 
199  if (iz <= 4) {
200  Fel = Fel_light[iz];
201  Finel = Finel_light[iz] ;
202  }
203  else {
204  Fel = facFel - lnZ/3. ;
205  Finel = facFinel - 2.*lnZ/3. ;
206  }
208  }
209 }
210 
211 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
212 
214 {
215  G4double screenVal;
216 
217  if (delta > 1.)
218  screenVal = 21.12 - 4.184*std::log(delta+0.952);
219  else
220  screenVal = 20.868 - delta*(3.242 - 0.625*delta);
221 
222  return screenVal;
223 }
224 
225 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
226 
228 {
229  G4double screenVal;
230 
231  if (delta > 1.)
232  screenVal = 21.12 - 4.184*std::log(delta+0.952);
233  else
234  screenVal = 20.209 - delta*(1.930 + 0.086*delta);
235 
236  return screenVal;
237 }
238 
240 
241 // compute the value of the screening function 3*PHI1 - PHI2
242 
243 {
244  G4double screenVal;
245 
246  if (ScreenVariable > 1.)
247  screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
248  else
249  screenVal = 42.392 - ScreenVariable*(7.796 - 1.961*ScreenVariable);
250 
251  return screenVal;
252 }
253 
254 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
255 
257 
258 // compute the value of the screening function 1.5*PHI1 + 0.5*PHI2
259 
260 {
261  G4double screenVal;
262 
263  if (ScreenVariable > 1.)
264  screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
265  else
266  screenVal = 41.405 - ScreenVariable*(5.828 - 0.8945*ScreenVariable);
267 
268  return screenVal;
269 }
270 
271 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
272 
273 
275 {
276  // k > 50 MeV
277  G4double FZ = 8.*(lnZ/3. + fCoulomb);
278  return std::exp( (42.24-FZ)/8.368 ) + 0.952;
279 }
280 
282 {
283  return 4.*136./z13*(CLHEP::electron_mass_c2/k);
284 }
285 
286 
287 
288 #endif