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 G4Isotope * SelectIsotope (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 G4String & GetName () 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: