99 0.0198550717512320, 0.1016667612931865, 0.2372337950418355, 0.4082826787521750,
100 0.5917173212478250, 0.7627662049581645, 0.8983332387068135, 0.9801449282487680
104 0.0506142681451880, 0.1111905172266870, 0.1568533229389435, 0.1813418916891810,
105 0.1813418916891810, 0.1568533229389435, 0.1111905172266870, 0.0506142681451880
121 factorForCross(
CLHEP::fine_structure_const*
CLHEP::fine_structure_const*
122 CLHEP::classic_electr_radius*
CLHEP::classic_electr_radius*
125 minPairEnergy(4.*
CLHEP::electron_mass_c2),
126 lowestKinEnergy(0.85*
CLHEP::GeV)
174 dataName =
"pEEPairProd";
175 }
else if (pdg == 321) {
176 dataName =
"kaonEEPairProd";
177 }
else if (pdg == 211) {
178 dataName =
"pionEEPairProd";
179 }
else if (pdg == 11) {
180 dataName =
"eEEPairProd";
181 }
else if (pdg == 13) {
182 if (
GetName() ==
"muToMuonPairProd") {
183 dataName =
"muMuMuPairProd";
185 dataName =
"muEEPairProd";
240 const G4double* theAtomicNumDensityVector =
245 G4double Z = (*theElementVector)[i]->GetZ();
248 dedx += loss*theAtomicNumDensityVector[i];
250 dedx = std::max(dedx, 0.0);
263 G4double cut = std::min(cutEnergy, tmax);
271 G4int kkk = std::min(std::max(
G4lrint((bbb-aaa)/ak1 + ak2), 8), 1);
275 for (
G4int l=0 ; l<kkk; ++l) {
283 loss = std::max(loss, 0.0);
297 if (tmax <= cut) {
return cross; }
301 G4int kkk = std::min(std::max(
G4lrint((bbb-aaa)/ak1 + ak2), 8), 1);
306 for (
G4int l=0; l<kkk; ++l) {
315 cross = std::max(cross, 0.0);
330 static const G4double bbbh = 202.4 ;
331 static const G4double g1tf = 1.95e-5 ;
332 static const G4double g2tf = 5.3e-5 ;
333 static const G4double g1h = 4.4e-5 ;
334 static const G4double g2h = 4.8e-5 ;
340 G4double residEnergy = totalEnergy - pairEnergy;
345 G4double a0 = 1.0 / (totalEnergy * residEnergy);
346 G4double alf = 4.0 * electron_mass_c2 / pairEnergy;
349 G4double tmnexp = alf/(1.0 + rt) + delta*rt;
351 if(tmnexp >= 1.0) {
return 0.0; }
356 G4double massratio2 = massratio*massratio;
357 G4double inv_massratio2 = 1.0 / massratio2;
361 if( Z < 1.5 ) { bbb = bbbh ; g1 = g1h ; g2 = g2h ; }
362 else { bbb = bbbtf; g1 = g1tf; g2 = g2tf; }
369 if (z1exp > 35.221047195922)
372 zeta = (0.073 *
G4Log(z1exp) - 0.26) / (0.058 *
G4Log(z2exp) - 0.14);
390 rho2[i] = rho[i] * rho[i];
391 xi[i] = xi0*(1.0-rho2[i]);
392 xi1[i] = 1.0 + xi[i];
393 xii[i] = 1.0 / xi[i];
404 G4double yeu = (b40 + 5.0) + (b40 - 1.0) * rho2[i];
405 G4double yed = b62*
G4Log(3.0 + xii[i]) + (2.0 * beta - 1.0)*rho2[i] - b40;
407 G4double ymu = b62 * (1.0 + rho2[i]) + 6.0;
408 G4double ymd = (b40 + 3.0)*(1.0 + rho2[i])*
G4Log(3.0 + xi[i])
409 + 2.0 - 3.0 * rho2[i];
411 ye1[i] = 1.0 + yeu / yed;
412 ym1[i] = 1.0 + ymu / ymd;
419 if(xi[i] <= 1000.0) {
420 be[i] = ((2.0 + rho2[i])*(1.0 + beta) +
421 xi[i]*(3.0 + rho2[i]))*
G4Log(1.0 + xii[i]) +
422 (1.0 - rho2[i] - beta)/xi1[i] - (3.0 + rho2[i]);
424 be[i] = 0.5*(3.0 - rho2[i] + 2.0*beta*(1.0 + rho2[i]))*xii[i];
428 G4double a10 = (1.0 + 2.0 * beta) * (1.0 - rho2[i]);
429 bm[i] = ((1.0 + rho2[i])*(1.0 + 1.5 * beta) - a10*xii[i])*
G4Log(xi1[i]) +
430 xi[i] * (1.0 - rho2[i] - beta)/xi1[i] + a10;
432 bm[i] = 0.5*(5.0 - rho2[i] + beta * (3.0 + rho2[i]))*xi[i];
439 G4double screen = screen0*xi1[i]/(1.0 - rho2[i]);
440 G4double ale =
G4Log(bbb/
z13*std::sqrt(xi1[i]*ye1[i])/(1. + screen*ye1[i]));
444 fe = std::max(
fe, 0.0);
447 G4double fm = std::max(alm_crm*bm[i], 0.0)*inv_massratio2;
449 sum +=
wgi[i]*(1.0 + rho[i])*(
fe + fm);
452 return -tmn*sum*
factorForCross*z2*residEnergy/(totalEnergy*pairEnergy);
468 G4double tmax = std::min(maxEnergy, maxPairEnergy);
470 if (cut >= tmax) {
return cross; }
473 if(tmax < kineticEnergy) {
491 for (std::size_t it=0; it<=
nbine; ++it) {
493 pv->
PutY(it,
G4Log(kinEnergy/CLHEP::MeV));
504 std::size_t imax = (std::size_t)fac;
518 for (std::size_t i=0; i<
nbiny; ++i) {
520 if(0 == it) { pv->
PutX(i, x); }
532 }
else if(i == imax) {
539 kinEnergy *= factore;
551 std::vector<G4DynamicParticle*>* vdp,
573 G4double maxEnergy = std::min(tmax, maxPairEnergy);
576 if (minEnergy >= maxEnergy) {
return; }
595 G4int iz1(0), iz2(0);
602 if(iz > 0) { iz1 = iz-1; }
607 if (0 == iz1) { iz1 = iz2 =
NZDATPAIR-1; }
624 x += (x2 - x)*(
lnZ - lz1)/(lz2 - lz1);
627 pairEnergy = kinEnergy*
G4Exp(x*coeff);
630 }
while((pairEnergy < minEnergy || pairEnergy > maxEnergy) && 10 > count);
642 G4double eEnergy = (1.-r)*pairEnergy*0.5;
643 G4double pEnergy = pairEnergy - eEnergy;
650 eDirection, pDirection);
652 eEnergy = std::max(eEnergy - CLHEP::electron_mass_c2, 0.0);
653 pEnergy = std::max(pEnergy - CLHEP::electron_mass_c2, 0.0);
659 vdp->push_back(aParticle1);
660 vdp->push_back(aParticle2);
663 kinEnergy -= pairEnergy;
664 partDirection *= totalMomentum;
666 partDirection = partDirection.
unit();
675 vdp->push_back(newdp);
697 else { res = pv->
FindLinearX((pmin + rand*(pmax - pmin))/p0, logTkin); }
709 ed <<
"G4ElementData is not properly initialized Z= " << Z
710 <<
" Ekin(MeV)= " <<
G4Exp(logTkin)
711 <<
" IsMasterThread= " <<
IsMaster()
727 std::ostringstream ss;
729 std::ofstream outfile(ss.str());
741 std::ostringstream ss;
744 std::ifstream infile(ss.str(), std::ios::in);
std::vector< const G4Element * > G4ElementVector
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)
#define G4MUTEX_INITIALIZER
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
static G4Electron * Electron()
static G4ElementDataRegistry * Instance()
G4ElementData * GetElementDataByName(const G4String &)
G4Physics2DVector * GetElement2DData(G4int Z) const
void InitialiseForElement(G4int Z, G4PhysicsVector *v)
void SetName(const G4String &nam)
static G4EmParameters * Instance()
G4bool RetrieveMuDataFromFile() const
const G4String & GetDirLEDATA() const
const G4ElementVector * GetElementVector() const
const G4double * GetAtomicNumDensityVector() const
std::size_t GetNumberOfElements() const
G4double ComputeMicroscopicCrossSection(G4double tkin, G4double Z, G4double cut)
void SetParticle(const G4ParticleDefinition *)
static const G4int NINTPAIR
virtual void DataCorrupted(G4int Z, G4double logTkin) const
void MakeSamplingTables()
G4double ComputMuPairLoss(G4double Z, G4double tkin, G4double cut, G4double tmax)
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy) override
G4MuPairProductionModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="muPairProd")
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy) override
void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
static const G4int NZDATPAIR
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4double FindScaledEnergy(G4int Z, G4double rand, G4double logTkin, G4double yymin, G4double yymax)
virtual G4double ComputeDMicroscopicCrossSection(G4double tkin, G4double Z, G4double pairEnergy)
const G4ParticleDefinition * particle
G4double MinPrimaryEnergy(const G4Material *, const G4ParticleDefinition *, G4double) override
G4ParticleChangeForLoss * fParticleChange
static const G4int ZDATPAIR[NZDATPAIR]
G4double MaxSecondaryEnergyForElement(G4double kineticEnergy, G4double Z)
static const G4double xgi[NINTPAIR]
static const G4double wgi[NINTPAIR]
G4double GetLOGZ(G4int Z) const
static G4NistManager * Instance()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
G4double GetPDGMass() const
G4int GetPDGEncoding() const
const G4String & GetParticleName() const
G4bool Retrieve(std::ifstream &fIn)
void PutY(std::size_t idy, G4double value)
void Store(std::ofstream &fOut) const
G4double Value(G4double x, G4double y, std::size_t &lastidx, std::size_t &lastidy) const
void PutValue(std::size_t idx, std::size_t idy, G4double value)
void PutX(std::size_t idx, G4double value)
G4double FindLinearX(G4double rand, G4double y, std::size_t &lastidy) const
static G4Positron * Positron()
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()
G4double LowEnergyLimit() const
std::vector< G4EmElementSelector * > * GetElementSelectors()
G4double HighEnergyLimit() const
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4ElementData * fElementData
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4String & GetName() const
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
G4double SecondaryThreshold() const
G4ParticleChangeForLoss * GetParticleChangeForLoss()
void ProposeTrackStatus(G4TrackStatus status)