56G4double G4BGGPionElasticXS::theGlauberFacPiPlus[93] = {0.0};
57G4double G4BGGPionElasticXS::theCoulombFacPiPlus[93] = {0.0};
58G4double G4BGGPionElasticXS::theGlauberFacPiMinus[93] = {0.0};
59G4double G4BGGPionElasticXS::theCoulombFacPiMinus[93] = {0.0};
60G4int G4BGGPionElasticXS::theA[93] = {0};
68 fGlauberEnergy = 91.*CLHEP::GeV;
69 fLowEnergy = 20.*CLHEP::MeV;
70 fLowestEnergy = 1.*CLHEP::MeV;
82 isPiplus = (p == thePiPlus);
85 if (0 == theA[0]) { Initialise(); }
122 G4int Z = std::min(ZZ, 92);
126 if(ekin <= fLowEnergy) {
127 cross = (isPiplus) ? theCoulombFacPiPlus[Z]*CoulombFactorPiPlus(ekin, Z)
128 : theCoulombFacPiMinus[Z]*FactorPiMinus(ekin);
129 }
else if(ekin > fGlauberEnergy) {
130 cross = (isPiplus) ? theGlauberFacPiPlus[Z] : theGlauberFacPiMinus[Z];
131 cross *= fGlauber->GetElasticGlauberGribov(dp, Z, theA[Z]);
133 cross = fPion->GetElasticCrossSection(dp, Z, theA[Z]);
138 G4cout <<
"G4BGGPionElasticXS::GetElementCrossSection for "
141 <<
" in nucleus Z= " << Z <<
" A= " << theA[Z]
142 <<
" XS(b)= " << cross/barn
161 G4double cross =
A*fHadron->GetElasticHadronNucleonXsc();
165 G4cout <<
"G4BGGPionElasticXS::GetIsoCrossSection for "
168 <<
" in nucleus Z=1 A=" <<
A
169 <<
" XS(b)= " << cross/barn
181 G4cout <<
"G4BGGPionElasticXS::BuildPhysicsTable for "
188 ed <<
"This BGG cross section is applicable only to pions and not to "
190 G4Exception(
"G4BGGPionElasticXS::BuildPhysicsTable",
"had001",
197void G4BGGPionElasticXS::Initialise()
199 theA[0] = theA[1] = 1;
206 for (
G4int iz=2; iz<93; ++iz) {
213 theGlauberFacPiPlus[iz] = csdn/csup;
217 for (
G4int iz=2; iz<93; ++iz) {
218 csup = fGlauber->GetElasticGlauberGribov(&dp, iz, theA[iz]);
219 csdn = fPion->GetElasticCrossSection(&dp, iz, theA[iz]);
220 theGlauberFacPiMinus[iz] = csdn/csup;
223 G4cout <<
"Z= " << iz <<
" A= " << theA[iz]
224 <<
" factorPiPlus= " << theGlauberFacPiPlus[iz]
225 <<
" factorPiMinus= " << theGlauberFacPiMinus[iz]
229 theCoulombFacPiPlus[1] = 1.0;
230 theCoulombFacPiMinus[1]= 1.0;
231 dp.SetKineticEnergy(fLowEnergy);
232 dp.SetDefinition(thePiPlus);
233 for (
G4int iz=2; iz<93; ++iz) {
234 theCoulombFacPiPlus[iz] = fPion->GetElasticCrossSection(&dp, iz, theA[iz])
235 /CoulombFactorPiPlus(fLowEnergy, iz);
238 for(
G4int iz=2; iz<93; ++iz) {
239 theCoulombFacPiMinus[iz] = fPion->GetElasticCrossSection(&dp, iz, theA[iz])
240 /FactorPiMinus(fLowEnergy);
243 G4cout <<
"Z= " << iz <<
" A= " << theA[iz]
244 <<
" CoulombFactorPiPlus= " << theCoulombFacPiPlus[iz]
245 <<
" CoulombFactorPiMinus= " << theCoulombFacPiMinus[iz]
255 return (kinEnergy > 0.0) ?
263 return 1.0/std::sqrt(kinEnergy);
271 outFile <<
"The Barashenkov-Glauber-Gribov cross section handles elastic\n"
272 <<
"scattering of pions from nuclei at all energies. The\n"
273 <<
"Barashenkov parameterization is used below 91 GeV and the\n"
274 <<
"Glauber-Gribov 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
G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr) final
G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *) final
~G4BGGPionElasticXS() final
G4BGGPionElasticXS(const G4ParticleDefinition *)
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
void CrossSectionDescription(std::ostream &) const final
G4bool IsIsoApplicable(const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm, const G4Material *mat) final
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4double GetElasticGlauberGribov(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 GetElasticCrossSection(const G4DynamicParticle *aParticle, G4int Z, G4int A) const
G4VCrossSectionDataSet(const G4String &nam="")
void SetMaxKinEnergy(G4double value)
void SetMinKinEnergy(G4double value)
void SetForAllAtomsAndEnergies(G4bool val)