Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ComponentBarNucleonNucleusXsc.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// author: [email protected]
27//
28// Implements data from: Barashenkov V.S., Nucleon-Nucleus Cross Section,
29// Preprint JINR P2-89-770, p. 12, Dubna 1989 (scanned version from KEK)
30// Based on G4NucleonNuclearCrossSection class
31//
32//
33
35#include "G4SystemOfUnits.hh"
36#include "G4DynamicParticle.hh"
37#include "G4Neutron.hh"
38#include "G4Proton.hh"
39#include "G4Pow.hh"
40#include "G4BarashenkovData.hh"
41#include "G4NistManager.hh"
42
43///////////////////////////////////////////////////////////////////////////////
44
45G4double G4ComponentBarNucleonNucleusXsc::theA[93] = {0.0};
46G4double G4ComponentBarNucleonNucleusXsc::A75[93] = {0.0};
47G4int G4ComponentBarNucleonNucleusXsc::theZ[] =
48{2,4,6,7,8,11,13,14,20,26,29,42,48,50,74,82,92};
49std::vector<G4PiData*>* G4ComponentBarNucleonNucleusXsc::thePData = nullptr;
50std::vector<G4PiData*>* G4ComponentBarNucleonNucleusXsc::theNData = nullptr;
51
52#ifdef G4MULTITHREADED
53G4Mutex G4ComponentBarNucleonNucleusXsc::barNNXSMutex = G4MUTEX_INITIALIZER;
54#endif
55
57 : G4VComponentCrossSection("BarashenkovNucleonNucleusXsc"),
58 fTotalXsc(0.0), fInelasticXsc(0.0), fElasticXsc(0.0), isMaster(false)
59{
60 theNeutron = G4Neutron::Neutron();
61 theProton = G4Proton::Proton();
62}
63
64///////////////////////////////////////////////////////////////////////////////
65
67{
68 if(isMaster && nullptr != thePData) {
69 for(G4int i=0; i<NZ; ++i) {
70 delete (*thePData)[i];
71 delete (*theNData)[i];
72 }
73 delete thePData;
74 delete theNData;
75 thePData = nullptr;
76 theNData = nullptr;
77 }
78}
79
80////////////////////////////////////////////////////////////////////
81
83 const G4ParticleDefinition* aParticle,
84 G4double kinEnergy, G4int Z, G4int)
85{
86 ComputeCrossSections(aParticle, kinEnergy, Z);
87 return fTotalXsc;
88}
89
90//////////////////////////////////////////////////////////////////////
91
93 const G4ParticleDefinition* aParticle,
94 G4double kinEnergy, G4int Z, G4double)
95{
96 ComputeCrossSections(aParticle, kinEnergy, Z);
97 return fTotalXsc;
98}
99
100////////////////////////////////////////////////////////////////////
101
103 const G4ParticleDefinition* aParticle,
104 G4double kinEnergy, G4int Z, G4int)
105{
106 ComputeCrossSections(aParticle, kinEnergy, Z);
107 return fInelasticXsc;
108}
109
110/////////////////////////////////////////////////////////////////////
111
113 const G4ParticleDefinition* aParticle,
114 G4double kinEnergy, G4int Z, G4double)
115{
116 ComputeCrossSections(aParticle, kinEnergy, Z);
117 return fInelasticXsc;
118}
119
120//////////////////////////////////////////////////////////////////
121
123 const G4ParticleDefinition* aParticle,
124 G4double kinEnergy, G4int Z, G4double)
125{
126 ComputeCrossSections(aParticle, kinEnergy, Z);
127 return fElasticXsc;
128}
129
130///////////////////////////////////////////////////////////////////
131
133 const G4ParticleDefinition* aParticle,
134 G4double kinEnergy, G4int Z, G4int)
135{
136 ComputeCrossSections(aParticle, kinEnergy, Z);
137 return fElasticXsc;
138}
139
140////////////////////////////////////////////////////////////////////////////
141
143 const G4ParticleDefinition* aParticle, G4double kineticEnergy, G4int ZZ)
144{
145 G4int Z = std::min(ZZ, 92);
146 G4int it = 0;
147 for(; it<NZ; ++it) { if(Z <= theZ[it]) { break; } }
148 if( it >= NZ ) { it = NZ-1; }
149
150 std::vector<G4PiData*>* theData = (aParticle == theNeutron) ? theNData : thePData;
151
152 if( theZ[it] == Z ) {
153 fInelasticXsc = (*theData)[it]->ReactionXSection(kineticEnergy);
154 fTotalXsc = (*theData)[it]->TotalXSection(kineticEnergy);
155 } else {
156 if(0 == it) { it = 1; }
157 G4double x1 = (*theData)[it-1]->ReactionXSection(kineticEnergy);
158 G4double xt1 = (*theData)[it-1]->TotalXSection(kineticEnergy);
159 G4double x2 = (*theData)[it]->ReactionXSection(kineticEnergy);
160 G4double xt2 = (*theData)[it]->TotalXSection(kineticEnergy);
161 G4int Z1 = theZ[it-1];
162 G4int Z2 = theZ[it];
163
164 fInelasticXsc = Interpolate(Z1, Z2, Z, x1, x2);
165 fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
166 }
167
168 fElasticXsc = std::max(fTotalXsc - fInelasticXsc, 0.0);
169}
170
171/////////////////////////////////////////////////////////////////////////////
172
173G4double G4ComponentBarNucleonNucleusXsc::
174Interpolate(G4int Z1, G4int Z2, G4int Z, G4double x1, G4double x2) const
175{
176 // for tabulated data, cross section scales with A^(2/3)
177 G4double r1 = x1* A75[Z] / A75[Z1];
178 G4double r2 = x2* A75[Z] / A75[Z2];
179 G4double alp1 = (theA[Z] - theA[Z1]);
180 G4double alp2 = (theA[Z2] - theA[Z]);
181 G4double result = (r1*alp2 + r2*alp1)/(alp1 + alp2);
182 // G4cout << "x1/2, z1/2 z" <<x1<<" "<<x2<<" "<<Z1<<" "<<Z2<<" "<<Z<<G4endl;
183 // G4cout << "res1/2 " << r1 <<" " << r2 <<" " << result<< G4endl;
184 return result;
185}
186
187/////////////////////////////////////////////////////////////////////////////
188
189void G4ComponentBarNucleonNucleusXsc::Description(std::ostream& outFile) const
190{
191 outFile << "G4ComponentBarNucleonNucleusXsc is a variant of the Barashenkov\n"
192 << "cross section parameterization to be used of protons and\n"
193 << "neutrons on targets heavier than hydrogen. It is intended for\n"
194 << "use as a cross section component and is currently used by\n"
195 << "G4BGGNucleonInelasticXS. It is valid for incident energies up\n"
196 << "to 1 TeV.\n";
197}
198
199/////////////////////////////////////////////////////////////////////////////
200
201void
203{
204 if(nullptr != theNData) { return; }
205
206#ifdef G4MULTITHREADED
207 G4MUTEXLOCK(&barNNXSMutex);
208 if(!theNData) {
209#endif
210 isMaster = true;
211#ifdef G4MULTITHREADED
212 }
213 G4MUTEXUNLOCK(&barNNXSMutex);
214#endif
215 if(isMaster) { LoadData(); }
216}
217
218/////////////////////////////////////////////////////////////////////////////
219
220void G4ComponentBarNucleonNucleusXsc::LoadData()
221{
222 theNData = new std::vector<G4PiData*>;
223 thePData = new std::vector<G4PiData*>;
224 theNData->resize(NZ, nullptr);
225 thePData->resize(NZ, nullptr);
226
227 // He, Be, C
228 (*theNData)[0] = new G4PiData(he_m_t, he_m_in, e1, 44);
229 (*thePData)[0] = new G4PiData(he_m_t, he_p_in, e1, 44);
230
231 (*theNData)[1] = new G4PiData(be_m_t, be_m_in, e1, 44);
232 (*thePData)[1] = new G4PiData(be_m_t, be_p_in, e1, 44);
233
234 (*theNData)[2] = new G4PiData(c_m_t, c_m_in, e1, 44);
235 (*thePData)[2] = new G4PiData(c_m_t, c_p_in, e1, 44);
236
237 // N, O, Na
238 (*theNData)[3] = new G4PiData(n_m_t, n_m_in, e2, 44);
239 (*thePData)[3] = new G4PiData(n_m_t, n_p_in, e2, 44);
240
241 (*theNData)[4] = new G4PiData(o_m_t, o_m_in, e2, 44);
242 (*thePData)[4] = new G4PiData(o_m_t, o_p_in, e2, 44);
243
244 (*theNData)[5] = new G4PiData(na_m_t, na_m_in, e2, 44);
245 (*thePData)[5] = new G4PiData(na_m_t, na_p_in, e2, 44);
246
247 // Al, Si, Ca
248 (*theNData)[6] = new G4PiData(al_m_t, al_m_in, e3, 45);
249 (*thePData)[6] = new G4PiData(al_m_t, al_p_in, e3, 45);
250
251 (*theNData)[7] = new G4PiData(si_m_t, si_m_in, e3, 45);
252 (*thePData)[7] = new G4PiData(si_m_t, si_p_in, e3, 45);
253
254 (*theNData)[8] = new G4PiData(ca_m_t, ca_m_in, e3, 45);
255 (*thePData)[8] = new G4PiData(ca_m_t, ca_p_in, e3, 45);
256
257 // Fe, Cu, Mo
258 (*theNData)[9] = new G4PiData(fe_m_t, fe_m_in, e4, 47);
259 (*thePData)[9] = new G4PiData(fe_m_t, fe_p_in, e4, 47);
260
261 (*theNData)[10] = new G4PiData(cu_m_t, cu_m_in, e4, 47);
262 (*thePData)[10] = new G4PiData(cu_m_t, cu_p_in, e4, 47);
263
264 (*theNData)[11] = new G4PiData(mo_m_t, mo_m_in, e4, 47);
265 (*thePData)[11] = new G4PiData(mo_m_t, mo_p_in, e4, 47);
266
267 // Cd, Sn, W
268 (*theNData)[12] = new G4PiData(cd_m_t, cd_m_in, e5, 48);
269 (*thePData)[12] = new G4PiData(cd_m_t, cd_p_in, e5, 48);
270
271 (*theNData)[13] = new G4PiData(sn_m_t, sn_m_in, e5, 48);
272 (*thePData)[13] = new G4PiData(sn_m_t, sn_p_in, e5, 48);
273
274 (*theNData)[14] = new G4PiData(w_m_t, w_m_in, e5, 48);
275 (*thePData)[14] = new G4PiData(w_m_t, w_p_in, e5, 48);
276
277 // Pb, U
278 (*theNData)[15] = new G4PiData(pb_m_t, pb_m_in, e6, 46);
279 (*thePData)[15] = new G4PiData(pb_m_t, pb_p_in, e6, 46);
280
281 (*theNData)[16] = new G4PiData(u_m_t, u_m_in, e6, 46);
282 (*thePData)[16] = new G4PiData(u_m_t, u_p_in, e6, 46);
283
285 A75[0] = theA[0] = 1.0;
286 G4Pow* g4pow = G4Pow::GetInstance();
287 for(G4int i=1; i<93; ++i) {
288 theA[i] = nist->GetAtomicMassAmu(i);
289 A75[i] = g4pow->A23(theA[i]); // interpolate by square ~ A^(2/3)
290 }
291}
292
293/////////////////////////////////////////////////////////////////////////////
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:85
#define G4MUTEXLOCK(mutex)
Definition: G4Threading.hh:251
#define G4MUTEXUNLOCK(mutex)
Definition: G4Threading.hh:254
std::mutex G4Mutex
Definition: G4Threading.hh:81
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
G4double GetTotalIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int) final
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4double GetInelasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int) final
G4double GetInelasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double) final
G4double GetTotalElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double) final
G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int) final
G4double GetElasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double) final
void Description(std::ostream &) const final
void ComputeCrossSections(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z)
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
Definition: G4Pow.hh:49
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double A23(G4double A) const
Definition: G4Pow.hh:131
static G4Proton * Proton()
Definition: G4Proton.cc:92