G4HadronNucleonXsc Class Reference

#include <G4HadronNucleonXsc.hh>


Public Member Functions

 G4HadronNucleonXsc ()
virtual ~G4HadronNucleonXsc ()
virtual G4bool IsApplicable (const G4DynamicParticle *aDP, const G4Element *)
virtual G4bool IsIsoApplicable (const G4DynamicParticle *aDP, G4int Z, G4int A)
virtual void DumpPhysicsTable (const G4ParticleDefinition &)
void CrossSectionDescription (std::ostream &) const
G4double GetHadronNucleonXscEL (const G4DynamicParticle *, const G4ParticleDefinition *)
G4double GetHadronNucleonXscPDG (const G4DynamicParticle *, const G4ParticleDefinition *)
G4double GetHadronNucleonXscNS (const G4DynamicParticle *, const G4ParticleDefinition *)
G4double GetHadronNucleonXscVU (const G4DynamicParticle *, const G4ParticleDefinition *)
G4double CalculateEcmValue (const G4double, const G4double, const G4double)
G4double CalcMandelstamS (const G4double, const G4double, const G4double)
G4double GetCoulombBarrier (const G4DynamicParticle *aParticle, const G4ParticleDefinition *nucleon)
G4double GetTotalHadronNucleonXsc ()
G4double GetElasticHadronNucleonXsc ()
G4double GetInelasticHadronNucleonXsc ()
void InitialiseKaonNucleonTotXsc ()
G4double GetKpProtonTotXscVector (G4double logEnergy)
G4double GetKpNeutronTotXscVector (G4double logEnergy)
G4double GetKmProtonTotXscVector (G4double logEnergy)
G4double GetKmNeutronTotXscVector (G4double logEnergy)


Detailed Description

Definition at line 51 of file G4HadronNucleonXsc.hh.


Constructor & Destructor Documentation

G4HadronNucleonXsc::G4HadronNucleonXsc (  ) 

Definition at line 39 of file G4HadronNucleonXsc.cc.

References G4Alpha::Alpha(), G4AntiLambda::AntiLambda(), G4AntiNeutron::AntiNeutron(), G4AntiOmegaMinus::AntiOmegaMinus(), G4AntiProton::AntiProton(), G4AntiSigmaMinus::AntiSigmaMinus(), G4AntiSigmaPlus::AntiSigmaPlus(), G4AntiSigmaZero::AntiSigmaZero(), G4AntiXiMinus::AntiXiMinus(), G4AntiXiZero::AntiXiZero(), G4Deuteron::Deuteron(), G4Gamma::Gamma(), G4He3::He3(), InitialiseKaonNucleonTotXsc(), G4KaonMinus::KaonMinus(), G4KaonPlus::KaonPlus(), G4KaonZeroLong::KaonZeroLong(), G4KaonZeroShort::KaonZeroShort(), G4Lambda::Lambda(), G4Neutron::Neutron(), G4OmegaMinus::OmegaMinus(), G4PionMinus::PionMinus(), G4PionPlus::PionPlus(), G4PionZero::PionZero(), G4Proton::Proton(), G4SigmaMinus::SigmaMinus(), G4SigmaPlus::SigmaPlus(), G4SigmaZero::SigmaZero(), G4Triton::Triton(), G4XiMinus::XiMinus(), and G4XiZero::XiZero().

00040 : fUpperLimit( 10000 * GeV ),
00041   fLowerLimit( 0.03 * MeV ),
00042   fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fHadronNucleonXsc(0.0)
00043 {
00044   theGamma    = G4Gamma::Gamma();
00045   theProton   = G4Proton::Proton();
00046   theNeutron  = G4Neutron::Neutron();
00047   theAProton  = G4AntiProton::AntiProton();
00048   theANeutron = G4AntiNeutron::AntiNeutron();
00049   thePiPlus   = G4PionPlus::PionPlus();
00050   thePiMinus  = G4PionMinus::PionMinus();
00051   thePiZero   = G4PionZero::PionZero();
00052   theKPlus    = G4KaonPlus::KaonPlus();
00053   theKMinus   = G4KaonMinus::KaonMinus();
00054   theK0S      = G4KaonZeroShort::KaonZeroShort();
00055   theK0L      = G4KaonZeroLong::KaonZeroLong();
00056   theL        = G4Lambda::Lambda();
00057   theAntiL    = G4AntiLambda::AntiLambda();
00058   theSPlus    = G4SigmaPlus::SigmaPlus();
00059   theASPlus   = G4AntiSigmaPlus::AntiSigmaPlus();
00060   theSMinus   = G4SigmaMinus::SigmaMinus();
00061   theASMinus  = G4AntiSigmaMinus::AntiSigmaMinus();
00062   theS0       = G4SigmaZero::SigmaZero();
00063   theAS0      = G4AntiSigmaZero::AntiSigmaZero();
00064   theXiMinus  = G4XiMinus::XiMinus();
00065   theXi0      = G4XiZero::XiZero();
00066   theAXiMinus = G4AntiXiMinus::AntiXiMinus();
00067   theAXi0     = G4AntiXiZero::AntiXiZero();
00068   theOmega    = G4OmegaMinus::OmegaMinus();
00069   theAOmega   = G4AntiOmegaMinus::AntiOmegaMinus();
00070   theD        = G4Deuteron::Deuteron();
00071   theT        = G4Triton::Triton();
00072   theA        = G4Alpha::Alpha();
00073   theHe3      = G4He3::He3();
00074 
00075   InitialiseKaonNucleonTotXsc();
00076 }

G4HadronNucleonXsc::~G4HadronNucleonXsc (  )  [virtual]

Definition at line 79 of file G4HadronNucleonXsc.cc.

00080 {}


Member Function Documentation

G4double G4HadronNucleonXsc::CalcMandelstamS ( const   G4double,
const   G4double,
const   G4double 
)

Definition at line 1125 of file G4HadronNucleonXsc.cc.

Referenced by GetHadronNucleonXscEL(), GetHadronNucleonXscNS(), and GetHadronNucleonXscPDG().

01128 {
01129   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
01130   G4double sMand  = mp*mp + mt*mt + 2*Elab*mt ;
01131 
01132   return sMand;
01133 }

G4double G4HadronNucleonXsc::CalculateEcmValue ( const   G4double,
const   G4double,
const   G4double 
)

Definition at line 1108 of file G4HadronNucleonXsc.cc.

01111 {
01112   G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
01113   G4double Ecm  = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt );
01114   // G4double Pcm  = Plab * mt / Ecm;
01115   // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp;
01116 
01117   return Ecm ; // KEcm;
01118 }

void G4HadronNucleonXsc::CrossSectionDescription ( std::ostream &   )  const

Definition at line 82 of file G4HadronNucleonXsc.cc.

00083 {
00084   outFile << "G4HadronNucleonXsc calculates the total, inelastic and elastic\n"
00085           << "hadron-nucleon cross sections using several different\n"
00086           << "parameterizations within the Glauber-Gribov approach. It is\n"
00087           << "valid for all incident gammas and long-lived hadrons at\n"
00088           << "energies above 30 keV.  This is a cross section component which\n"
00089           << "is to be used to build a cross section data set.\n"; 
00090 }

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

Definition at line 65 of file G4HadronNucleonXsc.hh.

References G4cout, and G4endl.

00066   {G4cout << "G4HadronNucleonXsc: uses parametrisation"<<G4endl;}

