81 1.98550718e-02, 1.01666761e-01, 2.37233795e-01, 4.08282679e-01,
82 5.91717321e-01, 7.62766205e-01, 8.98333239e-01, 9.80144928e-01
85 5.06142681e-02, 1.11190517e-01, 1.56853323e-01, 1.81341892e-01,
86 1.81341892e-01, 1.56853323e-01, 1.11190517e-01, 5.06142681e-02
92 0.0, 5.3104, 4.7935, 4.7402, 4.7112, 4.6694, 4.6134, 4.5520
95 0.0, 5.9173, 5.6125, 5.5377, 5.4728, 5.4174, 5.3688, 5.3236
118 :
G4VEmModel(nam), fIsUseLPMCorrection(true), fIsUseCompleteScreening(false),
121 fParticleChange(nullptr)
188 const G4double eps1 = 0.5 - 0.5*std::sqrt(1.-dmin/dmax);
196 const G4int numSub = 2;
198 G4double minEti = epsMin*gammaEnergy;
199 for (
G4int i = 0; i < numSub; ++i) {
200 for (
G4int ngl = 0; ngl < 8; ++ngl) {
204 xSection +=
gWGL[ngl]*xs;
210 xSection =
std::max(2.*xSection*dInterv, 0.);
243 xSection = (eps*eps + epsm*epsm + 2.*dum/3.)*(Lel-fc) - dum/9.;
252 xSection = (eps*eps + epsm*epsm)*(0.25*phi1-lnZ13-fc)
253 + 2.*dum*(0.25*phi2-lnZ13-fc)/3.;
257 return std::max(xSection, 0.0)/gammaEnergy;
296 xSection = (Lel-fc)*((eps*eps+epsm*epsm)*2.*fPhiS + fGS)/3. - dum*fGS/9.;
305 xSection = (eps*eps + epsm*epsm)*(2.*fPhiS+fGS)*(0.25*phi1-lnZ13-fc)/3.
306 + 2.*dum*fGS*(0.25*phi2-lnZ13-fc)/3.;
310 return std::max(fXiS*xSection, 0.0)/gammaEnergy;
372 if (eps0 > 0.5) {
return; }
398 const G4double deltaMin = 4.*deltaFactor;
401 const G4double epsp = 0.5 - 0.5*std::sqrt(1. - deltaMin/deltaMax) ;
403 const G4double epsRange = 0.5 - epsMin;
414 const G4double NormCond = NormF1/(NormF1 + NormF2);
424 if (NormCond > rndmv[0]) {
425 eps = 0.5 - epsRange *
fG4Calc->
A13(rndmv[1]);
428 G4double lpmXiS, lpmGS, lpmPhiS, phi1, phi2;
431 greject = lpmXiS*((2.*lpmPhiS+lpmGS)*phi1-lpmGS*phi2-lpmPhiS*FZ)/
F10;
436 eps = epsMin + epsRange*rndmv[1];
439 G4double lpmXiS, lpmGS, lpmPhiS, phi1, phi2;
442 greject = lpmXiS*( (lpmPhiS+0.5*lpmGS)*phi1 + 0.5*lpmGS*phi2
443 -0.5*(lpmGS+lpmPhiS)*FZ )/F20;
449 }
while (greject < rndmv[2]);
454 if (rndmEngine->
flat() > 0.5) {
455 eTotEnergy = (1.-
eps)*gammaEnergy;
456 pTotEnergy = eps*gammaEnergy;
458 pTotEnergy = (1.-
eps)*gammaEnergy;
459 eTotEnergy = eps*gammaEnergy;
470 eKinEnergy, pKinEnergy,
471 eDirection, pDirection);
480 fvect->push_back(aParticle1);
481 fvect->push_back(aParticle2);
498 size_t numElems = (*elemTable).size();
499 for (
size_t ie = 0; ie < numElems; ++ie) {
500 const G4Element* elem = (*elemTable)[ie];
506 const G4double FZ = 8.*(logZ13 + fc);
513 Fel =
G4Log(184.) - logZ13;
514 Finel =
G4Log(1194.) - 2.*logZ13;
538 for (
G4int i=0; i<num; ++i) {
550 if (varShat < 0.01) {
551 funcPhiS = 6.0*varShat*(1.0-
CLHEP::pi*varShat);
552 funcGS = 12.0*varShat-2.0*funcPhiS;
554 const G4double varShat2 = varShat*varShat;
555 const G4double varShat3 = varShat*varShat2;
556 const G4double varShat4 = varShat2*varShat2;
557 if (varShat < 0.415827397755) {
559 + varShat3/(0.623+0.796*varShat+0.658*varShat2));
561 const G4double funcPsiS = 1.0-
G4Exp( -4.0*varShat - 8.0*varShat2/(1.0
562 + 3.936*varShat+4.97*varShat2-0.05*varShat3+7.5*varShat4));
564 funcGS = 3.0*funcPsiS - 2.0*funcPhiS;
565 }
else if (varShat < 1.55) {
567 + varShat3/(0.623+0.796*varShat+0.658*varShat2));
568 const G4double dum0 = -0.16072300849123999+3.7550300067531581*varShat
569 -1.7981383069010097 *varShat2
570 +0.67282686077812381*varShat3
571 -0.1207722909879257 *varShat4;
572 funcGS = std::tanh(dum0);
574 funcPhiS = 1.0-0.01190476/varShat4;
575 if (varShat < 1.9156) {
576 const G4double dum0 = -0.16072300849123999+3.7550300067531581*varShat
577 -1.7981383069010097 *varShat2
578 +0.67282686077812381*varShat3
579 -0.1207722909879257 *varShat4;
580 funcGS = std::tanh(dum0);
582 funcGS = 1.0-0.0230655/varShat4;
605 lpmPhis = 1.0-0.01190476/
ss;
606 lpmGs = 1.0-0.0230655/
ss;
622 if (varSprime > 1.0) {
624 }
else if (varSprime > condition) {
627 funcXiS = 1.0 + funcHSprime
628 - 0.08*(1.0-funcHSprime)*funcHSprime*(2.0-funcHSprime)*dum;
631 const G4double varShat = varSprime / std::sqrt(funcXiS);
634 if (funcXiS * funcPhiS > 1. || varShat > 0.57) {
635 funcXiS = 1. / funcPhiS;
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
G4ParticleDefinition * fThePositron
virtual void SamplePairDirections(const G4DynamicParticle *dp, G4double elecKinEnergy, G4double posiKinEnergy, G4ThreeVector &dirElectron, G4ThreeVector &dirPositron, G4int Z=0, const G4Material *mat=nullptr)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double A13(G4double A) const
std::vector< G4double > fLPMFuncPhi
static LPMFuncs gLPMFuncs
void ScreenFunction12(const G4double delta, G4double &f1, G4double &f2)
static std::vector< ElementData * > gElementData
static const G4double gFinelLowZet[8]
static const G4double gXSecFactor
std::vector< G4double > fLPMFuncG
static const G4int gMaxZet
G4double GetRadlen() const
static constexpr double hbarc
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4double ScreenFunction2(const G4double delta)
static const G4double gEgLPMActivation
virtual ~G4PairProductionRelModel()
void GetLPMFunctions(G4double &lpmGs, G4double &lpmPhis, const G4double sval)
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
void SetProposedKineticEnergy(G4double proposedKinEnergy)
virtual void flatArray(const int size, double *vect)=0
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4double condition(const G4ErrorSymMatrix &m)
std::vector< G4EmElementSelector * > * GetElementSelectors()
static constexpr double classic_electr_radius
G4ParticleDefinition * fTheElectron
G4double G4Log(G4double x)
G4ParticleDefinition * fTheGamma
G4double LowEnergyLimit() const
virtual void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
static const G4double gLPMconstant
G4bool fIsUseLPMCorrection
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
void ComputeLPMGsPhis(G4double &funcGS, G4double &funcPhiS, const G4double varShat)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX) override
G4ParticleChangeForGamma * fParticleChange
static constexpr double electron_mass_c2
void ComputePhi12(const G4double delta, G4double &phi1, G4double &phi2)
std::vector< G4Element * > G4ElementTable
static const G4double gXGL[8]
void SetAngularDistribution(G4VEmAngularDistribution *)
static const G4double gWGL[8]
G4double ScreenFunction1(const G4double delta)
static const G4double gFelLowZet[8]
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
G4bool fIsUseCompleteScreening
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double) override
std::map< G4String, G4AttDef > * GetInstance(const G4String &storeKey, G4bool &isNew)
G4PairProductionRelModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="BetheHeitlerLPM")
G4IonisParamElm * GetIonisation() const
G4double GetKineticEnergy() const
void ComputeLPMfunctions(G4double &fXiS, G4double &fGS, G4double &fPhiS, const G4double eps, const G4double egamma, const G4int izet)
G4VEmAngularDistribution * GetAngularDistribution()
const G4Material * GetMaterial() const
G4ParticleChangeForGamma * GetParticleChangeForGamma()
static const G4double eps
G4double GetfCoulomb() const
G4double GetlogZ3() const
static constexpr double fine_structure_const
G4double HighEnergyLimit() const
void ProposeTrackStatus(G4TrackStatus status)
static constexpr double GeV
static constexpr double pi
void InitialiseElementData()
G4double ComputeXSectionPerAtom(G4double gammaEnergy, G4double Z)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static G4ElementTable * GetElementTable()