64G4double G4BGGNucleonInelasticXS::theGlauberFacP[93] = {0.0};
65G4double G4BGGNucleonInelasticXS::theCoulombFacP[93] = {0.0};
66G4double G4BGGNucleonInelasticXS::theGlauberFacN[93] = {0.0};
67G4double G4BGGNucleonInelasticXS::theCoulombFacN[93] = {0.0};
68G4int G4BGGNucleonInelasticXS::theA[93] = {0};
78 fGlauberEnergy = 91.*GeV;
86 isProton = (theProton == p);
124 G4int Z = std::min(ZZ, 92);
128 if(ekin <= fLowEnergy) {
129 cross = (isProton) ? theCoulombFacP[Z] : theCoulombFacN[Z];
130 cross *= CoulombFactor(ekin, Z);
131 }
else if(ekin > fGlauberEnergy) {
132 cross = (isProton) ? theGlauberFacP[Z] : theGlauberFacN[Z];
140 G4cout <<
"G4BGGNucleonInelasticXS::GetCrossSection for "
143 <<
" in nucleus Z= " << Z <<
" A= " << theA[Z]
144 <<
" XS(b)= " << cross/barn
165 G4cout <<
"G4BGGNucleonInelasticXS::GetIsoCrossSection for "
168 <<
" in nucleus Z= " << Z <<
" A= " << theA[Z]
169 <<
" XS(b)= " << cross/barn
179 if(
nullptr != fNucleon) {
return; }
181 isProton = (theProton == &p);
184 ed <<
"This BGG cross section is applicable only to nucleons and not to "
186 G4Exception(
"G4BGGNucleonInelasticXS::BuildPhysicsTable",
"had001",
198#ifdef G4MULTITHREADED
203#ifdef G4MULTITHREADED
211 if(isMaster && 0 == theA[0]) {
213 theA[0] = theA[1] = 1;
221 G4cout <<
"### G4BGGNucleonInelasticXS::Initialise for "
224 for(
G4int iz=2; iz<93; ++iz) {
231 theGlauberFacP[iz] = csdn/csup;
235 for(
G4int iz=2; iz<93; ++iz) {
238 theGlauberFacN[iz] = csdn/csup;
241 G4cout <<
"Z= " << iz <<
" A= " << theA[iz]
242 <<
" GFactorP= " << theGlauberFacP[iz]
243 <<
" GFactorN= " << theGlauberFacN[iz] <<
G4endl;
246 theCoulombFacP[1] = theCoulombFacN[1] = 1.0;
249 for(
G4int iz=2; iz<93; ++iz) {
251 /CoulombFactor(fLowEnergy, iz);
254 for(
G4int iz=2; iz<93; ++iz) {
256 /CoulombFactor(fLowEnergy, iz);
259 G4cout <<
"Z= " << iz <<
" A= " << theA[iz]
260 <<
" CFactorP= " << theCoulombFacP[iz]
261 <<
" CFactorN= " << theCoulombFacN[iz] <<
G4endl;
273 if(kinEnergy <= 0.0) {
return res; }
286 G4double ff3 = 0.8 + 18./aa - 0.002*aa;
287 res *= (1.0 + ff3*(1.0 - (1.0/(1+
G4Exp(-ff1*(elog + ff2))))));
288 ff1 = 8. - 8./aa - 0.008*aa;
289 ff2 = 2.34 - 5.4/aa - 0.0028*aa;
290 res /= (1.0 +
G4Exp(-ff1*(elog + ff2)));
294 G4double p3 = 0.6 + 13./aa - 0.0005*aa;
296 G4double p5 = 1.36 + 1.8/aa + 0.0005*aa;
297 G4double p6 = 1. + 200./aa + 0.02*aa;
298 G4double p7 = 3.0 - (aa-70.)*(aa-200.)/11000.;
303 res = (1.+p3*firstexp/(1. + firstexp))/(1. + secondexp);
312 outFile <<
"The Barashenkov-Glauber-Gribov cross section calculates inelastic\n"
313 <<
"scattering of protons and neutrons from nuclei using the\n"
314 <<
"Barashenkov parameterization below 91 GeV and the Glauber-Gribov\n"
315 <<
"parameterization above 91 GeV. It uses the G4HadronNucleonXsc\n"
316 <<
"cross section component for hydrogen targets, and the\n"
317 <<
"G4ComponentGGHadronNucleusXsc component for other targets.\n";
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
#define G4MUTEX_INITIALIZER
#define G4MUTEXLOCK(mutex)
#define G4MUTEXUNLOCK(mutex)
G4GLOB_DLL std::ostream G4cout
G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *mat) override
G4bool IsIsoApplicable(const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm, const G4Material *mat) override
~G4BGGNucleonInelasticXS() override
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) override
G4BGGNucleonInelasticXS(const G4ParticleDefinition *)
void CrossSectionDescription(std::ostream &) const override
void BuildPhysicsTable(const G4ParticleDefinition &) override
G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr) override
G4double GetInelasticGlauberGribov(const G4DynamicParticle *, G4int Z, G4int A)
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
void SetKineticEnergy(G4double aEnergy)
G4double GetInelasticHadronNucleonXsc() const
G4double HadronNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
static G4Neutron * Neutron()
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 GetElementCrossSection(const G4DynamicParticle *aParticle, G4int Z, const G4Material *mat=nullptr) final
const G4String & GetParticleName() const
static G4Proton * Proton()
void SetForAllAtomsAndEnergies(G4bool val)