60 LowestKineticEnergy(1*GeV), HighestKineticEnergy(1*PeV),
61 TotBin(60), CutFixed(0.2*GeV), isInitialized(false), isMaster(false)
68 delete theCrossSection[i];
69 theCrossSection[i] = 0;
78 outFile <<
"G4KokoulinMuonNuclearXS provides the total inelastic\n"
79 <<
"cross section for mu- and mu+ interactions with nuclei.\n"
80 <<
"R. Kokoulin's approximation of the Borog and Petrukhin double\n"
81 <<
"differential cross section at high energy and low Q**2 is integrated\n"
82 <<
"over the muon energy loss to get the total cross section as a\n"
83 <<
"function of muon kinetic energy\n" ;
100 if(theCrossSection[i]) {
return; }
116 for (std::size_t j = 0; j < nEl; ++j) {
117 Z =
G4lrint((*theElementTable)[j]->GetZ());
120 const G4bool isHeavyElementAllowed =
true;
if ( isHeavyElementAllowed && Z>92 ) Z=92;
123 if(Z <
MAXZMUN && !theCrossSection[Z]) {
125 HighestKineticEnergy,
127 for (
G4int i = 0; i <= TotBin; ++i) {
128 energy = theCrossSection[Z]->
Energy(i);
129 Value = ComputeMicroscopicCrossSection(energy,
A);
130 theCrossSection[Z]->
PutValue(i,Value);
143 {0.0199,0.1017,0.2372,0.4083,0.5917,0.7628,0.8983,0.9801};
145 {0.0506,0.1112,0.1569,0.1813,0.1813,0.1569,0.1112,0.0506};
152 if (KineticEnergy <= CutFixed)
return CrossSection;
156 if (epmax <= epmin)
return CrossSection;
160 G4int kkk = std::max(1,
G4int((bbb-aaa)/ak1 +ak2));
166 for (
G4int l = 0; l < kkk; ++l) {
168 for (
G4int ll = 0; ll < 8; ++ll) {
176 CrossSection *= hhh ;
177 if (CrossSection < 0.) { CrossSection = 0.; }
189 static const G4double alam2 = 0.400*GeV*GeV;
190 static const G4double alam = 0.632456*GeV;
191 static const G4double coeffn = fine_structure_const/pi;
194 G4double TotalEnergy = KineticEnergy + ParticleMass;
198 if ((
epsilon >= TotalEnergy - 0.5*proton_mass_c2) ||
199 (
epsilon <= CutFixed) ) {
return DCrossSection; }
203 G4double sigph = (49.2+11.1*
G4Log(ep)+151.8/std::sqrt(ep))*microbarn;
208 G4double mass2 = ParticleMass*ParticleMass;
210 G4double up = TotalEnergy*TotalEnergy*v1/mass2*(1.+mass2*v2/(alam2*v1));
213 DCrossSection = coeffn*aeff*sigph/
epsilon*
214 (-v1+(v1+0.5*v2*(1.+2.*mass2/alam2))*
G4Log(up/down));
216 if (DCrossSection < 0.) { DCrossSection = 0.; }
217 return DCrossSection;
225 G4int Z = std::min(ZZ, 92);
#define G4_DECLARE_XS_FACTORY(cross_section)
G4double epsilon(G4double density, G4double temperature)
std::vector< G4Element * > G4ElementTable
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
static G4ElementTable * GetElementTable()
static size_t GetNumberOfElements()
G4KokoulinMuonNuclearXS()
G4double GetElementCrossSection(const G4DynamicParticle *particle, G4int Z, const G4Material *)
virtual void CrossSectionDescription(std::ostream &) const
void BuildPhysicsTable(const G4ParticleDefinition &)
G4double ComputeDDMicroscopicCrossSection(G4double incidentKE, G4double Z, G4double A, G4double epsilon)
virtual ~G4KokoulinMuonNuclearXS()
G4bool IsElementApplicable(const G4DynamicParticle *particle, G4int Z, const G4Material *)
void BuildCrossSectionTable()
static G4MuonMinus * MuonMinus()
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetPDGMass() const
void PutValue(const std::size_t index, const G4double value)
G4double Energy(const std::size_t index) const
G4double LogVectorValue(const G4double energy, const G4double theLogEnergy) const