#include <G4HadronNucleonXsc.hh>
Definition at line 51 of file G4HadronNucleonXsc.hh.
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] |
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] |
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] |
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().
Definition at line 97 of file G4HadronNucleonXsc.hh.
References G4PhysicsVector::Value().
Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().
00097 { return fKmNeutronTotXscVector.Value(logEnergy); };
Definition at line 96 of file G4HadronNucleonXsc.hh.
References G4PhysicsVector::Value().
Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().
00096 { return fKmProtonTotXscVector.Value(logEnergy); };
Definition at line 95 of file G4HadronNucleonXsc.hh.
References G4PhysicsVector::Value().
Referenced by G4GlauberGribovCrossSection::GetKaonNucleonXscVector(), and G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector().
00095 { return fKpNeutronTotXscVector.Value(logEnergy); };
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] |
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 }