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
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// $Id$
27//
28// -------------------------------------------------------------------
29//
30// GEANT4 Class file
31//
32//
33// File name: G4BGGNucleonElasticXS
34//
35// Author: Vladimir Ivanchenko
36//
37// Creation date: 13.03.2007
38// Modifications:
39//
40//
41// -------------------------------------------------------------------
42//
43
45#include "G4SystemOfUnits.hh"
48#include "G4HadronNucleonXsc.hh"
50#include "G4Proton.hh"
51#include "G4Neutron.hh"
52#include "G4NistManager.hh"
53
55
57 : G4VCrossSectionDataSet("Barashenkov-Glauber")
58{
59 verboseLevel = 0;
60 fGlauberEnergy = 91.*GeV;
61 fLowEnergy = 14.*MeV;
62 fSAIDHighEnergyLimit = 1.3*GeV;
63 for (G4int i = 0; i < 93; ++i) {
64 theGlauberFac[i] = 0.0;
65 theCoulombFac[i] = 0.0;
66 theA[i] = 1;
67 }
68 fNucleon = 0;
69 fGlauber = 0;
70 fHadron = 0;
71 fSAID = 0;
72 particle = p;
73 theProton= G4Proton::Proton();
74 isProton = false;
75 isInitialized = false;
76}
77
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
79
81{
82 delete fHadron;
83 delete fSAID;
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 A,
99 const G4Element*,
100 const G4Material*)
101{
102 return (1 == Z && 2 >= A);
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 G4double ekin = dp->GetKineticEnergy();
115 G4int Z = ZZ;
116 if(1 == Z) {
117 cross = 1.0115*GetIsoCrossSection(dp,1,1);
118 } else {
119 if(Z > 92) { Z = 92; }
120
121 if(ekin <= fLowEnergy) {
122 cross = theCoulombFac[Z];
123
124 } else if(ekin > fGlauberEnergy) {
125 cross = theGlauberFac[Z]*fGlauber->GetElasticGlauberGribov(dp, Z, theA[Z]);
126 } else {
127 cross = fNucleon->GetElasticCrossSection(dp, Z);
128 }
129 }
130
131 if(verboseLevel > 1) {
132 G4cout << "G4BGGNucleonElasticXS::GetElementCrossSection for "
134 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV
135 << " in nucleus Z= " << Z << " A= " << theA[Z]
136 << " XS(b)= " << cross/barn
137 << G4endl;
138 }
139 return cross;
140}
141
142//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
143
146 G4int Z, G4int A,
147 const G4Isotope*,
148 const G4Element*,
149 const G4Material*)
150{
151 // this method should be called only for Z = 1
152
153 G4double cross = 0.0;
154 G4double ekin = dp->GetKineticEnergy();
155
156 if(ekin <= fSAIDHighEnergyLimit) {
157 cross = fSAID->GetElasticIsotopeCrossSection(particle, ekin, 1, 1);
158 } else {
159 fHadron->GetHadronNucleonXscPDG(dp, theProton);
160 cross = theCoulombFac[1]*fHadron->GetElasticHadronNucleonXsc();
161 }
162 // } else if(ekin <= 20*GeV) {
163 // fHadron->GetHadronNucleonXscNS(dp, G4Proton::Proton());
164 // cross = theGlauberFac[1]*fHadron->GetElasticHadronNucleonXsc();
165 cross *= A;
166
167 if(verboseLevel > 1) {
168 G4cout << "G4BGGNucleonElasticXS::GetIsoCrossSection for "
170 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV
171 << " in nucleus Z= " << Z << " A= " << A
172 << " XS(b)= " << cross/barn
173 << G4endl;
174 }
175 return cross;
176}
177
178//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
179
181{
182 if(&p == theProton || &p == G4Neutron::Neutron()) {
183 particle = &p;
184
185 } else {
186 G4cout << "### G4BGGNucleonElasticXS WARNING: is not applicable to "
187 << p.GetParticleName()
188 << G4endl;
189 throw G4HadronicException(__FILE__, __LINE__,
190 "G4BGGNucleonElasticXS::BuildPhysicsTable is used for wrong particle");
191 return;
192 }
193
194 if(isInitialized) { return; }
195 isInitialized = true;
196
199
200 fHadron = new G4HadronNucleonXsc();
201 fSAID = new G4ComponentSAIDTotalXS();
202 fNucleon->BuildPhysicsTable(*particle);
203 fGlauber->BuildPhysicsTable(*particle);
204 if(particle == theProton) {
205 isProton = true;
206 fSAIDHighEnergyLimit = 3*GeV;
207 }
208
209 G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(particle);
210 G4ThreeVector mom(0.0,0.0,1.0);
211 G4DynamicParticle dp(part, mom, fGlauberEnergy);
212
214
215 G4double csup, csdn;
216 G4int A;
217
218 if(verboseLevel > 0) {
219 G4cout << "### G4BGGNucleonElasticXS::Initialise for "
220 << particle->GetParticleName() << G4endl;
221 }
222
223 for(G4int iz=2; iz<93; iz++) {
224
225 A = G4lrint(nist->GetAtomicMassAmu(iz));
226 theA[iz] = A;
227
228 csup = fGlauber->GetElasticGlauberGribov(&dp, iz, A);
229 csdn = fNucleon->GetElasticCrossSection(&dp, iz);
230
231 theGlauberFac[iz] = csdn/csup;
232 if(verboseLevel > 0) {
233 G4cout << "Z= " << iz << " A= " << A
234 << " factor= " << theGlauberFac[iz] << G4endl;
235 }
236 }
237 dp.SetKineticEnergy(fSAIDHighEnergyLimit);
238 fHadron->GetHadronNucleonXscPDG(&dp, theProton);
239 theCoulombFac[1] =
240 fSAID->GetElasticIsotopeCrossSection(particle,fSAIDHighEnergyLimit,1,1)
241 /fHadron->GetElasticHadronNucleonXsc();
242 if(verboseLevel > 0) {
243 G4cout << "Z=1 A=1" << " CoulombFactor= " << theCoulombFac[1] << G4endl;
244 }
245
246 dp.SetKineticEnergy(fLowEnergy);
247 for(G4int iz=2; iz<93; iz++) {
248 theCoulombFac[iz] = fNucleon->GetElasticCrossSection(&dp, iz);
249 if(verboseLevel > 0) {
250 G4cout << "Z= " << iz << " A= " << theA[iz]
251 << " factor= " << theCoulombFac[iz] << G4endl;
252 }
253 }
254}
255
256//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
257
258void G4BGGNucleonElasticXS::CrossSectionDescription(std::ostream& outFile) const
259{
260 outFile << "The Barashenkov-Glauber-Gribov cross section handles elastic\n"
261 << "scattering of protons and neutrons from nuclei using the\n"
262 << "Barashenkov parameterization below 91 GeV and the Glauber-Gribov\n"
263 << "parameterization above 91 GeV. n";
264}
265
266//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
virtual G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
virtual void CrossSectionDescription(std::ostream &) const
virtual G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
G4BGGNucleonElasticXS(const G4ParticleDefinition *)
virtual G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
virtual G4bool IsIsoApplicable(const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm=0, const G4Material *mat=0)
virtual G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4int)
G4VCrossSectionDataSet * GetCrossSectionDataSet(const G4String &name, G4bool warning=true)
static G4CrossSectionDataSetRegistry * Instance()
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
void SetKineticEnergy(G4double aEnergy)
G4double GetElasticGlauberGribov(const G4DynamicParticle *, G4int Z, G4int A)
G4double GetHadronNucleonXscPDG(const G4DynamicParticle *, const G4ParticleDefinition *)
G4double GetElasticHadronNucleonXsc()
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetElasticCrossSection(const G4DynamicParticle *aParticle, G4int Z)
const G4String & GetParticleName() const
static G4Proton * Proton()
Definition: G4Proton.cc:93
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
int G4lrint(double ad)
Definition: templates.hh:163