Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4BGGPionElasticXS Class Reference

#include <G4BGGPionElasticXS.hh>

Inheritance diagram for G4BGGPionElasticXS:
Collaboration diagram for G4BGGPionElasticXS:

Public Member Functions

 G4BGGPionElasticXS (const G4ParticleDefinition *)
 
virtual ~G4BGGPionElasticXS ()
 
virtual G4bool IsElementApplicable (const G4DynamicParticle *, G4int Z, const G4Material *)
 
virtual G4bool IsIsoApplicable (const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm=0, const G4Material *mat=0)
 
virtual G4double GetElementCrossSection (const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
 
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 &)
 
virtual void CrossSectionDescription (std::ostream &) const
 
- Public Member Functions inherited from G4VCrossSectionDataSet
 G4VCrossSectionDataSet (const G4String &nam="")
 
virtual ~G4VCrossSectionDataSet ()
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
G4double ComputeCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
virtual G4IsotopeSelectIsotope (const G4Element *, G4double kinEnergy)
 
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
 
virtual G4int GetVerboseLevel () const
 
virtual void SetVerboseLevel (G4int value)
 
G4double GetMinKinEnergy () const
 
void SetMinKinEnergy (G4double value)
 
G4double GetMaxKinEnergy () const
 
void SetMaxKinEnergy (G4double value)
 
const G4StringGetName () const
 

Additional Inherited Members

- Protected Member Functions inherited from G4VCrossSectionDataSet
void SetName (const G4String &)
 
- Protected Attributes inherited from G4VCrossSectionDataSet
G4int verboseLevel
 

Detailed Description

Definition at line 64 of file G4BGGPionElasticXS.hh.

Constructor & Destructor Documentation

G4BGGPionElasticXS::G4BGGPionElasticXS ( const G4ParticleDefinition )

Definition at line 56 of file G4BGGPionElasticXS.cc.

57  : G4VCrossSectionDataSet("Barashenkov-Glauber")
58 {
59  verboseLevel = 0;
60  fGlauberEnergy = 91.*GeV;
61  fLowEnergy = 20.*MeV;
62  fSAIDHighEnergyLimit = 2.6*GeV;
63  SetMinKinEnergy(0.0);
64  SetMaxKinEnergy(100*TeV);
65 
66  for (G4int i = 0; i < 93; i++) {
67  theGlauberFac[i] = 0.0;
68  theCoulombFac[i] = 0.0;
69  theA[i] = 1;
70  }
71  fPion = 0;
72  fGlauber = 0;
73  fHadron = 0;
74  fSAID = 0;
75  particle = 0;
76  theProton= G4Proton::Proton();
77  isPiplus = false;
78  isInitialized = false;
79 }
G4VCrossSectionDataSet(const G4String &nam="")
int G4int
Definition: G4Types.hh:78
static constexpr double TeV
Definition: G4SIunits.hh:218
void SetMinKinEnergy(G4double value)
static G4Proton * Proton()
Definition: G4Proton.cc:93
void SetMaxKinEnergy(G4double value)
static constexpr double GeV
Definition: G4SIunits.hh:217
static constexpr double MeV
Definition: G4SIunits.hh:214
G4bool isInitialized()

Here is the call graph for this function:

G4BGGPionElasticXS::~G4BGGPionElasticXS ( )
virtual

Definition at line 83 of file G4BGGPionElasticXS.cc.

84 {
85  delete fSAID;
86  delete fHadron;
87  delete fPion;
88  delete fGlauber;
89 }

Member Function Documentation

void G4BGGPionElasticXS::BuildPhysicsTable ( const G4ParticleDefinition p)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 191 of file G4BGGPionElasticXS.cc.

192 {
193  if(&p == G4PionPlus::PionPlus() || &p == G4PionMinus::PionMinus()) {
194  particle = &p;
195  } else {
196  G4cout << "### G4BGGPionElasticXS WARNING: is not applicable to "
197  << p.GetParticleName()
198  << G4endl;
199  throw G4HadronicException(__FILE__, __LINE__,
200  "G4BGGPionElasticXS::BuildPhysicsTable is used for wrong particle");
201  return;
202  }
203 
204  if(isInitialized) { return; }
205  isInitialized = true;
206 
207  fPion = new G4UPiNuclearCrossSection();
208  fGlauber = new G4ComponentGGHadronNucleusXsc();
209  fHadron = new G4HadronNucleonXsc();
210  fSAID = new G4ComponentSAIDTotalXS();
211 
212  fPion->BuildPhysicsTable(*particle);
213  fGlauber->BuildPhysicsTable(*particle);
214 
215  if(particle == G4PionPlus::PionPlus()) { isPiplus = true; }
216 
217  G4ThreeVector mom(0.0,0.0,1.0);
218  G4DynamicParticle dp(particle, mom, fGlauberEnergy);
219 
221 
222  G4double csup, csdn;
223  G4int A;
224 
225  if(verboseLevel > 0) {
226  G4cout << "### G4BGGPionElasticXS::Initialise for "
227  << particle->GetParticleName() << G4endl;
228  }
229  for(G4int iz=2; iz<93; iz++) {
230 
231  A = G4lrint(nist->GetAtomicMassAmu(iz));
232  theA[iz] = A;
233 
234  csup = fGlauber->GetElasticGlauberGribov(&dp, iz, A);
235  csdn = fPion->GetElasticCrossSection(&dp, iz, A);
236 
237  theGlauberFac[iz] = csdn/csup;
238  if(verboseLevel > 0) {
239  G4cout << "Z= " << iz << " A= " << A
240  << " factor= " << theGlauberFac[iz] << G4endl;
241  }
242  }
243  /*
244  dp.SetKineticEnergy(fLowEnergy);
245  fHadron->GetHadronNucleonXscNS(&dp, G4Proton::Proton());
246  theCoulombFac[1] = fHadron->GetElasticHadronNucleonXsc();
247  */
248  dp.SetKineticEnergy(fSAIDHighEnergyLimit);
249  fHadron->GetHadronNucleonXscPDG(&dp, theProton);
250  theCoulombFac[1] =
251  fSAID->GetElasticIsotopeCrossSection(particle,fSAIDHighEnergyLimit,1,1)
252  /fHadron->GetElasticHadronNucleonXsc();
253 
254  dp.SetKineticEnergy(fLowEnergy);
255  for(G4int iz=2; iz<93; iz++) {
256  theCoulombFac[iz] = fPion->GetElasticCrossSection(&dp, iz, theA[iz]);
257  if(verboseLevel > 0) {
258  G4cout << "Z= " << iz << " A= " << A
259  << " factor= " << theCoulombFac[iz] << G4endl;
260  }
261  }
262 }
G4double GetElasticHadronNucleonXsc()
G4double GetElasticCrossSection(const G4DynamicParticle *aParticle, G4int Z, G4int A)
const char * p
Definition: xmltok.h:285
virtual G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4int)
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98
G4double GetElasticGlauberGribov(const G4DynamicParticle *, G4int Z, G4int A)
int G4lrint(double ad)
Definition: templates.hh:163
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:98
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetHadronNucleonXscPDG(const G4DynamicParticle *, const G4ParticleDefinition *)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
G4bool isInitialized()
void BuildPhysicsTable(const G4ParticleDefinition &)

Here is the call graph for this function:

void G4BGGPionElasticXS::CrossSectionDescription ( std::ostream &  outFile) const
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 265 of file G4BGGPionElasticXS.cc.

266 {
267  outFile << "The Barashenkov-Glauber-Gribov cross section handles elastic\n"
268  << "scattering of pions from nuclei at all energies. The\n"
269  << "Barashenkov parameterization is used below 91 GeV and the\n"
270  << "Glauber-Gribov parameterization is used above 91 GeV.\n";
271 }
G4double G4BGGPionElasticXS::GetElementCrossSection ( const G4DynamicParticle dp,
G4int  Z,
const G4Material mat = 0 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 113 of file G4BGGPionElasticXS.cc.

115 {
116  // this method should be called only for Z > 1
117 
118  G4double cross = 0.0;
119  G4double ekin = dp->GetKineticEnergy();
120  G4int Z = ZZ;
121  if(1 == Z) {
122  cross = 1.0115*GetIsoCrossSection(dp,1,1);
123  } else {
124  if(Z > 92) { Z = 92; }
125 
126  if(ekin <= fLowEnergy) {
127  cross = theCoulombFac[Z];
128  } else if(ekin > fGlauberEnergy) {
129  cross = theGlauberFac[Z]*fGlauber->GetElasticGlauberGribov(dp, Z, theA[Z]);
130  } else {
131  cross = fPion->GetElasticCrossSection(dp, Z, theA[Z]);
132  }
133  }
134  if(verboseLevel > 1) {
135  G4cout << "G4BGGPionElasticXS::GetElementCrossSection for "
136  << dp->GetDefinition()->GetParticleName()
137  << " Ekin(GeV)= " << dp->GetKineticEnergy()
138  << " in nucleus Z= " << Z << " A= " << theA[Z]
139  << " XS(b)= " << cross/barn
140  << G4endl;
141  }
142  return cross;
143 }
G4double GetElasticCrossSection(const G4DynamicParticle *aParticle, G4int Z, G4int A)
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
virtual G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
G4double GetElasticGlauberGribov(const G4DynamicParticle *, G4int Z, G4int A)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
static constexpr double barn
Definition: G4SIunits.hh:105

Here is the call graph for this function:

G4double G4BGGPionElasticXS::GetIsoCrossSection ( const G4DynamicParticle dp,
G4int  Z,
G4int  A,
const G4Isotope iso = 0,
const G4Element elm = 0,
const G4Material mat = 0 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 146 of file G4BGGPionElasticXS.cc.

151 {
152  // this method should be called only for Z = 1
153 
154  G4double cross = 0.0;
155  G4double ekin = dp->GetKineticEnergy();
156 
157  if(ekin <= fSAIDHighEnergyLimit) {
158  cross = fSAID->GetElasticIsotopeCrossSection(particle, ekin, 1, 1);
159  } else {
160  fHadron->GetHadronNucleonXscPDG(dp, theProton);
161  cross = theCoulombFac[1]*fHadron->GetElasticHadronNucleonXsc();
162  }
163  cross *= A;
164  /*
165  if(ekin <= fLowEnergy) {
166  cross = theCoulombFac[1];
167 
168  } else if( A < 2) {
169  fHadron->GetHadronNucleonXscNS(dp, G4Proton::Proton());
170  cross = fHadron->GetElasticHadronNucleonXsc();
171  } else {
172  fHadron->GetHadronNucleonXscNS(dp, G4Proton::Proton());
173  cross = fHadron->GetElasticHadronNucleonXsc();
174  fHadron->GetHadronNucleonXscNS(dp, G4Neutron::Neutron());
175  cross += fHadron->GetElasticHadronNucleonXsc();
176  }
177  */
178  if(verboseLevel > 1) {
179  G4cout << "G4BGGPionElasticXS::GetIsoCrossSection for "
180  << dp->GetDefinition()->GetParticleName()
181  << " Ekin(GeV)= " << dp->GetKineticEnergy()
182  << " in nucleus Z= " << Z << " A= " << A
183  << " XS(b)= " << cross/barn
184  << G4endl;
185  }
186  return cross;
187 }
G4double GetElasticHadronNucleonXsc()
G4double GetKineticEnergy() const
virtual G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4int)
G4ParticleDefinition * GetDefinition() const
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4double GetHadronNucleonXscPDG(const G4DynamicParticle *, const G4ParticleDefinition *)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
static constexpr double barn
Definition: G4SIunits.hh:105

Here is the call graph for this function:

Here is the caller graph for this function:

G4bool G4BGGPionElasticXS::IsElementApplicable ( const G4DynamicParticle ,
G4int  Z,
const G4Material  
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 94 of file G4BGGPionElasticXS.cc.

96 {
97  return true;
98 }
G4bool G4BGGPionElasticXS::IsIsoApplicable ( const G4DynamicParticle ,
G4int  Z,
G4int  A,
const G4Element elm = 0,
const G4Material mat = 0 
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 102 of file G4BGGPionElasticXS.cc.

106 {
107  return (1 == Z && 2 >= A);
108 }
double A(double temperature)

The documentation for this class was generated from the following files: