Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4KokoulinMuonNuclearXS.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id: $
27//
28// Author: D.H. Wright
29// Date: 1 February 2011
30//
31// Modified:
32//
33// 19 Aug 2011, V.Ivanchenko move to new design and make x-section per element
34
35// Description: use Kokoulin's parameterized calculation of virtual
36// photon production cross section and conversion to
37// real photons.
38
40
42#include "G4SystemOfUnits.hh"
43#include "G4PhysicsTable.hh"
44#include "G4PhysicsLogVector.hh"
45
46
48 :G4VCrossSectionDataSet("KokoulinMuonNuclearXS"), theCrossSectionTable(0),
49 LowestKineticEnergy(1*GeV), HighestKineticEnergy(1*PeV),
50 TotBin(60), CutFixed(0.2*GeV)
51{
53}
54
56{
57 if (theCrossSectionTable) {
58 theCrossSectionTable->clearAndDestroy();
59 delete theCrossSectionTable;
60 }
61}
62
63G4bool
65 G4int, const G4Material*)
66{
67 return true;
68}
69
70
72{
73 G4double lowEdgeEnergy;
74 G4PhysicsLogVector* ptrVector;
75
77 const G4ElementTable* theElementTable = G4Element::GetElementTable();
78
79 theCrossSectionTable = new G4PhysicsTable(nEl);
80
81 G4double AtomicNumber;
82 G4double AtomicWeight;
83 G4double Value;
84
85 for (G4int j = 0; j < nEl; j++) {
86 ptrVector = new G4PhysicsLogVector(LowestKineticEnergy,
87 HighestKineticEnergy, TotBin);
88 AtomicNumber = (*theElementTable)[j]->GetZ();
89 AtomicWeight = (*theElementTable)[j]->GetA();
90
91 for (G4int i = 0; i <= TotBin; ++i) {
92 lowEdgeEnergy = ptrVector->Energy(i);
93 Value = ComputeMicroscopicCrossSection(lowEdgeEnergy,
94 AtomicNumber, AtomicWeight);
95 ptrVector->PutValue(i,Value);
96 }
97
98 theCrossSectionTable->insertAt(j, ptrVector);
99 }
100
101 // Build (Z,element) look-up table (for use in GetZandACrossSection)
102 for (G4int j = 0; j < nEl; j++) {
103 G4int ZZ = G4int((*theElementTable)[j]->GetZ());
104 zelMap[ZZ] = j;
105 }
106}
107
108G4double G4KokoulinMuonNuclearXS::
109ComputeMicroscopicCrossSection(G4double KineticEnergy,
110 G4double AtomicNumber, G4double AtomicWeight)
111{
112 // Calculate cross section (differential in muon incident kinetic energy) by
113 // integrating the double differential cross section over the energy loss
114
115 const G4double xgi[] = {0.0199,0.1017,0.2372,0.4083,0.5917,0.7628,0.8983,0.9801};
116 const G4double wgi[] = {0.0506,0.1112,0.1569,0.1813,0.1813,0.1569,0.1112,0.0506};
117 const G4double ak1 = 6.9;
118 const G4double ak2 = 1.0;
119
121
122 G4double CrossSection = 0.0;
123 if (AtomicNumber < 1.) return CrossSection;
124 if (KineticEnergy <= CutFixed) return CrossSection;
125
126 G4double epmin = CutFixed;
127 G4double epmax = KineticEnergy + Mass - 0.5*proton_mass_c2;
128 if (epmax <= epmin) return CrossSection; // NaN bug correction
129
130 G4double aaa = std::log(epmin) ;
131 G4double bbb = std::log(epmax) ;
132 G4int kkk = G4int((bbb-aaa)/ak1 +ak2) ;
133 G4double hhh = (bbb-aaa)/kkk ;
134 G4double epln;
135 G4double ep;
136 G4double x;
137
138 for (G4int l = 0; l < kkk; l++) {
139 x = aaa + hhh*l;
140 for (G4int ll = 0; ll < 8; ll++) {
141 epln=x+xgi[ll]*hhh;
142 ep = std::exp(epln);
143 CrossSection += ep*wgi[ll]*ComputeDDMicroscopicCrossSection(KineticEnergy,
144 AtomicNumber, AtomicWeight, ep);
145 }
146 }
147
148 CrossSection *= hhh ;
149 if (CrossSection < 0.) CrossSection = 0.;
150 return CrossSection;
151}
152
155 G4double, G4double AtomicWeight,
156 G4double epsilon)
157{
158 // Calculate the double-differential microscopic cross section (in muon
159 // incident kinetic energy and energy loss) using the cross section formula
160 // of R.P. Kokoulin (18/01/98)
161
162 const G4double alam2 = 0.400*GeV*GeV;
163 const G4double alam = 0.632456*GeV;
164 const G4double coeffn = fine_structure_const/pi;
165
166 G4double ParticleMass = G4MuonMinus::MuonMinus()->GetPDGMass();
167 G4double TotalEnergy = KineticEnergy + ParticleMass;
168
169 G4double DCrossSection = 0.;
170
171 if ((epsilon >= TotalEnergy - 0.5*proton_mass_c2) ||
172 (epsilon <= CutFixed) ) return DCrossSection;
173
174 G4double ep = epsilon/GeV;
175 G4double a = AtomicWeight/(g/mole);
176 G4double aeff = 0.22*a+0.78*std::exp(0.89*std::log(a)); //shadowing
177 G4double sigph = (49.2+11.1*std::log(ep)+151.8/std::sqrt(ep))*microbarn;
178
179 G4double v = epsilon/TotalEnergy;
180 G4double v1 = 1.-v;
181 G4double v2 = v*v;
182 G4double mass2 = ParticleMass*ParticleMass;
183
184 G4double up = TotalEnergy*TotalEnergy*v1/mass2*(1.+mass2*v2/(alam2*v1));
185 G4double down = 1.+epsilon/alam*(1.+alam/(2.*proton_mass_c2)+epsilon/alam);
186
187 DCrossSection = coeffn*aeff*sigph/epsilon*
188 (-v1+(v1+0.5*v2*(1.+2.*mass2/alam2))*std::log(up/down));
189
190 if (DCrossSection < 0.) DCrossSection = 0.;
191 return DCrossSection;
192}
193
196 G4int ZZ, const G4Material*)
197{
198 G4int j = zelMap[ZZ];
199 return (*theCrossSectionTable)[j]->Value(aPart->GetKineticEnergy());
200}
201
std::vector< G4Element * > G4ElementTable
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4double GetKineticEnergy() const
static size_t GetNumberOfElements()
Definition: G4Element.cc:406
static const G4ElementTable * GetElementTable()
Definition: G4Element.cc:399
G4double ComputeDDMicroscopicCrossSection(G4double incidentKE, G4double, G4double AtomicWeight, G4double epsilon)
G4double GetElementCrossSection(const G4DynamicParticle *particle, G4int Z, const G4Material *)
G4bool IsElementApplicable(const G4DynamicParticle *particle, G4int Z, const G4Material *)
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
void insertAt(size_t, G4PhysicsVector *)
void clearAndDestroy()
G4double Energy(size_t index) const
void PutValue(size_t index, G4double theValue)