Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions
G4PiNuclearCrossSection Class Reference

#include <G4PiNuclearCrossSection.hh>

Inheritance diagram for G4PiNuclearCrossSection:
G4VCrossSectionDataSet

Public Member Functions

 G4PiNuclearCrossSection ()
 
virtual ~G4PiNuclearCrossSection ()
 
virtual G4bool IsElementApplicable (const G4DynamicParticle *aParticle, G4int Z, const G4Material *)
 
virtual G4double GetElementCrossSection (const G4DynamicParticle *particle, G4int Z, const G4Material *)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
virtual void CrossSectionDescription (std::ostream &) const
 
G4double GetTotalXsc ()
 
G4double GetElasticXsc ()
 
- Public Member Functions inherited from G4VCrossSectionDataSet
 G4VCrossSectionDataSet (const G4String &nam="")
 
virtual ~G4VCrossSectionDataSet ()
 
virtual G4bool IsIsoApplicable (const G4DynamicParticle *, G4int Z, G4int A, const G4Element *elm=0, const G4Material *mat=0)
 
G4double GetCrossSection (const G4DynamicParticle *, const G4Element *, const G4Material *mat=0)
 
G4double ComputeCrossSection (const G4DynamicParticle *, const G4Element *, 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 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 37 of file G4PiNuclearCrossSection.hh.

Constructor & Destructor Documentation

G4PiNuclearCrossSection::G4PiNuclearCrossSection ( )

Definition at line 381 of file G4PiNuclearCrossSection.cc.

References G4VCrossSectionDataSet::SetMaxKinEnergy(), G4VCrossSectionDataSet::SetMinKinEnergy(), and python.hepunit::TeV.

382  : G4VCrossSectionDataSet("G4PiNuclearCrossSection"),
383  fTotalXsc(0.0), fElasticXsc(0.0)
384 {
385  SetMinKinEnergy(0.0);
386  SetMaxKinEnergy(99.9*TeV);
387 
388  thePimData.push_back(new G4PiData(he_t, he_in, e1, 38));
389  thePipData.push_back(new G4PiData(he_t, he_in, e1, 38));
390  thePimData.push_back(new G4PiData(be_m_t, be_m_in, e1, 38));
391  thePipData.push_back(new G4PiData(be_p_t, be_p_in, e1, 24));
392  thePimData.push_back(new G4PiData(c_m_t, c_m_in, e2, 39));
393  thePipData.push_back(new G4PiData(c_p_t, c_p_in, e2, 24));
394  thePimData.push_back(new G4PiData(n_m_t, n_m_in, e2, 39));
395  thePipData.push_back(new G4PiData(n_p_t, n_p_in, e2, 27));
396  thePimData.push_back(new G4PiData(o_m_t, o_m_in, e3, 31));
397  thePipData.push_back(new G4PiData(o_p_t, o_p_in, e3, 20));
398  thePimData.push_back(new G4PiData(na_m_t, na_m_in, e3, 31));
399  thePipData.push_back(new G4PiData(na_p_t, na_p_in, e3, 22));
400  thePimData.push_back(new G4PiData(al_m_t, al_m_in, e3_1, 31));
401  thePipData.push_back(new G4PiData(al_p_t, al_p_in, e3_1, 21));
402  thePimData.push_back(new G4PiData(ca_m_t, ca_m_in, e3_1, 31));
403  thePipData.push_back(new G4PiData(ca_p_t, ca_p_in, e3_1, 23));
404  thePimData.push_back(new G4PiData(fe_m_t, fe_m_in, e4, 32));
405  thePipData.push_back(new G4PiData(fe_p_t, fe_p_in, e4, 25));
406  thePimData.push_back(new G4PiData(cu_m_t, cu_m_in, e4, 32));
407  thePipData.push_back(new G4PiData(cu_p_t, cu_p_in, e4, 25));
408  thePimData.push_back(new G4PiData(mo_m_t, mo_m_in, e5, 34));
409  thePipData.push_back(new G4PiData(mo_p_t, mo_p_in, e5, 27));
410  thePimData.push_back(new G4PiData(cd_m_t, cd_m_in, e5, 34));
411  thePipData.push_back(new G4PiData(cd_p_t, cd_p_in, e5, 28));
412  thePimData.push_back(new G4PiData(sn_m_t, sn_m_in, e6, 35));
413  thePipData.push_back(new G4PiData(sn_p_t, sn_p_in, e6, 29));
414  thePimData.push_back(new G4PiData(w_m_t, w_m_in, e6, 35));
415  thePipData.push_back(new G4PiData(w_p_t, w_p_in, e6, 30));
416  thePimData.push_back(new G4PiData(pb_m_t, pb_m_in, e7, 35));
417  thePipData.push_back(new G4PiData(pb_p_t, pb_p_in, e7, 30));
418  thePimData.push_back(new G4PiData(u_m_t, u_m_in, e7, 35));
419  thePipData.push_back(new G4PiData(u_p_t, u_p_in, e7, 30));
420 
421  theZ.push_back(2); // He
422  theZ.push_back(4); // Be
423  theZ.push_back(6); // C
424  theZ.push_back(7); // N
425  theZ.push_back(8); // O
426  theZ.push_back(11); // Na
427  theZ.push_back(13); // Al
428  theZ.push_back(20); // Ca
429  theZ.push_back(26); // Fe
430  theZ.push_back(29); // Cu
431  theZ.push_back(42); // Mo
432  theZ.push_back(48); // Cd
433  theZ.push_back(50); // Sn
434  theZ.push_back(74); // W
435  theZ.push_back(82); // Pb
436  theZ.push_back(92); // U
437 }
G4VCrossSectionDataSet(const G4String &nam="")
void SetMinKinEnergy(G4double value)
void SetMaxKinEnergy(G4double value)
G4PiNuclearCrossSection::~G4PiNuclearCrossSection ( )
virtual

Definition at line 440 of file G4PiNuclearCrossSection.cc.

441 {
442  std::for_each(thePimData.begin(), thePimData.end(), G4PiData::Delete());
443  std::for_each(thePipData.begin(), thePipData.end(), G4PiData::Delete());
444 }

Member Function Documentation

void G4PiNuclearCrossSection::BuildPhysicsTable ( const G4ParticleDefinition &  p)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 464 of file G4PiNuclearCrossSection.cc.

References G4PionMinus::PionMinus(), and G4PionPlus::PionPlus().

465 {
466  if(&p == G4PionMinus::PionMinus() || &p == G4PionPlus::PionPlus()) { return; }
467  throw G4HadronicException(__FILE__, __LINE__,"Is applicable only for pions");
468 }
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:98
void G4PiNuclearCrossSection::CrossSectionDescription ( std::ostream &  outFile) const
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 447 of file G4PiNuclearCrossSection.cc.

448 {
449  outFile << "G4PiNuclearCrossSection calculates the pion inelastic cross\n"
450  << "section for all nuclei heavier than hydrogen. It uses the\n"
451  << "Barashenkov cross sections and is valid for all incident\n"
452  << "energies.\n";
453 }
std::ofstream outFile
Definition: GammaRayTel.cc:68
G4double G4PiNuclearCrossSection::GetElasticXsc ( )
inline

Definition at line 58 of file G4PiNuclearCrossSection.hh.

58 {return fElasticXsc;};
G4double G4PiNuclearCrossSection::GetElementCrossSection ( const G4DynamicParticle *  particle,
G4int  Z,
const G4Material *   
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 471 of file G4PiNuclearCrossSection.cc.

References G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetKineticEnergy(), and G4ParticleDefinition::GetPDGCharge().

473 {
474  G4double charge = particle->GetDefinition()->GetPDGCharge();
475  G4double kineticEnergy = particle->GetKineticEnergy();
476 
477  // body
478 
479  G4double result = 0;
480  // debug.push_back(Z);
481  size_t it = 0;
482 
483  while(it < theZ.size() && Z > theZ[it]) it++;
484 
485  // debug.push_back(theZ[it]);
486  // debug.push_back(kineticEnergy);
487 
488  if(Z > theZ[it])
489  {
490  throw G4HadronicException(__FILE__, __LINE__,
491  "Called G4PiNuclearCrossSection outside parametrization");
492  }
493  G4int Z1, Z2;
494  G4double x1, x2, xt1, xt2;
495  if( charge < 0 )
496  {
497  if( theZ[it] == Z )
498  {
499  result = thePimData[it]->ReactionXSection(kineticEnergy);
500  fTotalXsc = thePimData[it]->TotalXSection(kineticEnergy);
501 
502  // debug.push_back("D1 ");
503  // debug.push_back(result);
504  // debug.push_back(fTotalXsc);
505  }
506  else
507  {
508  x1 = thePimData[it-1]->ReactionXSection(kineticEnergy);
509  xt1 = thePimData[it-1]->TotalXSection(kineticEnergy);
510  Z1 = theZ[it-1];
511  x2 = thePimData[it]->ReactionXSection(kineticEnergy);
512  xt2 = thePimData[it]->TotalXSection(kineticEnergy);
513  Z2 = theZ[it];
514 
515  result = Interpolate(Z1, Z2, Z, x1, x2);
516  fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
517 
518  // debug.push_back("D2 ");
519  // debug.push_back(x1);
520  // debug.push_back(x2);
521  // debug.push_back(xt1);
522  // debug.push_back(xt2);
523  // debug.push_back(Z1);
524  // debug.push_back(Z2);
525  // debug.push_back(result);
526  // debug.push_back(fTotalXsc);
527  }
528  }
529  else
530  {
531  if(theZ[it]==Z)
532  {
533  // at high energies, when no data for pi+, use pi-
534  std::vector<G4PiData *> * theData = &thePimData;
535  if(thePipData[it]->AppliesTo(kineticEnergy))
536  {
537  theData = &thePipData;
538  }
539  result = theData->operator[](it)->ReactionXSection(kineticEnergy);
540  fTotalXsc = theData->operator[](it)->TotalXSection(kineticEnergy);
541 
542  // debug.push_back("D3 ");
543  // debug.push_back(result);
544  // debug.push_back(fTotalXsc);
545  }
546  else
547  {
548  std::vector<G4PiData *> * theLData = &thePimData;
549  if(thePipData[it-1]->AppliesTo(kineticEnergy))
550  {
551  theLData = &thePipData;
552  }
553  std::vector<G4PiData *> * theHData = &thePimData;
554  if(thePipData[it]->AppliesTo(kineticEnergy))
555  {
556  theHData = &thePipData;
557  }
558  x1 = theLData->operator[](it-1)->ReactionXSection(kineticEnergy);
559  xt1 = theLData->operator[](it-1)->TotalXSection(kineticEnergy);
560  Z1 = theZ[it-1];
561  x2 = theHData->operator[](it)->ReactionXSection(kineticEnergy);
562  xt2 = theHData->operator[](it)->TotalXSection(kineticEnergy);
563  Z2 = theZ[it];
564 
565  result = Interpolate(Z1, Z2, Z, x1, x2);
566  fTotalXsc = Interpolate(Z1, Z2, Z, xt1, xt2);
567 
568  // debug.push_back("D4 ");
569  // debug.push_back(x1);
570  // debug.push_back(xt1);
571  // debug.push_back(x2);
572  // debug.push_back(xt2);
573  // debug.push_back(Z1);
574  // debug.push_back(Z2);
575  // debug.push_back(result);
576  // debug.push_back(fTotalXsc);
577  }
578  }
579  // debug.dump();
580 
581  fElasticXsc = fTotalXsc - result;
582  if( fElasticXsc < 0.) fElasticXsc = 0.;
583 
584  return result;
585 }
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
G4double G4PiNuclearCrossSection::GetTotalXsc ( )
inline

Definition at line 57 of file G4PiNuclearCrossSection.hh.

57 {return fTotalXsc;};
G4bool G4PiNuclearCrossSection::IsElementApplicable ( const G4DynamicParticle *  aParticle,
G4int  Z,
const G4Material *   
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 457 of file G4PiNuclearCrossSection.cc.

459 {
460  return (1 < Z);
461 }

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