G4ComponentGGNuclNuclXsc Class Reference

#include <G4ComponentGGNuclNuclXsc.hh>

Inheritance diagram for G4ComponentGGNuclNuclXsc:

G4VComponentCrossSection

Public Member Functions

 G4ComponentGGNuclNuclXsc ()
virtual ~G4ComponentGGNuclNuclXsc ()
virtual G4double GetTotalIsotopeCrossSection (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual G4double GetTotalElementCrossSection (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
virtual G4double GetInelasticIsotopeCrossSection (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual G4double GetInelasticElementCrossSection (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
virtual G4double GetElasticElementCrossSection (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
virtual G4double GetElasticIsotopeCrossSection (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual G4double ComputeQuasiElasticRatio (const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
G4bool IsElementApplicable (const G4DynamicParticle *, G4int Z, const G4Material *)
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 Zt, G4double At)
G4double GetNucleusRadiusRMS (G4double Zt, G4double At)
void SetEnergyLowerLimit (G4double E)

Detailed Description

Definition at line 50 of file G4ComponentGGNuclNuclXsc.hh.


Constructor & Destructor Documentation

G4ComponentGGNuclNuclXsc::G4ComponentGGNuclNuclXsc (  ) 

Definition at line 40 of file G4ComponentGGNuclNuclXsc.cc.

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

00041  : G4VComponentCrossSection("Glauber-Gribov nucleus nucleus"),
00042    fUpperLimit(100000*GeV), fLowerLimit(0.1*MeV),
00043    fRadiusConst(1.08*fermi),  // 1.1, 1.3 ?
00044    fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0),
00045    fDiffractionXsc(0.0), fHadronNucleonXsc(0.0)
00046 {
00047   theProton   = G4Proton::Proton();
00048   theNeutron  = G4Neutron::Neutron();
00049   hnXsc = new G4HadronNucleonXsc();
00050 }

G4ComponentGGNuclNuclXsc::~G4ComponentGGNuclNuclXsc (  )  [virtual]

Definition at line 53 of file G4ComponentGGNuclNuclXsc.cc.

00054 {
00055   delete hnXsc;
00056 }


Member Function Documentation

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

Reimplemented from G4VComponentCrossSection.

Definition at line 111 of file G4ComponentGGNuclNuclXsc.hh.

00112   {}

G4double G4ComponentGGNuclNuclXsc::CalcMandelstamS ( const   G4double,
const   G4double,
const   G4double 
)

Definition at line 870 of file G4ComponentGGNuclNuclXsc.cc.

Referenced by GetHadronNucleonXsc(), and GetHadronNucleonXscNS().

00873 {
00874   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
00875   G4double sMand  = mp*mp + mt*mt + 2*Elab*mt ;
00876 
00877   return sMand;
00878 }

G4double G4ComponentGGNuclNuclXsc::CalculateEcmValue ( const   G4double,
const   G4double,
const   G4double 
)

Definition at line 853 of file G4ComponentGGNuclNuclXsc.cc.

00856 {
00857   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
00858   G4double Ecm  = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
00859   // G4double Pcm  = Plab * mt / Ecm;
00860   // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
00861 
00862   return Ecm ; // KEcm;
00863 }

G4double G4ComponentGGNuclNuclXsc::ComputeQuasiElasticRatio ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4int  A 
) [virtual]

Reimplemented from G4VComponentCrossSection.

Definition at line 144 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00147 {
00148   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00149                                                 kinEnergy);
00150   fInelasticXsc = GetZandACrossSection(aDP, Z, A);
00151   delete aDP;
00152   G4double ratio = 0.;
00153 
00154   if(fInelasticXsc > 0.)
00155   {
00156     ratio = (fInelasticXsc - fProductionXsc)/fInelasticXsc;
00157     if(ratio < 0.) ratio = 0.;
00158   }
00159   return ratio;
00160 }

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

Definition at line 165 of file G4ComponentGGNuclNuclXsc.cc.

00166 {
00167   outFile << "G4ComponentGGNuclNuclXsc calculates total, inelastic and\n"
00168           << "elastic cross sections for nucleus-nucleus collisions using\n"
00169           << "the Glauber model with Gribov corrections.  It is valid for\n"
00170           << "all incident energies above 100 keV./n";
00171 }

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

Reimplemented from G4VComponentCrossSection.

Definition at line 115 of file G4ComponentGGNuclNuclXsc.hh.

References G4cout, and G4endl.

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

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

Definition at line 307 of file G4ComponentGGNuclNuclXsc.cc.

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

Referenced by GetZandACrossSection().

00309 {
00310   G4double ratio;
00311   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00312 
00313   G4double pTkin = aParticle->GetKineticEnergy();
00314   // G4double pPlab = aParticle->GetTotalMomentum();
00315   G4double pM    = aParticle->GetDefinition()->GetPDGMass();
00316   // G4double tM    = tZ*proton_mass_c2 + (tA-tZ)*neutron_mass_c2; // ~ 1% accuracy
00317   G4double tM    = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( G4int(tZ), G4int(tA) );
00318   G4double pElab = pTkin + pM;
00319   G4double totEcm  = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
00320   // G4double pPcm  = pPlab*tM/totEcm;
00321   // G4double pTcm  = std::sqrt(pM*pM + pPcm*pPcm) - pM;
00322   G4double totTcm  = totEcm - pM -tM;
00323 
00324   G4double bC    = fine_structure_const*hbarc*pZ*tZ;
00325            bC   /= pR + tR;
00326            bC   /= 2.;  // 4., 2. parametrisation cof ??? vmg
00327 
00328            // G4cout<<"pTkin = "<<pTkin/GeV<<"; pPlab = "
00329            // <<pPlab/GeV<<"; bC = "<<bC/GeV<<"; pTcm = "<<pTcm/GeV<<G4endl;
00330 
00331   if( totTcm <= bC ) ratio = 0.;
00332   else             ratio = 1. - bC/totTcm;
00333 
00334   // if(ratio < DBL_MIN) ratio = DBL_MIN;
00335   if( ratio < 0.) ratio = 0.;
00336 
00337   // G4cout <<"ratio = "<<ratio<<G4endl;
00338   return ratio;
00339 }

G4double G4ComponentGGNuclNuclXsc::GetDiffractionGlauberGribovXsc (  )  [inline]

Definition at line 141 of file G4ComponentGGNuclNuclXsc.hh.

00141 { return fDiffractionXsc; }; 

G4double G4ComponentGGNuclNuclXsc::GetElasticElementCrossSection ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4double  A 
) [virtual]

Implements G4VComponentCrossSection.

Definition at line 116 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00119 {
00120   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00121                                                 kinEnergy);
00122   fInelasticXsc = GetZandACrossSection(aDP, Z, G4int(A));
00123   delete aDP;
00124 
00125   return fElasticXsc;
00126 }

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

Definition at line 172 of file G4ComponentGGNuclNuclXsc.hh.

References GetZandACrossSection().

00174 {
00175   GetZandACrossSection(dp, Z, A);
00176   return fElasticXsc;
00177 }

G4double G4ComponentGGNuclNuclXsc::GetElasticGlauberGribovXsc (  )  [inline]

Definition at line 138 of file G4ComponentGGNuclNuclXsc.hh.

00138 { return fElasticXsc;   }; 

G4double G4ComponentGGNuclNuclXsc::GetElasticIsotopeCrossSection ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4int  A 
) [virtual]

Implements G4VComponentCrossSection.

Definition at line 130 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00133 {
00134   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00135                                                 kinEnergy);
00136   fInelasticXsc = GetZandACrossSection(aDP, Z, A);
00137   delete aDP;
00138 
00139   return fElasticXsc;
00140 }

G4double G4ComponentGGNuclNuclXsc::GetElementCrossSection ( const G4DynamicParticle ,
G4int  Z,
const G4Material  
)

Definition at line 195 of file G4ComponentGGNuclNuclXsc.cc.

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

00197 {
00198   G4int A = G4lrint(G4NistManager::Instance()->GetAtomicMassAmu(Z));
00199   return GetZandACrossSection(aParticle, Z, A);
00200 }

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

Definition at line 451 of file G4ComponentGGNuclNuclXsc.cc.

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

00453 {
00454   G4double xsection = 0.;
00455 
00456   G4double targ_mass = G4ParticleTable::GetParticleTable()->
00457   GetIonTable()->GetIonMass(Zt, At);
00458   targ_mass = 0.939*GeV;  // ~mean neutron and proton ???
00459 
00460   G4double proj_mass = aParticle->GetMass();
00461   G4double proj_momentum = aParticle->GetMomentum().mag();
00462   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
00463 
00464   sMand /= GeV*GeV;  // in GeV for parametrisation
00465   proj_momentum /= GeV;
00466   const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
00467 
00468   if(pParticle == theNeutron) // as proton ??? 
00469   {
00470     xsection = G4double(At)*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00471   } 
00472   else if(pParticle == theProton) 
00473   {
00474     xsection = G4double(At)*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00475   } 
00476  
00477   xsection *= millibarn;
00478   return xsection;
00479 }

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

Definition at line 432 of file G4ComponentGGNuclNuclXsc.cc.

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

00434 {
00435   G4int At = G4lrint(anElement->GetN());  // number of nucleons 
00436   G4int Zt = G4lrint(anElement->GetZ());  // number of protons
00437   return GetHadronNucleonXsc(aParticle, At, Zt);
00438 }

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

Definition at line 547 of file G4ComponentGGNuclNuclXsc.cc.

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

Referenced by GetRatioQE(), and GetRatioSD().

00550 {
00551   G4double xsection(0);
00552   // G4double Delta;   DHW 19 May 2011: variable set but not used
00553   G4double A0, B0;
00554   G4double hpXscv(0);
00555   G4double hnXscv(0);
00556 
00557   G4double targ_mass = tParticle->GetPDGMass();
00558   G4double proj_mass = pParticle->GetPDGMass(); 
00559 
00560   G4double proj_energy   = proj_mass + pTkin; 
00561   G4double proj_momentum = std::sqrt(pTkin*(pTkin+2*proj_mass));
00562 
00563   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
00564 
00565   sMand         /= GeV*GeV;  // in GeV for parametrisation
00566   proj_momentum /= GeV;
00567   proj_energy   /= GeV;
00568   proj_mass     /= GeV;
00569 
00570   // General PDG fit constants
00571 
00572   //  G4double s0   = 5.38*5.38; // in Gev^2
00573   //  G4double eta1 = 0.458;
00574   //  G4double eta2 = 0.458;
00575   //  G4double B    = 0.308;
00576   
00577   if( proj_momentum >= 373.)
00578   {
00579       return GetHadronNucleonXscPDG(pParticle,sMand,tParticle);
00580   }
00581   else if( proj_momentum >= 10. ) // high energy: pp = nn = np
00582     // if( proj_momentum >= 2.)
00583   {
00584     //  Delta = 1.;    // DHW 19 May 2011: variable set but not used
00585     //  if (proj_energy < 40.) Delta = 0.916+0.0021*proj_energy;
00586 
00587     if (proj_momentum >= 10.) {
00588       B0 = 7.5;
00589       A0 = 100. - B0*std::log(3.0e7);
00590 
00591       xsection = A0 + B0*std::log(proj_energy) - 11
00592                 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+
00593                   0.93827*0.93827,-0.165);        //  mb
00594     }
00595   }
00596   else // low energy pp = nn != np
00597   {
00598       if(pParticle == tParticle) // pp or nn      // nn to be pp
00599       {
00600         if( proj_momentum < 0.73 )
00601         {
00602           hnXscv = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) );
00603         }
00604         else if( proj_momentum < 1.05  )
00605         {
00606           hnXscv = 23 + 40*(std::log(proj_momentum/0.73))*
00607                          (std::log(proj_momentum/0.73));
00608         }
00609         else  // if( proj_momentum < 10.  )
00610         {
00611           hnXscv = 39.0 + 
00612               75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15);
00613         }
00614         xsection = hnXscv;
00615       }
00616       else  // pn to be np
00617       {
00618         if( proj_momentum < 0.8 )
00619         {
00620           hpXscv = 33+30*std::pow(std::log(proj_momentum/1.3),4.0);
00621         }      
00622         else if( proj_momentum < 1.4 )
00623         {
00624           hpXscv = 33+30*std::pow(std::log(proj_momentum/0.95),2.0);
00625         }
00626         else    // if( proj_momentum < 10.  )
00627         {
00628           hpXscv = 33.3+
00629               20.8*(std::pow(proj_momentum,2.0)-1.35)/
00630                  (std::pow(proj_momentum,2.50)+0.95);
00631         }
00632         xsection = hpXscv;
00633       }
00634   }
00635   xsection *= millibarn; // parametrised in mb
00636   return xsection;
00637 }

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

Definition at line 490 of file G4ComponentGGNuclNuclXsc.cc.

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

Referenced by GetHadronNucleonXscNS().

00493 {
00494   G4double xsection = 0.;
00495   // G4bool pORn = (tParticle == theProton || nucleon == theNeutron  );  
00496   G4bool proton = (tParticle == theProton);
00497   G4bool neutron = (tParticle == theNeutron);
00498 
00499   // General PDG fit constants
00500 
00501   G4double s0   = 5.38*5.38; // in Gev^2
00502   G4double eta1 = 0.458;
00503   G4double eta2 = 0.458;
00504   G4double B    = 0.308;
00505 
00506   // const G4ParticleDefinition* pParticle = aParticle->GetDefinition();
00507   
00508   if(pParticle == theNeutron) // proton-neutron fit 
00509   {
00510     if ( proton )
00511     {
00512       xsection = ( 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00513                   + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
00514     }
00515     if ( neutron )
00516     {
00517       xsection = (35.45 + B*std::pow(std::log(sMand/s0),2.) 
00518              + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // pp for nn
00519     }
00520   } 
00521   else if(pParticle == theProton) 
00522   {
00523     if ( proton )
00524     {
00525       xsection = (35.45 + B*std::pow(std::log(sMand/s0),2.) 
00526                 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
00527 
00528     }
00529     if ( neutron )
00530     {
00531       xsection = (35.80 + B*std::pow(std::log(sMand/s0),2.) 
00532                   + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
00533     }
00534   } 
00535   xsection *= millibarn; // parametrised in mb
00536   return xsection;
00537 }

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

Definition at line 644 of file G4ComponentGGNuclNuclXsc.cc.

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

00646 {
00647   G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
00648   G4int absPDGcode = std::abs(PDGcode);
00649   G4double Elab = aParticle->GetTotalEnergy();              
00650                           // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
00651   G4double Plab = aParticle->GetMomentum().mag();            
00652                           // std::sqrt(Elab * Elab - 0.88);
00653 
00654   Elab /= GeV;
00655   Plab /= GeV;
00656 
00657   G4double LogPlab    = std::log( Plab );
00658   G4double sqrLogPlab = LogPlab * LogPlab;
00659 
00660   //G4cout<<"Plab = "<<Plab<<G4endl;
00661 
00662   G4double NumberOfTargetProtons  = Zt; 
00663   G4double NumberOfTargetNucleons = At;
00664   G4double NumberOfTargetNeutrons = NumberOfTargetNucleons - NumberOfTargetProtons;
00665 
00666   if(NumberOfTargetNeutrons < 0.) NumberOfTargetNeutrons = 0.;
00667 
00668   G4double Xtotal = 0., Xelastic = 0., Xinelastic =0.;
00669 
00670   if( absPDGcode > 1000 )  //------Projectile is baryon --------
00671   {
00672        G4double XtotPP = 48.0 +  0. *std::pow(Plab, 0.  ) +
00673                          0.522*sqrLogPlab - 4.51*LogPlab;
00674 
00675        G4double XtotPN = 47.3 +  0. *std::pow(Plab, 0.  ) +
00676                          0.513*sqrLogPlab - 4.27*LogPlab;
00677 
00678        G4double XelPP  = 11.9 + 26.9*std::pow(Plab,-1.21) +
00679                          0.169*sqrLogPlab - 1.85*LogPlab;
00680 
00681        G4double XelPN  = 11.9 + 26.9*std::pow(Plab,-1.21) +
00682                          0.169*sqrLogPlab - 1.85*LogPlab;
00683 
00684        Xtotal          = ( NumberOfTargetProtons  * XtotPP +
00685                            NumberOfTargetNeutrons * XtotPN  );
00686 
00687        Xelastic        = ( NumberOfTargetProtons  * XelPP  +
00688                            NumberOfTargetNeutrons * XelPN   );
00689   }
00690 
00691   Xinelastic = Xtotal - Xelastic;
00692   if(Xinelastic < 0.) Xinelastic = 0.;
00693 
00694   return Xinelastic*= millibarn;
00695 }

G4double G4ComponentGGNuclNuclXsc::GetInelasticElementCrossSection ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4double  A 
) [virtual]

Implements G4VComponentCrossSection.

Definition at line 102 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00105 {
00106   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00107                                                 kinEnergy);
00108   fInelasticXsc = GetZandACrossSection(aDP, Z, G4int(A));
00109   delete aDP;
00110 
00111   return fInelasticXsc;
00112 }

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

Definition at line 182 of file G4ComponentGGNuclNuclXsc.hh.

References GetZandACrossSection().

00184 {
00185   GetZandACrossSection(dp, Z, A);
00186   return fInelasticXsc;
00187 }

G4double G4ComponentGGNuclNuclXsc::GetInelasticGlauberGribovXsc (  )  [inline]

Definition at line 139 of file G4ComponentGGNuclNuclXsc.hh.

00139 { return fInelasticXsc; }; 

G4double G4ComponentGGNuclNuclXsc::GetInelasticIsotopeCrossSection ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4int  A 
) [virtual]

Implements G4VComponentCrossSection.

Definition at line 88 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00091 {
00092   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00093                                                 kinEnergy);
00094   fInelasticXsc = GetZandACrossSection(aDP, Z, A);
00095   delete aDP;
00096 
00097   return fInelasticXsc;
00098 }

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

Definition at line 744 of file G4ComponentGGNuclNuclXsc.cc.

References GetNucleusRadiusDE().

00745 {
00746   G4double R;
00747   R = GetNucleusRadiusDE(Zt,At);
00748   // R = GetNucleusRadiusRMS(Zt,At);
00749 
00750   return R;
00751 }

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

Definition at line 702 of file G4ComponentGGNuclNuclXsc.cc.

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

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

00704 {
00705   G4double At = anElement->GetN();
00706   G4double oneThird = 1.0/3.0;
00707   G4double cubicrAt = std::pow (At, oneThird); 
00708 
00709   G4double R;  // = fRadiusConst*cubicrAt;
00710   R = fRadiusConst*cubicrAt;
00711 
00712   G4double meanA  = 21.;
00713   G4double tauA1  = 40.; 
00714   G4double tauA2  = 10.; 
00715   G4double tauA3  = 5.; 
00716 
00717   G4double a1 = 0.85;
00718   G4double b1 = 1. - a1;
00719 
00720   G4double b2 = 0.3;
00721   G4double b3 = 4.;
00722 
00723   if (At > 20.)   // 20.
00724   {
00725     R *= ( a1 + b1*std::exp( -(At - meanA)/tauA1) ); 
00726   }
00727   else if (At > 3.5)
00728   {
00729     R *= ( 1.0 + b2*( 1. - std::exp( (At - meanA)/tauA2) ) ); 
00730   }
00731   else 
00732   {
00733     R *= ( 1.0 + b3*( 1. - std::exp( (At - meanA)/tauA3) ) ); 
00734   }
00735 
00736   return R;
00737 }

G4double G4ComponentGGNuclNuclXsc::GetNucleusRadiusDE ( G4double  Zt,
G4double  At 
)

Definition at line 784 of file G4ComponentGGNuclNuclXsc.cc.

Referenced by GetNucleusRadius().

00785 {
00786   // algorithm from diffuse-elastic
00787 
00788   G4double R, r0, a11, a12, a13, a2, a3;
00789 
00790   a11 = 1.26;  // 1.08, 1.16
00791   a12 = 1.;  // 1.08, 1.16
00792   a13 = 1.12;  // 1.08, 1.16
00793   a2 = 1.1;
00794   a3 = 1.;
00795 
00796   // Special rms radii for light nucleii
00797 
00798   if (A < 50.)
00799   {
00800     if     (std::abs(A-1.) < 0.5)                         return 0.89*fermi; // p
00801     else if(std::abs(A-2.) < 0.5)                         return 2.13*fermi; // d
00802     else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
00803 
00804     else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
00805     else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
00806 
00807     else if(std::abs(Z-3.) < 0.5)                         return 2.40*fermi; // Li7
00808     else if(std::abs(Z-4.) < 0.5)                         return 2.51*fermi; // Be9
00809 
00810     else if( 10.  < A && A <= 16. ) r0  = a11*( 1 - std::pow(A, -2./3.) )*fermi;   // 1.08*fermi;
00811     else if( 15.  < A && A <= 20. ) r0  = a12*( 1 - std::pow(A, -2./3.) )*fermi;
00812     else if( 20.  < A && A <= 30. ) r0  = a13*( 1 - std::pow(A, -2./3.) )*fermi;
00813     else                            r0  = a2*fermi;
00814 
00815     R = r0*std::pow( A, 1./3. );
00816   }
00817   else
00818   {
00819     r0 = a3*fermi;
00820 
00821     R  = r0*std::pow(A, 0.27);
00822   }
00823   return R;
00824 }

G4double G4ComponentGGNuclNuclXsc::GetNucleusRadiusGG ( G4double  At  ) 

Definition at line 756 of file G4ComponentGGNuclNuclXsc.cc.

References G4INCL::Math::oneThird.

00757 {
00758   G4double oneThird = 1.0/3.0;
00759   G4double cubicrAt = std::pow (At, oneThird); 
00760 
00761   G4double R;  // = fRadiusConst*cubicrAt;  
00762   R = fRadiusConst*cubicrAt;
00763 
00764   G4double meanA = 20.;
00765   G4double tauA  = 20.;
00766 
00767   if ( At > 20.)   // 20.
00768   {
00769     R *= ( 0.8 + 0.2*std::exp( -(At - meanA)/tauA) ); 
00770   }
00771   else
00772   {
00773     R *= ( 1.0 + 0.1*( 1. - std::exp( (At - meanA)/tauA) ) ); 
00774   }
00775 
00776   return R;
00777 }

G4double G4ComponentGGNuclNuclXsc::GetNucleusRadiusRMS ( G4double  Zt,
G4double  At 
)

Definition at line 832 of file G4ComponentGGNuclNuclXsc.cc.

00833 {
00834 
00835   if     (std::abs(A-1.) < 0.5)                         return 0.89*fermi; // p
00836   else if(std::abs(A-2.) < 0.5)                         return 2.13*fermi; // d
00837   else if(std::abs(Z-1.) < 0.5 && std::abs(A-3.) < 0.5) return 1.80*fermi; // t
00838 
00839   else if(std::abs(Z-2.) < 0.5 && std::abs(A-3.) < 0.5) return 1.96*fermi; // He3
00840   else if(std::abs(Z-2.) < 0.5 && std::abs(A-4.) < 0.5) return 1.68*fermi; // He4
00841 
00842   else if(std::abs(Z-3.) < 0.5)                         return 2.40*fermi; // Li7
00843   else if(std::abs(Z-4.) < 0.5)                         return 2.51*fermi; // Be9
00844 
00845   else                               return 1.24*std::pow(A, 0.28 )*fermi; // A > 9
00846 }

G4double G4ComponentGGNuclNuclXsc::GetProductionGlauberGribovXsc (  )  [inline]

Definition at line 140 of file G4ComponentGGNuclNuclXsc.hh.

00140 { return fProductionXsc; }; 

G4double G4ComponentGGNuclNuclXsc::GetRadiusConst (  )  [inline]

Definition at line 142 of file G4ComponentGGNuclNuclXsc.hh.

00142 { return fRadiusConst;  }; 

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

Definition at line 387 of file G4ComponentGGNuclNuclXsc.cc.

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

