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)

Static Public Member Functions

static const char * Default_Name ()

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().

00047  : G4VCrossSectionDataSet(Default_Name()),
00048    fUpperLimit(100000*GeV), fLowerLimit(0.1*MeV),
00049    fRadiusConst(1.08*fermi),  // 1.1, 1.3 ?
00050    fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0),
00051    fDiffractionXsc(0.0), fHadronNucleonXsc(0.0)
00052 {
00053   theProton   = G4Proton::Proton();
00054   theNeutron  = G4Neutron::Neutron();
00055   hnXsc = new G4HadronNucleonXsc();
00056 }

G4GGNuclNuclCrossSection::~G4GGNuclNuclCrossSection (  )  [virtual]

Definition at line 59 of file G4GGNuclNuclCrossSection.cc.

00060 {
00061   delete hnXsc;
00062 }


Member Function Documentation

virtual void G4GGNuclNuclCrossSection::BuildPhysicsTable ( const G4ParticleDefinition  )  [inline, virtual]

Reimplemented from G4VCrossSectionDataSet.

Definition at line 75 of file G4GGNuclNuclCrossSection.hh.

00076   {}

G4double G4GGNuclNuclCrossSection::CalcMandelstamS ( const   G4double,
const   G4double,
const   G4double 
)

Definition at line 772 of file G4GGNuclNuclCrossSection.cc.

Referenced by GetHadronNucleonXsc(), and GetHadronNucleonXscNS().

00775 {
00776   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
00777   G4double sMand  = mp*mp + mt*mt + 2*Elab*mt ;
00778 
00779   return sMand;
00780 }

G4double G4GGNuclNuclCrossSection::CalculateEcmValue ( const   G4double,
const   G4double,
const   G4double 
)

Definition at line 755 of file G4GGNuclNuclCrossSection.cc.

00758 {
00759   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
00760   G4double Ecm  = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
00761   // G4double Pcm  = Plab * mt / Ecm;
00762   // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
00763 
00764   return Ecm ; // KEcm;
00765 }

void G4GGNuclNuclCrossSection::CrossSectionDescription ( std::ostream &   )  const [virtual]

Reimplemented from G4VCrossSectionDataSet.

Definition at line 65 of file G4GGNuclNuclCrossSection.cc.

00066 {
00067   outFile << "G4GGNuclNuclCrossSection calculates total, inelastic and\n"
00068           << "elastic cross sections for nucleus-nucleus collisions using\n"
00069           << "the Glauber model with Gribov corrections.  It is valid for\n"
00070           << "all incident energies above 100 keV./n";
00071 }

static const char* G4GGNuclNuclCrossSection::Default_Name (  )  [inline, static]

Definition at line 57 of file G4GGNuclNuclCrossSection.hh.

Referenced by G4IonPhysics::ConstructProcess().

00057 {return "Glauber-Gribov nucleus nucleus";}

virtual void G4GGNuclNuclCrossSection::DumpPhysicsTable ( const G4ParticleDefinition  )  [inline, virtual]

Reimplemented from G4VCrossSectionDataSet.

Definition at line 79 of file G4GGNuclNuclCrossSection.hh.

References G4cout, and G4endl.

00080   {G4cout << "G4NuclNuclCrossSection: uses Glauber-Gribov formula"<<G4endl;}

G4double G4GGNuclNuclCrossSection::GetCoulombBarier ( const G4DynamicParticle ,
G4double  Z,
G4double  A,
G4double  pR,
G4double  tR 
)

Definition at line 209 of file G4GGNuclNuclCrossSection.cc.

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

Referenced by GetZandACrossSection().

00211 {
00212   G4double ratio;
00213   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00214 
00215   G4double pTkin = aParticle->GetKineticEnergy();
00216   // G4double pPlab = aParticle->GetTotalMomentum();
00217   G4double pM    = aParticle->GetDefinition()->GetPDGMass();
00218   // G4double tM    = tZ*proton_mass_c2 + (tA-tZ)*neutron_mass_c2; // ~ 1% accuracy
00219   G4double tM    = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( G4int(tZ), G4int(tA) );
00220   G4double pElab = pTkin + pM;
00221   G4double totEcm  = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
00222   // G4double pPcm  = pPlab*tM/totEcm;
00223   // G4double pTcm  = std::sqrt(pM*pM + pPcm*pPcm) - pM;
00224   G4double totTcm  = totEcm - pM -tM;
00225 
00226   G4double bC    = fine_structure_const*hbarc*pZ*tZ;
00227            bC   /= pR + tR;
00228            bC   /= 2.;  // 4., 2. parametrisation cof ??? vmg
00229 
00230            // G4cout<<"pTkin = "<<pTkin/GeV<<"; pPlab = "
00231            // <<pPlab/GeV<<"; bC = "<<bC/GeV<<"; pTcm = "<<pTcm/GeV<<G4endl;
00232 
00233   if( totTcm <= bC ) ratio = 0.;
00234   else             ratio = 1. - bC/totTcm;
00235 
00236   // if(ratio < DBL_MIN) ratio = DBL_MIN;
00237   if( ratio < 0.) ratio = 0.;
00238 
00239   // G4cout <<"ratio = "<<ratio<<G4endl;
00240   return ratio;
00241 }

G4double G4GGNuclNuclCrossSection::GetDiffractionGlauberGribovXsc (  )  [inline]

Definition at line 105 of file G4GGNuclNuclCrossSection.hh.

00105 { return fDiffractionXsc; }; 

G4double G4GGNuclNuclCrossSection::GetElasticGlauberGribov ( const G4DynamicParticle ,
G4int  Z,
G4int  A 
) [inline]

Definition at line 136 of file G4GGNuclNuclCrossSection.hh.

References GetZandACrossSection().

00138 {
00139   GetZandACrossSection(dp, Z, A);
00140   return fElasticXsc;
00141 }

G4double G4GGNuclNuclCrossSection::GetElasticGlauberGribovXsc (  )  [inline]

Definition at line 102 of file G4GGNuclNuclCrossSection.hh.

00102 { return fElasticXsc;   }; 

G4double G4GGNuclNuclCrossSection::GetElementCrossSection ( const G4DynamicParticle ,
G4int  Z,
const G4Material  
) [virtual]

Reimplemented from G4VCrossSectionDataSet.

Definition at line 93 of file G4GGNuclNuclCrossSection.cc.

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

00095 {
00096   G4int A = G4lrint(G4NistManager::Instance()->GetAtomicMassAmu(Z));
00097   return GetZandACrossSection(aParticle, Z, A);
00098 }

G4double G4GGNuclNuclCrossSection::GetHadronNucleonXsc ( const G4DynamicParticle ,
G4int  At,
G4int  Zt 
)

Definition at line 353 of file G4GGNuclNuclCrossSection.cc.

