Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4BGGNucleonElasticXS.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// -------------------------------------------------------------------
27//
28// GEANT4 Class file
29//
30//
31// File name: G4BGGNucleonElasticXS
32//
33// Author: Vladimir Ivanchenko
34//
35// Creation date: 13.03.2007
36//
37// -------------------------------------------------------------------
38//
39
41#include "G4SystemOfUnits.hh"
44#include "G4HadronNucleonXsc.hh"
45#include "G4NuclearRadii.hh"
46#include "G4Proton.hh"
47#include "G4Neutron.hh"
48#include "G4NistManager.hh"
49#include "G4NuclearRadii.hh"
50
52
53G4double G4BGGNucleonElasticXS::theGlauberFacP[93] = {0.0};
54G4double G4BGGNucleonElasticXS::theCoulombFacP[93] = {0.0};
55G4double G4BGGNucleonElasticXS::theGlauberFacN[93] = {0.0};
56G4double G4BGGNucleonElasticXS::theCoulombFacN[93] = {0.0};
57G4int G4BGGNucleonElasticXS::theA[93] = {0};
58
59#ifdef G4MULTITHREADED
60G4Mutex G4BGGNucleonElasticXS::nucleonElasticXSMutex = G4MUTEX_INITIALIZER;
61#endif
62
64 : G4VCrossSectionDataSet("BarashenkovGlauberGribov")
65{
66 verboseLevel = 0;
67 fGlauberEnergy = 91.*GeV;
68 fLowEnergy = 14.0*MeV;
69 fNucleon = nullptr;
70 fGlauber = nullptr;
71 fHadron = nullptr;
72
73 theProton= G4Proton::Proton();
74 isProton = (theProton == p);
75 isMaster = false;
77}
78
79//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
80
82{
83 delete fHadron;
84}
85
86//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
87
88G4bool
90 const G4Material*)
91{
92 return true;
93}
94
95//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
96
98 G4int Z, G4int,
99 const G4Element*,
100 const G4Material*)
101{
102 return (1 == Z);
103}
104
105//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
106
109 G4int ZZ, const G4Material*)
110{
111 // this method should be called only for Z > 1
112
113 G4double cross = 0.0;
114 G4int Z = std::min(ZZ, 92);
115 G4double ekin = dp->GetKineticEnergy();
116 if(1 == Z) {
117 cross = 1.0115*GetIsoCrossSection(dp,1,1);
118 } else {
119 if(ekin <= fLowEnergy) {
120 cross = (isProton) ? theCoulombFacP[Z] : theCoulombFacN[Z];
121 cross *= CoulombFactor(ekin, Z);
122 } else if(ekin > fGlauberEnergy) {
123 cross = (isProton) ? theGlauberFacP[Z] : theGlauberFacN[Z];
124 cross *= fGlauber->GetElasticGlauberGribov(dp, Z, theA[Z]);
125 } else {
126 cross = fNucleon->GetElasticCrossSection(dp, Z);
127 }
128 }
129 if(verboseLevel > 1) {
130 G4cout << "G4BGGNucleonElasticXS::GetElementCrossSection for "
132 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV
133 << " in nucleus Z= " << Z << " A= " << theA[Z]
134 << " XS(b)= " << cross/barn
135 << G4endl;
136 }
137 return cross;
138}
139
140//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
141
144 G4int Z, G4int A,
145 const G4Isotope*,
146 const G4Element*,
147 const G4Material*)
148{
149 // this method should be called only for Z = 1
150 fHadron->HadronNucleonXscNS(dp->GetDefinition(), theProton,
151 dp->GetKineticEnergy());
152 G4double cross = A*fHadron->GetElasticHadronNucleonXsc();
153
154 if(verboseLevel > 1) {
155 G4cout << "G4BGGNucleonElasticXS::GetIsoCrossSection for "
157 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV
158 << " in nucleus Z= " << Z << " A= " << A
159 << " XS(b)= " << cross/barn
160 << G4endl;
161 }
162 return cross;
163}
164
165//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
166
168{
169 if(nullptr != fNucleon) { return; }
170 if(&p == theProton || &p == G4Neutron::Neutron()) {
171 isProton = (theProton == &p);
172
173 } else {
175 ed << "This BGG cross section is applicable only to nucleons and not to "
176 << p.GetParticleName() << G4endl;
177 G4Exception("G4BGGNucleonElasticXS::BuildPhysicsTable", "had001",
178 FatalException, ed);
179 return;
180 }
181
182 fNucleon = new G4NucleonNuclearCrossSection();
183 fGlauber = new G4ComponentGGHadronNucleusXsc();
184 fHadron = new G4HadronNucleonXsc();
185
186 fNucleon->BuildPhysicsTable(p);
187
188 if(0 == theA[0]) {
189#ifdef G4MULTITHREADED
190 G4MUTEXLOCK(&nucleonElasticXSMutex);
191 if(0 == theA[0]) {
192#endif
193 isMaster = true;
194#ifdef G4MULTITHREADED
195 }
196 G4MUTEXUNLOCK(&nucleonElasticXSMutex);
197#endif
198 } else {
199 return;
200 }
201
202 if(isMaster && 0 == theA[0]) {
203
204 theA[0] = theA[1] = 1;
205 G4ThreeVector mom(0.0,0.0,1.0);
206 G4DynamicParticle dp(theProton, mom, fGlauberEnergy);
207
209 G4double csup, csdn;
210
211 if(verboseLevel > 0) {
212 G4cout << "### G4BGGNucleonElasticXS::Initialise for "
213 << p.GetParticleName() << G4endl;
214 }
215
216 for(G4int iz=2; iz<93; ++iz) {
217 G4int A = G4lrint(nist->GetAtomicMassAmu(iz));
218 theA[iz] = A;
219
220 csup = fGlauber->GetElasticGlauberGribov(&dp, iz, A);
221 csdn = fNucleon->GetElasticCrossSection(&dp, iz);
222 theGlauberFacP[iz] = csdn/csup;
223 }
224
226 for(G4int iz=2; iz<93; ++iz) {
227 csup = fGlauber->GetElasticGlauberGribov(&dp, iz, theA[iz]);
228 csdn = fNucleon->GetElasticCrossSection(&dp, iz);
229 theGlauberFacN[iz] = csdn/csup;
230
231 if(verboseLevel > 0) {
232 G4cout << "Z= " << iz << " A= " << theA[iz]
233 << " GFactorP= " << theGlauberFacP[iz]
234 << " GFactorN= " << theGlauberFacN[iz] << G4endl;
235 }
236 }
237
238 theCoulombFacP[0] = theCoulombFacP[1] =
239 theCoulombFacN[0] = theCoulombFacN[1] = 1.0;
240 dp.SetDefinition(theProton);
241 dp.SetKineticEnergy(fLowEnergy);
242 for(G4int iz=2; iz<93; ++iz) {
243 theCoulombFacP[iz] = fNucleon->GetElasticCrossSection(&dp, iz)
244 /CoulombFactor(fLowEnergy, iz);
245 }
247 for(G4int iz=2; iz<93; ++iz) {
248 theCoulombFacN[iz] = fNucleon->GetElasticCrossSection(&dp, iz)
249 /CoulombFactor(fLowEnergy, iz);
250
251 if(verboseLevel > 0) {
252 G4cout << "Z= " << iz << " A= " << theA[iz]
253 << " CFactorP= " << theCoulombFacP[iz]
254 << " CFactorN= " << theCoulombFacN[iz] << G4endl;
255 }
256 }
257 }
258}
259
260//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
261
262G4double G4BGGNucleonElasticXS::CoulombFactor(G4double kinEnergy, G4int Z)
263{
264 G4double res= 1.0;
265 if(isProton) {
266 res = G4NuclearRadii::CoulombFactor(Z, theA[Z], theProton, kinEnergy);
267 }
268 return res;
269}
270
271//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
272
273void G4BGGNucleonElasticXS::CrossSectionDescription(std::ostream& outFile) const
274{
275 outFile << "The Barashenkov-Glauber-Gribov cross section handles elastic\n"
276 << "scattering of protons and neutrons from nuclei using the\n"
277 << "Barashenkov parameterization below 91 GeV and the Glauber-Gribov\n"
278 << "parameterization above 91 GeV. n";
279}
280
281//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
#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
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
void CrossSectionDescription(std::ostream &) const final
G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr) final
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4BGGNucleonElasticXS(const G4ParticleDefinition *)
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4bool IsIsoApplicable(const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm, const G4Material *mat) final
G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4double GetElasticGlauberGribov(const G4DynamicParticle *, G4int Z, G4int A)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
void SetKineticEnergy(G4double aEnergy)
G4double GetElasticHadronNucleonXsc() const
G4double HadronNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
static G4double CoulombFactor(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4double GetElasticCrossSection(const G4DynamicParticle *aParticle, G4int Z)
const G4String & GetParticleName() const
static G4Proton * Proton()
Definition: G4Proton.cc:92
void SetForAllAtomsAndEnergies(G4bool val)
int G4lrint(double ad)
Definition: templates.hh:134