55G4double G4BGGPionInelasticXS::theGlauberFacPiPlus[93] = {0.0};
56G4double G4BGGPionInelasticXS::theGlauberFacPiMinus[93] = {0.0};
57G4double G4BGGPionInelasticXS::theLowEPiPlus[93] = {0.0};
58G4double G4BGGPionInelasticXS::theLowEPiMinus[93] = {0.0};
59G4int G4BGGPionInelasticXS::theA[93] = {0};
65 fGlauberEnergy = 91.*CLHEP::GeV;
66 fLowEnergy = 20.*CLHEP::MeV;
67 fLowestEnergy = 1.*CLHEP::MeV;
79 isPiplus = (p == thePiPlus);
82 if (0 == theA[0]) { Initialise(); }
121 G4int Z = std::min(ZZ, 92);
125 }
else if(ekin < fLowEnergy) {
126 cross = (isPiplus) ? theLowEPiPlus[Z]*CoulombFactorPiPlus(ekin, Z)
127 : theLowEPiMinus[Z]*FactorPiMinus(ekin);
128 }
else if(ekin > fGlauberEnergy) {
129 cross = (isPiplus) ? theGlauberFacPiPlus[Z] : theGlauberFacPiMinus[Z];
130 cross *= fGlauber->GetInelasticGlauberGribov(dp, Z, theA[Z]);
132 cross = fPion->GetInelasticCrossSection(dp, Z, theA[Z]);
136 G4cout <<
"G4BGGPionInelasticXS::GetCrossSection for "
139 <<
" in nucleus Z= " << Z <<
" A= " << theA[Z]
140 <<
" XS(b)= " << cross/barn
159 G4double cross =
A*fHadron->GetInelasticHadronNucleonXsc();
163 G4cout <<
"G4BGGPionInelasticXS::GetCrossSection for "
166 <<
" in nucleus Z=1 A=" <<
A
167 <<
" XS(b)= " << cross/barn
179 G4cout <<
"G4BGGPionInelasticXS::BuildPhysicsTable for "
186 ed <<
"This BGG cross section is applicable only to pions and not to "
188 G4Exception(
"G4BGGPionInelasticXS::BuildPhysicsTable",
"had001",
195void G4BGGPionInelasticXS::Initialise()
197 theA[0] = theA[1] = 1;
204 for (
G4int iz=2; iz<93; ++iz) {
210 theGlauberFacPiPlus[iz] = csdn/csup;
214 for (
G4int iz=2; iz<93; ++iz) {
215 csup = fGlauber->GetInelasticGlauberGribov(&dp, iz, theA[iz]);
216 csdn = fPion->GetInelasticCrossSection(&dp, iz, theA[iz]);
217 theGlauberFacPiMinus[iz] = csdn/csup;
220 G4cout <<
"Z= " << iz <<
" A= " << theA[iz]
221 <<
" factorPiPlus= " << theGlauberFacPiPlus[iz]
222 <<
" factorPiMinus= " << theGlauberFacPiMinus[iz]
227 theLowEPiPlus[1] = theLowEPiMinus[1]= 1.0;
228 dp.SetDefinition(thePiPlus);
229 dp.SetKineticEnergy(fLowEnergy);
230 for (
G4int iz=2; iz<93; ++iz) {
231 theLowEPiPlus[iz] = fPion->GetInelasticCrossSection(&dp, iz, theA[iz])
232 /CoulombFactorPiPlus(fLowEnergy, iz);
236 for (
G4int iz=2; iz<93; ++iz) {
237 theLowEPiMinus[iz] = fPion->GetInelasticCrossSection(&dp, iz, theA[iz])
238 /FactorPiMinus(fLowEnergy);
241 G4cout <<
"Z= " << iz <<
" A= " << theA[iz]
242 <<
" LowEtorPiPlus= " << theLowEPiPlus[iz]
243 <<
" LowEtorPiMinus= " << theLowEPiMinus[iz]
253 return (kinEnergy > 0.0) ?
261 return 1.0/std::sqrt(kinEnergy);
269 outFile <<
"The Barashenkov-Glauber-Gribov cross section handles inelastic\n"
270 <<
"pion scattering from nuclei at all energies. The Barashenkov\n"
271 <<
"parameterization is used below 91 GeV and the Glauber-Gribov\n"
272 <<
"parameterization is used above 91 GeV.\n";
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
void CrossSectionDescription(std::ostream &) const final
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr) final
G4BGGPionInelasticXS(const G4ParticleDefinition *)
G4bool IsIsoApplicable(const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm, const G4Material *mat) final
~G4BGGPionInelasticXS() final
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4double GetInelasticGlauberGribov(const G4DynamicParticle *, G4int Z, G4int A)
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4HadronicParameters * Instance()
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
static G4double CoulombFactor(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
const G4String & GetParticleName() const
static G4PionMinus * PionMinus()
static G4PionPlus * PionPlus()
static G4Pow * GetInstance()
static G4Proton * Proton()
G4double GetInelasticCrossSection(const G4DynamicParticle *aParticle, G4int Z, G4int A) const
G4VCrossSectionDataSet(const G4String &nam="")
void SetMaxKinEnergy(G4double value)
void SetMinKinEnergy(G4double value)
void SetForAllAtomsAndEnergies(G4bool val)