00388 {
00389   G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
00390 
00391   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00392   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
00393 
00394   G4double pTkin = aParticle->GetKineticEnergy();  
00395   pTkin /= pA;
00396 
00397   G4double pN = pA - pZ;
00398   if( pN < 0. ) pN = 0.;
00399 
00400   G4double tN = tA - tZ;
00401   if( tN < 0. ) tN = 0.;
00402 
00403   G4double tR = GetNucleusRadius(tZ,tA);  
00404   G4double pR = GetNucleusRadius(pZ,pA); 
00405 
00406   sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
00407           (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
00408 
00409   nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
00410   ratio = sigma/nucleusSquare;
00411   fInelasticXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
00412 
00413   //  sigma = GetHNinelasticXsc(aParticle, tA, tZ);
00414   ratio = sigma/nucleusSquare;
00415   fProductionXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
00416 
00417   if (fInelasticXsc > fProductionXsc) ratio = (fInelasticXsc-fProductionXsc)/fInelasticXsc;
00418   else                                ratio = 0.;
00419   if ( ratio < 0. )                   ratio = 0.;
00420 
00421   return ratio; 
00422 }

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

Definition at line 347 of file G4ComponentGGNuclNuclXsc.cc.

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

00348 {
00349   G4double sigma, cofInelastic = 2.4, cofTotal = 2.0, nucleusSquare, ratio;
00350 
00351   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00352   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
00353 
00354   G4double pTkin = aParticle->GetKineticEnergy();  
00355   pTkin /= pA;
00356 
00357   G4double pN = pA - pZ;
00358   if( pN < 0. ) pN = 0.;
00359 
00360   G4double tN = tA - tZ;
00361   if( tN < 0. ) tN = 0.;
00362 
00363   G4double tR = GetNucleusRadius(tZ,tA);  
00364   G4double pR = GetNucleusRadius(pZ,pA); 
00365 
00366   sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscNS(theProton, pTkin, theProton) +
00367           (pZ*tN+pN*tZ)*GetHadronNucleonXscNS(theProton, pTkin, theNeutron);
00368 
00369   nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
00370   ratio = sigma/nucleusSquare;
00371   fInelasticXsc = nucleusSquare*std::log(1. + cofInelastic*ratio)/cofInelastic;
00372   G4double difratio = ratio/(1.+ratio);
00373 
00374   fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) );
00375 
00376   if (fInelasticXsc > 0.) ratio = fDiffractionXsc/fInelasticXsc;
00377   else                    ratio = 0.;
00378 
00379   return ratio; 
00380 }

G4double G4ComponentGGNuclNuclXsc::GetTotalElementCrossSection ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4double  A 
) [virtual]

Implements G4VComponentCrossSection.

Definition at line 74 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00077 {
00078   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00079                                                 kinEnergy);
00080   fInelasticXsc = GetZandACrossSection(aDP, Z, G4int(A));
00081   delete aDP;
00082 
00083   return fTotalXsc;
00084 }

G4double G4ComponentGGNuclNuclXsc::GetTotalGlauberGribovXsc (  )  [inline]

Definition at line 137 of file G4ComponentGGNuclNuclXsc.hh.

00137 { return fTotalXsc;     }; 

G4double G4ComponentGGNuclNuclXsc::GetTotalIsotopeCrossSection ( const G4ParticleDefinition aParticle,
G4double  kinEnergy,
G4int  Z,
G4int  A 
) [virtual]

Implements G4VComponentCrossSection.

Definition at line 60 of file G4ComponentGGNuclNuclXsc.cc.

References GetZandACrossSection().

00063 {
00064   G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 
00065                                                 kinEnergy);
00066   fInelasticXsc = GetZandACrossSection(aDP, Z, A);
00067   delete aDP;
00068 
00069   return fTotalXsc;
00070 }

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

Definition at line 212 of file G4ComponentGGNuclNuclXsc.cc.

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

Referenced by ComputeQuasiElasticRatio(), GetElasticElementCrossSection(), GetElasticGlauberGribov(), GetElasticIsotopeCrossSection(), GetElementCrossSection(), GetInelasticElementCrossSection(), GetInelasticGlauberGribov(), GetInelasticIsotopeCrossSection(), GetTotalElementCrossSection(), and GetTotalIsotopeCrossSection().

00214 {
00215   G4double xsection;
00216   G4double sigma;
00217   G4double cofInelastic = 2.4;
00218   G4double cofTotal = 2.0;
00219   G4double nucleusSquare;
00220   G4double cB;
00221   G4double ratio;
00222 
00223   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
00224   G4double pA = aParticle->GetDefinition()->GetBaryonNumber();
00225 
00226   G4double pTkin = aParticle->GetKineticEnergy();  
00227   pTkin /= pA;
00228 
00229   G4double pN = pA - pZ;
00230   if( pN < 0. ) pN = 0.;
00231 
00232   G4double tN = tA - tZ;
00233   if( tN < 0. ) tN = 0.;
00234 
00235   G4double tR = GetNucleusRadius( G4double(tZ),G4double(tA) );  
00236   G4double pR = GetNucleusRadius(pZ,pA); 
00237 
00238   cB = GetCoulombBarier(aParticle, G4double(tZ), G4double(tA), pR, tR);
00239 
00240   if ( cB > 0. ) 
00241   {
00242     G4DynamicParticle* dProton = new G4DynamicParticle(theProton,
00243                                               G4ParticleMomentum(1.,0.,0.), 
00244                                               pTkin);
00245 
00246     G4DynamicParticle* dNeutron = new G4DynamicParticle(theNeutron,
00247                                               G4ParticleMomentum(1.,0.,0.), 
00248                                               pTkin);
00249 
00250     sigma = (pZ*tZ+pN*tN)*hnXsc->GetHadronNucleonXscNS(dProton, theProton);
00251 
00252     G4double ppInXsc = hnXsc->GetInelasticHadronNucleonXsc();
00253 
00254     sigma += (pZ*tN+pN*tZ)*hnXsc->GetHadronNucleonXscNS(dNeutron, theProton);
00255 
00256     G4double npInXsc = hnXsc->GetInelasticHadronNucleonXsc();
00257 
00258     // G4cout<<"ppInXsc = "<<ppInXsc/millibarn<<"; npInXsc = "<<npInXsc/millibarn<<G4endl;
00259     // G4cout<<"npTotXsc = "<<hnXsc->GetTotalHadronNucleonXsc()/millibarn<<"; npElXsc = "
00260     //                      <<hnXsc->GetElasticHadronNucleonXsc()/millibarn<<G4endl;
00261 
00262     nucleusSquare = cofTotal*pi*( pR*pR + tR*tR );   // basically 2piRR
00263 
00264     ratio      = sigma/nucleusSquare;
00265     xsection   = nucleusSquare*std::log( 1. + ratio );
00266     fTotalXsc  = xsection;
00267     fTotalXsc *= cB;
00268 
00269     fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
00270 
00271     fInelasticXsc *= cB;
00272     fElasticXsc   = fTotalXsc - fInelasticXsc;
00273 
00274     // if (fElasticXsc < DBL_MIN) fElasticXsc = DBL_MIN;
00275     /*    
00276     G4double difratio = ratio/(1.+ratio);
00277 
00278     fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) );
00279     */
00280     // production to be checked !!! edit MK xsc
00281 
00282     //sigma = (pZ*tZ+pN*tN)*GetHadronNucleonXscMK(theProton, pTkin, theProton) +
00283     //      (pZ*tN+pN*tZ)*GetHadronNucleonXscMK(theProton, pTkin, theNeutron);
00284 
00285     sigma = (pZ*tZ+pN*tN)*ppInXsc + (pZ*tN+pN*tZ)*npInXsc;
00286  
00287     ratio = sigma/nucleusSquare;
00288     fProductionXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic;
00289 
00290     if (fElasticXsc < 0.) fElasticXsc = 0.;
00291   }
00292   else
00293   {
00294     fInelasticXsc  = 0.;
00295     fTotalXsc      = 0.;
00296     fElasticXsc    = 0.;
00297     fProductionXsc = 0.;
00298   }
00299   return fInelasticXsc;   // xsection; 
00300 }

G4bool G4ComponentGGNuclNuclXsc::IsElementApplicable ( const G4DynamicParticle ,
G4int  Z,
const G4Material  
)

Definition at line 176 of file G4ComponentGGNuclNuclXsc.cc.

References G4DynamicParticle::GetKineticEnergy().

00178 {
00179   G4bool applicable = false;
00180   G4double kineticEnergy = aDP->GetKineticEnergy();
00181 
00182   if (kineticEnergy >= fLowerLimit && Z > 1) applicable = true;
00183   return applicable;
00184 }

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

Definition at line 151 of file G4ComponentGGNuclNuclXsc.hh.

00151 {fLowerLimit=E;};


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