77 CLHEP::fine_structure_const*CLHEP::electron_mass_c2*CLHEP::electron_mass_c2
78 /(4.*CLHEP::pi*CLHEP::hbarc);
83 1.98550718e-02, 1.01666761e-01, 2.37233795e-01, 4.08282679e-01,
84 5.91717321e-01, 7.62766205e-01, 8.98333239e-01, 9.80144928e-01
87 5.06142681e-02, 1.11190517e-01, 1.56853323e-01, 1.81341892e-01,
88 1.81341892e-01, 1.56853323e-01, 1.11190517e-01, 5.06142681e-02
94 0.0, 5.3104, 4.7935, 4.7402, 4.7112, 4.6694, 4.6134, 4.5520
97 0.0, 5.9173, 5.6125, 5.5377, 5.4728, 5.4174, 5.3688, 5.3236
102 4.*CLHEP::fine_structure_const*CLHEP::classic_electr_radius
103 *CLHEP::classic_electr_radius;
156 InitialiseElementData();
180 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
185 const G4double eps1 = 0.5 - 0.5*std::sqrt(1.-dmin/dmax);
186 const G4double epsMin = std::max(eps0, eps1);
193 const G4int numSub = 2;
195 G4double minEti = epsMin*gammaEnergy;
196 for (
G4int i = 0; i < numSub; ++i) {
197 for (
G4int ngl = 0; ngl < 8; ++ngl) {
201 xSection +=
gWGL[ngl]*xs;
207 xSection = std::max(2.*xSection*dInterv, 0.);
232 const G4double eps = pEnergy/gammaEnergy;
239 xSection = (eps*eps + epsm*epsm + 2.*dum/3.)*(Lel-fc) - dum/9.;
242 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
248 xSection = (eps*eps + epsm*epsm)*(0.25*phi1-lnZ13-fc)
249 + 2.*dum*(0.25*phi2-lnZ13-fc)/3.;
253 return std::max(xSection, 0.0)/gammaEnergy;
281 const G4double eps = pEnergy/gammaEnergy;
286 ComputeLPMfunctions(fXiS, fGS, fPhiS, eps, gammaEnergy, iz);
291 xSection = (Lel-fc)*((eps*eps+epsm*epsm)*2.*fPhiS + fGS)/3. - dum*fGS/9.;
294 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
300 xSection = (eps*eps + epsm*epsm)*(2.*fPhiS+fGS)*(0.25*phi1-lnZ13-fc)/3.
301 + 2.*dum*fGS*(0.25*phi2-lnZ13-fc)/3.;
305 return std::max(fXiS*xSection, 0.0)/gammaEnergy;
314 if ( gammaEnergy <= 2.0*electron_mass_c2 ) {
return crossSection; }
336 return std::max(crossSection, 0.);
366 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy ;
370 if (eps0 > 0.5) {
return; }
384 static const G4double Egsmall = 2.*CLHEP::MeV;
385 if (gammaEnergy < Egsmall) {
386 eps = eps0 + (0.5-eps0)*rndmEngine->
flat();
406 const G4double deltaMin = 4.*deltaFactor;
414 const G4double epsp = 0.5 - 0.5*std::sqrt(1. - deltaMin/deltaMax) ;
415 const G4double epsMin = std::max(eps0,epsp);
416 const G4double epsRange = 0.5 - epsMin;
423 const G4double NormF1 = std::max(
F10 * epsRange * epsRange, 0.);
425 const G4double NormCond = NormF1/(NormF1 + NormF2);
434 if (NormCond > rndmv[0]) {
435 eps = 0.5 - epsRange *
fG4Calc->A13(rndmv[1]);
436 const G4double delta = deltaFactor/(eps*(1.-eps));
438 G4double lpmXiS, lpmGS, lpmPhiS, phi1, phi2;
440 ComputeLPMfunctions(lpmXiS, lpmGS, lpmPhiS, eps, gammaEnergy, iZet);
441 greject = lpmXiS*((2.*lpmPhiS+lpmGS)*phi1-lpmGS*phi2-lpmPhiS*FZ)/
F10;
446 eps = epsMin + epsRange*rndmv[1];
447 const G4double delta = deltaFactor/(eps*(1.-eps));
449 G4double lpmXiS, lpmGS, lpmPhiS, phi1, phi2;
451 ComputeLPMfunctions(lpmXiS, lpmGS, lpmPhiS, eps, gammaEnergy, iZet);
452 greject = lpmXiS*( (lpmPhiS+0.5*lpmGS)*phi1 + 0.5*lpmGS*phi2
453 -0.5*(lpmGS+lpmPhiS)*FZ )/
F20;
459 }
while (greject < rndmv[2]);
465 if (rndmEngine->
flat() > 0.5) {
466 eTotEnergy = (1.-eps)*gammaEnergy;
467 pTotEnergy = eps*gammaEnergy;
469 pTotEnergy = (1.-eps)*gammaEnergy;
470 eTotEnergy = eps*gammaEnergy;
475 const G4double eKinEnergy = std::max(0.,eTotEnergy - CLHEP::electron_mass_c2);
476 const G4double pKinEnergy = std::max(0.,pTotEnergy - CLHEP::electron_mass_c2);
481 eKinEnergy, pKinEnergy, eDirection, pDirection);
488 fvect->push_back(aParticle1);
489 fvect->push_back(aParticle2);
496void G4PairProductionRelModel::InitialiseElementData()
500 for (
auto const &
elem : *elemTable) {
503 const G4double logZ13 =
elem->GetIonisation()->GetlogZ3();
507 const G4double FZHigh = 8.*(logZ13 + fc);
514 Fel =
G4Log(184.) - logZ13;
515 Finel =
G4Log(1194.) - 2.*logZ13;
517 auto elD =
new ElementData();
518 elD->fLogZ13 = logZ13;
521 elD->fDeltaFactor = 136./Z13;
522 elD->fDeltaMaxLow =
G4Exp((42.038 - FZLow)/8.29) - 0.958;
523 elD->fDeltaMaxHigh =
G4Exp((42.038 - FZHigh)/8.29) - 0.958;
524 elD->fEtaValue = Finel/(Fel-fc);
525 elD->fLPMVarS1Cond = std::sqrt(2.)*Z13*Z13/(184.*184.);
526 elD->fLPMILVarS1Cond = 1./
G4Log(elD->fLPMVarS1Cond);
532void G4PairProductionRelModel::ComputeLPMfunctions(
G4double &funcXiS,
542 if (varSprime > 1.0) {
547 funcXiS = 1.0 + funcHSprime
548 - 0.08*(1.0-funcHSprime)*funcHSprime*(2.0-funcHSprime)*dum;
551 const G4double varShat = varSprime / std::sqrt(funcXiS);
554 if (funcXiS * funcPhiS > 1. || varShat > 0.57) {
555 funcXiS = 1. / funcPhiS;
577 static const G4double kMC2 = CLHEP::electron_mass_c2;
579 if (Z < 0.9 || gammaE <= 2.0*kMC2) {
return xSection; }
581 static const G4double gammaEnergyLimit = 1.5*CLHEP::MeV;
583 static const G4double a0 = 8.7842e+2*CLHEP::microbarn;
584 static const G4double a1 = -1.9625e+3*CLHEP::microbarn;
585 static const G4double a2 = 1.2949e+3*CLHEP::microbarn;
586 static const G4double a3 = -2.0028e+2*CLHEP::microbarn;
587 static const G4double a4 = 1.2575e+1*CLHEP::microbarn;
588 static const G4double a5 = -2.8333e-1*CLHEP::microbarn;
590 static const G4double b0 = -1.0342e+1*CLHEP::microbarn;
591 static const G4double b1 = 1.7692e+1*CLHEP::microbarn;
592 static const G4double b2 = -8.2381 *CLHEP::microbarn;
593 static const G4double b3 = 1.3063 *CLHEP::microbarn;
594 static const G4double b4 = -9.0815e-2*CLHEP::microbarn;
595 static const G4double b5 = 2.3586e-3*CLHEP::microbarn;
597 static const G4double c0 = -4.5263e+2*CLHEP::microbarn;
598 static const G4double c1 = 1.1161e+3*CLHEP::microbarn;
599 static const G4double c2 = -8.6749e+2*CLHEP::microbarn;
600 static const G4double c3 = 2.1773e+2*CLHEP::microbarn;
601 static const G4double c4 = -2.0467e+1*CLHEP::microbarn;
602 static const G4double c5 = 6.5372e-1*CLHEP::microbarn;
605 if (gammaE < gammaEnergyLimit) { gammaE = gammaEnergyLimit; }
613 const G4double F1 =
a0 + a1*x + a2*x2 + a3*x3 + a4*x4 + a5*x5;
614 const G4double F2 = b0 + b1*x + b2*x2 + b3*x3 + b4*x4 + b5*x5;
615 const G4double F3 = c0 + c1*x + c2*x2 + c3*x3 + c4*x4 + c5*x5;
617 xSection = (Z + 1.)*(F1*Z + F2*Z*Z + F3);
619 if (gammaEnergyOrg < gammaEnergyLimit) {
620 const G4double dum = (gammaEnergyOrg-2.*kMC2)/(gammaEnergyLimit-2.*kMC2);
G4TemplateAutoLock< G4Mutex > G4AutoLock
G4double condition(const G4ErrorSymMatrix &m)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
#define G4MUTEX_INITIALIZER
CLHEP::Hep3Vector G4ThreeVector
virtual void flatArray(const int size, double *vect)=0
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
static const G4ElementTable * GetElementTable()
const G4Material * GetMaterial() const
G4double GetRadlen() const
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
G4bool fIsUseLPMCorrection
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
G4bool fIsUseCompleteScreening
G4double fParametrizedXSectionThreshold
void ScreenFunction12(const G4double delta, G4double &f1, G4double &f2)
G4double fCoulombCorrectionThreshold
static const G4double gFinelLowZet[8]
static std::vector< ElementData * > gElementData
static const G4int gMaxZet
G4PairProductionRelModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="BetheHeitlerLPM")
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
~G4PairProductionRelModel() override
void ComputePhi12(const G4double delta, G4double &phi1, G4double &phi2)
static const G4double gXSecFactor
G4double ComputeXSectionPerAtom(G4double gammaEnergy, G4double Z)
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
virtual void SamplePairDirections(const G4DynamicParticle *dp, G4double elecKinEnergy, G4double posiKinEnergy, G4ThreeVector &dirElectron, G4ThreeVector &dirPositron, G4int Z=0, const G4Material *mat=nullptr)
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
G4VEmAngularDistribution * GetAngularDistribution()
G4ParticleChangeForGamma * GetParticleChangeForGamma()
std::vector< G4EmElementSelector * > * GetElementSelectors()
G4VEmModel(const G4String &nam)
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4Element * SelectTargetAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
void GetLPMFunctions(G4double &lpmFuncG, G4double &lpmFuncPhi, G4double sVar)