Geant4  10.02.p03
G4PairProductionRelModel Class Reference

#include <G4PairProductionRelModel.hh>

Inheritance diagram for G4PairProductionRelModel:
Collaboration diagram for G4PairProductionRelModel:

Public Member Functions

 G4PairProductionRelModel (const G4ParticleDefinition *p=0, const G4String &nam="BetheHeitlerLPM")
 
virtual ~G4PairProductionRelModel ()
 
virtual void Initialise (const G4ParticleDefinition *, const G4DataVector &)
 
virtual void InitialiseLocal (const G4ParticleDefinition *, G4VEmModel *masterModel)
 
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX)
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle *> *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
 
virtual void SetupForMaterial (const G4ParticleDefinition *, const G4Material *, G4double)
 
void SetCurrentElement (G4double)
 
void SetLPMconstant (G4double val)
 
G4double LPMconstant () const
 
void SetLPMflag (G4bool)
 
G4bool LPMflag () const
 
- Public Member Functions inherited from G4VEmModel
 G4VEmModel (const G4String &nam)
 
virtual ~G4VEmModel ()
 
virtual void InitialiseForMaterial (const G4ParticleDefinition *, const G4Material *)
 
virtual void InitialiseForElement (const G4ParticleDefinition *, G4int Z)
 
virtual G4double ComputeDEDXPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
 
virtual G4double CrossSectionPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
virtual G4double GetPartialCrossSection (const G4Material *, G4int, const G4ParticleDefinition *, G4double)
 
