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
122 CLHEP::classic_electr_radius*
CLHEP::classic_electr_radius*
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";
239 const G4double* theAtomicNumDensityVector =
244 G4double Z = (*theElementVector)[i]->GetZ();
247 dedx += loss*theAtomicNumDensityVector[i];
249 dedx = std::max(dedx, 0.0);
262 G4double cut = std::min(cutEnergy, tmax);
270 G4int kkk = std::min(std::max(
G4lrint((bbb-aaa)/ak1 + ak2), 8), 1);
274 for (
G4int l=0 ; l<kkk; ++l) {
282 loss = std::max(loss, 0.0);
296 if (tmax <= cut) {
return cross; }
300 G4int kkk = std::min(std::max(
G4lrint((bbb-aaa)/ak1 + ak2), 8), 1);
305 for (
G4int l=0; l<kkk; ++l) {
314 cross = std::max(cross, 0.0);
329 static const G4double bbbh = 202.4 ;
330 static const G4double g1tf = 1.95e-5 ;
331 static const G4double g2tf = 5.3e-5 ;
332 static const G4double g1h = 4.4e-5 ;
333 static const G4double g2h = 4.8e-5 ;
339 G4double residEnergy = totalEnergy - pairEnergy;
344 G4double a0 = 1.0 / (totalEnergy * residEnergy);
345 G4double alf = 4.0 * electron_mass_c2 / pairEnergy;
348 G4double tmnexp = alf/(1.0 + rt) + delta*rt;
350 if(tmnexp >= 1.0) {
return 0.0; }
355 G4double massratio2 = massratio*massratio;
356 G4double inv_massratio2 = 1.0 / massratio2;
360 if( Z < 1.5 ) { bbb = bbbh ; g1 = g1h ; g2 = g2h ; }
361 else { bbb = bbbtf; g1 = g1tf; g2 = g2tf; }
368 if (z1exp > 35.221047195922)
371 zeta = (0.073 *
G4Log(z1exp) - 0.26) / (0.058 *
G4Log(z2exp) - 0.14);
389 rho2[i] = rho[i] * rho[i];
390 xi[i] = xi0*(1.0-rho2[i]);
391 xi1[i] = 1.0 + xi[i];
392 xii[i] = 1.0 / xi[i];
403 G4double yeu = (b40 + 5.0) + (b40 - 1.0) * rho2[i];
404 G4double yed = b62*
G4Log(3.0 + xii[i]) + (2.0 * beta - 1.0)*rho2[i] - b40;
406 G4double ymu = b62 * (1.0 + rho2[i]) + 6.0;
407 G4double ymd = (b40 + 3.0)*(1.0 + rho2[i])*
G4Log(3.0 + xi[i])
408 + 2.0 - 3.0 * rho2[i];
410 ye1[i] = 1.0 + yeu / yed;
411 ym1[i] = 1.0 + ymu / ymd;
418 if(xi[i] <= 1000.0) {
419 be[i] = ((2.0 + rho2[i])*(1.0 + beta) +
420 xi[i]*(3.0 + rho2[i]))*
G4Log(1.0 + xii[i]) +
421 (1.0 - rho2[i] - beta)/xi1[i] - (3.0 + rho2[i]);
423 be[i] = 0.5*(3.0 - rho2[i] + 2.0*beta*(1.0 + rho2[i]))*xii[i];
427 G4double a10 = (1.0 + 2.0 * beta) * (1.0 - rho2[i]);
428 bm[i] = ((1.0 + rho2[i])*(1.0 + 1.5 * beta) - a10*xii[i])*
G4Log(xi1[i]) +
429 xi[i] * (1.0 - rho2[i] - beta)/xi1[i] + a10;
431 bm[i] = 0.5*(5.0 - rho2[i] + beta * (3.0 + rho2[i]))*xi[i];
438 G4double screen = screen0*xi1[i]/(1.0 - rho2[i]);
439 G4double ale =
G4Log(bbb/
z13*std::sqrt(xi1[i]*ye1[i])/(1. + screen*ye1[i]));
443 fe = std::max(
fe, 0.0);
446 G4double fm = std::max(alm_crm*bm[i], 0.0)*inv_massratio2;
448 sum +=
wgi[i]*(1.0 + rho[i])*(
fe + fm);
451 return -tmn*sum*
factorForCross*z2*residEnergy/(totalEnergy*pairEnergy);
467 G4double tmax = std::min(maxEnergy, maxPairEnergy);
469 if (cut >= tmax) {
return cross; }
472 if(tmax < kineticEnergy) {
490 for (std::size_t it=0; it<=
nbine; ++it) {
492 pv->
PutY(it,
G4Log(kinEnergy/CLHEP::MeV));
503 std::size_t imax = (std::size_t)fac;
517 for (std::size_t i=0; i<
nbiny; ++i) {
519 if(0 == it) { pv->
PutX(i, x); }
531 }
else if(i == imax) {
538 kinEnergy *= factore;
549 std::vector<G4DynamicParticle*>* vdp,
571 G4double maxEnergy = std::min(tmax, maxPairEnergy);
574 if (minEnergy >= maxEnergy) {
return; }
593 G4int iz1(0), iz2(0);
600 if(iz > 0) { iz1 = iz-1; }
605 if (0 == iz1) { iz1 = iz2 =
NZDATPAIR-1; }
622 x += (x2 - x)*(
lnZ - lz1)/(lz2 - lz1);
625 pairEnergy = kinEnergy*
G4Exp(x*coeff);
628 }
while((pairEnergy < minEnergy || pairEnergy > maxEnergy) && 10 > count);
640 G4double eEnergy = (1.-r)*pairEnergy*0.5;
641 G4double pEnergy = pairEnergy - eEnergy;
648 eDirection, pDirection);
650 eEnergy = std::max(eEnergy - CLHEP::electron_mass_c2, 0.0);
651 pEnergy = std::max(pEnergy - CLHEP::electron_mass_c2, 0.0);
655 vdp->push_back(aParticle1);
656 vdp->push_back(aParticle2);
659 kinEnergy -= pairEnergy;
660 partDirection *= totalMomentum;
661 partDirection -= (aParticle1->GetMomentum() + aParticle2->GetMomentum());
662 partDirection = partDirection.
unit();
670 vdp->push_back(newdp);
692 else { res = pv->
FindLinearX((pmin + rand*(pmax - pmin))/p0, logTkin); }
704 ed <<
"G4ElementData is not properly initialized Z= " << Z
705 <<
" Ekin(MeV)= " <<
G4Exp(logTkin)
706 <<
" IsMasterThread= " <<
IsMaster()
722 std::ostringstream ss;
723 ss <<
"mupair/" <<
particle->GetParticleName() << Z <<
".dat";
724 std::ofstream outfile(ss.str());
736 std::ostringstream ss;
738 <<
particle->GetParticleName() << Z <<
".dat";
739 std::ifstream infile(ss.str(), std::ios::in);
G4TemplateAutoLock< G4Mutex > G4AutoLock
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
CLHEP::Hep3Vector G4ThreeVector
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
static G4ElementDataRegistry * Instance()
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]
static G4NistManager * Instance()
G4double GetPDGMass() const
G4int GetPDGEncoding() 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
G4VEmModel(const G4String &nam)
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4String & GetName() const
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
G4double SecondaryThreshold() const
G4ParticleChangeForLoss * GetParticleChangeForLoss()