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
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//
27// -------------------------------------------------------------------
28//
29// GEANT4 Class header file
30//
31//
32// File name: G4PairProductionRelModel
33//
34// Author: Andreas Schaelicke
35//
36// Creation date: 02.04.2009
37//
38// Modifications:
39// 28-05-18 New version with improved screening function approximation, improved
40// LPM function approximation, efficiency, documentation and cleanup.
41// Corrected call to selecting target atom in the final state sampling.
42// (M. Novak)
43//
44// Class Description:
45//
46// Implementation of gamma conversion to e+e- in the field of a nucleus
47// relativistic approximation
48//
49
50// -------------------------------------------------------------------
51//
52
53#ifndef G4PairProductionRelModel_h
54#define G4PairProductionRelModel_h 1
55
57
58#include "G4VEmModel.hh"
59#include "G4Log.hh"
60#include <vector>
61
63class G4Pow;
64
66{
67
68public:
69
70 explicit G4PairProductionRelModel(const G4ParticleDefinition* p = nullptr,
71 const G4String& nam = "BetheHeitlerLPM");
72
74
75 void Initialise(const G4ParticleDefinition*, const G4DataVector&) override;
76
78 G4VEmModel* masterModel) override;
79
81 G4double kinEnergy,
82 G4double Z,
83 G4double A=0.,
84 G4double cut=0.,
85 G4double emax=DBL_MAX) override;
86
87 void SampleSecondaries(std::vector<G4DynamicParticle*>*,
89 const G4DynamicParticle*,
90 G4double tmin,
91 G4double maxEnergy) override;
92
94 const G4Material*,G4double) override;
95
96 inline void SetLPMflag(G4bool val) { fIsUseLPMCorrection = val; }
97 inline G4bool LPMflag() const { return fIsUseLPMCorrection; }
98
100 (const G4PairProductionRelModel &right) = delete;
102
103protected:
104
105 // for evaluating screening related functions
106 inline void ComputePhi12(const G4double delta,
107 G4double &phi1, G4double &phi2);
108 inline G4double ScreenFunction1(const G4double delta);
109 inline G4double ScreenFunction2(const G4double delta);
110 inline void ScreenFunction12(const G4double delta,
111 G4double &f1, G4double &f2);
112 // helper methods for cross-section computation under different approximations
115 G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy,
116 G4double Z);
118 G4double gammaEnergy, G4double Z);
119
120private:
121
122 // for creating some data structure per Z
123 void InitialiseElementData();
124 struct ElementData {
125 G4double fLogZ13;
126 G4double fCoulomb;
127 G4double fLradEl;
128 G4double fDeltaFactor;
129 G4double fDeltaMaxLow;
130 G4double fDeltaMaxHigh;
131 G4double fEtaValue;
132 G4double fLPMVarS1Cond;
133 G4double fLPMILVarS1Cond;
134 };
135 // for precomputing comp. intensive parts of LPM suppression functions and
136 // using them at run-time
137 void InitLPMFunctions();
138 void ComputeLPMGsPhis(G4double &funcGS, G4double &funcPhiS,
139 const G4double varShat);
140 void GetLPMFunctions(G4double &lpmGs, G4double &lpmPhis, const G4double sval);
141 void ComputeLPMfunctions(G4double &fXiS, G4double &fGS, G4double &fPhiS,
142 const G4double eps, const G4double egamma,
143 const G4int izet);
144 struct LPMFuncs {
145 LPMFuncs() : fIsInitialized(false), fISDelta(100.), fSLimit(2.) {}
146 G4bool fIsInitialized;
147 G4double fISDelta;
148 G4double fSLimit;
149 std::vector<G4double> fLPMFuncG;
150 std::vector<G4double> fLPMFuncPhi;
151 };
152
153protected:
154 static const G4int gMaxZet;
155 //
156 static const G4double gLPMconstant;
157 //
158 static const G4double gXGL[8];
159 static const G4double gWGL[8];
160 static const G4double gFelLowZet[8];
161 static const G4double gFinelLowZet[8];
162 //
163 static const G4double gXSecFactor;
165 //
166 static std::vector<ElementData*> gElementData;
167 static LPMFuncs gLPMFuncs;
168 //
171 //
173 //
176 //
182};
183//
184// Bethe screening functions for the elastic (coherent) scattering:
185// Bethe's phi1, phi2 coherent screening functions were computed numerically
186// by using (the universal) atomic form factors computed based on the Thomas-
187// Fermi model of the atom (using numerical solution of the Thomas-Fermi
188// screening function instead of Moliere's analytical approximation). The
189// numerical results can be well approximated (better than Butcher & Messel
190// especially near the delta=1 limit) by:
191// ## if delta <= 1.4
192// phi1(delta) = 20.806 - delta*(3.190 - 0.5710*delta)
193// phi2(delta) = 20.234 - delta*(2.126 - 0.0903*delta)
194// ## if delta > 1.4
195// phi1(delta) = phi2(delta) = 21.0190 - 4.145*ln(delta + 0.958)
196// with delta = 136mc^2kZ^{-1/3}/[E(Eg-E)] = 136Z^{-1/3}eps0/[eps(1-eps)] where
197// Eg is the initial photon energy, E is the total energy transferred to one of
198// the e-/e+ pair, eps0 = mc^2/Eg and eps = E/Eg.
199
201 G4double &phi1,
202 G4double &phi2)
203{
204 if (delta > 1.4) {
205 phi1 = 21.0190 - 4.145*G4Log(delta + 0.958);
206 phi2 = phi1;
207 } else {
208 phi1 = 20.806 - delta*(3.190 - 0.5710*delta);
209 phi2 = 20.234 - delta*(2.126 - 0.0903*delta);
210 }
211}
212
213// Compute the value of the screening function 3*PHI1(delta) - PHI2(delta):
215{
216 return (delta > 1.4) ? 42.038 - 8.29*G4Log(delta + 0.958)
217 : 42.184 - delta*(7.444 - 1.623*delta);
218}
219
220// Compute the value of the screening function 1.5*PHI1(delta) +0.5*PHI2(delta):
222{
223 return (delta > 1.4) ? 42.038 - 8.29*G4Log(delta + 0.958)
224 : 41.326 - delta*(5.848 - 0.902*delta);
225}
226
227// Same as ScreenFunction1 and ScreenFunction2 but computes them at once
229 G4double &f1, G4double &f2)
230{
231 if (delta > 1.4) {
232 f1 = 42.038 - 8.29*G4Log(delta + 0.958);
233 f2 = f1;
234 } else {
235 f1 = 42.184 - delta*(7.444 - 1.623*delta);
236 f2 = 41.326 - delta*(5.848 - 0.902*delta);
237 }
238}
239
240#endif
G4double G4Log(G4double x)
Definition: G4Log.hh:227
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
static const G4double gFelLowZet[8]
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4double ComputeParametrizedXSectionPerAtom(G4double gammaEnergy, G4double Z)
static const G4double gEgLPMActivation
void ScreenFunction12(const G4double delta, G4double &f1, G4double &f2)
static const G4double gFinelLowZet[8]
static std::vector< ElementData * > gElementData
static const G4double gXGL[8]
G4double ScreenFunction1(const G4double delta)
void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double) override
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX) override
G4ParticleDefinition * fThePositron
static const G4double gLPMconstant
void ComputePhi12(const G4double delta, G4double &phi1, G4double &phi2)
G4double ComputeXSectionPerAtom(G4double gammaEnergy, G4double Z)
G4PairProductionRelModel(const G4PairProductionRelModel &)=delete
G4double ScreenFunction2(const G4double delta)
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4ParticleDefinition * fTheGamma
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
static const G4double gWGL[8]
G4ParticleChangeForGamma * fParticleChange
G4ParticleDefinition * fTheElectron
Definition: G4Pow.hh:49
#define DBL_MAX
Definition: templates.hh:62