182 G4cout <<
"BH5DModel::Initialise conversion to e+ e-" <<
G4endl;
188 G4cout <<
"BH5DModel::Initialise conversion to mu+ mu-" <<
G4endl;
205 G4cout <<
"G4BetheHeitler5DModel::SetLeptonPair conversion to e+ e-"
213 G4cout <<
"G4BetheHeitler5DModel::SetLeptonPair conversion to mu+ mu-"
218 ed <<
"Model not applicable to particle(s) "
221 G4Exception(
"G4BetheHeitler5DModel::SetLeptonPair",
"em0002",
231 G4cout <<
"G4BetheHeitler5DModel::SetLeptonPair conversion to e+ e-"
239 G4cout <<
"G4BetheHeitler5DModel::SetLeptonPair conversion to mu+ mu-"
244 ed <<
"Model not applicable to particle(s) "
247 G4Exception(
"G4BetheHeitler5DModel::SetLeptonPair",
"em0002",
252 G4Exception(
"G4BetheHeitler5DModel::SetLeptonPair",
"em0007",
254 G4cerr <<
"BH5DModel::SetLeptonPair BAD paricle/anti particle pair"
268 return par[0] *
G4Exp((par[2]+loge*par[4])*loge)
269 / (par[1]+
G4Exp(par[3]*loge)+
G4Exp(par[5]*loge))
285 const G4double LeptonMass2 = LeptonMass*LeptonMass;
291 static const G4double r02 = r0*r0*1.e+25;
295 static const G4double factor1 = 2.66134007899/(8.*alpha0*ElectronMass);
297 G4double PairInvMassMin = 2.*LeptonMass;
298 G4double TrThreshold = 2.0 * ( (LeptonMass2)/ElectronMass + LeptonMass);
303 { 0.0227436, 0.0582046, 3.0322675, 2.8275065, -0.0034004,
304 1.1212766, 1.8989468, 68.3492750, 0.0211186, 14.4},
306 {0.67810E-06, 0.86037E+05, 2.0008395, 1.6739719, -0.0057279,
307 1.4222, 0.0, 263230.0, 0.0521, 51.1338}
311 { 0.0332350, 4.3942537, 2.8515925, 2.6351695, -0.0031510,
312 1.5737305, 1.8104647, 20.6434021, -0.0272586, 28.9},
314 {0.10382E-03, 0.14408E+17, 4.1368679, 3.2662121, -0.0163091,
315 0.0000, 0.0, 0.0, 0.0000, 1.0000}
318 static const G4double para[2][3][2] = {
320 { {11., -16.},{-1.17, -2.95},{-2., -0.5} },
322 { {17.5, 1.},{-1.17, -2.95},{2., 6.} }
325 static const G4double correctionIndex = 1.4;
329 if ( GammaEnergy <= PairInvMassMin) {
return; }
331 const G4double GammaEnergy2 = GammaEnergy*GammaEnergy;
343 GammaPolarization -= GammaPolarization.
dot(GammaDirection) * GammaDirection;
347 const G4double GammaPolarizationMag = GammaPolarization.
mag();
360 const G4double NuThreshold = 2.0 * ( (LeptonMass2)/targetMass + LeptonMass);
362 if ( GammaEnergy <= NuThreshold) {
return; }
372 if ( GammaEnergy <= TrThreshold )
return;
373 }
else if ( GammaEnergy > TrThreshold ) {
377 if(rndmEngine->
flat()*(
Z+1) < 1.) {
383 const G4double RecoilMass = itriplet ? ElectronMass : targetMass;
384 const G4double RecoilMass2 = RecoilMass*RecoilMass;
385 const G4double sCMS = 2.*RecoilMass*GammaEnergy + RecoilMass2;
386 const G4double sCMSPlusRM2 = sCMS + RecoilMass2;
387 const G4double sqrts = std::sqrt(sCMS);
388 const G4double isqrts2 = 1./(2.*sqrts);
390 const G4double PairInvMassMax = sqrts-RecoilMass;
391 const G4double PairInvMassRange = PairInvMassMax/PairInvMassMin;
400 const G4double Threshold = itriplet ? TrThreshold : NuThreshold;
401 const G4double AvailableEnergy = GammaEnergy - Threshold;
404 const G4double MaxDiffCross = itriplet
406 EffectiveZ, AvailableEnergy, LogAvailableEnergy)
408 EffectiveZ, AvailableEnergy, LogAvailableEnergy);
411 const G4double ymax = 1.5 * MaxDiffCross;
441 G4Exp(
G4Log(rndmv6[0])/(correctionIndex + 1.0));
445 const G4double cosTheta = (x0-1.)*dum0;
446 const G4double sinTheta = std::sqrt(4.*x0)*dum0;
448 const G4double PairInvMass = PairInvMassMin*
G4Exp(X1*X1*lnPairInvMassRange);
454 const G4double cosThetaLept = std::cos(
pi*rndmv6[2]);
456 const G4double sinThetaLept = std::sqrt((1.-cosThetaLept)*(1.+cosThetaLept));
461 const G4double sinPhiLept = std::copysign(std::sqrt((1.-cosPhiLept)*(1.+cosPhiLept)),rndmv6[3]-0.5);
464 const G4double sinPhi = std::copysign(std::sqrt((1.-cosPhi)*(1.+cosPhi)),rndmv6[4]-0.5);
476 const G4double RecEnergyCMS = (sCMSPlusRM2-PairInvMass*PairInvMass)*isqrts2;
477 const G4double LeptonEnergy2 = PairInvMass*0.5;
481 PairInvMass*PairInvMass + 2.0*PairInvMass*RecoilMass)*
482 (2.0*GammaEnergy*RecoilMass -
483 PairInvMass*PairInvMass - 2.0*PairInvMass*RecoilMass),0.0);
485 G4double thePRecoil = std::sqrt(abp) * isqrts2;
488 Recoil.
set( thePRecoil*sinTheta*cosPhi,
489 thePRecoil*sinTheta*sinPhi,
494 const G4double thePLepton = std::sqrt( (LeptonEnergy2-LeptonMass)
495 *(LeptonEnergy2+LeptonMass));
497 LeptonPlus.
set(thePLepton*sinThetaLept*cosPhiLept,
498 thePLepton*sinThetaLept*sinPhiLept,
499 thePLepton*cosThetaLept,
502 LeptonMinus.
set(-LeptonPlus.
x(),
520 LeptonPlus.
boost(pair2cms);
521 LeptonMinus.
boost(pair2cms);
526 LeptonPlus.
boostZ(betaCMS);
527 LeptonMinus.
boostZ(betaCMS);
530 const G4double Jacob0 = x0*dum0*dum0;
531 const G4double Jacob1 = 2.*X1*lnPairInvMassRange*PairInvMass;
532 const G4double Jacob2 = std::abs(sinThetaLept);
541 const G4double dum1 = 1./std::sqrt( pPX*pPX + pPY*pPY );
542 const G4double cosPhiPlus = pPX*dum1;
543 const G4double sinPhiPlus = pPY*dum1;
547 const G4double elMassCTP = LeptonMass*cosThetaPlus;
548 const G4double ePlusSTP = EPlus*sinThetaPlus;
549 const G4double DPlus = (elMassCTP*elMassCTP + ePlusSTP*ePlusSTP)
550 /(EPlus + PPlus*cosThetaPlus);
559 const G4double dum2 = 1./std::sqrt( ePX*ePX + ePY*ePY );
560 const G4double cosPhiMinus = ePX*dum2;
561 const G4double sinPhiMinus = ePY*dum2;
563 const G4double elMassCTM = LeptonMass*cosThetaMinus;
564 const G4double eMinSTM = EMinus*sinThetaMinus;
565 const G4double DMinus = (elMassCTM*elMassCTM + eMinSTM*eMinSTM)
566 /(EMinus + PMinus*cosThetaMinus);
569 const G4double cosdPhi = cosPhiPlus*cosPhiMinus + sinPhiPlus*sinPhiMinus;
573 const G4double BigPhi = -LeptonMass2 / (GammaEnergy*GammaEnergy2 * q2*q2);
578 const G4double qun = factor1*iZ13*iZ13;
581 FormFactor = (nun < 0.01) ? (13.8-55.4*std::sqrt(nun))*nun
582 : std::sqrt(1-(nun-1)*(nun-1));
585 const G4double dum3 = 217.*PRec*iZ13;
586 const G4double AFF = 1./(1. + dum3*dum3);
587 FormFactor = (1.-AFF)*(1-AFF);
592 if (GammaPolarizationMag==0.) {
593 const G4double pPlusSTP = PPlus*sinThetaPlus;
594 const G4double pMinusSTM = PMinus*sinThetaMinus;
595 const G4double pPlusSTPperDP = pPlusSTP/DPlus;
596 const G4double pMinusSTMperDM = pMinusSTM/DMinus;
598 pPlusSTPperDP *pPlusSTPperDP *(4.*EMinus*EMinus-q2)
599 + pMinusSTMperDM*pMinusSTMperDM*(4.*EPlus*EPlus - q2)
600 + 2.*pPlusSTPperDP*pMinusSTMperDM*cosdPhi
601 *(4.*EPlus*EMinus + q2 - 2.*GammaEnergy2)
602 - 2.*GammaEnergy2*(pPlusSTP*pPlusSTP+pMinusSTM*pMinusSTM)/(DMinus*DPlus));
603 betheheitler = dunpol * factor;
605 const G4double pPlusSTP = PPlus*sinThetaPlus;
606 const G4double pMinusSTM = PMinus*sinThetaMinus;
607 const G4double pPlusSTPCPPperDP = pPlusSTP*cosPhiPlus/DPlus;
608 const G4double pMinusSTMCPMperDM = pMinusSTM*cosPhiMinus/DMinus;
609 const G4double caa = 2.*(EPlus*pMinusSTMCPMperDM+EMinus*pPlusSTPCPPperDP);
610 const G4double cbb = pMinusSTMCPMperDM-pPlusSTPCPPperDP;
611 const G4double ccc = (pPlusSTP*pPlusSTP + pMinusSTM*pMinusSTM
612 +2.*pPlusSTP*pMinusSTM*cosdPhi)/ (DMinus*DPlus);
613 const G4double dtot= 2.*BigPhi*( caa*caa - q2*cbb*cbb - GammaEnergy2*ccc);
614 betheheitler = dtot * factor;
617 const G4double cross = Norme * Jacob0 * Jacob1 * Jacob2 * betheheitler
618 * FormFactor * RecoilMass / sqrts;
619 pdf = cross * (xu1 - xl1) /
G4Exp(correctionIndex*
G4Log(X1));
620 }
while ( pdf < ymax * rndmv6[5] );
624 G4double recul = std::sqrt(Recoil.
x()*Recoil.
x()+Recoil.
y()*Recoil.
y()
625 +Recoil.
z()*Recoil.
z());
626 G4cout <<
"BetheHeitler5DModel GammaEnergy= " << GammaEnergy
627 <<
" PDF= " << pdf <<
" ymax= " << ymax
628 <<
" recul= " << recul <<
G4endl;
634 G4cout <<
"BetheHeitler5DModel GammaDirection " << GammaDirection <<
G4endl;
635 G4cout <<
"BetheHeitler5DModel GammaPolarization " << GammaPolarization <<
G4endl;
636 G4cout <<
"BetheHeitler5DModel GammaEnergy " << GammaEnergy <<
G4endl;
637 G4cout <<
"BetheHeitler5DModel Conv "
638 << (itriplet ?
"triplet" :
"nucl") <<
G4endl;
641 if (GammaPolarizationMag == 0.0) {
646 GammaPolarization /= GammaPolarizationMag;
660 G4cout <<
"BetheHeitler5DModel Recoil " << Recoil.
x() <<
" " << Recoil.
y() <<
" " << Recoil.
z()
661 <<
" " << Recoil.
t() <<
" " <<
G4endl;
662 G4cout <<
"BetheHeitler5DModel LeptonPlus " << LeptonPlus.
x() <<
" " << LeptonPlus.
y() <<
" "
663 << LeptonPlus.
z() <<
" " << LeptonPlus.
t() <<
" " <<
G4endl;
664 G4cout <<
"BetheHeitler5DModel LeptonMinus " << LeptonMinus.
x() <<
" " << LeptonMinus.
y() <<
" "
665 << LeptonMinus.
z() <<
" " << LeptonMinus.
t() <<
" " <<
G4endl;
683 fvect->push_back(aParticle1);
684 fvect->push_back(aParticle2);
685 fvect->push_back(aParticle3);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
CLHEP::HepLorentzVector G4LorentzVector
static constexpr double pi
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
Hep3Vector orthogonal() const
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
double howOrthogonal(const Hep3Vector &v) const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
HepLorentzVector & boostZ(double beta)
void set(double x, double y, double z, double t)
HepLorentzVector & transform(const HepRotation &)
virtual void flatArray(const int size, double *vect)=0
~G4BetheHeitler5DModel() override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
const G4ParticleDefinition * fLepton2
const G4ParticleDefinition * fLepton1
void SampleSecondaries(std::vector< G4DynamicParticle * > *fvect, const G4MaterialCutsCouple *couple, const G4DynamicParticle *aDynamicGamma, G4double, G4double) override
const G4ParticleDefinition * fTheMuMinus
void SetLeptonPair(const G4ParticleDefinition *p1, const G4ParticleDefinition *p2)
G4double MaxDiffCrossSection(const G4double *par, G4double eZ, G4double e, G4double loge) const
G4BetheHeitler5DModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="BetheHeitler5D")
void SetConversionMode(G4int to)
const G4ThreeVector & GetMomentumDirection() const
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
const G4ThreeVector & GetPolarization() const
static G4Electron * Definition()
G4IonisParamElm * GetIonisation() const
static G4EmParameters * Instance()
G4bool OnIsolated() const
G4int GetConversionType() const
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4IonTable * GetIonTable()
static G4MuonMinus * Definition()
static G4MuonPlus * Definition()
static G4double GetNuclearMass(const G4double A, const G4double Z)
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4ParticleDefinition * fTheGamma
G4ParticleChangeForGamma * fParticleChange
G4ParticleDefinition * fTheElectron
void SetProposedKineticEnergy(G4double proposedKinEnergy)
G4int GetAntiPDGEncoding() const
G4double GetPDGMass() const
G4int GetPDGEncoding() const
const G4String & GetParticleName() const
static G4Positron * Definition()
G4int SelectIsotopeNumber(const G4Element *)
void SetLowEnergyLimit(G4double)
const G4Element * SelectTargetAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void ProposeTrackStatus(G4TrackStatus status)
static constexpr double electron_mass_c2
static constexpr double fine_structure_const
static constexpr double twopi
static constexpr double classic_electr_radius
T max(const T t1, const T t2)
brief Return the largest of the two arguments