References CalcMandelstamS(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMass(), G4DynamicParticle::GetMomentum(), and G4ParticleTable::GetParticleTable().

00355 {
00356   G4double xsection = 0.;
00357 
00358   G4double targ_mass = G4ParticleTable::GetParticleTable()->
00359   GetIonTable()->GetIonMass(Zt, At);
00360   targ_mass = 0.939*GeV;  // ~mean neutron and proton ???
00361 
00362   G4double proj_mass = aParticle->GetMass();
00363   G4double proj_momentum = aParticle->GetMomentum().mag();
00364   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
00365 
00366   sMand /= GeV*GeV;  // in GeV for parametrisation
00367   proj_momentum /= GeV;
00368   const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
00369 
00370   if(pParticle == theNeutron) // as proton ??? 
00371   {
00372     xsection = G4double(At)*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00373   } 
00374   else if(pParticle == theProton) 
00375   {
00376     xsection = G4double(At)*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00377   } 
00378  
00379   xsection *= millibarn;
00380   return xsection;
00381 }

G4double G4GGNuclNuclCrossSection::GetHadronNucleonXsc ( const G4DynamicParticle ,
const G4Element  
)

Definition at line 334 of file G4GGNuclNuclCrossSection.cc.

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

00336 {
00337   G4int At = G4lrint(anElement->GetN());  // number of nucleons 
00338   G4int Zt = G4lrint(anElement->GetZ());  // number of protons
00339   return GetHadronNucleonXsc(aParticle, At, Zt);
00340 }

G4double G4GGNuclNuclCrossSection::GetHadronNucleonXscNS ( G4ParticleDefinition ,
G4double  pTkin,
G4ParticleDefinition  
)

Definition at line 449 of file G4GGNuclNuclCrossSection.cc.

References CalcMandelstamS(), GetHadronNucleonXscPDG(), and G4ParticleDefinition::GetPDGMass().

Referenced by GetRatioQE(), and GetRatioSD().

00452 {
00453   G4double xsection(0);
00454   // G4double Delta;   DHW 19 May 2011: variable set but not used
00455   G4double A0, B0;
00456   G4double hpXscv(0);
00457   G4double hnXscv(0);
00458 
00459   G4double targ_mass = tParticle->GetPDGMass();
00460   G4double proj_mass = pParticle->GetPDGMass(); 
00461 
00462   G4double proj_energy   = proj_mass + pTkin; 
00463   G4double proj_momentum = std::sqrt(pTkin*(pTkin+2*proj_mass));
00464 
00465   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
00466 
00467   sMand         /= GeV*GeV;  // in GeV for parametrisation
00468   proj_momentum /= GeV;
00469   proj_energy   /= GeV;
00470   proj_mass     /= GeV;
00471 
00472   // General PDG fit constants
00473 
00474   //  G4double s0   = 5.38*5.38; // in Gev^2
00475   //  G4double eta1 = 0.458;
00476   //  G4double eta2 = 0.458;
00477   //  G4double B    = 0.308;
00478   
00479   if( proj_momentum >= 373.)
00480   {
00481       return GetHadronNucleonXscPDG(pParticle,sMand,tParticle);
00482   }
00483   else if( proj_momentum >= 10. ) // high energy: pp = nn = np
00484     // if( proj_momentum >= 2.)
00485   {
00486     //  Delta = 1.;    // DHW 19 May 2011: variable set but not used
00487     //  if (proj_energy < 40.) Delta = 0.916+0.0021*proj_energy;
00488 
00489     if (proj_momentum >= 10.) {
00490       B0 = 7.5;
00491       A0 = 100. - B0*std::log(3.0e7);
00492 
00493       xsection = A0 + B0*std::log(proj_energy) - 11
00494                 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
00495                   0.93827*0.93827,-0.165);        //  mb
00496     }
00497   }
00498   else // low energy pp = nn != np
00499   {
00500       if(pParticle == tParticle) // pp or nn      // nn to be pp
00501       {
00502         if( proj_momentum < 0.73 )
00503         {
00504           hnXscv = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
00505         }
00506         else if( proj_momentum < 1.05  )
00507         {
00508           hnXscv = 23 + 40*(std::log(proj_momentum/0.73))*
00509                          (std::log(proj_momentum/0.73));
00510         }
00511         else  // if( proj_momentum < 10.  )
00512         {
00513           hnXscv = 39.0 + 
00514               75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
00515         }
00516         xsection = hnXscv;
00517       }
00518       else  // pn to be np
00519       {
00520         if( proj_momentum < 0.8 )
00521         {
00522           hpXscv = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
00523         }      
00524         else if( proj_momentum < 1.4 )
00525         {
00526           hpXscv = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
00527         }
00528         else    // if( proj_momentum < 10.  )
00529         {
00530           hpXscv = 33.3+
00531               20.8*(std::pow(proj_momentum,2.0)-1.35)/
00532                  (std::pow(proj_momentum,2.50)+0.95);
00533         }
00534         xsection = hpXscv;
00535       }
00536   }
00537   xsection *= millibarn; // parametrised in mb
00538   return xsection;
00539 }

G4double G4GGNuclNuclCrossSection::GetHadronNucleonXscPDG ( G4ParticleDefinition ,
G4double  sMand,
G4ParticleDefinition  
)

Definition at line 392 of file G4GGNuclNuclCrossSection.cc.

References neutron, G4InuclParticleNames::proton, and G4InuclParticleNames::s0.

Referenced by GetHadronNucleonXscNS().

00395 {
00396   G4double xsection = 0.;
00397   // G4bool pORn = (tParticle == theProton || nucleon == theNeutron  );  
00398   G4bool proton = (tParticle == theProton);
00399   G4bool neutron = (tParticle == theNeutron);
00400 
00401   // General PDG fit constants
00402 
00403   G4double s0   = 5.38*5.38; // in Gev^2
00404   G4double eta1 = 0.458;
00405   G4double eta2 = 0.458;
00406   G4double B    = 0.308;
00407 
00408   // const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
00409   
00410   if(pParticle == theNeutron) // proton-neutron fit 
00411   {
00412     if ( proton )
00413     {
00414       xsection = ( 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00415                   + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
00416     }
00417     if ( neutron )
00418     {
00419       xsection = (35.45 + B*std::pow(std::log(sMand/s0),2.) 
00420              + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // pp for nn
00421     }
00422   } 
00423   else if(pParticle == theProton) 
00424   {
00425     if ( proton )
00426     {
00427       xsection = (35.45 + B*std::pow(std::log(sMand/s0),2.) 
00428                 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
00429 
00430     }
00431     if ( neutron )
00432     {
00433       xsection = (35.80 + B*std::pow(std::log(sMand/s0),2.) 
00434                   + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
00435     }
00436   } 
00437   xsection *= millibarn; // parametrised in mb
00438   return xsection;
00439 }

G4double G4GGNuclNuclCrossSection::GetHNinelasticXscVU ( const G4DynamicParticle ,
G4int  At,
G4int  Zt 
)

Definition at line 546 of file G4GGNuclNuclCrossSection.cc.

References G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMomentum(), G4ParticleDefinition::GetPDGEncoding(), and G4DynamicParticle::GetTotalEnergy().

00548 {
00549   G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
00550   G4int absPDGcode = std::abs(PDGcode);
00551   G4double Elab = aParticle->GetTotalEnergy();              
00552                           // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
00553   G4double Plab = aParticle->GetMomentum().mag();            
00554                           // std::sqrt(Elab * Elab - 0.88);
00555 
00556   Elab /= GeV;
00557   Plab /= GeV;
00558 
00559   G4double LogPlab    = std::log( Plab );
00560   G4double sqrLogPlab = LogPlab * LogPlab;
00561 
00562   //G4cout<<"Plab = "<<Plab<<G4endl;
00563 
00564   G4double NumberOfTargetProtons  = Zt; 
00565   G4double NumberOfTargetNucleons = At;
00566   G4double NumberOfTargetNeutrons = NumberOfTargetNucleons - NumberOfTargetProtons;
00567 
00568   if(NumberOfTargetNeutrons < 0.) NumberOfTargetNeutrons = 0.;
00569 
00570   G4double Xtotal = 0., Xelastic = 0., Xinelastic =0.;
00571 
00572   if( absPDGcode > 1000 )  //------Projectile is baryon --------
00573   {
00574        G4double XtotPP = 48.0 +  0. *std::pow(Plab, 0.  ) +
00575                          0.522*sqrLogPlab - 4.51*LogPlab;
00576 
00577        G4double XtotPN = 47.3 +  0. *std::pow(Plab, 0.  ) +
00578                          0.513*sqrLogPlab - 4.27*LogPlab;
00579 
00580        G4double XelPP  = 11.9 + 26.9*std::pow(Plab,-1.21) +
00581                          0.169*sqrLogPlab - 1.85*LogPlab;
00582 
00583        G4double XelPN  = 11.9 + 26.9*std::pow(Plab,-1.21) +
00584                          0.169*sqrLogPlab - 1.85*LogPlab;
00585 
00586        Xtotal          = ( NumberOfTargetProtons  * XtotPP +
00587                            NumberOfTargetNeutrons * XtotPN  );
00588 
00589        Xelastic        = ( NumberOfTargetProtons  * XelPP  +
00590                            NumberOfTargetNeutrons * XelPN   );
00591   }
00592 
00593   Xinelastic = Xtotal - Xelastic;
00594   if(Xinelastic < 0.) Xinelastic = 0.;
00595 
00596   return Xinelastic*= millibarn;
00597 }

G4double G4GGNuclNuclCrossSection::GetInelasticGlauberGribov ( const G4DynamicParticle ,
G4int  Z,
G4int  A 
) [inline]

Definition at line 146 of file G4GGNuclNuclCrossSection.hh.

References GetZandACrossSection().

00148 {
00149   GetZandACrossSection(dp, Z, A);
00150   return fInelasticXsc;
00151 }

G4double G4GGNuclNuclCrossSection::GetInelasticGlauberGribovXsc (  )  [inline]

Definition at line 103 of file G4GGNuclNuclCrossSection.hh.

00103 { return fInelasticXsc; }; 

G4double G4GGNuclNuclCrossSection::GetNucleusRadius ( G4double  Zt,
G4double  At 
)

Definition at line 646 of file G4GGNuclNuclCrossSection.cc.

References GetNucleusRadiusDE().

00647 {
00648   G4double R;
00649   R = GetNucleusRadiusDE(Zt,At);
00650   // R = GetNucleusRadiusRMS(Zt,At);
00651 
00652   return R;
00653 }

G4double G4GGNuclNuclCrossSection::GetNucleusRadius ( const G4DynamicParticle ,
const G4Element  
)

Definition at line 604 of file G4GGNuclNuclCrossSection.cc.

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

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

00606 {
00607   G4double At = anElement->GetN();
00608   G4double oneThird = 1.0/3.0;
00609   G4double cubicrAt = std::pow (At, oneThird); 
00610 
00611   G4double R;  // = fRadiusConst*cubicrAt;
00612   R = fRadiusConst*cubicrAt;
00613 
00614   G4double meanA  = 21.;
00615   G4double tauA1  = 40.; 
00616   G4double tauA2  = 10.; 
00617   G4double tauA3  = 5.; 
00618 
00619   G4double a1 = 0.85;
00620   G4double b1 = 1. - a1;
00621 
00622   G4double b2 = 0.3;
00623   G4double b3 = 4.;
00624 
00625   if (At > 20.)   // 20.
00626   {
00627     R *= ( a1 + b1*std::exp( -(At - meanA)/tauA1) ); 
00628   }
00629   else if (At > 3.5)
00630   {
00631     R *= ( 1.0 + b2*( 1. - std::exp( (At - meanA)/tauA2) ) ); 
00632   }
00633   else 
00634   {
00635     R *= ( 1.0 + b3*( 1. - std::exp( (At - meanA)/tauA3) ) ); 
00636   }
00637 
00638   return R;
00639 }

G4double G4GGNuclNuclCrossSection::GetNucleusRadiusDE ( G4double  Z,
G4double  A 
)

Definition at line 686 of file G4GGNuclNuclCrossSection.cc.

Referenced by GetNucleusRadius().

00687 {
00688   // algorithm from diffuse-elastic
00689 
00690   G4double R, r0, a11, a12, a13, a2, a3;
00691 
00692   a11 = 1.26;  // 1.08, 1.16
00693   a12 = 1.;  // 1.08, 1.16
00694   a13 = 1.12;  // 1.08, 1.16
00695   a2 = 1.1;
00696   a3 = 1.;
00697 
00698   // Special rms radii for light nucleii
00699 
00700   if (A < 50.)
00701   {
00702     if     (std::abs(A-1.) < 0.5)                         return 0.89*fermi; // p
00703     else if(std::abs(A-2.) < 0.5)                         return 2.13*fermi; // d
00704     else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
00705 
00706     else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
00707     else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
00708 
00709     else if(std::abs(Z-3.) < 0.5)                         return 2.40*fermi; // Li7
00710     else if(std::abs(Z-4.) < 0.5)                         return 2.51*fermi; // Be9
00711 
00712     else if( 10.  < A && A <= 16. ) r0  = a11*( 1 - std::pow(A, -2./3.) )*fermi;   // 1.08*fermi;
00713     else if( 15.  < A && A <= 20. ) r0  = a12*( 1 - std::pow(A, -2./3.) )*fermi;
00714     else if( 20.  < A && A <= 30. ) r0  = a13*( 1 - std::pow(A, -2./3.) )*fermi;
00715     else                            r0  = a2*fermi;
00716 
00717     R = r0*std::pow( A, 1./3. );
00718   }
00719   else
00720   {
00721     r0 = a3*fermi;
00722 
00723     R  = r0*std::pow(A, 0.27);
00724   }
00725   return R;
00726 }

G4double G4GGNuclNuclCrossSection::GetNucleusRadiusGG ( G4double  At  ) 

Definition at line 658 of file G4GGNuclNuclCrossSection.cc.

References G4INCL::Math::oneThird.

00659 {
00660   G4double oneThird = 1.0/3.0;
00661   G4double cubicrAt = std::pow (At, oneThird); 
00662 
00663   G4double R;  // = fRadiusConst*cubicrAt;  
00664   R = fRadiusConst*cubicrAt;
00665 
00666   G4double meanA = 20.;
00667   G4double tauA  = 20.;
00668 
00669   if ( At > 20.)   // 20.
00670   {
00671     R *= ( 0.8 + 0.2*std::exp( -(At - meanA)/tauA) ); 
00672   }
00673   else
00674   {
00675     R *= ( 1.0 + 0.1*( 1. - std::exp( (At - meanA)/tauA) ) ); 
00676   }
00677 
00678   return R;
00679 }

G4double G4GGNuclNuclCrossSection::GetNucleusRadiusRMS ( G4double  Z,
G4double  A 
)

Definition at line 734 of file G4GGNuclNuclCrossSection.cc.

00735 {
00736 
00737   if     (std::abs(A-1.) < 0.5)                         return 0.89*fermi; // p
00738   else if(std::abs(A-2.) < 0.5)                         return 2.13*fermi; // d
00739   else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
00740 
00741   else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
00742   else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
00743 
00744   else if(std::abs(Z-3.) < 0.5)                         return 2.40*fermi; // Li7
00745   else if(std::abs(Z-4.) < 0.5)                         return 2.51*fermi; // Be9
00746 
00747   else                               return 1.24*std::pow(A, 0.28 )*fermi; // A > 9
00748 }

G4double G4GGNuclNuclCrossSection::GetProductionGlauberGribovXsc (  )  [inline]

Definition at line 104 of file G4GGNuclNuclCrossSection.hh.

00104 { return fProductionXsc; }; 

G4double G4GGNuclNuclCrossSection::GetRadiusConst (  )  [inline]

Definition at line 106 of file G4GGNuclNuclCrossSection.hh.

00106 { return fRadiusConst;  }; 

G4double G4GGNuclNuclCrossSection::GetRatioQE ( const G4DynamicParticle ,
G4double  At,
G4double  Zt 
)

Definition at line 289 of file G4GGNuclNuclCrossSection.cc.

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

00290 {
00291   G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
00292 
00293   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00294   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
00295 
00296   G4double pTkin = aParticle->GetKineticEnergy();  
00297   pTkin /= pA;
00298 
00299   G4double pN = pA - pZ;
00300   if( pN < 0. ) pN = 0.;
00301 
00302   G4double tN = tA - tZ;
00303   if( tN < 0. ) tN = 0.;
00304 
00305   G4double tR = GetNucleusRadius(tZ,tA);  
00306   G4double pR = GetNucleusRadius(pZ,pA); 
00307 
00308   sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
00309           (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
00310 
00311   nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
00312   ratio = sigma/nucleusSquare;
00313   fInelasticXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
00314 
00315   //  sigma = GetHNinelasticXsc(aParticle, tA, tZ);
00316   ratio = sigma/nucleusSquare;
00317   fProductionXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
00318 
00319   if (fInelasticXsc > fProductionXsc) ratio = (fInelasticXsc-fProductionXsc)/fInelasticXsc;
00320   else                                ratio = 0.;
00321   if ( ratio < 0. )                   ratio = 0.;
00322 
00323   return ratio; 
00324 }

G4double G4GGNuclNuclCrossSection::GetRatioSD ( const G4DynamicParticle ,
G4double  At,
G4double  Zt 
)

Definition at line 249 of file G4GGNuclNuclCrossSection.cc.

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

00250 {
00251   G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
00252 
00253   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00254   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
00255 
00256   G4double pTkin = aParticle->GetKineticEnergy();  
00257   pTkin /= pA;
00258 
00259   G4double pN = pA - pZ;
00260   if( pN < 0. ) pN = 0.;
00261 
00262   G4double tN = tA - tZ;
00263   if( tN < 0. ) tN = 0.;
00264 
00265   G4double tR = GetNucleusRadius(tZ,tA);  
00266   G4double pR = GetNucleusRadius(pZ,pA); 
00267 
00268   sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
00269           (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
00270 
00271   nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
00272   ratio = sigma/nucleusSquare;
00273   fInelasticXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
00274   G4double difratio = ratio/(1.+ratio);
00275 
00276   fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) );
00277 
00278   if (fInelasticXsc > 0.) ratio = fDiffractionXsc/fInelasticXsc;
00279   else                    ratio = 0.;
00280 
00281   return ratio; 
00282 }

G4double G4GGNuclNuclCrossSection::GetTotalGlauberGribovXsc (  )  [inline]

Definition at line 101 of file G4GGNuclNuclCrossSection.hh.

00101 { return fTotalXsc;     }; 

G4double G4GGNuclNuclCrossSection::GetZandACrossSection ( const G4DynamicParticle ,
G4int  Z,
G4int  A 
)

Definition at line 110 of file G4GGNuclNuclCrossSection.cc.

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

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

00112 {
00113   G4double xsection;
00114   G4double sigma;
00115   G4double cofInelastic = 2.4;
00116   G4double cofTotal = 2.0;
00117   G4double nucleusSquare;
00118   G4double cB;
00119   G4double ratio;
00120 
00121   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00122   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
00123 
00124   G4double pTkin = aParticle->GetKineticEnergy();  
00125   pTkin /= pA;
00126 
00127   G4double pN = pA - pZ;
00128   if( pN < 0. ) pN = 0.;
00129 
00130   G4double tN = tA - tZ;
00131   if( tN < 0. ) tN = 0.;
00132 
00133   G4double tR = GetNucleusRadius( G4double(tZ),G4double(tA) );  
00134   G4double pR = GetNucleusRadius(pZ,pA); 
00135 
00136   cB = GetCoulombBarier(aParticle, G4double(tZ), G4double(tA), pR, tR);
00137 
00138   if ( cB > 0. ) 
00139   {
00140     G4DynamicParticle* dProton = new G4DynamicParticle(theProton,
00141                                               G4ParticleMomentum(1.,0.,0.), 
00142                                               pTkin);
00143 
00144     G4DynamicParticle* dNeutron = new G4DynamicParticle(theNeutron,
00145                                               G4ParticleMomentum(1.,0.,0.), 
00146                                               pTkin);
00147 
00148     sigma = (pZ*tZ+pN*tN)*hnXsc->GetHadronNucleonXscNS(dProton, theProton);
00149 
00150     G4double ppInXsc = hnXsc->GetInelasticHadronNucleonXsc();
00151 
00152     sigma += (pZ*tN+pN*tZ)*hnXsc->GetHadronNucleonXscNS(dNeutron, theProton);
00153 
00154     G4double npInXsc = hnXsc->GetInelasticHadronNucleonXsc();
00155 
00156       delete dProton;
00157       delete dNeutron;
00158       
00159     // G4cout<<"ppInXsc = "<<ppInXsc/millibarn<<"; npInXsc = "<<npInXsc/millibarn<<G4endl;
00160     // G4cout<<"npTotXsc = "<<hnXsc->GetTotalHadronNucleonXsc()/millibarn<<"; npElXsc = "
00161     //                      <<hnXsc->GetElasticHadronNucleonXsc()/millibarn<<G4endl;
00162 
00163     nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
00164 
00165     ratio      = sigma/nucleusSquare;
00166     xsection   = nucleusSquare*std::log( 1. + ratio );
00167     fTotalXsc  = xsection;
00168     fTotalXsc *= cB;
00169 
00170     fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
00171 
00172     fInelasticXsc *= cB;
00173     fElasticXsc   = fTotalXsc - fInelasticXsc;
00174 
00175     // if (fElasticXsc < DBL_MIN) fElasticXsc = DBL_MIN;
00176     /*    
00177     G4double difratio = ratio/(1.+ratio);
00178 
00179     fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) );
00180     */
00181     // production to be checked !!! edit MK xsc
00182 
00183     //sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscMK(theProton, pTkin, theProton) +
00184     //      (pZ*tN+pN*tZ)*GetHadronNucleonXscMK(theProton, pTkin, theNeutron);
00185 
00186     sigma = (pZ*tZ+pN*tN)*ppInXsc + (pZ*tN+pN*tZ)*npInXsc;
00187  
00188     ratio = sigma/nucleusSquare;
00189     fProductionXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
00190 
00191     if (fElasticXsc < 0.) fElasticXsc = 0.;
00192   }
00193   else
00194   {
00195     fInelasticXsc  = 0.;
00196     fTotalXsc      = 0.;
00197     fElasticXsc    = 0.;
00198     fProductionXsc = 0.;
00199   }
00200     
00201   return fInelasticXsc;   // xsection; 
00202 }

G4bool G4GGNuclNuclCrossSection::IsElementApplicable ( const G4DynamicParticle ,
G4int  Z,
const G4Material  
) [virtual]

Reimplemented from G4VCrossSectionDataSet.

Definition at line 74 of file G4GGNuclNuclCrossSection.cc.

00076 {
00077   G4bool applicable = true;
00078 //  G4double kineticEnergy = aDP->GetKineticEnergy();
00079 
00080 //  if (kineticEnergy >= fLowerLimit) applicable = true;
00081   return applicable;
00082 }

void G4GGNuclNuclCrossSection::SetEnergyLowerLimit ( G4double  E  )  [inline]

Definition at line 115 of file G4GGNuclNuclCrossSection.hh.

00115 {fLowerLimit=E;};


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:52:05 2013 for Geant4 by  doxygen 1.4.7