63static const G4int nzdat = 5;
64static const G4int zdat[5] = {1, 4, 13, 29, 92};
67{ 0.0198550717512320, 0.1016667612931865, 0.2372337950418355, 0.4082826787521750,
68 0.5917173212478250, 0.7627662049581645, 0.8983332387068135, 0.9801449282487680 };
71{ 0.0506142681451880, 0.1111905172266870, 0.1568533229389435, 0.1813418916891810,
72 0.1813418916891810, 0.1568533229389435, 0.1111905172266870, 0.0506142681451880 };
89 pow(CLHEP::fine_structure_const*CLHEP::classic_electr_radius/
mueRatio, 2);
106 G4double residEnergy = totalEnergy - pairEnergy;
108 if (residEnergy <=
muonMass) {
return 0.0; }
110 G4double a0 = 1.0 / (totalEnergy * residEnergy);
114 if(tmnexp >= 1.0) {
return 0.0; }
129 for (
G4int i = 0; i < 8; ++i)
131 rho[i] =
G4Exp(tmn*xgi[i]) - 1.0;
132 rho2[i] = rho[i] * rho[i];
133 xi[i] = xi0*(1.0-rho2[i]);
134 xi1[i] = 1.0 + xi[i];
135 xii[i] = 1.0 / xi[i];
138 G4double ximax = xi0*(1. - rhomax*rhomax);
143 for (
G4int i = 0; i < 8; ++i)
145 U[i] =
U_func(
Z, rho2[i], xi[i],
Y, pairEnergy);
151 for (
G4int i = 0; i < 8; ++i)
155 G4double phi = ((2 + rho2[i])*(1 + beta) + xi[i]*(3 + rho2[i]))*
156 G4Log(1 + xii[i]) - 1 - 3*rho2[i] + beta*(1 - 2*rho2[i])
157 + ((1 + rho2[i])*(1 + 1.5*beta) - xii[i]*(1 + 2*beta)
158 *(1 - rho2[i]))*
G4Log(xi1[i]);
159 sum += wgi[i]*(1.0 + rho[i])*phi*lnX;
162 return -tmn*sum*
factorForCross*z2*residEnergy/(totalEnergy*pairEnergy);
177 /(CLHEP::electron_mass_c2*pairEnergy*(1 - rho2)));
184 std::vector<G4DynamicParticle*>* vdp,
204 G4double maxEnergy = std::min(tmax, maxPairEnergy);
207 if(minEnergy >= maxEnergy) {
return; }
226 G4int iz1(0), iz2(0);
227 for(
G4int iz=0; iz<nzdat; ++iz) {
233 if(iz > 0) { iz1 = zdat[iz-1]; }
238 if(0 == iz1) { iz1 = iz2 = zdat[nzdat-1]; }
255 x += (x2 - x)*(
lnZ - lz1)/(lz2 - lz1);
258 pairEnergy = kinEnergy*
G4Exp(x*coeff);
261 }
while((pairEnergy < minEnergy || pairEnergy > maxEnergy) && 10 > count);
271 G4double muMinusEnergy = (1.-r)*pairEnergy*0.5;
272 G4double muPlusEnergy = pairEnergy - muMinusEnergy;
278 muMinusEnergy, muPlusEnergy,
279 muMinusDirection, muPlusDirection);
281 muMinusEnergy = std::max(muMinusEnergy -
muonMass, 0.0);
282 muPlusEnergy = std::max(muPlusEnergy -
muonMass, 0.0);
288 vdp->push_back(aParticle1);
289 vdp->push_back(aParticle2);
292 kinEnergy -= pairEnergy;
293 partDirection *= totalMomentum;
295 partDirection = partDirection.
unit();
304 vdp->push_back(newdp);
317 ed <<
"G4ElementData is not properly initialized Z= " <<
Z
318 <<
" Ekin(MeV)= " <<
G4Exp(logTkin)
319 <<
" IsMasterThread= " <<
IsMaster()
G4double B(G4double temperature)
G4double Y(G4double density)
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)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
G4double FindScaledEnergy(G4int Z, G4double rand, G4double logTkin, G4double yymin, G4double yymax)
const G4ParticleDefinition * particle
G4ParticleChangeForLoss * fParticleChange
G4double MaxSecondaryEnergyForElement(G4double kineticEnergy, G4double Z)
static G4MuonMinus * MuonMinus()
static G4MuonPlus * MuonPlus()
G4double ComputeDMicroscopicCrossSection(G4double tkin, G4double Z, G4double pairEnergy) override
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4MuonToMuonPairProductionModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="muToMuonPairProd")
G4ParticleDefinition * theMuonMinus
G4double U_func(G4double Z, G4double rho2, G4double xi, G4double Y, G4double pairEnergy, const G4double B=183)
G4ParticleDefinition * theMuonPlus
void DataCorrupted(G4int Z, G4double logTkin) const override
G4double GetA27(G4int Z) const
G4double GetZ13(G4double Z) const
G4double GetLOGZ(G4int Z) const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
G4double GetPDGMass() const
virtual void SamplePairDirections(const G4DynamicParticle *dp, G4double elecKinEnergy, G4double posiKinEnergy, G4ThreeVector &dirElectron, G4ThreeVector &dirPositron, G4int Z=0, const G4Material *mat=nullptr)
G4VEmAngularDistribution * GetAngularDistribution()
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4String & GetName() const
G4double SecondaryThreshold() const
void ProposeTrackStatus(G4TrackStatus status)