Geant4  10.02.p03
G4KokoulinMuonNuclearXS Class Reference

#include <G4KokoulinMuonNuclearXS.hh>

Inheritance diagram for G4KokoulinMuonNuclearXS:
Collaboration diagram for G4KokoulinMuonNuclearXS:

Public Member Functions

 G4KokoulinMuonNuclearXS ()
 
virtual ~G4KokoulinMuonNuclearXS ()
 
virtual void CrossSectionDescription (std::ostream &) const
 
G4bool IsElementApplicable (const G4DynamicParticle *particle, G4int Z, const G4Material *)
 
G4double GetElementCrossSection (const G4DynamicParticle *particle, G4int Z, const G4Material *)
 
void BuildPhysicsTable (const G4ParticleDefinition &)
 
void BuildCrossSectionTable ()
 
G4double ComputeDDMicroscopicCrossSection (G4double incidentKE, G4double Z, G4double A, G4double epsilon)
 
- Public Member Functions inherited from G4VCrossSectionDataSet
 G4VCrossSectionDataSet (const G4String &nam="")
 
virtual ~G4VCrossSectionDataSet ()
 
virtual G4bool IsIsoApplicable (const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm=0, const G4Material *mat=0)
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
G4double ComputeCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
virtual G4double GetIsoCrossSection (const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
 
virtual G4IsotopeSelectIsotope (const G4Element *, G4double kinEnergy)
 
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
 
virtual G4int GetVerboseLevel () const
 
virtual void SetVerboseLevel (G4int value)
 
G4double GetMinKinEnergy () const
 
void SetMinKinEnergy (G4double value)
 
G4double GetMaxKinEnergy () const
 
void SetMaxKinEnergy (G4double value)
 
const G4StringGetName () const
 

Static Public Member Functions

static const char * Default_Name ()
 

Private Member Functions

G4double ComputeMicroscopicCrossSection (G4double incidentKE, G4double A)
 
G4KokoulinMuonNuclearXSoperator= (const G4KokoulinMuonNuclearXS &right)
 
 G4KokoulinMuonNuclearXS (const G4KokoulinMuonNuclearXS &)
 

Private Attributes

G4double LowestKineticEnergy
 
G4double HighestKineticEnergy
 
G4int TotBin
 
G4double CutFixed
 
G4bool isInitialized
 
G4bool isMaster
 

Static Private Attributes

static G4PhysicsVectortheCrossSection [MAXZMUN] = {0}
 

Additional Inherited Members

- Protected Member Functions inherited from G4VCrossSectionDataSet
void SetName (const G4String &)
 
- Protected Attributes inherited from G4VCrossSectionDataSet
G4int verboseLevel
 

Detailed Description

Definition at line 53 of file G4KokoulinMuonNuclearXS.hh.

Constructor & Destructor Documentation

◆ G4KokoulinMuonNuclearXS() [1/2]

G4KokoulinMuonNuclearXS::G4KokoulinMuonNuclearXS ( )

Definition at line 59 of file G4KokoulinMuonNuclearXS.cc.

Here is the caller graph for this function:

◆ ~G4KokoulinMuonNuclearXS()

G4KokoulinMuonNuclearXS::~G4KokoulinMuonNuclearXS ( )
virtual

Definition at line 65 of file G4KokoulinMuonNuclearXS.cc.

66 {
67  if (isMaster) {
68  for(G4int i=0; i<MAXZMUN; ++i) {
69  delete theCrossSection[i];
70  theCrossSection[i] = 0;
71  }
72  }
73 }
int G4int
Definition: G4Types.hh:78
const G4int MAXZMUN
static G4PhysicsVector * theCrossSection[MAXZMUN]

◆ G4KokoulinMuonNuclearXS() [2/2]

G4KokoulinMuonNuclearXS::G4KokoulinMuonNuclearXS ( const G4KokoulinMuonNuclearXS )
private

Member Function Documentation

◆ BuildCrossSectionTable()

void G4KokoulinMuonNuclearXS::BuildCrossSectionTable ( )

Definition at line 108 of file G4KokoulinMuonNuclearXS.cc.

109 {
110  G4double energy, A, Value;
111  G4int Z;
112 
114  const G4ElementTable* theElementTable = G4Element::GetElementTable();
115  G4NistManager* nistManager = G4NistManager::Instance();
116 
117  for (G4int j = 0; j < nEl; j++) {
118  Z = G4lrint((*theElementTable)[j]->GetZ());
119  A = nistManager->GetAtomicMassAmu(Z);
120  if(Z < MAXZMUN && !theCrossSection[Z]) {
123  TotBin);
124  for (G4int i = 0; i <= TotBin; ++i) {
125  energy = theCrossSection[Z]->Energy(i);
126  Value = ComputeMicroscopicCrossSection(energy, A);
127  theCrossSection[Z]->PutValue(i,Value);
128  }
129  }
130  }
131 }
G4double ComputeMicroscopicCrossSection(G4double incidentKE, G4double A)
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
double energy
Definition: plottest35.C:25
double A(double temperature)
static size_t GetNumberOfElements()
Definition: G4Element.cc:402
Float_t Z
void PutValue(size_t index, G4double theValue)
const G4int MAXZMUN
int G4lrint(double ad)
Definition: templates.hh:163
static G4PhysicsVector * theCrossSection[MAXZMUN]
G4double Energy(size_t index) const
std::vector< G4Element * > G4ElementTable
double G4double
Definition: G4Types.hh:76
static G4ElementTable * GetElementTable()
Definition: G4Element.cc:395
G4double GetAtomicMassAmu(const G4String &symb) const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ BuildPhysicsTable()

void G4KokoulinMuonNuclearXS::BuildPhysicsTable ( const G4ParticleDefinition )
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 96 of file G4KokoulinMuonNuclearXS.cc.

97 {
98  if(!isInitialized) {
99  isInitialized = true;
100  for(G4int i=0; i<MAXZMUN; ++i) {
101  if(theCrossSection[i]) { return; }
102  }
103  isMaster = true;
104  }
106 }
int G4int
Definition: G4Types.hh:78
const G4int MAXZMUN
static G4PhysicsVector * theCrossSection[MAXZMUN]
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ComputeDDMicroscopicCrossSection()

G4double G4KokoulinMuonNuclearXS::ComputeDDMicroscopicCrossSection ( G4double  incidentKE,
G4double  Z,
G4double  A,
G4double  epsilon 
)

Definition at line 179 of file G4KokoulinMuonNuclearXS.cc.

181 {
182  // Calculate the double-differential microscopic cross section (in muon
183  // incident kinetic energy and energy loss) using the cross section formula
184  // of R.P. Kokoulin (18/01/98)
185 
186  static const G4double alam2 = 0.400*GeV*GeV;
187  static const G4double alam = 0.632456*GeV;
188  static const G4double coeffn = fine_structure_const/pi;
189 
190  G4double ParticleMass = G4MuonMinus::MuonMinus()->GetPDGMass();
191  G4double TotalEnergy = KineticEnergy + ParticleMass;
192 
193  G4double DCrossSection = 0.;
194 
195  if ((epsilon >= TotalEnergy - 0.5*proton_mass_c2) ||
196  (epsilon <= CutFixed) ) { return DCrossSection; }
197 
198  G4double ep = epsilon/GeV;
199  G4double aeff = 0.22*A+0.78*G4Exp(0.89*G4Log(A)); //shadowing
200  G4double sigph = (49.2+11.1*G4Log(ep)+151.8/std::sqrt(ep))*microbarn;
201 
202  G4double v = epsilon/TotalEnergy;
203  G4double v1 = 1.-v;
204  G4double v2 = v*v;
205  G4double mass2 = ParticleMass*ParticleMass;
206 
207  G4double up = TotalEnergy*TotalEnergy*v1/mass2*(1.+mass2*v2/(alam2*v1));
208  G4double down = 1.+epsilon/alam*(1.+alam/(2.*proton_mass_c2)+epsilon/alam);
209 
210  DCrossSection = coeffn*aeff*sigph/epsilon*
211  (-v1+(v1+0.5*v2*(1.+2.*mass2/alam2))*G4Log(up/down));
212 
213  if (DCrossSection < 0.) { DCrossSection = 0.; }
214  return DCrossSection;
215 }
static const double microbarn
Definition: G4SIunits.hh:106
int fine_structure_const
Definition: hepunit.py:287
double A(double temperature)
float proton_mass_c2
Definition: hepunit.py:275
static const double GeV
Definition: G4SIunits.hh:214
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
static const double pi
Definition: G4SIunits.hh:74
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
double G4double
Definition: G4Types.hh:76
double epsilon(double density, double temperature)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ComputeMicroscopicCrossSection()

G4double G4KokoulinMuonNuclearXS::ComputeMicroscopicCrossSection ( G4double  incidentKE,
G4double  A 
)
private

Definition at line 134 of file G4KokoulinMuonNuclearXS.cc.

135 {
136  // Calculate cross section (differential in muon incident kinetic energy) by
137  // integrating the double differential cross section over the energy loss
138 
139  static const G4double xgi[] =
140  {0.0199,0.1017,0.2372,0.4083,0.5917,0.7628,0.8983,0.9801};
141  static const G4double wgi[] =
142  {0.0506,0.1112,0.1569,0.1813,0.1813,0.1569,0.1112,0.0506};
143  static const G4double ak1 = 6.9;
144  static const G4double ak2 = 1.0;
145 
147 
148  G4double CrossSection = 0.0;
149  if (KineticEnergy <= CutFixed) return CrossSection;
150 
151  G4double epmin = CutFixed;
152  G4double epmax = KineticEnergy + Mass - 0.5*proton_mass_c2;
153  if (epmax <= epmin) return CrossSection; // NaN bug correction
154 
155  G4double aaa = G4Log(epmin);
156  G4double bbb = G4Log(epmax);
157  G4int kkk = std::max(1,G4int((bbb-aaa)/ak1 +ak2));
158  G4double hhh = (bbb-aaa)/kkk ;
159  G4double epln;
160  G4double ep;
161  G4double x;
162 
163  for (G4int l = 0; l < kkk; ++l) {
164  x = aaa + hhh*l;
165  for (G4int ll = 0; ll < 8; ++ll) {
166  epln=x+xgi[ll]*hhh;
167  ep = G4Exp(epln);
168  CrossSection +=
169  ep*wgi[ll]*ComputeDDMicroscopicCrossSection(KineticEnergy, 0, A, ep);
170  }
171  }
172 
173  CrossSection *= hhh ;
174  if (CrossSection < 0.) { CrossSection = 0.; }
175  return CrossSection;
176 }
G4double ComputeDDMicroscopicCrossSection(G4double incidentKE, G4double Z, G4double A, G4double epsilon)
int G4int
Definition: G4Types.hh:78
double A(double temperature)
float proton_mass_c2
Definition: hepunit.py:275
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
double G4double
Definition: G4Types.hh:76
TH1F * hhh
Here is the call graph for this function:
Here is the caller graph for this function:

◆ CrossSectionDescription()

void G4KokoulinMuonNuclearXS::CrossSectionDescription ( std::ostream &  outFile) const
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 77 of file G4KokoulinMuonNuclearXS.cc.

78 {
79  outFile << "G4KokoulinMuonNuclearXS provides the total inelastic\n"
80  << "cross section for mu- and mu+ interactions with nuclei.\n"
81  << "R. Kokoulin's approximation of the Borog and Petrukhin double\n"
82  << "differential cross section at high energy and low Q**2 is integrated\n"
83  << "over the muon energy loss to get the total cross section as a\n"
84  << "function of muon kinetic energy\n" ;
85 }
Here is the caller graph for this function:

◆ Default_Name()

static const char* G4KokoulinMuonNuclearXS::Default_Name ( )
inlinestatic

Definition at line 60 of file G4KokoulinMuonNuclearXS.hh.

60 {return "KokoulinMuonNuclearXS";}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetElementCrossSection()

G4double G4KokoulinMuonNuclearXS::GetElementCrossSection ( const G4DynamicParticle particle,
G4int  Z,
const G4Material  
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 218 of file G4KokoulinMuonNuclearXS.cc.

220 {
221  return theCrossSection[Z]->Value(aPart->GetKineticEnergy());
222 }
Float_t Z
G4double Value(G4double theEnergy, size_t &lastidx) const
static G4PhysicsVector * theCrossSection[MAXZMUN]
Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsElementApplicable()

G4bool G4KokoulinMuonNuclearXS::IsElementApplicable ( const G4DynamicParticle particle,
G4int  Z,
const G4Material  
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 89 of file G4KokoulinMuonNuclearXS.cc.

91 {
92  return true;
93 }
Here is the caller graph for this function:

◆ operator=()

G4KokoulinMuonNuclearXS& G4KokoulinMuonNuclearXS::operator= ( const G4KokoulinMuonNuclearXS right)
private
Here is the caller graph for this function:

Member Data Documentation

◆ CutFixed

G4double G4KokoulinMuonNuclearXS::CutFixed
private

Definition at line 91 of file G4KokoulinMuonNuclearXS.hh.

◆ HighestKineticEnergy

G4double G4KokoulinMuonNuclearXS::HighestKineticEnergy
private

Definition at line 89 of file G4KokoulinMuonNuclearXS.hh.

◆ isInitialized

G4bool G4KokoulinMuonNuclearXS::isInitialized
private

Definition at line 92 of file G4KokoulinMuonNuclearXS.hh.

◆ isMaster

G4bool G4KokoulinMuonNuclearXS::isMaster
private

Definition at line 93 of file G4KokoulinMuonNuclearXS.hh.

◆ LowestKineticEnergy

G4double G4KokoulinMuonNuclearXS::LowestKineticEnergy
private

Definition at line 88 of file G4KokoulinMuonNuclearXS.hh.

◆ theCrossSection

G4PhysicsVector * G4KokoulinMuonNuclearXS::theCrossSection = {0}
staticprivate

Definition at line 86 of file G4KokoulinMuonNuclearXS.hh.

◆ TotBin

G4int G4KokoulinMuonNuclearXS::TotBin
private

Definition at line 90 of file G4KokoulinMuonNuclearXS.hh.


The documentation for this class was generated from the following files: