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 G4Isotope * SelectIsotope (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 G4String & GetName () const
 

Static Public Member Functions

static const char * Default_Name ()
 

Private Member Functions

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

Private Attributes

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

Static Private Attributes

static G4PhysicsVector * theCrossSection [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: