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

#include <G4GGNuclNuclCrossSection.hh>

Inheritance diagram for G4GGNuclNuclCrossSection:
G4VCrossSectionDataSet

Public Member Functions

 G4GGNuclNuclCrossSection ()
 
virtual ~G4GGNuclNuclCrossSection ()
 
virtual G4bool IsElementApplicable (const G4DynamicParticle *, G4int Z, const G4Material *)
 
virtual G4double GetElementCrossSection (const G4DynamicParticle *, G4int Z, const G4Material *)
 
G4double GetZandACrossSection (const G4DynamicParticle *, G4int Z, G4int A)
 
G4double GetCoulombBarier (const G4DynamicParticle *, G4double Z, G4double A, G4double pR, G4double tR)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
 
virtual void CrossSectionDescription (std::ostream &) const
 
G4double GetRatioSD (const G4DynamicParticle *, G4double At, G4double Zt)
 
G4double GetRatioQE (const G4DynamicParticle *, G4double At, G4double Zt)
 
G4double GetHadronNucleonXsc (const G4DynamicParticle *, const G4Element *)
 
G4double GetHadronNucleonXsc (const G4DynamicParticle *, G4int At, G4int Zt)
 
G4double GetHadronNucleonXscPDG (G4ParticleDefinition *, G4double sMand, G4ParticleDefinition *)
 
G4double GetHadronNucleonXscNS (G4ParticleDefinition *, G4double pTkin, G4ParticleDefinition *)
 
G4double GetHNinelasticXscVU (const G4DynamicParticle *, G4int At, G4int Zt)
 
G4double CalculateEcmValue (const G4double, const G4double, const G4double)
 
G4double CalcMandelstamS (const G4double, const G4double, const G4double)
 
G4double GetElasticGlauberGribov (const G4DynamicParticle *, G4int Z, G4int A)
 
G4double GetInelasticGlauberGribov (const G4DynamicParticle *, G4int Z, G4int A)
 
G4double GetTotalGlauberGribovXsc ()
 
G4double GetElasticGlauberGribovXsc ()
 
G4double GetInelasticGlauberGribovXsc ()
 
G4double GetProductionGlauberGribovXsc ()
 
G4double GetDiffractionGlauberGribovXsc ()
 
G4double GetRadiusConst ()
 
G4double GetNucleusRadius (const G4DynamicParticle *, const G4Element *)
 
G4double GetNucleusRadius (G4double Zt, G4double At)
 
G4double GetNucleusRadiusGG (G4double At)
 
G4double GetNucleusRadiusDE (G4double Z, G4double A)
 
G4double GetNucleusRadiusRMS (G4double Z, G4double A)
 
void SetEnergyLowerLimit (G4double E)
 
- 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 G4IsotopeSelectIsotope (const G4Element *, G4double kinEnergy)
 
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
 

Static Public Member Functions

static const char * Default_Name ()
 

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 50 of file G4GGNuclNuclCrossSection.hh.

Constructor & Destructor Documentation

G4GGNuclNuclCrossSection::G4GGNuclNuclCrossSection ( )

Definition at line 46 of file G4GGNuclNuclCrossSection.cc.

References G4Neutron::Neutron(), and G4Proton::Proton().

48 // fUpperLimit(100000*GeV),
49  fLowerLimit(0.1*MeV),
50  fRadiusConst(1.08*fermi), // 1.1, 1.3 ?
51  fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0),
52  fDiffractionXsc(0.0)
53 // , fHadronNucleonXsc(0.0)
54 {
55  theProton = G4Proton::Proton();
56  theNeutron = G4Neutron::Neutron();
57  hnXsc = new G4HadronNucleonXsc();
58 }
G4VCrossSectionDataSet(const G4String &nam="")
static const char * Default_Name()
static G4Proton * Proton()
Definition: G4Proton.cc:93
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
G4GGNuclNuclCrossSection::~G4GGNuclNuclCrossSection ( )
virtual

Definition at line 61 of file G4GGNuclNuclCrossSection.cc.

62 {
63  delete hnXsc;
64 }

Member Function Documentation

virtual void G4GGNuclNuclCrossSection::BuildPhysicsTable ( const G4ParticleDefinition )
inlinevirtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 75 of file G4GGNuclNuclCrossSection.hh.

76  {}
G4double G4GGNuclNuclCrossSection::CalcMandelstamS ( const G4double  mp,
const G4double  mt,
const G4double  Plab 
)

Definition at line 774 of file G4GGNuclNuclCrossSection.cc.

Referenced by GetHadronNucleonXsc(), and GetHadronNucleonXscNS().

777 {
778  G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
779  G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
780 
781  return sMand;
782 }
double G4double
Definition: G4Types.hh:76
G4double G4GGNuclNuclCrossSection::CalculateEcmValue ( const G4double  mp,
const G4double  mt,
const G4double  Plab 
)

Definition at line 757 of file G4GGNuclNuclCrossSection.cc.

760 {
761  G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
762  G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
763  // G4double Pcm = Plab * mt / Ecm;
764  // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
765 
766  return Ecm ; // KEcm;
767 }
double G4double
Definition: G4Types.hh:76
void G4GGNuclNuclCrossSection::CrossSectionDescription ( std::ostream &  outFile) const
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 67 of file G4GGNuclNuclCrossSection.cc.

68 {
69  outFile << "G4GGNuclNuclCrossSection calculates total, inelastic and\n"
70  << "elastic cross sections for nucleus-nucleus collisions using\n"
71  << "the Glauber model with Gribov corrections. It is valid for\n"
72  << "all incident energies above 100 keV./n";
73 }
std::ofstream outFile
Definition: GammaRayTel.cc:68
static const char* G4GGNuclNuclCrossSection::Default_Name ( )
inlinestatic

Definition at line 57 of file G4GGNuclNuclCrossSection.hh.

Referenced by DMXPhysicsList::ConstructHad(), and GammaRayTelIonPhysics::ConstructProcess().

57 {return "Glauber-Gribov nucleus nucleus";}
virtual void G4GGNuclNuclCrossSection::DumpPhysicsTable ( const G4ParticleDefinition )
inlinevirtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 79 of file G4GGNuclNuclCrossSection.hh.

References G4cout, and G4endl.

80  {G4cout << "G4NuclNuclCrossSection: uses Glauber-Gribov formula"<<G4endl;}
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61
G4double G4GGNuclNuclCrossSection::GetCoulombBarier ( const G4DynamicParticle aParticle,
G4double  Z,
G4double  A,
G4double  pR,
G4double  tR 
)

Definition at line 211 of file G4GGNuclNuclCrossSection.cc.

References python.hepunit::fine_structure_const, G4DynamicParticle::GetDefinition(), G4IonTable::GetIonMass(), G4ParticleTable::GetIonTable(), G4DynamicParticle::GetKineticEnergy(), G4ParticleTable::GetParticleTable(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), and python.hepunit::hbarc.

Referenced by GetZandACrossSection().

213 {
214  G4double ratio;
215  G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
216 
217  G4double pTkin = aParticle->GetKineticEnergy();
218  // G4double pPlab = aParticle->GetTotalMomentum();
219  G4double pM = aParticle->GetDefinition()->GetPDGMass();
220  // G4double tM = tZ*proton_mass_c2 + (tA-tZ)*neutron_mass_c2; // ~ 1% accuracy
222  G4double pElab = pTkin + pM;
223  G4double totEcm = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
224  // G4double pPcm = pPlab*tM/totEcm;
225  // G4double pTcm = std::sqrt(pM*pM + pPcm*pPcm) - pM;
226  G4double totTcm = totEcm - pM -tM;
227 
229  bC /= pR + tR;
230  bC /= 2.; // 4., 2. parametrisation cof ??? vmg
231 
232  // G4cout<<"pTkin = "<<pTkin/GeV<<"; pPlab = "
233  // <<pPlab/GeV<<"; bC = "<<bC/GeV<<"; pTcm = "<<pTcm/GeV<<G4endl;
234 
235  if( totTcm <= bC ) ratio = 0.;
236  else ratio = 1. - bC/totTcm;
237 
238  // if(ratio < DBL_MIN) ratio = DBL_MIN;
239  if( ratio < 0.) ratio = 0.;
240 
241  // G4cout <<"ratio = "<<ratio<<G4endl;
242  return ratio;
243 }
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
G4IonTable * GetIonTable() const
G4double GetIonMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
Definition: G4IonTable.cc:1232
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
G4double G4GGNuclNuclCrossSection::GetDiffractionGlauberGribovXsc ( )
inline

Definition at line 105 of file G4GGNuclNuclCrossSection.hh.

105 { return fDiffractionXsc; };
G4double G4GGNuclNuclCrossSection::GetElasticGlauberGribov ( const G4DynamicParticle dp,
G4int  Z,
G4int  A 
)
inline

Definition at line 136 of file G4GGNuclNuclCrossSection.hh.

References GetZandACrossSection().

138 {
139  GetZandACrossSection(dp, Z, A);
140  return fElasticXsc;
141 }
G4double GetZandACrossSection(const G4DynamicParticle *, G4int Z, G4int A)
G4double G4GGNuclNuclCrossSection::GetElasticGlauberGribovXsc ( )
inline

Definition at line 102 of file G4GGNuclNuclCrossSection.hh.

102 { return fElasticXsc; };
G4double G4GGNuclNuclCrossSection::GetElementCrossSection ( const G4DynamicParticle aParticle,
G4int  Z,
const G4Material  
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 95 of file G4GGNuclNuclCrossSection.cc.

References G4lrint(), GetZandACrossSection(), and G4NistManager::Instance().

97 {
98  G4int A = G4lrint(G4NistManager::Instance()->GetAtomicMassAmu(Z));
99  return GetZandACrossSection(aParticle, Z, A);
100 }
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
G4double GetZandACrossSection(const G4DynamicParticle *, G4int Z, G4int A)
int G4lrint(double ad)
Definition: templates.hh:163
G4double G4GGNuclNuclCrossSection::GetHadronNucleonXsc ( const G4DynamicParticle aParticle,
const G4Element anElement 
)

Definition at line 336 of file G4GGNuclNuclCrossSection.cc.

References G4lrint(), G4Element::GetN(), and G4Element::GetZ().

338 {
339  G4int At = G4lrint(anElement->GetN()); // number of nucleons
340  G4int Zt = G4lrint(anElement->GetZ()); // number of protons
341  return GetHadronNucleonXsc(aParticle, At, Zt);
342 }
G4double GetN() const
Definition: G4Element.hh:134
G4double GetZ() const
Definition: G4Element.hh:131
int G4int
Definition: G4Types.hh:78
int G4lrint(double ad)
Definition: templates.hh:163
G4double GetHadronNucleonXsc(const G4DynamicParticle *, const G4Element *)
G4double G4GGNuclNuclCrossSection::GetHadronNucleonXsc ( const G4DynamicParticle aParticle,
G4int  At,
G4int  Zt 
)

Definition at line 355 of file G4GGNuclNuclCrossSection.cc.

References CalcMandelstamS(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMass(), G4DynamicParticle::GetMomentum(), G4ParticleTable::GetParticleTable(), python.hepunit::GeV, CLHEP::Hep3Vector::mag(), and python.hepunit::millibarn.

357 {
358  G4double xsection = 0.;
359 
361  GetIonTable()->GetIonMass(Zt, At);
362  targ_mass = 0.939*GeV; // ~mean neutron and proton ???
363 
364  G4double proj_mass = aParticle->GetMass();
365  G4double proj_momentum = aParticle->GetMomentum().mag();
366  G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
367 
368  sMand /= GeV*GeV; // in GeV for parametrisation
369  proj_momentum /= GeV;
370  const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
371 
372  if(pParticle == theNeutron) // as proton ???
373  {
374  xsection = G4double(At)*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
375  }
376  else if(pParticle == theProton)
377  {
378  xsection = G4double(At)*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
379  }
380 
381  xsection *= millibarn;
382  return xsection;
383 }
G4double CalcMandelstamS(const G4double, const G4double, const G4double)
G4ParticleDefinition * GetDefinition() const
int millibarn
Definition: hepunit.py:40
G4double GetMass() const
static G4ParticleTable * GetParticleTable()
double G4double
Definition: G4Types.hh:76
double mag() const
G4ThreeVector GetMomentum() const
G4double G4GGNuclNuclCrossSection::GetHadronNucleonXscNS ( G4ParticleDefinition pParticle,
G4double  pTkin,
G4ParticleDefinition tParticle 
)

Definition at line 451 of file G4GGNuclNuclCrossSection.cc.

References CalcMandelstamS(), GetHadronNucleonXscPDG(), G4ParticleDefinition::GetPDGMass(), python.hepunit::GeV, and python.hepunit::millibarn.

Referenced by GetRatioQE(), and GetRatioSD().

454 {
455  G4double xsection(0);
456  // G4double Delta; DHW 19 May 2011: variable set but not used
457  G4double A0, B0;
458  G4double hpXscv(0);
459  G4double hnXscv(0);
460 
461  G4double targ_mass = tParticle->GetPDGMass();
462  G4double proj_mass = pParticle->GetPDGMass();
463 
464  G4double proj_energy = proj_mass + pTkin;
465  G4double proj_momentum = std::sqrt(pTkin*(pTkin+2*proj_mass));
466 
467  G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
468 
469  sMand /= GeV*GeV; // in GeV for parametrisation
470  proj_momentum /= GeV;
471  proj_energy /= GeV;
472  proj_mass /= GeV;
473 
474  // General PDG fit constants
475 
476  // G4double s0 = 5.38*5.38; // in Gev^2
477  // G4double eta1 = 0.458;
478  // G4double eta2 = 0.458;
479  // G4double B = 0.308;
480 
481  if( proj_momentum >= 373.)
482  {
483  return GetHadronNucleonXscPDG(pParticle,sMand,tParticle);
484  }
485  else if( proj_momentum >= 10. ) // high energy: pp = nn = np
486  // if( proj_momentum >= 2.)
487  {
488  // Delta = 1.; // DHW 19 May 2011: variable set but not used
489  // if (proj_energy < 40.) Delta = 0.916+0.0021*proj_energy;
490 
491  if (proj_momentum >= 10.) {
492  B0 = 7.5;
493  A0 = 100. - B0*std::log(3.0e7);
494 
495  xsection = A0 + B0*std::log(proj_energy) - 11
496  + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
497  0.93827*0.93827,-0.165); // mb
498  }
499  }
500  else // low energy pp = nn != np
501  {
502  if(pParticle == tParticle) // pp or nn // nn to be pp
503  {
504  if( proj_momentum < 0.73 )
505  {
506  hnXscv = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
507  }
508  else if( proj_momentum < 1.05 )
509  {
510  hnXscv = 23 + 40*(std::log(proj_momentum/0.73))*
511  (std::log(proj_momentum/0.73));
512  }
513  else // if( proj_momentum < 10. )
514  {
515  hnXscv = 39.0 +
516  75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
517  }
518  xsection = hnXscv;
519  }
520  else // pn to be np
521  {
522  if( proj_momentum < 0.8 )
523  {
524  hpXscv = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
525  }
526  else if( proj_momentum < 1.4 )
527  {
528  hpXscv = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
529  }
530  else // if( proj_momentum < 10. )
531  {
532  hpXscv = 33.3+
533  20.8*(std::pow(proj_momentum,2.0)-1.35)/
534  (std::pow(proj_momentum,2.50)+0.95);
535  }
536  xsection = hpXscv;
537  }
538  }
539  xsection *= millibarn; // parametrised in mb
540  return xsection;
541 }
G4double CalcMandelstamS(const G4double, const G4double, const G4double)
G4double GetHadronNucleonXscPDG(G4ParticleDefinition *, G4double sMand, G4ParticleDefinition *)
int millibarn
Definition: hepunit.py:40
G4double GetPDGMass() const
double G4double
Definition: G4Types.hh:76
G4double G4GGNuclNuclCrossSection::GetHadronNucleonXscPDG ( G4ParticleDefinition pParticle,
G4double  sMand,
G4ParticleDefinition tParticle 
)

Definition at line 394 of file G4GGNuclNuclCrossSection.cc.

References python.hepunit::millibarn, neutron, G4InuclParticleNames::proton, and G4InuclParticleNames::s0.

Referenced by GetHadronNucleonXscNS().

397 {
398  G4double xsection = 0.;
399  // G4bool pORn = (tParticle == theProton || nucleon == theNeutron );
400  G4bool proton = (tParticle == theProton);
401  G4bool neutron = (tParticle == theNeutron);
402 
403  // General PDG fit constants
404 
405  G4double s0 = 5.38*5.38; // in Gev^2
406  G4double eta1 = 0.458;
407  G4double eta2 = 0.458;
408  G4double B = 0.308;
409 
410  // const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
411 
412  if(pParticle == theNeutron) // proton-neutron fit
413  {
414  if ( proton )
415  {
416  xsection = ( 35.80 + B*std::pow(std::log(sMand/s0),2.)
417  + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
418  }
419  if ( neutron )
420  {
421  xsection = (35.45 + B*std::pow(std::log(sMand/s0),2.)
422  + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // pp for nn
423  }
424  }
425  else if(pParticle == theProton)
426  {
427  if ( proton )
428  {
429  xsection = (35.45 + B*std::pow(std::log(sMand/s0),2.)
430  + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
431 
432  }
433  if ( neutron )
434  {
435  xsection = (35.80 + B*std::pow(std::log(sMand/s0),2.)
436  + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
437  }
438  }
439  xsection *= millibarn; // parametrised in mb
440  return xsection;
441 }
int millibarn
Definition: hepunit.py:40
bool G4bool
Definition: G4Types.hh:79
double G4double
Definition: G4Types.hh:76
G4double G4GGNuclNuclCrossSection::GetHNinelasticXscVU ( const G4DynamicParticle aParticle,
G4int  At,
G4int  Zt 
)

Definition at line 548 of file G4GGNuclNuclCrossSection.cc.

References G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMomentum(), G4ParticleDefinition::GetPDGEncoding(), G4DynamicParticle::GetTotalEnergy(), python.hepunit::GeV, CLHEP::Hep3Vector::mag(), and python.hepunit::millibarn.

550 {
551  G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
552  G4int absPDGcode = std::abs(PDGcode);
553  G4double Elab = aParticle->GetTotalEnergy();
554  // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
555  G4double Plab = aParticle->GetMomentum().mag();
556  // std::sqrt(Elab * Elab - 0.88);
557 
558  Elab /= GeV;
559  Plab /= GeV;
560 
561  G4double LogPlab = std::log( Plab );
562  G4double sqrLogPlab = LogPlab * LogPlab;
563 
564  //G4cout<<"Plab = "<<Plab<<G4endl;
565 
566  G4double NumberOfTargetProtons = Zt;
567  G4double NumberOfTargetNucleons = At;
568  G4double NumberOfTargetNeutrons = NumberOfTargetNucleons - NumberOfTargetProtons;
569 
570  if(NumberOfTargetNeutrons < 0.) NumberOfTargetNeutrons = 0.;
571 
572  G4double Xtotal = 0., Xelastic = 0., Xinelastic =0.;
573 
574  if( absPDGcode > 1000 ) //------Projectile is baryon --------
575  {
576  G4double XtotPP = 48.0 + 0. *std::pow(Plab, 0. ) +
577  0.522*sqrLogPlab - 4.51*LogPlab;
578 
579  G4double XtotPN = 47.3 + 0. *std::pow(Plab, 0. ) +
580  0.513*sqrLogPlab - 4.27*LogPlab;
581 
582  G4double XelPP = 11.9 + 26.9*std::pow(Plab,-1.21) +
583  0.169*sqrLogPlab - 1.85*LogPlab;
584 
585  G4double XelPN = 11.9 + 26.9*std::pow(Plab,-1.21) +
586  0.169*sqrLogPlab - 1.85*LogPlab;
587 
588  Xtotal = ( NumberOfTargetProtons * XtotPP +
589  NumberOfTargetNeutrons * XtotPN );
590 
591  Xelastic = ( NumberOfTargetProtons * XelPP +
592  NumberOfTargetNeutrons * XelPN );
593  }
594 
595  Xinelastic = Xtotal - Xelastic;
596  if(Xinelastic < 0.) Xinelastic = 0.;
597 
598  return Xinelastic*= millibarn;
599 }
G4double GetTotalEnergy() const
G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
int millibarn
Definition: hepunit.py:40
double G4double
Definition: G4Types.hh:76
double mag() const
G4ThreeVector GetMomentum() const
G4double G4GGNuclNuclCrossSection::GetInelasticGlauberGribov ( const G4DynamicParticle dp,
G4int  Z,
G4int  A 
)
inline

Definition at line 146 of file G4GGNuclNuclCrossSection.hh.

References GetZandACrossSection().

148 {
149  GetZandACrossSection(dp, Z, A);
150  return fInelasticXsc;
151 }
G4double GetZandACrossSection(const G4DynamicParticle *, G4int Z, G4int A)
G4double G4GGNuclNuclCrossSection::GetInelasticGlauberGribovXsc ( )
inline

Definition at line 103 of file G4GGNuclNuclCrossSection.hh.

103 { return fInelasticXsc; };
G4double G4GGNuclNuclCrossSection::GetNucleusRadius ( const G4DynamicParticle ,
const G4Element anElement 
)

Definition at line 606 of file G4GGNuclNuclCrossSection.cc.

References G4Element::GetN(), and G4INCL::Math::oneThird.

Referenced by GetRatioQE(), GetRatioSD(), and GetZandACrossSection().

608 {
609  G4double At = anElement->GetN();
610  G4double oneThird = 1.0/3.0;
611  G4double cubicrAt = std::pow (At, oneThird);
612 
613  G4double R; // = fRadiusConst*cubicrAt;
614  R = fRadiusConst*cubicrAt;
615 
616  G4double meanA = 21.;
617  G4double tauA1 = 40.;
618  G4double tauA2 = 10.;
619  G4double tauA3 = 5.;
620 
621  G4double a1 = 0.85;
622  G4double b1 = 1. - a1;
623 
624  G4double b2 = 0.3;
625  G4double b3 = 4.;
626 
627  if (At > 20.) // 20.
628  {
629  R *= ( a1 + b1*std::exp( -(At - meanA)/tauA1) );
630  }
631  else if (At > 3.5)
632  {
633  R *= ( 1.0 + b2*( 1. - std::exp( (At - meanA)/tauA2) ) );
634  }
635  else
636  {
637  R *= ( 1.0 + b3*( 1. - std::exp( (At - meanA)/tauA3) ) );
638  }
639 
640  return R;
641 }
G4double GetN() const
Definition: G4Element.hh:134
double G4double
Definition: G4Types.hh:76
const G4double oneThird
G4double G4GGNuclNuclCrossSection::GetNucleusRadius ( G4double  Zt,
G4double  At 
)

Definition at line 648 of file G4GGNuclNuclCrossSection.cc.

References GetNucleusRadiusDE().

649 {
650  G4double R;
651  R = GetNucleusRadiusDE(Zt,At);
652  // R = GetNucleusRadiusRMS(Zt,At);
653 
654  return R;
655 }
G4double GetNucleusRadiusDE(G4double Z, G4double A)
double G4double
Definition: G4Types.hh:76
G4double G4GGNuclNuclCrossSection::GetNucleusRadiusDE ( G4double  Z,
G4double  A 
)

Definition at line 688 of file G4GGNuclNuclCrossSection.cc.

References python.hepunit::fermi.

Referenced by GetNucleusRadius().

689 {
690  // algorithm from diffuse-elastic
691 
692  G4double R, r0, a11, a12, a13, a2, a3;
693 
694  a11 = 1.26; // 1.08, 1.16
695  a12 = 1.; // 1.08, 1.16
696  a13 = 1.12; // 1.08, 1.16
697  a2 = 1.1;
698  a3 = 1.;
699 
700  // Special rms radii for light nucleii
701 
702  if (A < 50.)
703  {
704  if (std::abs(A-1.) < 0.5) return 0.89*fermi; // p
705  else if(std::abs(A-2.) < 0.5) return 2.13*fermi; // d
706  else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
707 
708  else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
709  else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
710 
711  else if(std::abs(Z-3.) < 0.5) return 2.40*fermi; // Li7
712  else if(std::abs(Z-4.) < 0.5) return 2.51*fermi; // Be9
713 
714  else if( 10. < A && A <= 16. ) r0 = a11*( 1 - std::pow(A, -2./3.) )*fermi; // 1.08*fermi;
715  else if( 15. < A && A <= 20. ) r0 = a12*( 1 - std::pow(A, -2./3.) )*fermi;
716  else if( 20. < A && A <= 30. ) r0 = a13*( 1 - std::pow(A, -2./3.) )*fermi;
717  else r0 = a2*fermi;
718 
719  R = r0*std::pow( A, 1./3. );
720  }
721  else
722  {
723  r0 = a3*fermi;
724 
725  R = r0*std::pow(A, 0.27);
726  }
727  return R;
728 }
double G4double
Definition: G4Types.hh:76
G4double G4GGNuclNuclCrossSection::GetNucleusRadiusGG ( G4double  At)

Definition at line 660 of file G4GGNuclNuclCrossSection.cc.

References G4INCL::Math::oneThird.

661 {
662  G4double oneThird = 1.0/3.0;
663  G4double cubicrAt = std::pow (At, oneThird);
664 
665  G4double R; // = fRadiusConst*cubicrAt;
666  R = fRadiusConst*cubicrAt;
667 
668  G4double meanA = 20.;
669  G4double tauA = 20.;
670 
671  if ( At > 20.) // 20.
672  {
673  R *= ( 0.8 + 0.2*std::exp( -(At - meanA)/tauA) );
674  }
675  else
676  {
677  R *= ( 1.0 + 0.1*( 1. - std::exp( (At - meanA)/tauA) ) );
678  }
679 
680  return R;
681 }
double G4double
Definition: G4Types.hh:76
const G4double oneThird
G4double G4GGNuclNuclCrossSection::GetNucleusRadiusRMS ( G4double  Z,
G4double  A 
)

Definition at line 736 of file G4GGNuclNuclCrossSection.cc.

References python.hepunit::fermi.

737 {
738 
739  if (std::abs(A-1.) < 0.5) return 0.89*fermi; // p
740  else if(std::abs(A-2.) < 0.5) return 2.13*fermi; // d
741  else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
742 
743  else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
744  else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
745 
746  else if(std::abs(Z-3.) < 0.5) return 2.40*fermi; // Li7
747  else if(std::abs(Z-4.) < 0.5) return 2.51*fermi; // Be9
748 
749  else return 1.24*std::pow(A, 0.28 )*fermi; // A > 9
750 }
G4double G4GGNuclNuclCrossSection::GetProductionGlauberGribovXsc ( )
inline

Definition at line 104 of file G4GGNuclNuclCrossSection.hh.

104 { return fProductionXsc; };
G4double G4GGNuclNuclCrossSection::GetRadiusConst ( )
inline

Definition at line 106 of file G4GGNuclNuclCrossSection.hh.

106 { return fRadiusConst; };
G4double G4GGNuclNuclCrossSection::GetRatioQE ( const G4DynamicParticle aParticle,
G4double  At,
G4double  Zt 
)

Definition at line 291 of file G4GGNuclNuclCrossSection.cc.

References G4ParticleDefinition::GetBaryonNumber(), G4DynamicParticle::GetDefinition(), GetHadronNucleonXscNS(), G4DynamicParticle::GetKineticEnergy(), GetNucleusRadius(), G4ParticleDefinition::GetPDGCharge(), and python.hepunit::pi.

292 {
293  G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
294 
295  G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
296  G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
297 
298  G4double pTkin = aParticle->GetKineticEnergy();
299  pTkin /= pA;
300 
301  G4double pN = pA - pZ;
302  if( pN < 0. ) pN = 0.;
303 
304  G4double tN = tA - tZ;
305  if( tN < 0. ) tN = 0.;
306 
307  G4double tR = GetNucleusRadius(tZ,tA);
308  G4double pR = GetNucleusRadius(pZ,pA);
309 
310  sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
311  (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
312 
313  nucleusSquare = cofTotal*pi*( pR*pR + tR*tR ); // basically 2piRR
314  ratio = sigma/nucleusSquare;
315  fInelasticXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
316 
317  // sigma = GetHNinelasticXsc(aParticle, tA, tZ);
318  ratio = sigma/nucleusSquare;
319  fProductionXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
320 
321  if (fInelasticXsc > fProductionXsc) ratio = (fInelasticXsc-fProductionXsc)/fInelasticXsc;
322  else ratio = 0.;
323  if ( ratio < 0. ) ratio = 0.;
324 
325  return ratio;
326 }
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
G4double GetNucleusRadius(const G4DynamicParticle *, const G4Element *)
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
G4double GetHadronNucleonXscNS(G4ParticleDefinition *, G4double pTkin, G4ParticleDefinition *)
G4double G4GGNuclNuclCrossSection::GetRatioSD ( const G4DynamicParticle aParticle,
G4double  At,
G4double  Zt 
)

Definition at line 251 of file G4GGNuclNuclCrossSection.cc.

References G4ParticleDefinition::GetBaryonNumber(), G4DynamicParticle::GetDefinition(), GetHadronNucleonXscNS(), G4DynamicParticle::GetKineticEnergy(), GetNucleusRadius(), G4ParticleDefinition::GetPDGCharge(), and python.hepunit::pi.

252 {
253  G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
254 
255  G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
256  G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
257 
258  G4double pTkin = aParticle->GetKineticEnergy();
259  pTkin /= pA;
260 
261  G4double pN = pA - pZ;
262  if( pN < 0. ) pN = 0.;
263 
264  G4double tN = tA - tZ;
265  if( tN < 0. ) tN = 0.;
266 
267  G4double tR = GetNucleusRadius(tZ,tA);
268  G4double pR = GetNucleusRadius(pZ,pA);
269 
270  sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
271  (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
272 
273  nucleusSquare = cofTotal*pi*( pR*pR + tR*tR ); // basically 2piRR
274  ratio = sigma/nucleusSquare;
275  fInelasticXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
276  G4double difratio = ratio/(1.+ratio);
277 
278  fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) );
279 
280  if (fInelasticXsc > 0.) ratio = fDiffractionXsc/fInelasticXsc;
281  else ratio = 0.;
282 
283  return ratio;
284 }
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
G4double GetNucleusRadius(const G4DynamicParticle *, const G4Element *)
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
G4double GetHadronNucleonXscNS(G4ParticleDefinition *, G4double pTkin, G4ParticleDefinition *)
G4double G4GGNuclNuclCrossSection::GetTotalGlauberGribovXsc ( )
inline

Definition at line 101 of file G4GGNuclNuclCrossSection.hh.

101 { return fTotalXsc; };
G4double G4GGNuclNuclCrossSection::GetZandACrossSection ( const G4DynamicParticle aParticle,
G4int  Z,
G4int  A 
)

Definition at line 112 of file G4GGNuclNuclCrossSection.cc.

References G4ParticleDefinition::GetBaryonNumber(), GetCoulombBarier(), G4DynamicParticle::GetDefinition(), G4HadronNucleonXsc::GetHadronNucleonXscNS(), G4HadronNucleonXsc::GetInelasticHadronNucleonXsc(), G4DynamicParticle::GetKineticEnergy(), GetNucleusRadius(), G4ParticleDefinition::GetPDGCharge(), and python.hepunit::pi.

Referenced by GetElasticGlauberGribov(), GetElementCrossSection(), and GetInelasticGlauberGribov().

114 {
115  G4double xsection;
116  G4double sigma;
117  G4double cofInelastic = 2.4;
118  G4double cofTotal = 2.0;
119  G4double nucleusSquare;
120  G4double cB;
121  G4double ratio;
122 
123  G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
124  G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
125 
126  G4double pTkin = aParticle->GetKineticEnergy();
127  pTkin /= pA;
128 
129  G4double pN = pA - pZ;
130  if( pN < 0. ) pN = 0.;
131 
132  G4double tN = tA - tZ;
133  if( tN < 0. ) tN = 0.;
134 
135  G4double tR = GetNucleusRadius( G4double(tZ),G4double(tA) );
136  G4double pR = GetNucleusRadius(pZ,pA);
137 
138  cB = GetCoulombBarier(aParticle, G4double(tZ), G4double(tA), pR, tR);
139 
140  if ( cB > 0. )
141  {
142  G4DynamicParticle* dProton = new G4DynamicParticle(theProton,
143  G4ParticleMomentum(1.,0.,0.),
144  pTkin);
145 
146  G4DynamicParticle* dNeutron = new G4DynamicParticle(theNeutron,
147  G4ParticleMomentum(1.,0.,0.),
148  pTkin);
149 
150  sigma = (pZ*tZ+pN*tN)*hnXsc->GetHadronNucleonXscNS(dProton, theProton);
151 
152  G4double ppInXsc = hnXsc->GetInelasticHadronNucleonXsc();
153 
154  sigma += (pZ*tN+pN*tZ)*hnXsc->GetHadronNucleonXscNS(dNeutron, theProton);
155 
156  G4double npInXsc = hnXsc->GetInelasticHadronNucleonXsc();
157 
158  delete dProton;
159  delete dNeutron;
160 
161  // G4cout<<"ppInXsc = "<<ppInXsc/millibarn<<"; npInXsc = "<<npInXsc/millibarn<<G4endl;
162  // G4cout<<"npTotXsc = "<<hnXsc->GetTotalHadronNucleonXsc()/millibarn<<"; npElXsc = "
163  // <<hnXsc->GetElasticHadronNucleonXsc()/millibarn<<G4endl;
164 
165  nucleusSquare = cofTotal*pi*( pR*pR + tR*tR ); // basically 2piRR
166 
167  ratio = sigma/nucleusSquare;
168  xsection = nucleusSquare*std::log( 1. + ratio );
169  fTotalXsc = xsection;
170  fTotalXsc *= cB;
171 
172  fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
173 
174  fInelasticXsc *= cB;
175  fElasticXsc = fTotalXsc - fInelasticXsc;
176 
177  // if (fElasticXsc < DBL_MIN) fElasticXsc = DBL_MIN;
178  /*
179  G4double difratio = ratio/(1.+ratio);
180 
181  fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) );
182  */
183  // production to be checked !!! edit MK xsc
184 
185  //sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscMK(theProton, pTkin, theProton) +
186  // (pZ*tN+pN*tZ)*GetHadronNucleonXscMK(theProton, pTkin, theNeutron);
187 
188  sigma = (pZ*tZ+pN*tN)*ppInXsc + (pZ*tN+pN*tZ)*npInXsc;
189 
190  ratio = sigma/nucleusSquare;
191  fProductionXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
192 
193  if (fElasticXsc < 0.) fElasticXsc = 0.;
194  }
195  else
196  {
197  fInelasticXsc = 0.;
198  fTotalXsc = 0.;
199  fElasticXsc = 0.;
200  fProductionXsc = 0.;
201  }
202 
203  return fInelasticXsc; // xsection;
204 }
G4double GetKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
G4double GetHadronNucleonXscNS(const G4DynamicParticle *, const G4ParticleDefinition *)
G4double GetCoulombBarier(const G4DynamicParticle *, G4double Z, G4double A, G4double pR, G4double tR)
G4double GetNucleusRadius(const G4DynamicParticle *, const G4Element *)
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const
G4ThreeVector G4ParticleMomentum
G4double GetInelasticHadronNucleonXsc()
G4bool G4GGNuclNuclCrossSection::IsElementApplicable ( const G4DynamicParticle ,
G4int  Z,
const G4Material  
)
virtual

Reimplemented from G4VCrossSectionDataSet.

Definition at line 76 of file G4GGNuclNuclCrossSection.cc.

78 {
79  G4bool applicable = true;
80 // G4double kineticEnergy = aDP->GetKineticEnergy();
81 
82 // if (kineticEnergy >= fLowerLimit) applicable = true;
83  return applicable;
84 }
bool G4bool
Definition: G4Types.hh:79
void G4GGNuclNuclCrossSection::SetEnergyLowerLimit ( G4double  E)
inline

Definition at line 115 of file G4GGNuclNuclCrossSection.hh.

115 {fLowerLimit=E;};

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