101{ 0.0198550717512320, 0.1016667612931865, 0.2372337950418355, 0.4082826787521750,
102 0.5917173212478250, 0.7627662049581645, 0.8983332387068135, 0.9801449282487680 };
105{ 0.0506142681451880, 0.1111905172266870, 0.1568533229389435, 0.1813418916891810,
106 0.1813418916891810, 0.1568533229389435, 0.1111905172266870, 0.0506142681451880 };
211 const G4double* theAtomicNumDensityVector =
212 material->GetAtomicNumDensityVector();
215 for (
size_t i=0; i<
material->GetNumberOfElements(); ++i) {
216 G4double Z = (*theElementVector)[i]->GetZ();
219 dedx += loss*theAtomicNumDensityVector[i];
243 if (kkk > 8) { kkk = 8; }
244 else if (kkk < 1) { kkk = 1; }
249 for (
G4int l=0 ; l<kkk; ++l) {
250 for (
G4int ll=0; ll<8; ++ll)
272 if (tmax <= cut) {
return cross; }
277 if(kkk > 8) { kkk = 8; }
278 else if (kkk < 1) { kkk = 1; }
283 for(
G4int l=0; l<kkk; ++l)
285 for(
G4int i=0; i<8; ++i)
309 static const G4double bbbh = 202.4 ;
310 static const G4double g1tf = 1.95e-5 ;
311 static const G4double g2tf = 5.3e-5 ;
312 static const G4double g1h = 4.4e-5 ;
313 static const G4double g2h = 4.8e-5 ;
319 G4double residEnergy = totalEnergy - pairEnergy;
324 G4double a0 = 1.0 / (totalEnergy * residEnergy);
328 G4double tmnexp = alf/(1.0 + rt) + delta*rt;
330 if(tmnexp >= 1.0) {
return 0.0; }
335 G4double massratio2 = massratio*massratio;
336 G4double inv_massratio2 = 1.0 / massratio2;
340 if(
Z < 1.5 ) { bbb = bbbh ; g1 = g1h ; g2 = g2h ; }
341 else { bbb = bbbtf; g1 = g1tf; g2 = g2tf; }
348 if (z1exp > 35.221047195922)
351 zeta = (0.073 *
G4Log(z1exp) - 0.26) / (0.058 *
G4Log(z2exp) - 0.14);
366 for (
G4int i = 0; i < 8; ++i)
369 rho2[i] = rho[i] * rho[i];
370 xi[i] =
xi0*(1.0-rho2[i]);
371 xi1[i] = 1.0 + xi[i];
372 xii[i] = 1.0 / xi[i];
381 for (
G4int i = 0; i < 8; ++i)
383 G4double yeu = (b40 + 5.0) + (b40 - 1.0) * rho2[i];
386 G4double ymu = b62 * (1.0 + rho2[i]) + 6.0;
387 G4double ymd = (b40 + 3.0) * (1.0 + rho2[i]) *
G4Log(3.0 + xi[i]) + 2.0 - 3.0 * rho2[i];
389 ye1[i] = 1.0 + yeu / yed;
390 ym1[i] = 1.0 + ymu / ymd;
396 for(
G4int i = 0; i < 8; ++i)
398 if(xi[i] <= 1000.0) {
399 be[i] = ((2.0 + rho2[i]) * (1.0 +
beta) + xi[i] * (3.0 + rho2[i])) *
400 G4Log(1.0 + xii[i]) + (1.0 - rho2[i] -
beta) / xi1[i] - (3.0 + rho2[i]);
402 be[i] = 0.5 * (3.0 - rho2[i] + 2.0 *
beta * (1.0 + rho2[i])) * xii[i];
407 bm[i] = ((1.0 + rho2[i]) * (1.0 + 1.5 *
beta) - a10 * xii[i]) *
G4Log(xi1[i]) +
408 xi[i] * (1.0 - rho2[i] -
beta) / xi1[i] + a10;
410 bm[i] = 0.5 * (5.0 - rho2[i] +
beta * (3.0 + rho2[i])) * xi[i];
416 for (
G4int i = 0; i < 8; ++i)
418 G4double screen = screen0*xi1[i]/(1.0-rho2[i]) ;
427 fm *= (fm > 0.0) * inv_massratio2;
429 sum +=
wgi[i]*(1.0 + rho[i])*(
fe+fm);
432 return -tmn*sum*
factorForCross*z2*residEnergy/(totalEnergy*pairEnergy);
450 if (cut >= tmax) {
return cross; }
453 if(tmax < kineticEnergy) {
471 for (
size_t it=0; it<=
nbine; ++it) {
498 for (
size_t i=0; i<
nbiny; ++i) {
500 if(0 == it) { pv->
PutX(i, x); }
512 }
else if(i ==
imax) {
519 kinEnergy *= factore;
531 std::vector<G4DynamicParticle*>* vdp,
556 if(minEnergy >= maxEnergy) {
return; }
575 G4int iz1(0), iz2(0);
582 if(iz > 0) { iz1 =
zdat[iz-1]; }
587 if(0 == iz1) { iz1 = iz2 =
zdat[
nzdat-1]; }
604 x += (x2 - x)*(
lnZ - lz1)/(lz2 - lz1);
607 pairEnergy = kinEnergy*
G4Exp(x*coeff);
610 }
while((pairEnergy < minEnergy || pairEnergy > maxEnergy) && 10 > count);
622 G4double eEnergy = (1.-r)*pairEnergy*0.5;
623 G4double pEnergy = pairEnergy - eEnergy;
630 eDirection, pDirection);
639 vdp->push_back(aParticle1);
640 vdp->push_back(aParticle2);
643 kinEnergy -= pairEnergy;
644 partDirection *= totalMomentum;
646 partDirection = partDirection.
unit();
655 vdp->push_back(newdp);
668 ed <<
"G4ElementData is not properly initialized Z= " <<
Z
669 <<
" Ekin(MeV)= " <<
G4Exp(logTkin)
670 <<
" IsMasterThread= " <<
IsMaster()
687 std::ostringstream ss;
689 std::ofstream outfile(ss.str());
698 char* path = std::getenv(
"G4LEDATA");
701 std::ostringstream ost;
702 ost << path <<
"/mupair/";
711 std::ostringstream ss;
713 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.
static const G4double sqrte
G4double G4Log(G4double x)
static const G4double ak2
static const G4double xgi[]
static const G4int zdat[5]
static const G4double wgi[]
static const G4double ak1
static const G4double fac
static constexpr double GeV
static constexpr double pi
static constexpr double TeV
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
static G4Electron * Electron()
void InitialiseForElement(G4int Z, G4PhysicsVector *v)
G4Physics2DVector * GetElement2DData(G4int Z)
static G4EmParameters * Instance()
G4bool RetrieveMuDataFromFile() const
G4double ComputeMicroscopicCrossSection(G4double tkin, G4double Z, G4double cut)
void SetParticle(const G4ParticleDefinition *)
G4ParticleDefinition * thePositron
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
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)
virtual ~G4MuPairProductionModel() override
const G4ParticleDefinition * particle
G4double MinPrimaryEnergy(const G4Material *, const G4ParticleDefinition *, G4double) override
G4ParticleChangeForLoss * fParticleChange
G4double MaxSecondaryEnergyForElement(G4double kineticEnergy, G4double Z)
G4ParticleDefinition * theElectron
G4double GetLOGZ(G4int Z) const
static G4NistManager * Instance()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
G4double GetPDGMass() const
const G4String & GetParticleName() const
G4bool Retrieve(std::ifstream &fIn)
void PutY(std::size_t idy, G4double value)
void Store(std::ofstream &fOut) const
void PutValue(std::size_t idx, std::size_t idy, G4double value)
void PutX(std::size_t idx, G4double value)
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
G4ElementData * GetElementData()
G4ParticleChangeForLoss * GetParticleChangeForLoss()
void ProposeTrackStatus(G4TrackStatus status)
static constexpr double electron_mass_c2
static constexpr double MeV
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
int classic_electr_radius