G4double G4HadronNucleonXsc::GetCoulombBarrier ( const G4DynamicParticle aParticle,
const G4ParticleDefinition nucleon 
)

Definition at line 1140 of file G4HadronNucleonXsc.cc.

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

Referenced by GetHadronNucleonXscNS().

01142 {
01143   G4double ratio;
01144 
01145   G4double tR = 0.895*fermi, pR;
01146 
01147   if     ( aParticle->GetDefinition() == theProton ) pR = 0.895*fermi;
01148   else if( aParticle->GetDefinition() == thePiPlus ) pR = 0.663*fermi;
01149   else if( aParticle->GetDefinition() == theKPlus )  pR = 0.340*fermi;
01150   else                                               pR = 0.500*fermi;
01151 
01152   G4double pZ = aParticle->GetDefinition()->GetPDGCharge();
01153   G4double tZ = nucleon->GetPDGCharge();
01154 
01155   G4double pTkin = aParticle->GetKineticEnergy();
01156   
01157   G4double pM    = aParticle->GetDefinition()->GetPDGMass(); 
01158   G4double tM    = nucleon->GetPDGMass();
01159 
01160   G4double pElab = pTkin + pM;
01161 
01162   G4double totEcm  = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
01163 
01164   G4double totTcm  = totEcm - pM -tM;
01165 
01166   G4double bC    = fine_structure_const*hbarc*pZ*tZ;
01167            bC   /= pR + tR;
01168            bC   /= 2.;  // 4., 2. parametrisation cof ??? vmg
01169 
01170            // G4cout<<"pTkin = "<<pTkin/GeV<<"; pPlab = "
01171            // <<pPlab/GeV<<"; bC = "<<bC/GeV<<"; pTcm = "<<pTcm/GeV<<G4endl;
01172 
01173   if( totTcm <= bC ) ratio = 0.;
01174   else               ratio = 1. - bC/totTcm;
01175 
01176   // if(ratio < DBL_MIN) ratio = DBL_MIN;
01177   if( ratio < 0.) ratio = 0.;
01178 
01179   // G4cout <<"ratio = "<<ratio<<G4endl;
01180   return ratio;
01181 }

G4double G4HadronNucleonXsc::GetElasticHadronNucleonXsc (  )  [inline]

Definition at line 89 of file G4HadronNucleonXsc.hh.

Referenced by G4BGGPionElasticXS::BuildPhysicsTable(), G4BGGNucleonElasticXS::BuildPhysicsTable(), G4NeutronElasticXS::GetElementCrossSection(), G4BGGPionElasticXS::GetIsoCrossSection(), and G4BGGNucleonElasticXS::GetIsoCrossSection().

00089 { return fElasticXsc;   }; 

G4double G4HadronNucleonXsc::GetHadronNucleonXscEL ( const G4DynamicParticle ,
const G4ParticleDefinition  
)

Definition at line 141 of file G4HadronNucleonXsc.cc.

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

00143 {
00144   G4double xsection;
00145 
00146 
00147   G4double targ_mass = 0.939*GeV;  // ~mean neutron and proton ???
00148 
00149   G4double proj_mass     = aParticle->GetMass();
00150   G4double proj_momentum = aParticle->GetMomentum().mag();
00151   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
00152 
00153   sMand /= GeV*GeV;  // in GeV for parametrisation
00154   proj_momentum /= GeV;
00155 
00156   const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
00157 
00158   G4bool pORn = (nucleon == theProton || nucleon == theNeutron  );  
00159   
00160 
00161   if(theParticle == theGamma && pORn ) 
00162   {
00163     xsection = (0.0677*std::pow(sMand,0.0808) + 0.129*std::pow(sMand,-0.4525));
00164   } 
00165   else if(theParticle == theNeutron && pORn ) // as proton ??? 
00166   {
00167     xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00168   } 
00169   else if(theParticle == theProton && pORn ) 
00170   {
00171     xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00172 
00173     // xsection = At*( 49.51*std::pow(sMand,-0.097) + 0.314*std::log(sMand)*std::log(sMand) );
00174     // xsection = At*( 38.4 + 0.85*std::abs(std::pow(log(sMand),1.47)) );
00175   } 
00176   else if(theParticle == theAProton && pORn ) 
00177   {
00178     xsection = ( 21.70*std::pow(sMand,0.0808) + 98.39*std::pow(sMand,-0.4525));
00179   } 
00180   else if(theParticle == thePiPlus && pORn ) 
00181   {
00182     xsection = (13.63*std::pow(sMand,0.0808) + 27.56*std::pow(sMand,-0.4525));
00183   } 
00184   else if(theParticle == thePiMinus && pORn ) 
00185   {
00186     // xsection = At*( 55.2*std::pow(sMand,-0.255) + 0.346*std::log(sMand)*std::log(sMand) );
00187     xsection = (13.63*std::pow(sMand,0.0808) + 36.02*std::pow(sMand,-0.4525));
00188   } 
00189   else if(theParticle == theKPlus && pORn ) 
00190   {
00191     xsection = (11.82*std::pow(sMand,0.0808) + 8.15*std::pow(sMand,-0.4525));
00192   } 
00193   else if(theParticle == theKMinus && pORn ) 
00194   {
00195     xsection = (11.82*std::pow(sMand,0.0808) + 26.36*std::pow(sMand,-0.4525));
00196   }
00197   else  // as proton ??? 
00198   {
00199     xsection = (21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525));
00200   }
00201   xsection *= millibarn;
00202 
00203   fTotalXsc     = xsection;
00204   fInelasticXsc = 0.83*xsection;
00205   fElasticXsc   = fTotalXsc - fInelasticXsc;
00206   if (fElasticXsc < 0.)fElasticXsc = 0.;
00207  
00208   return xsection;
00209 }

G4double G4HadronNucleonXsc::GetHadronNucleonXscNS ( const G4DynamicParticle ,
const G4ParticleDefinition  
)

Definition at line 363 of file G4HadronNucleonXsc.cc.

References CalcMandelstamS(), GetCoulombBarrier(), G4DynamicParticle::GetDefinition(), GetHadronNucleonXscPDG(), G4DynamicParticle::GetMass(), G4DynamicParticle::GetMomentum(), G4ParticleDefinition::GetPDGCharge(), G4DynamicParticle::GetTotalEnergy(), neutron, G4InuclParticleNames::proton, and G4InuclParticleNames::s0.

Referenced by G4BGGNucleonInelasticXS::BuildPhysicsTable(), G4GlauberGribovCrossSection::GetIsoCrossSection(), G4ComponentGGHadronNucleusXsc::GetIsoCrossSection(), G4BGGNucleonInelasticXS::GetIsoCrossSection(), G4GGNuclNuclCrossSection::GetZandACrossSection(), and G4ComponentGGNuclNuclXsc::GetZandACrossSection().

00365 {
00366   G4double xsection(0); 
00367   
00368   G4double A0, B0;
00369   G4double hpXsc(0);
00370   G4double hnXsc(0);
00371 
00372 
00373   G4double tM = 0.939*GeV;  // ~mean neutron and proton ???
00374 
00375   G4double pM   = aParticle->GetMass();
00376   G4double pE   = aParticle->GetTotalEnergy(); 
00377   G4double pLab = aParticle->GetMomentum().mag();
00378 
00379   G4double sMand = CalcMandelstamS ( pM , tM , pLab );
00380 
00381   sMand         /= GeV*GeV;  // in GeV for parametrisation
00382   pLab /= GeV;
00383   pE   /= GeV;
00384   pM     /= GeV;
00385 
00386   G4double logP = std::log(pLab);
00387 
00388 
00389   // General PDG fit constants
00390 
00391   G4double s0   = 5.38*5.38; // in Gev^2
00392   G4double eta1 = 0.458;
00393   G4double eta2 = 0.458;
00394   G4double B    = 0.308;
00395 
00396 
00397   const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
00398 
00399   G4bool pORn = (nucleon == theProton || nucleon == theNeutron  );  
00400   G4bool proton = (nucleon == theProton);
00401   G4bool neutron = (nucleon == theNeutron);
00402 
00403   if( theParticle == theNeutron && pORn ) 
00404   {
00405     if( pLab >= 373.)
00406     {
00407       xsection =  GetHadronNucleonXscPDG(aParticle, nucleon)/millibarn;
00408 
00409       fElasticXsc = 6.5 + 0.308*std::pow(std::log(sMand/400.),1.65) + 9.19*std::pow(sMand,-0.458);
00410     
00411       fTotalXsc = xsection;
00412     
00413     }
00414     else if( pLab >= 100.)
00415     {
00416       B0 = 7.5;
00417       A0 = 100. - B0*std::log(3.0e7);
00418 
00419       xsection = A0 + B0*std::log(pE) - 11
00420           // + 103*std::pow(2*0.93827*pE + pM*pM+0.93827*0.93827,-0.165);        //  mb
00421                   + 103*std::pow(sMand,-0.165);        //  mb
00422 
00423       fElasticXsc = 5.53 + 0.308*std::pow(std::log(sMand/28.9),1.1) + 9.19*std::pow(sMand,-0.458);
00424       
00425       fTotalXsc = xsection;
00426     }
00427     else if( pLab >= 10.)
00428     {
00429         B0 = 7.5;
00430         A0 = 100. - B0*std::log(3.0e7);
00431 
00432         xsection = A0 + B0*std::log(pE) - 11
00433                   + 103*std::pow(2*0.93827*pE + pM*pM+
00434                      0.93827*0.93827,-0.165);        //  mb      
00435       fTotalXsc = xsection;
00436       fElasticXsc =  6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
00437     }
00438     else  // pLab < 10 GeV/c
00439     {
00440       if( neutron )      // nn to be pp
00441       {
00442         if( pLab < 0.4 )
00443         {
00444           hnXsc = 23 + 50*( std::pow( std::log(0.73/pLab), 3.5 ) );
00445           fElasticXsc = hnXsc;
00446         }
00447         else if( pLab < 0.73 )
00448         {
00449           hnXsc = 23 + 50*( std::pow( std::log(0.73/pLab), 3.5 ) );
00450           fElasticXsc = hnXsc; 
00451         }
00452         else if( pLab < 1.05  )
00453         {
00454           hnXsc = 23 + 40*(std::log(pLab/0.73))*
00455                          (std::log(pLab/0.73));
00456           fElasticXsc = 23 + 20*(std::log(pLab/0.73))*
00457                          (std::log(pLab/0.73));
00458         }
00459         else    // 1.05 - 10 GeV/c
00460         {
00461           hnXsc = 39.0+75*(pLab - 1.2)/(std::pow(pLab,3.0) + 0.15);
00462 
00463           fElasticXsc =  6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
00464         }
00465         fTotalXsc = hnXsc;
00466       }
00467       if( proton )   // pn to be np
00468       {
00469         if( pLab < 0.02 )
00470         {
00471           hpXsc = 4100+30*std::pow(std::log(1.3/pLab),3.6); // was as pLab < 0.8
00472           fElasticXsc = hpXsc;
00473         }      
00474         else if( pLab < 0.8 )
00475         {
00476           hpXsc = 33+30*std::pow(std::log(pLab/1.3),4.0);
00477           fElasticXsc = hpXsc;
00478         }      
00479         else if( pLab < 1.05 )
00480         {
00481           hpXsc = 33+30*std::pow(std::log(pLab/0.95),2.0);
00482           fElasticXsc =  6 + 52/( std::log(0.511/pLab)*std::log(0.511/pLab) + 1.6 );
00483         }
00484         else if( pLab < 1.4 )
00485         {
00486           hpXsc = 33+30*std::pow(std::log(pLab/0.95),2.0);
00487           fElasticXsc =  6 + 52/( std::log(0.511/pLab)*std::log(0.511/pLab) + 1.6 );
00488         }
00489         else    // 1.4 < pLab < 10.  )
00490         {
00491           hpXsc = 33.3 + 20.8*(std::pow(pLab,2.0) - 1.35)/(std::pow(pLab,2.50) + 0.95);
00492           
00493           fElasticXsc =  6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
00494         }
00495         fTotalXsc = hpXsc;
00496       }
00497     }
00498   } 
00499   else if( theParticle == theProton && pORn ) 
00500   {
00501     if( pLab >= 373.) // pdg due to TOTEM data
00502     {
00503       xsection =  GetHadronNucleonXscPDG(aParticle, nucleon)/millibarn;
00504 
00505       fElasticXsc = 6.5 + 0.308*std::pow(std::log(sMand/400.),1.65) + 9.19*std::pow(sMand,-0.458);
00506      
00507       fTotalXsc = xsection;
00508     }
00509     else if( pLab >= 100.)
00510     {
00511       B0 = 7.5;
00512       A0 = 100. - B0*std::log(3.0e7);
00513 
00514       xsection = A0 + B0*std::log(pE) - 11 + 103*std::pow(sMand,-0.165);        //  mb
00515 
00516       fElasticXsc = 5.53 + 0.308*std::pow(std::log(sMand/28.9),1.1) + 9.19*std::pow(sMand,-0.458);
00517       
00518       fTotalXsc = xsection;
00519     }
00520     else if( pLab >= 10.)
00521     {
00522       B0 = 7.5;
00523       A0 = 100. - B0*std::log(3.0e7);
00524 
00525       xsection = A0 + B0*std::log(pE) - 11 + 103*std::pow(sMand,-0.165);        //  mb
00526 
00527       fElasticXsc =  6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
00528       
00529       fTotalXsc = xsection;
00530     }
00531     else
00532     {
00533       // pp
00534 
00535       if( proton )
00536       {
00537         if( pLab < 0.4 )
00538         {
00539           hpXsc = 23 + 50*( std::pow( std::log(0.73/pLab), 3.5 ) );
00540           fElasticXsc = hpXsc;
00541         }
00542         else if( pLab < 0.73 )
00543         {
00544           hpXsc = 23 + 50*( std::pow( std::log(0.73/pLab), 3.5 ) );
00545           fElasticXsc = hpXsc; 
00546         }
00547         else if( pLab < 1.05  )
00548         {
00549           hpXsc = 23 + 40*(std::log(pLab/0.73))*
00550                          (std::log(pLab/0.73));
00551           fElasticXsc = 23 + 20*(std::log(pLab/0.73))*
00552                          (std::log(pLab/0.73));
00553         }
00554         else    // 1.05 - 10 GeV/c
00555         {
00556           hpXsc = 39.0+75*(pLab - 1.2)/(std::pow(pLab,3.0) + 0.15);
00557 
00558           fElasticXsc =  6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
00559         }
00560         fTotalXsc = hpXsc;
00561       }
00562       if( neutron )     // pn to be np
00563       {
00564         if( pLab < 0.02 )
00565         {
00566           hnXsc = 4100+30*std::pow(std::log(1.3/pLab),3.6); // was as pLab < 0.8
00567           fElasticXsc = hnXsc;
00568         }      
00569         else if( pLab < 0.8 )
00570         {
00571           hnXsc = 33+30*std::pow(std::log(pLab/1.3),4.0);
00572           fElasticXsc = hnXsc;
00573         }      
00574         else if( pLab < 1.05 )
00575         {
00576           hnXsc = 33+30*std::pow(std::log(pLab/0.95),2.0);
00577           fElasticXsc =  6 + 52/( std::log(0.511/pLab)*std::log(0.511/pLab) + 1.6 );
00578         }
00579         else if( pLab < 1.4 )
00580         {
00581           hnXsc = 33+30*std::pow(std::log(pLab/0.95),2.0);
00582           fElasticXsc =  6 + 52/( std::log(0.511/pLab)*std::log(0.511/pLab) + 1.6 );
00583         }
00584         else    // 1.4 < pLab < 10.  )
00585         {
00586           hnXsc = 33.3 + 20.8*(std::pow(pLab,2.0) - 1.35)/(std::pow(pLab,2.50) + 0.95);
00587           
00588           fElasticXsc =  6 + 20/( (logP-0.182)*(logP-0.182) + 1.0 );
00589         }
00590         fTotalXsc = hnXsc;
00591       }
00592     }    
00593   } 
00594   else if( theParticle == theAProton && pORn ) 
00595   {
00596     if( proton )
00597     {
00598       xsection  = 35.45 + B*std::pow(std::log(sMand/s0),2.) 
00599                           + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2);
00600     }
00601     if( neutron ) // ???
00602     {
00603       xsection = 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00604                           + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2);
00605     }
00606     fTotalXsc = xsection;
00607   } 
00608   else if( theParticle == thePiPlus && pORn ) // pi+ /////////////////////////////////////////////
00609   {
00610     if( proton ) // pi+ p
00611     {
00612       if( pLab < 0.28 )
00613       {
00614         hpXsc       = 10./((logP + 1.273)*(logP + 1.273) + 0.05);
00615         fElasticXsc = hpXsc;
00616       }
00617       else if( pLab < 0.4 )
00618       {
00619         hpXsc       = 14./( (logP + 1.273)*(logP + 1.273) + 0.07);
00620         fElasticXsc = hpXsc;
00621       }
00622       else if( pLab < 0.68 )
00623       {
00624         hpXsc       = 14./( (logP + 1.273)*(logP + 1.273) + 0.07);
00625         fElasticXsc = hpXsc;
00626       }
00627       else if( pLab < 0.85 )
00628       {
00629         G4double Ex4 = 88*(std::log(pLab/0.77))*(std::log(pLab/0.77));
00630         hpXsc        = Ex4 + 14.9;
00631         fElasticXsc = hpXsc*std::exp(-3.*(pLab - 0.68));  
00632       }
00633       else if( pLab < 1.15 )
00634       {
00635         G4double Ex4 = 88*(std::log(pLab/0.77))*(std::log(pLab/0.77));
00636         hpXsc        = Ex4 + 14.9;
00637 
00638         fElasticXsc = 6.0 + 1.4/(( pLab - 1.4)*( pLab - 1.4) + 0.1);
00639       }
00640       else if( pLab < 1.4) // ns original
00641       {
00642         G4double Ex1 = 3.2*std::exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
00643         G4double Ex2 = 12*std::exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
00644         hpXsc        = Ex1 + Ex2 + 27.5;
00645         fElasticXsc = 6.0 + 1.4/(( pLab - 1.4)*( pLab - 1.4) + 0.1);
00646       }
00647       else if( pLab < 2.0 ) // ns original
00648       {
00649         G4double Ex1 = 3.2*std::exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
00650         G4double Ex2 = 12*std::exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
00651         hpXsc        = Ex1 + Ex2 + 27.5;
00652         fElasticXsc = 3.0 + 1.36/( (logP - 0.336)*(logP - 0.336) + 0.08);    
00653       }
00654       else if( pLab < 3.5 ) // ns original
00655       {
00656         G4double Ex1 = 3.2*std::exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
00657         G4double Ex2 = 12*std::exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
00658         hpXsc        = Ex1 + Ex2 + 27.5;
00659         fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);    
00660       }
00661       else if( pLab < 200. ) // my
00662       {
00663         hpXsc = 10.6 + 2.*std::log(pE) + 25*std::pow(pE, -0.43 ); // ns original
00664         // hpXsc = GetHadronNucleonXscPDG(aParticle, nucleon )/millibarn;
00665         fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);    
00666       }
00667       else //  pLab > 100 // my
00668       {
00669         hpXsc = GetHadronNucleonXscPDG(aParticle, nucleon )/millibarn;
00670         fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);    
00671       }
00672       fTotalXsc = hpXsc;
00673     }    
00674     if( neutron )  // pi+ n = pi- p??
00675     {
00676       if( pLab < 0.28 ) 
00677       {
00678         hnXsc       = 0.288/((pLab - 0.28)*(pLab - 0.28) + 0.004);
00679         fElasticXsc = 1.8/((logP + 1.273)*(logP + 1.273) + 0.07);
00680       }
00681       else if( pLab < 0.395676 ) // first peak
00682       {
00683         hnXsc       = 0.648/((pLab - 0.28)*(pLab - 0.28) + 0.009);
00684         fElasticXsc = 0.257/((pLab - 0.28)*(pLab - 0.28) + 0.01);
00685        }
00686       else if( pLab < 0.5 )
00687       {
00688         hnXsc       = 26 + 110*(std::log(pLab/0.48))*(std::log(pLab/0.48));
00689         fElasticXsc = 0.37*hnXsc;
00690       }
00691       else if( pLab < 0.65 )
00692       {
00693         hnXsc       = 26 + 110*(std::log(pLab/0.48))*(std::log(pLab/0.48));
00694         fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
00695       }
00696       else if( pLab < 0.72 )
00697       {
00698         hnXsc = 36.1 + 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00699                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00700         fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
00701       }
00702       else if( pLab < 0.88 )
00703       {
00704         hnXsc = 36.1 + 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00705                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00706         fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
00707       }
00708       else if( pLab < 1.03 )
00709       {
00710         hnXsc = 36.1 + 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00711                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00712         fElasticXsc = 2.0 + 0.4/((pLab - 1.03)*(pLab - 1.03) + 0.016);
00713       }
00714       else if( pLab < 1.15 )
00715       {
00716         hnXsc = 36.1 + 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00717                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00718         fElasticXsc = 2.0 + 0.4/((pLab - 1.03)*(pLab - 1.03) + 0.016);
00719       }
00720       else if( pLab < 1.3 )
00721       {
00722         hnXsc = 36.1 + 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00723                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00724         fElasticXsc = 3. + 13./pLab;
00725       }
00726       else if( pLab < 2.6 ) // < 3.0) // ns original
00727       {
00728         hnXsc = 36.1 + 0.079-4.313*std::log(pLab)+
00729                 3*std::exp(-(pLab-2.1)*(pLab-2.1)/0.4/0.4)+
00730                 1.5*std::exp(-(pLab-1.4)*(pLab-1.4)/0.12/0.12);
00731         fElasticXsc = 3. + 13./pLab; 
00732       }
00733       else if( pLab < 20. ) // < 3.0) // ns original
00734       {
00735         hnXsc = 36.1 + 0.079 - 4.313*std::log(pLab)+
00736                 3*std::exp(-(pLab-2.1)*(pLab-2.1)/0.4/0.4)+
00737                 1.5*std::exp(-(pLab-1.4)*(pLab-1.4)/0.12/0.12);
00738         fElasticXsc = 3. + 13./pLab; 
00739       }
00740       else   // mb 
00741       {
00742         hnXsc = GetHadronNucleonXscPDG(aParticle, nucleon )/millibarn;
00743         fElasticXsc = 3. + 13./pLab;
00744       }
00745       fTotalXsc = hnXsc;
00746     }
00747   } 
00748   else if( theParticle == thePiMinus && pORn ) 
00749   {
00750     if( neutron )     // pi- n = pi+ p??
00751     {
00752       if( pLab < 0.28 )
00753       {
00754         hnXsc       = 10./((logP + 1.273)*(logP + 1.273) + 0.05);
00755         fElasticXsc = hnXsc;
00756       }
00757       else if( pLab < 0.4 )
00758       {
00759         hnXsc       = 14./( (logP + 1.273)*(logP + 1.273) + 0.07);
00760         fElasticXsc = hnXsc;
00761       }
00762       else if( pLab < 0.68 )
00763       {
00764         hnXsc       = 14./( (logP + 1.273)*(logP + 1.273) + 0.07);
00765         fElasticXsc = hnXsc;
00766       }
00767       else if( pLab < 0.85 )
00768       {
00769         G4double Ex4 = 88*(std::log(pLab/0.77))*(std::log(pLab/0.77));
00770         hnXsc        = Ex4 + 14.9;
00771         fElasticXsc = hnXsc*std::exp(-3.*(pLab - 0.68));  
00772       }
00773       else if( pLab < 1.15 )
00774       {
00775         G4double Ex4 = 88*(std::log(pLab/0.77))*(std::log(pLab/0.77));
00776         hnXsc        = Ex4 + 14.9;
00777 
00778         fElasticXsc = 6.0 + 1.4/(( pLab - 1.4)*( pLab - 1.4) + 0.1);
00779       }
00780       else if( pLab < 1.4) // ns original
00781       {
00782         G4double Ex1 = 3.2*std::exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
00783         G4double Ex2 = 12*std::exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
00784         hnXsc        = Ex1 + Ex2 + 27.5;
00785         fElasticXsc = 6.0 + 1.4/(( pLab - 1.4)*( pLab - 1.4) + 0.1);
00786       }
00787       else if( pLab < 2.0 ) // ns original
00788       {
00789         G4double Ex1 = 3.2*std::exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
00790         G4double Ex2 = 12*std::exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
00791         hnXsc        = Ex1 + Ex2 + 27.5;
00792         fElasticXsc = 3.0 + 1.36/( (logP - 0.336)*(logP - 0.336) + 0.08);    
00793       }
00794       else if( pLab < 3.5 ) // ns original
00795       {
00796         G4double Ex1 = 3.2*std::exp(-(pLab-2.55)*(pLab-2.55)/0.55/0.55);
00797         G4double Ex2 = 12*std::exp(-(pLab-1.47)*(pLab-1.47)/0.225/0.225);
00798         hnXsc        = Ex1 + Ex2 + 27.5;
00799         fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);    
00800       }
00801       else if( pLab < 200. ) // my
00802       {
00803         hnXsc = 10.6 + 2.*std::log(pE) + 25*std::pow(pE, -0.43 ); // ns original
00804         fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);    
00805       }
00806       else //  pLab > 100 // my
00807       {
00808         hnXsc = GetHadronNucleonXscPDG(aParticle, nucleon )/millibarn;
00809         fElasticXsc = 3.0 + 6.20/( (logP - 0.336)*(logP - 0.336) + 0.8);    
00810       }
00811       fTotalXsc = hnXsc;
00812     }
00813     if( proton )    // pi- p
00814     {
00815       if( pLab < 0.28 ) 
00816       {
00817         hpXsc       = 0.288/((pLab - 0.28)*(pLab - 0.28) + 0.004);
00818         fElasticXsc = 1.8/((logP + 1.273)*(logP + 1.273) + 0.07);
00819       }
00820       else if( pLab < 0.395676 ) // first peak
00821       {
00822         hpXsc       = 0.648/((pLab - 0.28)*(pLab - 0.28) + 0.009);
00823         fElasticXsc = 0.257/((pLab - 0.28)*(pLab - 0.28) + 0.01);
00824        }
00825       else if( pLab < 0.5 )
00826       {
00827         hpXsc       = 26 + 110*(std::log(pLab/0.48))*(std::log(pLab/0.48));
00828         fElasticXsc = 0.37*hpXsc;
00829       }
00830       else if( pLab < 0.65 )
00831       {
00832         hpXsc       = 26 + 110*(std::log(pLab/0.48))*(std::log(pLab/0.48));
00833         fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
00834       }
00835       else if( pLab < 0.72 )
00836       {
00837         hpXsc = 36.1+
00838                 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00839                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00840         fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
00841       }
00842       else if( pLab < 0.88 )
00843       {
00844         hpXsc = 36.1+
00845                 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00846                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00847         fElasticXsc = 0.95/((pLab - 0.72)*(pLab - 0.72) + 0.049);
00848       }
00849       else if( pLab < 1.03 )
00850       {
00851         hpXsc = 36.1+
00852                 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00853                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00854         fElasticXsc = 2.0 + 0.4/((pLab - 1.03)*(pLab - 1.03) + 0.016);
00855       }
00856       else if( pLab < 1.15 )
00857       {
00858         hpXsc = 36.1+
00859                 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00860                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00861         fElasticXsc = 2.0 + 0.4/((pLab - 1.03)*(pLab - 1.03) + 0.016);
00862       }
00863       else if( pLab < 1.3 )
00864       {
00865         hpXsc = 36.1+
00866                 10*std::exp(-(pLab-0.72)*(pLab-0.72)/0.06/0.06)+
00867                 24*std::exp(-(pLab-1.015)*(pLab-1.015)/0.075/0.075);
00868         fElasticXsc = 3. + 13./pLab;
00869       }
00870       else if( pLab < 2.6 ) // < 3.0) // ns original
00871       {
00872         hpXsc = 36.1+0.079-4.313*std::log(pLab)+
00873                 3*std::exp(-(pLab-2.1)*(pLab-2.1)/0.4/0.4)+
00874                 1.5*std::exp(-(pLab-1.4)*(pLab-1.4)/0.12/0.12);
00875         fElasticXsc = 3. +13./pLab; // *std::log(pLab*6.79);
00876       }
00877       else   // mb
00878       {
00879         hpXsc = GetHadronNucleonXscPDG(aParticle, nucleon )/millibarn;
00880         fElasticXsc = 3. + 13./pLab;
00881       }
00882       fTotalXsc = hpXsc;
00883     }
00884   } 
00885   else if( theParticle == theKPlus && pORn ) 
00886   {
00887     if( proton )
00888     {
00889       xsection  = 17.91 + B*std::pow(std::log(sMand/s0),2.) 
00890                           + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2);
00891     }
00892     if( neutron )
00893     {
00894       xsection = 17.87 + B*std::pow(std::log(sMand/s0),2.) 
00895                           + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2);
00896     }
00897     fTotalXsc = xsection;
00898   } 
00899   else if( theParticle == theKMinus && pORn ) 
00900   {
00901     if( proton )
00902     {
00903       xsection  = 17.91 + B*std::pow(std::log(sMand/s0),2.) 
00904                           + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2);
00905     }
00906     if( neutron )
00907     {
00908       xsection = 17.87 + B*std::pow(std::log(sMand/s0),2.) 
00909                           + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2);
00910     }
00911     fTotalXsc = xsection;
00912   }
00913   else if( theParticle == theSMinus && pORn ) 
00914   {
00915     xsection  = 35.20 + B*std::pow(std::log(sMand/s0),2.) 
00916                           - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2);
00917   } 
00918   else if( theParticle == theGamma && pORn ) // modify later on
00919   {
00920     xsection  = 0.0 + B*std::pow(std::log(sMand/s0),2.) 
00921                           + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2);
00922     fTotalXsc = xsection;   
00923   } 
00924   else  // other then p,n,pi+,pi-,K+,K- as proton ??? 
00925   {
00926     if( proton )
00927     {
00928       xsection  = 35.45 + B*std::pow(std::log(sMand/s0),2.) 
00929                           + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2);
00930     }
00931     if( neutron )
00932     {
00933       xsection += 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00934                           + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2);
00935     }
00936     fTotalXsc = xsection;
00937   } 
00938   fTotalXsc   *= millibarn; // parametrised in mb
00939   fElasticXsc *= millibarn; // parametrised in mb
00940 
00941   if( proton && aParticle->GetDefinition()->GetPDGCharge() > 0. )
00942   {
00943     G4double cB = GetCoulombBarrier(aParticle, nucleon);
00944     fTotalXsc   *= cB;
00945     fElasticXsc *= cB; 
00946   }
00947   fInelasticXsc = fTotalXsc - fElasticXsc;
00948   if( fInelasticXsc < 0. ) fInelasticXsc = 0.;
00949 
00950   // G4cout<<fTotalXsc/millibarn<<"; "<<fElasticXsc/millibarn<<"; "<<fInelasticXsc/millibarn<<G4endl;
00951 
00952   return fTotalXsc;
00953 }

G4double G4HadronNucleonXsc::GetHadronNucleonXscPDG ( const G4DynamicParticle ,
const G4ParticleDefinition  
)

Definition at line 219 of file G4HadronNucleonXsc.cc.

References CalcMandelstamS(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMass(), G4DynamicParticle::GetMomentum(), neutron, G4InuclParticleNames::proton, and G4InuclParticleNames::s0.

Referenced by G4BGGPionInelasticXS::BuildPhysicsTable(), G4BGGPionElasticXS::BuildPhysicsTable(), G4BGGNucleonInelasticXS::BuildPhysicsTable(), G4BGGNucleonElasticXS::BuildPhysicsTable(), G4NeutronInelasticXS::GetElementCrossSection(), G4NeutronElasticXS::GetElementCrossSection(), GetHadronNucleonXscNS(), G4BGGPionInelasticXS::GetIsoCrossSection(), G4BGGPionElasticXS::GetIsoCrossSection(), G4BGGNucleonInelasticXS::GetIsoCrossSection(), and G4BGGNucleonElasticXS::GetIsoCrossSection().

00221 {
00222   G4double xsection(0);
00223   G4int Zt=1, Nt=1, At=1;
00224 
00225    G4double targ_mass = 0.939*GeV;  // ~mean neutron and proton ???
00226 
00227   G4double proj_mass     = aParticle->GetMass(); 
00228   G4double proj_momentum = aParticle->GetMomentum().mag();
00229 
00230   G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum );
00231 
00232   sMand         /= GeV*GeV;  // in GeV for parametrisation
00233 
00234   // General PDG fit constants
00235 
00236   G4double s0   = 5.38*5.38; // in Gev^2
00237   G4double eta1 = 0.458;
00238   G4double eta2 = 0.458;
00239   G4double B    = 0.308;
00240 
00241   const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
00242 
00243   G4bool pORn = (nucleon == theProton || nucleon == theNeutron  );  
00244   G4bool proton = (nucleon == theProton);
00245   G4bool neutron = (nucleon == theNeutron);
00246   
00247   if(theParticle == theNeutron) // proton-neutron fit 
00248   {
00249     if ( proton )
00250     {
00251       xsection = Zt*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00252                  + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));// on p
00253     }
00254     if ( neutron )
00255     {
00256       xsection  = Nt*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 
00257                       + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // on n pp for nn
00258     }
00259   } 
00260   else if(theParticle == theProton) 
00261   {
00262     if ( proton )
00263     {      
00264       xsection  = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 
00265                           + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2));
00266     }
00267     if ( neutron )
00268     {
00269       xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00270                           + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
00271     }
00272   } 
00273   else if(theParticle == theAProton) 
00274   {
00275     if ( proton )
00276     {      
00277       xsection  = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 
00278                           + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2));
00279     }
00280     if ( neutron )
00281     {
00282       xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00283                           + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2));
00284     }
00285   } 
00286   else if(theParticle == thePiPlus && pORn ) 
00287   {
00288     xsection  = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.) 
00289                           + 19.24*std::pow(sMand,-eta1) - 6.03*std::pow(sMand,-eta2));
00290   } 
00291   else if(theParticle == thePiMinus && pORn ) 
00292   {
00293     xsection  = At*( 20.86 + B*std::pow(std::log(sMand/s0),2.) 
00294                           + 19.24*std::pow(sMand,-eta1) + 6.03*std::pow(sMand,-eta2));
00295   } 
00296   else if(theParticle == theKPlus) 
00297   {
00298     if ( proton )
00299     {      
00300       xsection  = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.) 
00301                           + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2));
00302     }
00303     if ( neutron )
00304     {
00305       xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.) 
00306                           + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2));
00307     }
00308   } 
00309   else if(theParticle == theKMinus) 
00310   {
00311     if ( proton )
00312     {      
00313       xsection  = Zt*( 17.91 + B*std::pow(std::log(sMand/s0),2.) 
00314                           + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2));
00315     }
00316     if ( neutron )
00317     {
00318       xsection = Nt*( 17.87 + B*std::pow(std::log(sMand/s0),2.) 
00319                           + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2) );
00320     }
00321   }
00322   else if(theParticle == theSMinus && pORn ) 
00323   {
00324     xsection  = At*( 35.20 + B*std::pow(std::log(sMand/s0),2.) 
00325                           - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2) );
00326   } 
00327   else if(theParticle == theGamma && pORn ) // modify later on
00328   {
00329     xsection  = At*( 0.0 + B*std::pow(std::log(sMand/s0),2.) 
00330                           + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2) );
00331    
00332   } 
00333   else  // as proton ??? 
00334   {
00335     if ( proton )
00336     {      
00337       xsection  = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 
00338                        + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2) );
00339     }
00340     if ( neutron )
00341     {
00342       xsection = Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 
00343                       + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2));
00344     }
00345   } 
00346   xsection *= millibarn; // parametrised in mb
00347 
00348   fTotalXsc     = xsection;
00349   fInelasticXsc = 0.75*xsection;
00350   fElasticXsc   = fTotalXsc - fInelasticXsc;
00351   if (fElasticXsc < 0.) fElasticXsc = 0.;
00352 
00353   return xsection;
00354 }

G4double G4HadronNucleonXsc::GetHadronNucleonXscVU ( const G4DynamicParticle ,
const G4ParticleDefinition  
)

Definition at line 961 of file G4HadronNucleonXsc.cc.

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

00963 {
00964   G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding();
00965   G4int absPDGcode = std::abs(PDGcode);
00966   G4double Elab = aParticle->GetTotalEnergy();              
00967                           // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV;
00968   G4double Plab = aParticle->GetMomentum().mag();            
00969                           // std::sqrt(Elab * Elab - 0.88);
00970 
00971   Elab /= GeV;
00972   Plab /= GeV;
00973 
00974   G4double LogPlab = std::log( Plab );
00975   G4double sqrLogPlab = LogPlab * LogPlab;
00976 
00977   G4bool pORn = (nucleon == theProton || nucleon == theNeutron  );  
00978   G4bool proton = (nucleon == theProton);
00979   G4bool neutron = (nucleon == theNeutron);
00980 
00981    
00982   if( absPDGcode > 1000 && pORn )  //------Projectile is baryon -
00983   {
00984     if(proton)
00985     {
00986       fTotalXsc   = 48.0 +  0. *std::pow(Plab, 0.  ) + 0.522*sqrLogPlab - 4.51*LogPlab;
00987       fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
00988     }
00989     if(neutron)
00990     {    
00991       fTotalXsc   = 47.3 +  0. *std::pow(Plab, 0.  ) + 0.513*sqrLogPlab - 4.27*LogPlab;
00992       fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
00993     }
00994   }
00995   else if( PDGcode ==  211  && pORn )  //------Projectile is PionPlus ----
00996   {
00997     if(proton)
00998     {
00999       fTotalXsc  = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
01000       fElasticXsc =  0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
01001     }
01002     if(neutron)
01003     {    
01004       fTotalXsc   =  33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
01005       fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
01006     }
01007   }
01008   else if( PDGcode == -211  && pORn )  //------Projectile is PionMinus ----
01009   {
01010     if(proton)
01011     {
01012       fTotalXsc   = 33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab;
01013       fElasticXsc = 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab;
01014     }
01015     if(neutron)
01016     {    
01017       fTotalXsc   = 16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab;
01018       fElasticXsc =  0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab;
01019     }
01020   }
01021   else if( PDGcode ==  111  && pORn )  //------Projectile is PionZero  --
01022   {
01023     if(proton)
01024     {
01025       fTotalXsc   = (16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab +   //Pi+
01026                         33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab)/2; //Pi-
01027 
01028       fElasticXsc = ( 0.0 + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab +    //Pi+
01029                          1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
01030 
01031     }
01032     if(neutron)
01033     {    
01034       fTotalXsc   = (33.0 + 14.0 *std::pow(Plab,-1.36) + 0.456*sqrLogPlab - 4.03*LogPlab +   //Pi+
01035                         16.4 + 19.3 *std::pow(Plab,-0.42) + 0.19 *sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
01036       fElasticXsc = ( 1.76 + 11.2*std::pow(Plab,-0.64) + 0.043*sqrLogPlab - 0.0 *LogPlab +   //Pi+
01037                          0.0  + 11.4*std::pow(Plab,-0.40) + 0.079*sqrLogPlab - 0.0 *LogPlab)/2; //Pi-
01038     }
01039   }
01040   else if( PDGcode == 321  && pORn )    //------Projectile is KaonPlus --
01041   {
01042     if(proton)
01043     {
01044       fTotalXsc   = 18.1 +  0. *std::pow(Plab, 0.  ) + 0.26 *sqrLogPlab - 1.0 *LogPlab;
01045       fElasticXsc =  5.0 +  8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab;
01046     }
01047     if(neutron)
01048     {    
01049       fTotalXsc   = 18.7 +  0. *std::pow(Plab, 0.  ) + 0.21 *sqrLogPlab - 0.89*LogPlab;
01050       fElasticXsc =  7.3 +  0. *std::pow(Plab,-0.  ) + 0.29 *sqrLogPlab - 2.4 *LogPlab;
01051     }
01052   }
01053   else if( PDGcode ==-321  && pORn )  //------Projectile is KaonMinus ----
01054   {
01055     if(proton)
01056     {
01057       fTotalXsc   = 32.1 +  0. *std::pow(Plab, 0.  ) + 0.66*sqrLogPlab - 5.6*LogPlab;
01058       fElasticXsc =  7.3 +  0. *std::pow(Plab,-0.  ) + 0.29*sqrLogPlab - 2.4*LogPlab;
01059     }
01060     if(neutron)
01061     {    
01062       fTotalXsc   = 25.2 +  0. *std::pow(Plab, 0.  ) + 0.38*sqrLogPlab - 2.9*LogPlab;
01063       fElasticXsc =  5.0 +  8.1*std::pow(Plab,-1.8 ) + 0.16*sqrLogPlab - 1.3*LogPlab;
01064     }
01065   }
01066   else if( PDGcode == 311  && pORn )  //------Projectile is KaonZero -----
01067   {
01068     if(proton)
01069     {
01070       fTotalXsc   = ( 18.1 +  0. *std::pow(Plab, 0.  ) + 0.26 *sqrLogPlab - 1.0 *LogPlab +   //K+
01071                         32.1 +  0. *std::pow(Plab, 0.  ) + 0.66 *sqrLogPlab - 5.6 *LogPlab)/2; //K-
01072       fElasticXsc = (  5.0 +  8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab +   //K+
01073                          7.3 +  0. *std::pow(Plab,-0.  ) + 0.29 *sqrLogPlab - 2.4 *LogPlab)/2; //K-
01074     }
01075     if(neutron)
01076     {    
01077       fTotalXsc   = ( 18.7 +  0. *std::pow(Plab, 0.  ) + 0.21 *sqrLogPlab - 0.89*LogPlab +   //K+
01078                          25.2 +  0. *std::pow(Plab, 0.  ) + 0.38 *sqrLogPlab - 2.9 *LogPlab)/2; //K-
01079       fElasticXsc = (  7.3 +  0. *std::pow(Plab,-0.  ) + 0.29 *sqrLogPlab - 2.4 *LogPlab +   //K+
01080                          5.0 +  8.1*std::pow(Plab,-1.8 ) + 0.16 *sqrLogPlab - 1.3 *LogPlab)/2; //K-
01081     }
01082   }
01083   else  //------Projectile is undefined, Nucleon assumed
01084   {
01085     if(proton)
01086     {
01087       fTotalXsc   = 48.0 +  0. *std::pow(Plab, 0.  ) + 0.522*sqrLogPlab - 4.51*LogPlab;
01088       fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
01089     }
01090     if(neutron)
01091     {    
01092       fTotalXsc   = 47.3 +  0. *std::pow(Plab, 0.  ) + 0.513*sqrLogPlab - 4.27*LogPlab;
01093       fElasticXsc = 11.9 + 26.9*std::pow(Plab,-1.21) + 0.169*sqrLogPlab - 1.85*LogPlab;
01094     }
01095   }
01096   fTotalXsc   *= millibarn;
01097   fElasticXsc *= millibarn;
01098   fInelasticXsc   = fTotalXsc - fElasticXsc;
01099   if (fInelasticXsc < 0.) fInelasticXsc = 0.;
01100 
01101   return fTotalXsc;    
01102 }

G4double G4HadronNucleonXsc::GetInelasticHadronNucleonXsc (  )  [inline]

Definition at line 90 of file G4HadronNucleonXsc.hh.

Referenced by G4BGGPionInelasticXS::BuildPhysicsTable(), G4BGGNucleonInelasticXS::BuildPhysicsTable(), G4NeutronInelasticXS::GetElementCrossSection(), G4GlauberGribovCrossSection::GetIsoCrossSection(), G4ComponentGGHadronNucleusXsc::GetIsoCrossSection(), G4BGGPionInelasticXS::GetIsoCrossSection(), G4BGGNucleonInelasticXS::GetIsoCrossSection(), G4GGNuclNuclCrossSection::GetZandACrossSection(), and G4ComponentGGNuclNuclXsc::GetZandACrossSection().

00090 { return fInelasticXsc; }; 

G4double G4HadronNucleonXsc::GetKmNeutronTotXscVector ( G4double  logEnergy  )  [inline]

Definition at line 97 of file G4HadronNucleonXsc.hh.

References G4PhysicsVector::Value().

Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().

00097 { return fKmNeutronTotXscVector.Value(logEnergy); };

G4double G4HadronNucleonXsc::GetKmProtonTotXscVector ( G4double  logEnergy  )  [inline]

Definition at line 96 of file G4HadronNucleonXsc.hh.

References G4PhysicsVector::Value().

Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().

00096 { return fKmProtonTotXscVector.Value(logEnergy); };

G4double G4HadronNucleonXsc::GetKpNeutronTotXscVector ( G4double  logEnergy  )  [inline]

Definition at line 95 of file G4HadronNucleonXsc.hh.

References G4PhysicsVector::Value().

Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().

00095 { return fKpNeutronTotXscVector.Value(logEnergy); };

G4double G4HadronNucleonXsc::GetKpProtonTotXscVector ( G4double  logEnergy  )  [inline]

Definition at line 94 of file G4HadronNucleonXsc.hh.

References G4PhysicsVector::Value().

Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().

00094 { return fKpProtonTotXscVector.Value(logEnergy); };

G4double G4HadronNucleonXsc::GetTotalHadronNucleonXsc (  )  [inline]

Definition at line 88 of file G4HadronNucleonXsc.hh.

00088 { return fTotalXsc;     }; 

void G4HadronNucleonXsc::InitialiseKaonNucleonTotXsc (  ) 

Definition at line 1192 of file G4HadronNucleonXsc.cc.

References G4LPhysicsFreeVector::PutValues(), and G4PhysicsVector::SetSpline().

Referenced by G4HadronNucleonXsc().

01193 {
01194   G4int i = 0, iMax;
01195   G4double tmpxsc[106];
01196 
01197   // Kp-proton tot xsc
01198 
01199   iMax = 66;
01200   fKpProtonTotXscVector = G4LPhysicsFreeVector(iMax, fKpProtonTotTkin[0], fKpProtonTotTkin[iMax-1]);
01201   fKpProtonTotXscVector.SetSpline(true);
01202 
01203   for( i = 0; i < iMax; i++)
01204   {
01205     tmpxsc[i] = 0.;
01206 
01207     if( i == 0 || i == iMax-1 ) tmpxsc[i] = fKpProtonTotXsc[i];
01208     else                        tmpxsc[i] = 0.5*(fKpProtonTotXsc[i-1]+fKpProtonTotXsc[i+1]);
01209 
01210     fKpProtonTotXscVector.PutValues(size_t(i), fKpProtonTotTkin[i], tmpxsc[i]*millibarn);
01211   }
01212 
01213   // Kp-neutron tot xsc
01214 
01215   iMax = 75;
01216   fKpNeutronTotXscVector = G4LPhysicsFreeVector(iMax, fKpNeutronTotTkin[0], fKpNeutronTotTkin[iMax-1]);
01217   fKpNeutronTotXscVector.SetSpline(true);
01218 
01219   for( i = 0; i < iMax; i++)
01220   {
01221     tmpxsc[i] = 0.;
01222     if( i == 0 || i == iMax-1 ) tmpxsc[i] = fKpNeutronTotXsc[i];
01223     else                        tmpxsc[i] = 0.5*(fKpNeutronTotXsc[i-1]+fKpNeutronTotXsc[i+1]);
01224 
01225     fKpNeutronTotXscVector.PutValues(size_t(i), fKpNeutronTotTkin[i], tmpxsc[i]*millibarn);
01226   }
01227 
01228   // Km-proton tot xsc
01229 
01230   iMax = 106;
01231   fKmProtonTotXscVector = G4LPhysicsFreeVector(iMax, fKmProtonTotTkin[0], fKmProtonTotTkin[iMax-1]);
01232   fKmProtonTotXscVector.SetSpline(true);
01233 
01234   for( i = 0; i < iMax; i++)
01235   {
01236     tmpxsc[i] = 0.;
01237 
01238     if( i == 0 || i == iMax-1 ) tmpxsc[i] = fKmProtonTotXsc[i];
01239     else                        tmpxsc[i] = 0.5*(fKmProtonTotXsc[i-1]+fKmProtonTotXsc[i+1]);
01240 
01241     fKmProtonTotXscVector.PutValues(size_t(i), fKmProtonTotTkin[i], tmpxsc[i]*millibarn);
01242   }
01243 
01244   // Km-neutron tot xsc
01245 
01246   iMax = 68;
01247   fKmNeutronTotXscVector = G4LPhysicsFreeVector(iMax, fKmNeutronTotTkin[0], fKmNeutronTotTkin[iMax-1]);
01248   fKmNeutronTotXscVector.SetSpline(true);
01249 
01250   for( i = 0; i < iMax; i++)
01251   {
01252     tmpxsc[i] = 0.;
01253     if( i == 0 || i == iMax-1 ) tmpxsc[i] = fKmNeutronTotXsc[i];
01254     else                        tmpxsc[i] = 0.5*(fKmNeutronTotXsc[i-1]+fKmNeutronTotXsc[i+1]);
01255 
01256     fKmNeutronTotXscVector.PutValues(size_t(i), fKmNeutronTotTkin[i], tmpxsc[i]*millibarn);
01257   }
01258 }

G4bool G4HadronNucleonXsc::IsApplicable ( const G4DynamicParticle aDP,
const G4Element  
) [virtual]

Definition at line 93 of file G4HadronNucleonXsc.cc.

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

00095 {
00096   G4int Z = G4lrint(anElement->GetZ());
00097   G4int A = G4lrint(anElement->GetN());
00098   return IsIsoApplicable(aDP, Z, A);
00099 } 

G4bool G4HadronNucleonXsc::IsIsoApplicable ( const G4DynamicParticle aDP,
G4int  Z,
G4int  A 
) [virtual]

Definition at line 105 of file G4HadronNucleonXsc.cc.

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

Referenced by IsApplicable().

00107 {
00108   G4bool applicable = false;
00109   // G4int baryonNumber     = aDP->GetDefinition()->GetBaryonNumber();
00110   G4double kineticEnergy = aDP->GetKineticEnergy();
00111 
00112   const G4ParticleDefinition* theParticle = aDP->GetDefinition();
00113  
00114   if ( ( kineticEnergy  >= fLowerLimit &&
00115          Z > 1 &&      // >=  He
00116        ( theParticle == theAProton   ||
00117          theParticle == theGamma     ||
00118          theParticle == theKPlus     ||
00119          theParticle == theKMinus    || 
00120          theParticle == theSMinus)      )    ||  
00121 
00122        ( kineticEnergy  >= 0.1*fLowerLimit &&
00123          Z > 1 &&      // >=  He
00124        ( theParticle == theProton    ||
00125          theParticle == theNeutron   ||   
00126          theParticle == thePiPlus    ||
00127          theParticle == thePiMinus       ) )    ) applicable = true;
00128 
00129   return applicable;
00130 }


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