virtual G4double ComputeCrossSectionPerShell (const G4ParticleDefinition *, G4int Z, G4int shellIdx, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
virtual G4double ChargeSquareRatio (const G4Track &)
 
virtual G4double GetChargeSquareRatio (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
virtual G4double GetParticleCharge (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
virtual void StartTracking (G4Track *)
 
virtual void CorrectionsAlongStep (const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
 
virtual G4double Value (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
 
virtual G4double MinPrimaryEnergy (const G4Material *, const G4ParticleDefinition *, G4double cut=0.0)
 
virtual G4double MinEnergyCut (const G4ParticleDefinition *, const G4MaterialCutsCouple *)
 
virtual void DefineForRegion (const G4Region *)
 
virtual void ModelDescription (std::ostream &outFile) const
 
void InitialiseElementSelectors (const G4ParticleDefinition *, const G4DataVector &)
 
std::vector< G4EmElementSelector * > * GetElementSelectors ()
 
void SetElementSelectors (std::vector< G4EmElementSelector *> *)
 
G4double ComputeDEDX (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
 
G4double CrossSection (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4double ComputeMeanFreePath (const G4ParticleDefinition *, G4double kineticEnergy, const G4Material *, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, const G4Element *, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4int SelectIsotopeNumber (const G4Element *)
 
const G4ElementSelectRandomAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
const G4ElementSelectRandomAtom (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4int SelectRandomAtomNumber (const G4Material *)
 
void SetParticleChange (G4VParticleChange *, G4VEmFluctuationModel *f=0)
 
void SetCrossSectionTable (G4PhysicsTable *, G4bool isLocal)
 
G4ElementDataGetElementData ()
 
G4PhysicsTableGetCrossSectionTable ()
 
G4VEmFluctuationModelGetModelOfFluctuations ()
 
G4VEmAngularDistributionGetAngularDistribution ()
 
void SetAngularDistribution (G4VEmAngularDistribution *)
 
G4double HighEnergyLimit () const
 
G4double LowEnergyLimit () const
 
G4double HighEnergyActivationLimit () const
 
G4double LowEnergyActivationLimit () const
 
G4double PolarAngleLimit () const
 
G4double SecondaryThreshold () const
 
G4bool LPMFlag () const
 
G4bool DeexcitationFlag () const
 
G4bool ForceBuildTableFlag () const
 
G4bool UseAngularGeneratorFlag () const
 
void SetAngularGeneratorFlag (G4bool)
 
void SetHighEnergyLimit (G4double)
 
void SetLowEnergyLimit (G4double)
 
void SetActivationHighEnergyLimit (G4double)
 
void SetActivationLowEnergyLimit (G4double)
 
G4bool IsActive (G4double kinEnergy)
 
void SetPolarAngleLimit (G4double)
 
void SetSecondaryThreshold (G4double)
 
void SetLPMFlag (G4bool val)
 
void SetDeexcitationFlag (G4bool val)
 
void SetForceBuildTable (G4bool val)
 
void SetMasterThread (G4bool val)
 
G4bool IsMaster () const
 
G4double MaxSecondaryKinEnergy (const G4DynamicParticle *dynParticle)
 
const G4StringGetName () const
 
void SetCurrentCouple (const G4MaterialCutsCouple *)
 
const G4ElementGetCurrentElement () const
 
const G4IsotopeGetCurrentIsotope () const
 
G4bool IsLocked () const
 
void SetLocked (G4bool)
 

Protected Member Functions

G4double Phi1 (G4double delta) const
 
G4double Phi2 (G4double delta) const
 
G4double ScreenFunction1 (G4double ScreenVariable)
 
G4double ScreenFunction2 (G4double ScreenVariable)
 
G4double DeltaMax () const
 
G4double DeltaMin (G4double) const
 
void CalcLPMFunctions (G4double k, G4double eplus)
 
G4double ComputeXSectionPerAtom (G4double totalEnergy, G4double Z)
 
G4double ComputeDXSectionPerAtom (G4double eplusEnergy, G4double totalEnergy, G4double Z)
 
G4double ComputeRelDXSectionPerAtom (G4double eplusEnergy, G4double totalEnergy, G4double Z)
 
G4PairProductionRelModeloperator= (const G4PairProductionRelModel &right)
 
 G4PairProductionRelModel (const G4PairProductionRelModel &)
 
- Protected Member Functions inherited from G4VEmModel
G4ParticleChangeForLoss * GetParticleChangeForLoss ()
 
G4ParticleChangeForGamma * GetParticleChangeForGamma ()
 
virtual G4double MaxSecondaryEnergy (const G4ParticleDefinition *, G4double kineticEnergy)
 
const G4MaterialCutsCoupleCurrentCouple () const
 
void SetCurrentElement (const G4Element *)
 

Protected Attributes

G4NistManagernist
 
G4ParticleDefinitiontheGamma
 
G4ParticleDefinitiontheElectron
 
G4ParticleDefinitionthePositron
 
G4ParticleChangeForGamma * fParticleChange
 
G4double fLPMconstant
 
G4bool fLPMflag
 
G4double z13
 
G4double z23
 
G4double lnZ
 
G4double Fel
 
G4double Finel
 
G4double fCoulomb
 
G4double currentZ
 
G4double lpmEnergy
 
G4double xiLPM
 
G4double phiLPM
 
G4double gLPM
 
G4bool use_completescreening
 
- Protected Attributes inherited from G4VEmModel
G4ElementDatafElementData
 
G4VParticleChange * pParticleChange
 
G4PhysicsTablexSectionTable
 
const std::vector< G4double > * theDensityFactor
 
const std::vector< G4int > * theDensityIdx
 
size_t idxTable
 

Static Protected Attributes

static const G4double xgi [8]
 
static const G4double wgi [8]
 
static const G4double Fel_light [5] = {0., 5.31 , 4.79 , 4.74 , 4.71}
 
static const G4double Finel_light [5] = {0., 6.144 , 5.621 , 5.805 , 5.924}
 
static const G4double facFel = G4Log(184.15)
 
static const G4double facFinel = G4Log(1194.)
 
static const G4double preS1 = 1./(184.15*184.15)
 
static const G4double logTwo = G4Log(2.)
 
- Static Protected Attributes inherited from G4VEmModel
static const G4double inveplus = 1.0/CLHEP::eplus
 

Detailed Description

Definition at line 61 of file G4PairProductionRelModel.hh.

Constructor & Destructor Documentation

◆ G4PairProductionRelModel() [1/2]

G4PairProductionRelModel::G4PairProductionRelModel ( const G4ParticleDefinition p = 0,
const G4String nam = "BetheHeitlerLPM" 
)

Definition at line 90 of file G4PairProductionRelModel.cc.

92  : G4VEmModel(nam),
94  fLPMflag(true),
95  lpmEnergy(0.),
97 {
98  fParticleChange = 0;
102 
104 
105  currentZ = z13 = z23 = lnZ = Fel = Finel = fCoulomb = phiLPM = gLPM = xiLPM = 0;
106 
107 }
G4ParticleDefinition * thePositron
static G4NistManager * Instance()
G4VEmModel(const G4String &nam)
Definition: G4VEmModel.cc:69
int fine_structure_const
Definition: hepunit.py:287
float hbarc
Definition: hepunit.py:265
float electron_mass_c2
Definition: hepunit.py:274
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
static G4Positron * Positron()
Definition: G4Positron.cc:94
G4ParticleChangeForGamma * fParticleChange
static const double pi
Definition: G4SIunits.hh:74
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4ParticleDefinition * theElectron
Here is the call graph for this function:

◆ ~G4PairProductionRelModel()

G4PairProductionRelModel::~G4PairProductionRelModel ( )
virtual

Definition at line 111 of file G4PairProductionRelModel.cc.

112 {}

◆ G4PairProductionRelModel() [2/2]

G4PairProductionRelModel::G4PairProductionRelModel ( const G4PairProductionRelModel )
protected

Member Function Documentation

◆ CalcLPMFunctions()

void G4PairProductionRelModel::CalcLPMFunctions ( G4double  k,
G4double  eplus 
)
protected

Definition at line 238 of file G4PairProductionRelModel.cc.

239 {
240  // *** calculate lpm variable s & sprime ***
241  // Klein eqs. (78) & (79)
242  G4double sprime = sqrt(0.125*k*lpmEnergy/(eplusEnergy*(k-eplusEnergy)));
243 
244  G4double s1 = preS1*z23;
245  G4double logS1 = 2./3.*lnZ-2.*facFel;
246  G4double logTS1 = logTwo+logS1;
247 
248  xiLPM = 2.;
249 
250  if (sprime>1)
251  xiLPM = 1.;
252  else if (sprime>sqrt(2.)*s1) {
253  G4double h = G4Log(sprime)/logTS1;
254  xiLPM = 1+h-0.08*(1-h)*(1-sqr(1-h))/logTS1;
255  }
256 
257  G4double s0 = sprime/sqrt(xiLPM);
258  // G4cout<<"k="<<k<<" y="<<eplusEnergy/k<<G4endl;
259  // G4cout<<"s0="<<s0<<G4endl;
260 
261  // *** calculate supression functions phi and G ***
262  // Klein eqs. (77)
263  G4double s2=s0*s0;
264  G4double s3=s0*s2;
265  G4double s4=s2*s2;
266 
267  if (s0<0.1) {
268  // high suppression limit
269  phiLPM = 6.*s0 - 18.84955592153876*s2 + 39.47841760435743*s3
270  - 57.69873135166053*s4;
271  gLPM = 37.69911184307752*s2 - 236.8705056261446*s3 + 807.7822389*s4;
272  }
273  else if (s0<1.9516) {
274  // intermediate suppression
275  // using eq.77 approxim. valid s0<2.
276  phiLPM = 1.-G4Exp(-6.*s0*(1.+(3.-pi)*s0)
277  +s3/(0.623+0.795*s0+0.658*s2));
278  if (s0<0.415827397755) {
279  // using eq.77 approxim. valid 0.07<s<2
280  G4double psiLPM = 1-G4Exp(-4*s0-8*s2/(1+3.936*s0+4.97*s2-0.05*s3+7.50*s4));
281  gLPM = 3*psiLPM-2*phiLPM;
282  }
283  else {
284  // using alternative parametrisiation
285  G4double pre = -0.16072300849123999 + s0*3.7550300067531581 + s2*-1.7981383069010097
286  + s3*0.67282686077812381 + s4*-0.1207722909879257;
287  gLPM = tanh(pre);
288  }
289  }
290  else {
291  // low suppression limit valid s>2.
292  phiLPM = 1. - 0.0119048/s4;
293  gLPM = 1. - 0.0230655/s4;
294  }
295 
296  // *** make sure suppression is smaller than 1 ***
297  // *** caused by Migdal approximation in xi ***
298  if (xiLPM*phiLPM>1. || s0>0.57) xiLPM=1./phiLPM;
299 }
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
static const double pi
Definition: G4SIunits.hh:74
T sqr(const T &x)
Definition: templates.hh:145
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ComputeCrossSectionPerAtom()

G4double G4PairProductionRelModel::ComputeCrossSectionPerAtom ( const G4ParticleDefinition ,
G4double  kinEnergy,
G4double  Z,
G4double  A = 0.,
G4double  cut = 0.,
G4double  emax = DBL_MAX 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 305 of file G4PairProductionRelModel.cc.

308 {
309  G4double crossSection = 0.0 ;
310  // if ( Z < 0.9 ) return crossSection;
311  if ( gammaEnergy <= 2.0*electron_mass_c2 ) return crossSection;
312 
314  // choose calculator according to parameters and switches
315  // in the moment only one calculator:
316  crossSection=ComputeXSectionPerAtom(gammaEnergy,Z);
317 
318  G4double xi = Finel/(Fel - fCoulomb); // inelastic contribution
319  crossSection *= xsfactor*Z*(Z+xi);
320 
321  return crossSection;
322 }
G4double ComputeXSectionPerAtom(G4double totalEnergy, G4double Z)
Float_t Z
float electron_mass_c2
Definition: hepunit.py:274
double G4double
Definition: G4Types.hh:76
static const G4double xsfactor
Here is the call graph for this function:

◆ ComputeDXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeDXSectionPerAtom ( G4double  eplusEnergy,
G4double  totalEnergy,
G4double  Z 
)
protected

Definition at line 181 of file G4PairProductionRelModel.cc.

184 {
185  // most simple case - complete screening:
186 
187  // dsig/dE+ = 4 * alpha * Z**2 * r0**2 / k
188  // * [ (y**2 + (1-y**2) + 2/3*y*(1-y) ) * ( log (183 * Z**-1/3) + 1/9 * y*(1-y) ]
189  // y = E+/k
190  G4double yp=eplusEnergy/totalEnergy;
191  G4double ym=1.-yp;
192 
193  G4double cross = 0.;
195  cross = (yp*yp + ym*ym + 2./3.*ym*yp)*(Fel - fCoulomb) + 1./9.*yp*ym;
196  else {
197  G4double delta = 0.25*DeltaMin(totalEnergy)/(yp*ym);
198  cross = (yp*yp + ym*ym)*(0.25*Phi1(delta) - lnZ/3. - fCoulomb)
199  + 2./3.*ym*yp*(0.25*Phi2(delta) - lnZ/3. - fCoulomb);
200  }
201  return cross/totalEnergy;
202 
203 }
G4double Phi1(G4double delta) const
G4double Phi2(G4double delta) const
G4double DeltaMin(G4double) const
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ComputeRelDXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeRelDXSectionPerAtom ( G4double  eplusEnergy,
G4double  totalEnergy,
G4double  Z 
)
protected

Definition at line 207 of file G4PairProductionRelModel.cc.

210 {
211  // most simple case - complete screening:
212 
213  // dsig/dE+ = 4 * alpha * Z**2 * r0**2 / k
214  // * [ (y**2 + (1-y**2) + 2/3*y*(1-y) ) * ( log (183 * Z**-1/3) + 1/9 * y*(1-y) ]
215  // y = E+/k
216  G4double yp=eplusEnergy/totalEnergy;
217  G4double ym=1.-yp;
218 
219  CalcLPMFunctions(totalEnergy,eplusEnergy); // gamma
220 
221  G4double cross = 0.;
223  cross = xiLPM*(2./3.*phiLPM*(yp*yp + ym*ym) + gLPM)*(Fel - fCoulomb);
224  else {
225  G4double delta = 0.25*DeltaMin(totalEnergy)/(yp*ym);
226  cross = (1./3.*gLPM + 2./3.*phiLPM)*(yp*yp + ym*ym)
227  *(0.25*Phi1(delta) - lnZ/3. - fCoulomb)
228  + 2./3.*gLPM*ym*yp*(0.25*Phi2(delta) - lnZ/3. - fCoulomb);
229  cross *= xiLPM;
230  }
231  return cross/totalEnergy;
232 
233 }
void CalcLPMFunctions(G4double k, G4double eplus)
G4double Phi1(G4double delta) const
G4double Phi2(G4double delta) const
G4double DeltaMin(G4double) const
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ComputeXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeXSectionPerAtom ( G4double  totalEnergy,
G4double  Z 
)
protected

Definition at line 137 of file G4PairProductionRelModel.cc.

138 {
139  G4double cross = 0.0;
140 
141  // number of intervals and integration step
142  G4double vcut = electron_mass_c2/totalEnergy ;
143 
144  // limits by the screening variable
145  G4double dmax = DeltaMax();
146  G4double dmin = min(DeltaMin(totalEnergy),dmax);
147  G4double vcut1 = 0.5 - 0.5*sqrt(1. - dmin/dmax) ;
148  vcut = max(vcut, vcut1);
149 
150 
151  G4double vmax = 0.5;
152  G4int n = 1; // needs optimisation
153 
154  G4double delta = (vmax - vcut)*totalEnergy/G4double(n);
155 
156  G4double e0 = vcut*totalEnergy;
157  G4double xs;
158 
159  // simple integration
160  for(G4int l=0; l<n; l++,e0 += delta) {
161  for(G4int i=0; i<8; i++) {
162 
163  G4double eg = (e0 + xgi[i]*delta);
164  if (fLPMflag && totalEnergy>100.*GeV)
165  xs = ComputeRelDXSectionPerAtom(eg,totalEnergy,Z);
166  else
167  xs = ComputeDXSectionPerAtom(eg,totalEnergy,Z);
168  cross += wgi[i]*xs;
169 
170  }
171  }
172 
173  cross *= delta*2.;
174 
175  return cross;
176 }
int G4int
Definition: G4Types.hh:78
static const G4double xgi[8]
Char_t n[5]
static const G4double wgi[8]
Float_t Z
static const double GeV
Definition: G4SIunits.hh:214
float electron_mass_c2
Definition: hepunit.py:274
G4double DeltaMin(G4double) const
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z)
double G4double
Definition: G4Types.hh:76
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DeltaMax()

G4double G4PairProductionRelModel::DeltaMax ( ) const
inlineprotected

Definition at line 277 of file G4PairProductionRelModel.hh.

278 {
279  // k > 50 MeV
280  G4double FZ = 8.*(lnZ/3. + fCoulomb);
281  return std::exp( (42.24-FZ)/8.368 ) + 0.952;
282 }
double G4double
Definition: G4Types.hh:76
Here is the caller graph for this function:

◆ DeltaMin()

G4double G4PairProductionRelModel::DeltaMin ( G4double  k) const
inlineprotected

Definition at line 284 of file G4PairProductionRelModel.hh.

285 {
286  return 4.*136./z13*(CLHEP::electron_mass_c2/k);
287 }
static const double electron_mass_c2
Here is the caller graph for this function:

◆ Initialise()

void G4PairProductionRelModel::Initialise ( const G4ParticleDefinition p,
const G4DataVector cuts 
)
virtual

Implements G4VEmModel.

Definition at line 116 of file G4PairProductionRelModel.cc.

118 {
120  if(IsMaster() && LowEnergyLimit() < HighEnergyLimit()) {
121  InitialiseElementSelectors(p, cuts);
122  }
123 }
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:641
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
Definition: G4VEmModel.cc:148
G4bool IsMaster() const
Definition: G4VEmModel.hh:718
G4double HighEnergyLimit() const
Definition: G4VEmModel.hh:634
G4ParticleChangeForGamma * fParticleChange
G4ParticleChangeForGamma * GetParticleChangeForGamma()
Definition: G4VEmModel.cc:134
Here is the call graph for this function:

◆ InitialiseLocal()

void G4PairProductionRelModel::InitialiseLocal ( const G4ParticleDefinition ,
G4VEmModel masterModel 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 127 of file G4PairProductionRelModel.cc.

129 {
130  if(LowEnergyLimit() < HighEnergyLimit()) {
132  }
133 }
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:641
void SetElementSelectors(std::vector< G4EmElementSelector *> *)
Definition: G4VEmModel.hh:810
G4double HighEnergyLimit() const
Definition: G4VEmModel.hh:634
std::vector< G4EmElementSelector * > * GetElementSelectors()
Definition: G4VEmModel.hh:802
Here is the call graph for this function:

◆ LPMconstant()

G4double G4PairProductionRelModel::LPMconstant ( ) const
inline

Definition at line 169 of file G4PairProductionRelModel.hh.

170 {
171  return fLPMconstant;
172 }

◆ LPMflag()

G4bool G4PairProductionRelModel::LPMflag ( ) const
inline

Definition at line 185 of file G4PairProductionRelModel.hh.

186 {
187  return fLPMflag;
188 }

◆ operator=()

G4PairProductionRelModel& G4PairProductionRelModel::operator= ( const G4PairProductionRelModel right)
protected

◆ Phi1()

G4double G4PairProductionRelModel::Phi1 ( G4double  delta) const
inlineprotected

Definition at line 216 of file G4PairProductionRelModel.hh.

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 }
double G4double
Definition: G4Types.hh:76
Here is the caller graph for this function:

◆ Phi2()

G4double G4PairProductionRelModel::Phi2 ( G4double  delta) const
inlineprotected

Definition at line 230 of file G4PairProductionRelModel.hh.

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 }
double G4double
Definition: G4Types.hh:76
Here is the caller graph for this function:

◆ SampleSecondaries()

void G4PairProductionRelModel::SampleSecondaries ( std::vector< G4DynamicParticle *> *  fvect,
const G4MaterialCutsCouple couple,
const G4DynamicParticle aDynamicGamma,
G4double  tmin,
G4double  maxEnergy 
)
virtual

Implements G4VEmModel.

Definition at line 327 of file G4PairProductionRelModel.cc.

344 {
345  const G4Material* aMaterial = couple->GetMaterial();
346 
347  G4double GammaEnergy = aDynamicGamma->GetKineticEnergy();
348  G4ParticleMomentum GammaDirection = aDynamicGamma->GetMomentumDirection();
349 
350  G4double epsil ;
351  G4double epsil0 = electron_mass_c2/GammaEnergy ;
352  if(epsil0 > 1.0) { return; }
353 
354  // do it fast if GammaEnergy < 2. MeV
355  SetupForMaterial(theGamma, aMaterial, GammaEnergy);
356 
357  // select randomly one element constituing the material
358  const G4Element* anElement =
359  SelectRandomAtom(aMaterial, theGamma, GammaEnergy);
360 
361  CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine();
362 
363  if (GammaEnergy < Egsmall) {
364 
365  epsil = epsil0 + (0.5-epsil0)*rndmEngine->flat();
366 
367  } else {
368  // now comes the case with GammaEnergy >= 2. MeV
369 
370  // Extract Coulomb factor for this Element
371  G4double FZ = 8.*(anElement->GetIonisation()->GetlogZ3());
372  if (GammaEnergy > 50.*MeV) { FZ += 8.*(anElement->GetfCoulomb()); }
373 
374  // limits of the screening variable
375  G4double screenfac = 136.*epsil0/(anElement->GetIonisation()->GetZ3());
376  G4double screenmax = G4Exp ((42.24 - FZ)/8.368) - 0.952 ;
377  G4double screenmin = min(4.*screenfac,screenmax);
378 
379  // limits of the energy sampling
380  G4double epsil1 = 0.5 - 0.5*sqrt(1. - screenmin/screenmax) ;
381  G4double epsilmin = max(epsil0,epsil1) , epsilrange = 0.5 - epsilmin;
382 
383  //
384  // sample the energy rate of the created electron (or positron)
385  //
386  //G4double epsil, screenvar, greject ;
387  G4double screenvar, greject ;
388 
389  G4double F10 = ScreenFunction1(screenmin) - FZ;
390  G4double F20 = ScreenFunction2(screenmin) - FZ;
391  G4double NormF1 = max(F10*epsilrange*epsilrange,0.);
392  G4double NormF2 = max(1.5*F20,0.);
393 
394  do {
395  if ( NormF1/(NormF1+NormF2) > rndmEngine->flat() ) {
396  epsil = 0.5 - epsilrange*nist->GetZ13(rndmEngine->flat());
397  screenvar = screenfac/(epsil*(1-epsil));
398  if (fLPMflag && GammaEnergy>100.*GeV) {
399  CalcLPMFunctions(GammaEnergy,GammaEnergy*epsil);
400  greject = xiLPM*((gLPM+2.*phiLPM)*Phi1(screenvar) -
401  gLPM*Phi2(screenvar) - phiLPM*FZ)/F10;
402  }
403  else {
404  greject = (ScreenFunction1(screenvar) - FZ)/F10;
405  }
406 
407  } else {
408  epsil = epsilmin + epsilrange*rndmEngine->flat();
409  screenvar = screenfac/(epsil*(1-epsil));
410  if (fLPMflag && GammaEnergy>100.*GeV) {
411  CalcLPMFunctions(GammaEnergy,GammaEnergy*epsil);
412  greject = xiLPM*((0.5*gLPM+phiLPM)*Phi1(screenvar) +
413  0.5*gLPM*Phi2(screenvar) - 0.5*(gLPM+phiLPM)*FZ)/F20;
414  }
415  else {
416  greject = (ScreenFunction2(screenvar) - FZ)/F20;
417  }
418  }
419 
420  // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
421  } while( greject < rndmEngine->flat());
422 
423  } // end of epsil sampling
424 
425  //
426  // fixe charges randomly
427  //
428 
429  G4double ElectTotEnergy, PositTotEnergy;
430  if (rndmEngine->flat() > 0.5) {
431 
432  ElectTotEnergy = (1.-epsil)*GammaEnergy;
433  PositTotEnergy = epsil*GammaEnergy;
434 
435  } else {
436 
437  PositTotEnergy = (1.-epsil)*GammaEnergy;
438  ElectTotEnergy = epsil*GammaEnergy;
439  }
440 
441  //
442  // scattered electron (positron) angles. ( Z - axis along the parent photon)
443  //
444  // universal distribution suggested by L. Urban
445  // (Geant3 manual (1993) Phys211),
446  // derived from Tsai distribution (Rev Mod Phys 49,421(1977))
447 
448  G4double u = -G4Log(rndmEngine->flat()*rndmEngine->flat());
449 
450  if (9. > 36.*rndmEngine->flat()) { u *= 1.6; }
451  else { u *= 0.53333; }
452 
453  G4double TetEl = u*electron_mass_c2/ElectTotEnergy;
454  G4double TetPo = u*electron_mass_c2/PositTotEnergy;
455  G4double Phi = twopi * rndmEngine->flat();
456  G4double dxEl= sin(TetEl)*cos(Phi),dyEl= sin(TetEl)*sin(Phi),dzEl=cos(TetEl);
457  G4double dxPo=-sin(TetPo)*cos(Phi),dyPo=-sin(TetPo)*sin(Phi),dzPo=cos(TetPo);
458 
459  //
460  // kinematic of the created pair
461  //
462  // the electron and positron are assumed to have a symetric
463  // angular distribution with respect to the Z axis along the parent photon.
464 
465  G4double ElectKineEnergy = max(0.,ElectTotEnergy - electron_mass_c2);
466 
467  G4ThreeVector ElectDirection (dxEl, dyEl, dzEl);
468  ElectDirection.rotateUz(GammaDirection);
469 
470  // create G4DynamicParticle object for the particle1
471  G4DynamicParticle* aParticle1= new G4DynamicParticle(
472  theElectron,ElectDirection,ElectKineEnergy);
473 
474  // the e+ is always created (even with Ekine=0) for further annihilation.
475 
476  G4double PositKineEnergy = max(0.,PositTotEnergy - electron_mass_c2);
477 
478  G4ThreeVector PositDirection (dxPo, dyPo, dzPo);
479  PositDirection.rotateUz(GammaDirection);
480 
481  // create G4DynamicParticle object for the particle2
482  G4DynamicParticle* aParticle2= new G4DynamicParticle(
483  thePositron,PositDirection,PositKineEnergy);
484 
485  // Fill output vector
486  fvect->push_back(aParticle1);
487  fvect->push_back(aParticle2);
488 
489  // kill incident photon
490  fParticleChange->SetProposedKineticEnergy(0.);
491  fParticleChange->ProposeTrackStatus(fStopAndKill);
492 }
static const double MeV
Definition: G4SIunits.hh:211
const G4Material * GetMaterial() const
G4double GetlogZ3() const
G4double GetZ13(G4double Z)
static const G4double Egsmall
virtual double flat()=0
#define F20
G4ParticleDefinition * thePositron
G4double GetZ3() const
G4double ScreenFunction1(G4double ScreenVariable)
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double)
G4double GetKineticEnergy() const
static const double twopi
Definition: G4SIunits.hh:75
G4IonisParamElm * GetIonisation() const
Definition: G4Element.hh:198
void CalcLPMFunctions(G4double k, G4double eplus)
static const double GeV
Definition: G4SIunits.hh:214
float electron_mass_c2
Definition: hepunit.py:274
G4double ScreenFunction2(G4double ScreenVariable)
#define F10
double flat()
Definition: G4AblaRandom.cc:47
G4double GetfCoulomb() const
Definition: G4Element.hh:190
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double Phi1(G4double delta) const
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
G4ParticleChangeForGamma * fParticleChange
const G4ThreeVector & GetMomentumDirection() const
G4double Phi2(G4double delta) const
G4ParticleDefinition * theElectron
double G4double
Definition: G4Types.hh:76
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:544
Here is the call graph for this function:

◆ ScreenFunction1()

G4double G4PairProductionRelModel::ScreenFunction1 ( G4double  ScreenVariable)
inlineprotected

Definition at line 242 of file G4PairProductionRelModel.hh.

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 }
double G4double
Definition: G4Types.hh:76
Here is the caller graph for this function:

◆ ScreenFunction2()

G4double G4PairProductionRelModel::ScreenFunction2 ( G4double  ScreenVariable)
inlineprotected

Definition at line 259 of file G4PairProductionRelModel.hh.

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 }
double G4double
Definition: G4Types.hh:76
Here is the caller graph for this function:

◆ SetCurrentElement()

void G4PairProductionRelModel::SetCurrentElement ( G4double  Z)
inline

Definition at line 192 of file G4PairProductionRelModel.hh.

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 }
const G4Element * GetCurrentElement() const
Definition: G4VEmModel.hh:467
G4double GetZ13(G4double Z)
static const G4double Finel_light[5]
int G4int
Definition: G4Types.hh:78
Float_t Z
G4double iz
Definition: TRTMaterials.hh:39
G4double GetfCoulomb() const
Definition: G4Element.hh:190
G4double GetLOGZ(G4int Z)
static const G4double Fel_light[5]
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetLPMconstant()

void G4PairProductionRelModel::SetLPMconstant ( G4double  val)
inline

Definition at line 161 of file G4PairProductionRelModel.hh.

162 {
163  fLPMconstant = val;
164 }

◆ SetLPMflag()

void G4PairProductionRelModel::SetLPMflag ( G4bool  val)
inline

Definition at line 177 of file G4PairProductionRelModel.hh.

178 {
179  fLPMflag = val;
180 }

◆ SetupForMaterial()

void G4PairProductionRelModel::SetupForMaterial ( const G4ParticleDefinition ,
const G4Material mat,
G4double   
)
virtual

Reimplemented from G4VEmModel.

Definition at line 497 of file G4PairProductionRelModel.cc.

499 {
501  // G4cout<<" lpmEnergy="<<lpmEnergy<<G4endl;
502 }
G4double GetRadlen() const
Definition: G4Material.hh:220
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ currentZ

G4double G4PairProductionRelModel::currentZ
protected

Definition at line 138 of file G4PairProductionRelModel.hh.

◆ facFel

const G4double G4PairProductionRelModel::facFel = G4Log(184.15)
staticprotected

Definition at line 150 of file G4PairProductionRelModel.hh.

◆ facFinel

const G4double G4PairProductionRelModel::facFinel = G4Log(1194.)
staticprotected

Definition at line 151 of file G4PairProductionRelModel.hh.

◆ fCoulomb

G4double G4PairProductionRelModel::fCoulomb
protected

Definition at line 137 of file G4PairProductionRelModel.hh.

◆ Fel

G4double G4PairProductionRelModel::Fel
protected

Definition at line 137 of file G4PairProductionRelModel.hh.

◆ Fel_light

const G4double G4PairProductionRelModel::Fel_light = {0., 5.31 , 4.79 , 4.74 , 4.71}
staticprotected

Definition at line 148 of file G4PairProductionRelModel.hh.

◆ Finel

G4double G4PairProductionRelModel::Finel
protected

Definition at line 137 of file G4PairProductionRelModel.hh.

◆ Finel_light

const G4double G4PairProductionRelModel::Finel_light = {0., 6.144 , 5.621 , 5.805 , 5.924}
staticprotected

Definition at line 149 of file G4PairProductionRelModel.hh.

◆ fLPMconstant

G4double G4PairProductionRelModel::fLPMconstant
protected

Definition at line 132 of file G4PairProductionRelModel.hh.

◆ fLPMflag

G4bool G4PairProductionRelModel::fLPMflag
protected

Definition at line 133 of file G4PairProductionRelModel.hh.

◆ fParticleChange

G4ParticleChangeForGamma* G4PairProductionRelModel::fParticleChange
protected

Definition at line 130 of file G4PairProductionRelModel.hh.

◆ gLPM

G4double G4PairProductionRelModel::gLPM
protected

Definition at line 142 of file G4PairProductionRelModel.hh.

◆ lnZ

G4double G4PairProductionRelModel::lnZ
protected

Definition at line 136 of file G4PairProductionRelModel.hh.

◆ logTwo

const G4double G4PairProductionRelModel::logTwo = G4Log(2.)
staticprotected

Definition at line 153 of file G4PairProductionRelModel.hh.

◆ lpmEnergy

G4double G4PairProductionRelModel::lpmEnergy
protected

Definition at line 141 of file G4PairProductionRelModel.hh.

◆ nist

G4NistManager* G4PairProductionRelModel::nist
protected

Definition at line 125 of file G4PairProductionRelModel.hh.

◆ phiLPM

G4double G4PairProductionRelModel::phiLPM
protected

Definition at line 142 of file G4PairProductionRelModel.hh.

◆ preS1

const G4double G4PairProductionRelModel::preS1 = 1./(184.15*184.15)
staticprotected

Definition at line 153 of file G4PairProductionRelModel.hh.

◆ theElectron

G4ParticleDefinition* G4PairProductionRelModel::theElectron
protected

Definition at line 128 of file G4PairProductionRelModel.hh.

◆ theGamma

G4ParticleDefinition* G4PairProductionRelModel::theGamma
protected

Definition at line 127 of file G4PairProductionRelModel.hh.

◆ thePositron

G4ParticleDefinition* G4PairProductionRelModel::thePositron
protected

Definition at line 129 of file G4PairProductionRelModel.hh.

◆ use_completescreening

G4bool G4PairProductionRelModel::use_completescreening
protected

Definition at line 145 of file G4PairProductionRelModel.hh.

◆ wgi

const G4double G4PairProductionRelModel::wgi
staticprotected
Initial value:
={ 0.0506, 0.1112, 0.1569, 0.1813,
0.1813, 0.1569, 0.1112, 0.0506 }

Definition at line 147 of file G4PairProductionRelModel.hh.

◆ xgi

const G4double G4PairProductionRelModel::xgi
staticprotected
Initial value:
={ 0.0199, 0.1017, 0.2372, 0.4083,
0.5917, 0.7628, 0.8983, 0.9801 }

Definition at line 147 of file G4PairProductionRelModel.hh.

◆ xiLPM

G4double G4PairProductionRelModel::xiLPM
protected

Definition at line 142 of file G4PairProductionRelModel.hh.

◆ z13

G4double G4PairProductionRelModel::z13
protected

Definition at line 136 of file G4PairProductionRelModel.hh.

◆ z23

G4double G4PairProductionRelModel::z23
protected

Definition at line 136 of file G4PairProductionRelModel.hh.


The documentation for this class was generated from the following files: