#include <G4ComponentGGHadronNucleusXsc.hh>
Inheritance diagram for G4ComponentGGHadronNucleusXsc:
Definition at line 51 of file G4ComponentGGHadronNucleusXsc.hh.
G4ComponentGGHadronNucleusXsc::G4ComponentGGHadronNucleusXsc | ( | ) |
Definition at line 44 of file G4ComponentGGHadronNucleusXsc.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(), 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().
00045 : G4VComponentCrossSection("Glauber-Gribov"), 00046 fUpperLimit(100000*GeV), fLowerLimit(10.*MeV),// fLowerLimit(3*GeV), 00047 fRadiusConst(1.08*fermi), // 1.1, 1.3 ? 00048 fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0), 00049 fDiffractionXsc(0.0), fHadronNucleonXsc(0.0) 00050 { 00051 theGamma = G4Gamma::Gamma(); 00052 theProton = G4Proton::Proton(); 00053 theNeutron = G4Neutron::Neutron(); 00054 theAProton = G4AntiProton::AntiProton(); 00055 theANeutron = G4AntiNeutron::AntiNeutron(); 00056 thePiPlus = G4PionPlus::PionPlus(); 00057 thePiMinus = G4PionMinus::PionMinus(); 00058 thePiZero = G4PionZero::PionZero(); 00059 theKPlus = G4KaonPlus::KaonPlus(); 00060 theKMinus = G4KaonMinus::KaonMinus(); 00061 theK0S = G4KaonZeroShort::KaonZeroShort(); 00062 theK0L = G4KaonZeroLong::KaonZeroLong(); 00063 theL = G4Lambda::Lambda(); 00064 theAntiL = G4AntiLambda::AntiLambda(); 00065 theSPlus = G4SigmaPlus::SigmaPlus(); 00066 theASPlus = G4AntiSigmaPlus::AntiSigmaPlus(); 00067 theSMinus = G4SigmaMinus::SigmaMinus(); 00068 theASMinus = G4AntiSigmaMinus::AntiSigmaMinus(); 00069 theS0 = G4SigmaZero::SigmaZero(); 00070 theAS0 = G4AntiSigmaZero::AntiSigmaZero(); 00071 theXiMinus = G4XiMinus::XiMinus(); 00072 theXi0 = G4XiZero::XiZero(); 00073 theAXiMinus = G4AntiXiMinus::AntiXiMinus(); 00074 theAXi0 = G4AntiXiZero::AntiXiZero(); 00075 theOmega = G4OmegaMinus::OmegaMinus(); 00076 theAOmega = G4AntiOmegaMinus::AntiOmegaMinus(); 00077 theD = G4Deuteron::Deuteron(); 00078 theT = G4Triton::Triton(); 00079 theA = G4Alpha::Alpha(); 00080 theHe3 = G4He3::He3(); 00081 00082 hnXsc = new G4HadronNucleonXsc(); 00083 }
G4ComponentGGHadronNucleusXsc::~G4ComponentGGHadronNucleusXsc | ( | ) | [virtual] |
G4double G4ComponentGGHadronNucleusXsc::CalcMandelstamS | ( | const | G4double, | |
const | G4double, | |||
const | G4double | |||
) |
Definition at line 1428 of file G4ComponentGGHadronNucleusXsc.cc.
Referenced by GetHadronNucleonXsc(), GetHadronNucleonXscNS(), and GetHadronNucleonXscPDG().
01431 { 01432 G4double Elab = std::sqrt ( mp * mp + Plab * Plab ); 01433 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ; 01434 01435 return sMand; 01436 }
G4double G4ComponentGGHadronNucleusXsc::CalculateEcmValue | ( | const | G4double, | |
const | G4double, | |||
const | G4double | |||
) |
Definition at line 1412 of file G4ComponentGGHadronNucleusXsc.cc.
01415 { 01416 G4double Elab = std::sqrt ( mp * mp + Plab * Plab ); 01417 G4double Ecm = std::sqrt ( mp * mp + mt * mt + 2 * Elab * mt ); 01418 // G4double Pcm = Plab * mt / Ecm; 01419 // G4double KEcm = std::sqrt ( Pcm * Pcm + mp * mp ) - mp; 01420 01421 return Ecm ; // KEcm; 01422 }
G4double G4ComponentGGHadronNucleusXsc::ComputeQuasiElasticRatio | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4int | A | |||
) | [virtual] |
Reimplemented from G4VComponentCrossSection.
Definition at line 180 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00183 { 00184 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00185 kinEnergy); 00186 fTotalXsc = GetIsoCrossSection(aDP, Z, A); 00187 delete aDP; 00188 G4double ratio = 0.; 00189 00190 if(fInelasticXsc > 0.) 00191 { 00192 ratio = (fInelasticXsc - fProductionXsc)/fInelasticXsc; 00193 if(ratio < 0.) ratio = 0.; 00194 } 00195 return ratio; 00196 }
void G4ComponentGGHadronNucleusXsc::CrossSectionDescription | ( | std::ostream & | ) | const [virtual] |
Definition at line 1442 of file G4ComponentGGHadronNucleusXsc.cc.
01443 { 01444 outFile << "G4ComponentGGHadronNucleusXsc calculates total, inelastic and\n" 01445 << "elastic cross sections for hadron-nucleus cross sections using\n" 01446 << "the Glauber model with Gribov corrections. It is valid for all\n" 01447 << "targets except hydrogen, and for incident p, pbar, n, sigma-,\n" 01448 << "pi+, pi-, K+, K- and gammas with energies above 3 GeV. This is\n" 01449 << "a cross section component which is to be used to build a cross\n" 01450 << "data set.\n"; 01451 }
G4double G4ComponentGGHadronNucleusXsc::GetDiffractionGlauberGribovXsc | ( | ) | [inline] |
G4double G4ComponentGGHadronNucleusXsc::GetElasticElementCrossSection | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4double | A | |||
) | [virtual] |
Implements G4VComponentCrossSection.
Definition at line 152 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00155 { 00156 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00157 kinEnergy); 00158 fTotalXsc = GetIsoCrossSection(aDP, Z, G4int(A)); 00159 delete aDP; 00160 00161 return fElasticXsc; 00162 }
G4double G4ComponentGGHadronNucleusXsc::GetElasticGlauberGribov | ( | const G4DynamicParticle * | , | |
G4int | Z, | |||
G4int | A | |||
) | [inline] |
Definition at line 211 of file G4ComponentGGHadronNucleusXsc.hh.
References GetIsoCrossSection().
00213 { 00214 GetIsoCrossSection(dp, Z, A); 00215 return fElasticXsc; 00216 }
G4double G4ComponentGGHadronNucleusXsc::GetElasticGlauberGribovXsc | ( | ) | [inline] |
G4double G4ComponentGGHadronNucleusXsc::GetElasticIsotopeCrossSection | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4int | A | |||
) | [virtual] |
Implements G4VComponentCrossSection.
Definition at line 166 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00169 { 00170 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00171 kinEnergy); 00172 fTotalXsc = GetIsoCrossSection(aDP, Z, A); 00173 delete aDP; 00174 00175 return fElasticXsc; 00176 }
G4double G4ComponentGGHadronNucleusXsc::GetHadronNucleonXsc | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 460 of file G4ComponentGGHadronNucleusXsc.cc.
References CalcMandelstamS(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMass(), and G4DynamicParticle::GetMomentum().
00462 { 00463 G4double xsection; 00464 00465 //G4double targ_mass = G4NucleiProperties::GetNuclearMass(At, Zt); 00466 00467 G4double targ_mass = 0.939*GeV; // ~mean neutron and proton ??? 00468 00469 G4double proj_mass = aParticle->GetMass(); 00470 G4double proj_momentum = aParticle->GetMomentum().mag(); 00471 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum ); 00472 00473 sMand /= GeV*GeV; // in GeV for parametrisation 00474 proj_momentum /= GeV; 00475 00476 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 00477 00478 G4double aa = At; 00479 00480 if(theParticle == theGamma) 00481 { 00482 xsection = aa*(0.0677*std::pow(sMand,0.0808) + 0.129*std::pow(sMand,-0.4525)); 00483 } 00484 else if(theParticle == theNeutron) // as proton ??? 00485 { 00486 xsection = aa*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525)); 00487 } 00488 else if(theParticle == theProton) 00489 { 00490 xsection = aa*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525)); 00491 // xsection = At*( 49.51*std::pow(sMand,-0.097) + 0.314*std::log(sMand)*std::log(sMand) ); 00492 // xsection = At*( 38.4 + 0.85*std::abs(std::pow(log(sMand),1.47)) ); 00493 } 00494 else if(theParticle == theAProton) 00495 { 00496 xsection = aa*( 21.70*std::pow(sMand,0.0808) + 98.39*std::pow(sMand,-0.4525)); 00497 } 00498 else if(theParticle == thePiPlus) 00499 { 00500 xsection = aa*(13.63*std::pow(sMand,0.0808) + 27.56*std::pow(sMand,-0.4525)); 00501 } 00502 else if(theParticle == thePiMinus) 00503 { 00504 // xsection = At*( 55.2*std::pow(sMand,-0.255) + 0.346*std::log(sMand)*std::log(sMand) ); 00505 xsection = aa*(13.63*std::pow(sMand,0.0808) + 36.02*std::pow(sMand,-0.4525)); 00506 } 00507 else if(theParticle == theKPlus) 00508 { 00509 xsection = aa*(11.82*std::pow(sMand,0.0808) + 8.15*std::pow(sMand,-0.4525)); 00510 } 00511 else if(theParticle == theKMinus) 00512 { 00513 xsection = aa*(11.82*std::pow(sMand,0.0808) + 26.36*std::pow(sMand,-0.4525)); 00514 } 00515 else // as proton ??? 00516 { 00517 xsection = aa*(21.70*std::pow(sMand,0.0808) + 56.08*std::pow(sMand,-0.4525)); 00518 } 00519 xsection *= millibarn; 00520 return xsection; 00521 }
G4double G4ComponentGGHadronNucleusXsc::GetHadronNucleonXsc | ( | const G4DynamicParticle * | , | |
const G4Element * | ||||
) |
Definition at line 443 of file G4ComponentGGHadronNucleusXsc.cc.
References G4lrint(), G4Element::GetN(), and G4Element::GetZ().
00445 { 00446 G4int At = G4lrint(anElement->GetN()); // number of nucleons 00447 G4int Zt = G4lrint(anElement->GetZ()); // number of protons 00448 00449 return GetHadronNucleonXsc(aParticle, At, Zt); 00450 }
G4double G4ComponentGGHadronNucleusXsc::GetHadronNucleonXscNS | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 682 of file G4ComponentGGHadronNucleusXsc.cc.
References CalcMandelstamS(), G4DynamicParticle::GetDefinition(), GetHadronNucleonXscPDG(), G4DynamicParticle::GetMass(), G4DynamicParticle::GetMomentum(), G4ParticleTable::GetParticleTable(), G4DynamicParticle::GetTotalEnergy(), G4InuclParticleNames::nn, and G4InuclParticleNames::s0.
00684 { 00685 G4double xsection(0); 00686 // G4double Delta; DHW 19 May 2011: variable set but not used 00687 G4double A0, B0; 00688 G4double hpXscv(0); 00689 G4double hnXscv(0); 00690 00691 G4int Nt = At-Zt; // number of neutrons 00692 if (Nt < 0) Nt = 0; 00693 00694 G4double aa = At; 00695 G4double zz = Zt; 00696 G4double nn = Nt; 00697 00698 G4double targ_mass = G4ParticleTable::GetParticleTable()-> 00699 GetIonTable()->GetIonMass(Zt, At); 00700 00701 targ_mass = 0.939*GeV; // ~mean neutron and proton ??? 00702 00703 G4double proj_mass = aParticle->GetMass(); 00704 G4double proj_energy = aParticle->GetTotalEnergy(); 00705 G4double proj_momentum = aParticle->GetMomentum().mag(); 00706 00707 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum ); 00708 00709 sMand /= GeV*GeV; // in GeV for parametrisation 00710 proj_momentum /= GeV; 00711 proj_energy /= GeV; 00712 proj_mass /= GeV; 00713 00714 // General PDG fit constants 00715 00716 G4double s0 = 5.38*5.38; // in Gev^2 00717 G4double eta1 = 0.458; 00718 G4double eta2 = 0.458; 00719 G4double B = 0.308; 00720 00721 00722 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 00723 00724 00725 if(theParticle == theNeutron) 00726 { 00727 if( proj_momentum >= 373.) 00728 { 00729 return GetHadronNucleonXscPDG(aParticle,At,Zt); 00730 } 00731 else if( proj_momentum >= 10.) 00732 // if( proj_momentum >= 2.) 00733 { 00734 // Delta = 1.; // DHW 19 May 2011: variable set but not used 00735 // if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy; 00736 00737 if(proj_momentum >= 10.) 00738 { 00739 B0 = 7.5; 00740 A0 = 100. - B0*std::log(3.0e7); 00741 00742 xsection = A0 + B0*std::log(proj_energy) - 11 00743 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+ 00744 0.93827*0.93827,-0.165); // mb 00745 } 00746 xsection *= zz + nn; 00747 } 00748 else 00749 { 00750 // nn to be pp 00751 00752 if( proj_momentum < 0.73 ) 00753 { 00754 hnXscv = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) ); 00755 } 00756 else if( proj_momentum < 1.05 ) 00757 { 00758 hnXscv = 23 + 40*(std::log(proj_momentum/0.73))* 00759 (std::log(proj_momentum/0.73)); 00760 } 00761 else // if( proj_momentum < 10. ) 00762 { 00763 hnXscv = 39.0+ 00764 75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15); 00765 } 00766 // pn to be np 00767 00768 if( proj_momentum < 0.8 ) 00769 { 00770 hpXscv = 33+30*std::pow(std::log(proj_momentum/1.3),4.0); 00771 } 00772 else if( proj_momentum < 1.4 ) 00773 { 00774 hpXscv = 33+30*std::pow(std::log(proj_momentum/0.95),2.0); 00775 } 00776 else // if( proj_momentum < 10. ) 00777 { 00778 hpXscv = 33.3+ 00779 20.8*(std::pow(proj_momentum,2.0)-1.35)/ 00780 (std::pow(proj_momentum,2.50)+0.95); 00781 } 00782 xsection = hpXscv*zz + hnXscv*nn; 00783 } 00784 } 00785 else if(theParticle == theProton) 00786 { 00787 if( proj_momentum >= 373.) 00788 { 00789 return GetHadronNucleonXscPDG(aParticle,At,Zt); 00790 } 00791 else if( proj_momentum >= 10.) 00792 // if( proj_momentum >= 2.) 00793 { 00794 // Delta = 1.; DHW 19 May 2011: variable set but not used 00795 // if( proj_energy < 40. ) Delta = 0.916+0.0021*proj_energy; 00796 00797 if(proj_momentum >= 10.) 00798 { 00799 B0 = 7.5; 00800 A0 = 100. - B0*std::log(3.0e7); 00801 00802 xsection = A0 + B0*std::log(proj_energy) - 11 00803 + 103*std::pow(2*0.93827*proj_energy + proj_mass*proj_mass+ 00804 0.93827*0.93827,-0.165); // mb 00805 } 00806 xsection *= zz + nn; 00807 } 00808 else 00809 { 00810 // pp 00811 00812 if( proj_momentum < 0.73 ) 00813 { 00814 hpXscv = 23 + 50*( std::pow( std::log(0.73/proj_momentum), 3.5 ) ); 00815 } 00816 else if( proj_momentum < 1.05 ) 00817 { 00818 hpXscv = 23 + 40*(std::log(proj_momentum/0.73))* 00819 (std::log(proj_momentum/0.73)); 00820 } 00821 else // if( proj_momentum < 10. ) 00822 { 00823 hpXscv = 39.0+ 00824 75*(proj_momentum - 1.2)/(std::pow(proj_momentum,3.0) + 0.15); 00825 } 00826 // pn to be np 00827 00828 if( proj_momentum < 0.8 ) 00829 { 00830 hnXscv = 33+30*std::pow(std::log(proj_momentum/1.3),4.0); 00831 } 00832 else if( proj_momentum < 1.4 ) 00833 { 00834 hnXscv = 33+30*std::pow(std::log(proj_momentum/0.95),2.0); 00835 } 00836 else // if( proj_momentum < 10. ) 00837 { 00838 hnXscv = 33.3+ 00839 20.8*(std::pow(proj_momentum,2.0)-1.35)/ 00840 (std::pow(proj_momentum,2.50)+0.95); 00841 } 00842 xsection = hpXscv*zz + hnXscv*nn; 00843 // xsection = hpXscv*(Zt + Nt); 00844 // xsection = hnXscv*(Zt + Nt); 00845 } 00846 // xsection *= 0.95; 00847 } 00848 else if( theParticle == theAProton ) 00849 { 00850 // xsection = Zt*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 00851 // + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2)); 00852 00853 // xsection += Nt*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 00854 // + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2)); 00855 00856 G4double logP = std::log(proj_momentum); 00857 00858 if( proj_momentum <= 1.0 ) 00859 { 00860 xsection = zz*(65.55 + 53.84/(proj_momentum+1.e-6) ); 00861 } 00862 else 00863 { 00864 xsection = zz*( 41.1 + 77.2*std::pow( proj_momentum, -0.68) 00865 + 0.293*logP*logP - 1.82*logP ); 00866 } 00867 if ( nn > 0.) 00868 { 00869 xsection += nn*( 41.9 + 96.2*std::pow( proj_momentum, -0.99) - 0.154*logP); 00870 } 00871 else // H 00872 { 00873 fInelasticXsc = 38.0 + 38.0*std::pow( proj_momentum, -0.96) 00874 - 0.169*logP*logP; 00875 fInelasticXsc *= millibarn; 00876 } 00877 } 00878 else if( theParticle == thePiPlus ) 00879 { 00880 if(proj_momentum < 0.4) 00881 { 00882 G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085); 00883 hpXscv = Ex3+20.0; 00884 } 00885 else if( proj_momentum < 1.15 ) 00886 { 00887 G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75)); 00888 hpXscv = Ex4+14.0; 00889 } 00890 else if(proj_momentum < 3.5) 00891 { 00892 G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55); 00893 G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225); 00894 hpXscv = Ex1+Ex2+27.5; 00895 } 00896 else // if(proj_momentum > 3.5) // mb 00897 { 00898 hpXscv = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43); 00899 } 00900 // pi+n = pi-p?? 00901 00902 if(proj_momentum < 0.37) 00903 { 00904 hnXscv = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07); 00905 } 00906 else if(proj_momentum<0.65) 00907 { 00908 hnXscv = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48)); 00909 } 00910 else if(proj_momentum<1.3) 00911 { 00912 hnXscv = 36.1+ 00913 10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+ 00914 24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075); 00915 } 00916 else if(proj_momentum<3.0) 00917 { 00918 hnXscv = 36.1+0.079-4.313*std::log(proj_momentum)+ 00919 3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+ 00920 1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12); 00921 } 00922 else // mb 00923 { 00924 hnXscv = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43); 00925 } 00926 xsection = hpXscv*zz + hnXscv*nn; 00927 } 00928 else if(theParticle == thePiMinus) 00929 { 00930 // pi-n = pi+p?? 00931 00932 if(proj_momentum < 0.4) 00933 { 00934 G4double Ex3 = 180*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.085/0.085); 00935 hnXscv = Ex3+20.0; 00936 } 00937 else if(proj_momentum < 1.15) 00938 { 00939 G4double Ex4 = 88*(std::log(proj_momentum/0.75))*(std::log(proj_momentum/0.75)); 00940 hnXscv = Ex4+14.0; 00941 } 00942 else if(proj_momentum < 3.5) 00943 { 00944 G4double Ex1 = 3.2*std::exp(-(proj_momentum-2.55)*(proj_momentum-2.55)/0.55/0.55); 00945 G4double Ex2 = 12*std::exp(-(proj_momentum-1.47)*(proj_momentum-1.47)/0.225/0.225); 00946 hnXscv = Ex1+Ex2+27.5; 00947 } 00948 else // if(proj_momentum > 3.5) // mb 00949 { 00950 hnXscv = 10.6+2.*std::log(proj_energy)+25*std::pow(proj_energy,-0.43); 00951 } 00952 // pi-p 00953 00954 if(proj_momentum < 0.37) 00955 { 00956 hpXscv = 28.0 + 40*std::exp(-(proj_momentum-0.29)*(proj_momentum-0.29)/0.07/0.07); 00957 } 00958 else if(proj_momentum<0.65) 00959 { 00960 hpXscv = 26+110*(std::log(proj_momentum/0.48))*(std::log(proj_momentum/0.48)); 00961 } 00962 else if(proj_momentum<1.3) 00963 { 00964 hpXscv = 36.1+ 00965 10*std::exp(-(proj_momentum-0.72)*(proj_momentum-0.72)/0.06/0.06)+ 00966 24*std::exp(-(proj_momentum-1.015)*(proj_momentum-1.015)/0.075/0.075); 00967 } 00968 else if(proj_momentum<3.0) 00969 { 00970 hpXscv = 36.1+0.079-4.313*std::log(proj_momentum)+ 00971 3*std::exp(-(proj_momentum-2.1)*(proj_momentum-2.1)/0.4/0.4)+ 00972 1.5*std::exp(-(proj_momentum-1.4)*(proj_momentum-1.4)/0.12/0.12); 00973 } 00974 else // mb 00975 { 00976 hpXscv = 10.6+2*std::log(proj_energy)+30*std::pow(proj_energy,-0.43); 00977 } 00978 xsection = hpXscv*zz + hnXscv*nn; 00979 } 00980 else if(theParticle == theKPlus) 00981 { 00982 xsection = zz*( 17.91 + B*std::pow(std::log(sMand/s0),2.) 00983 + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2)); 00984 00985 xsection += nn*( 17.87 + B*std::pow(std::log(sMand/s0),2.) 00986 + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2)); 00987 } 00988 else if(theParticle == theKMinus) 00989 { 00990 xsection = zz*( 17.91 + B*std::pow(std::log(sMand/s0),2.) 00991 + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2)); 00992 00993 xsection += nn*( 17.87 + B*std::pow(std::log(sMand/s0),2.) 00994 + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2)); 00995 } 00996 else if(theParticle == theSMinus) 00997 { 00998 xsection = aa*( 35.20 + B*std::pow(std::log(sMand/s0),2.) 00999 - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2)); 01000 } 01001 else if(theParticle == theGamma) // modify later on 01002 { 01003 xsection = aa*( 0.0 + B*std::pow(std::log(sMand/s0),2.) 01004 + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2)); 01005 01006 } 01007 else // as proton ??? 01008 { 01009 xsection = zz*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 01010 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); 01011 01012 xsection += nn*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 01013 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2)); 01014 } 01015 xsection *= millibarn; // parametrised in mb 01016 return xsection; 01017 }
G4double G4ComponentGGHadronNucleusXsc::GetHadronNucleonXscNS | ( | const G4DynamicParticle * | , | |
const G4Element * | ||||
) |
Definition at line 664 of file G4ComponentGGHadronNucleusXsc.cc.
References G4lrint(), G4Element::GetN(), and G4Element::GetZ().
Referenced by GetHNinelasticXsc(), GetIsoCrossSection(), GetRatioQE(), and GetRatioSD().
00666 { 00667 G4int At = G4lrint(anElement->GetN()); // number of nucleons 00668 G4int Zt = G4lrint(anElement->GetZ()); // number of protons 00669 00670 return GetHadronNucleonXscNS(aParticle, At, Zt); 00671 }
G4double G4ComponentGGHadronNucleusXsc::GetHadronNucleonXscPDG | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 549 of file G4ComponentGGHadronNucleusXsc.cc.
References CalcMandelstamS(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMass(), G4DynamicParticle::GetMomentum(), G4ParticleTable::GetParticleTable(), G4InuclParticleNames::nn, and G4InuclParticleNames::s0.
00551 { 00552 G4double xsection; 00553 00554 G4int Nt = At-Zt; // number of neutrons 00555 if (Nt < 0) Nt = 0; 00556 00557 G4double zz = Zt; 00558 G4double aa = At; 00559 G4double nn = Nt; 00560 00561 G4double targ_mass = G4ParticleTable::GetParticleTable()-> 00562 GetIonTable()->GetIonMass(Zt, At); 00563 00564 targ_mass = 0.939*GeV; // ~mean neutron and proton ??? 00565 00566 G4double proj_mass = aParticle->GetMass(); 00567 G4double proj_momentum = aParticle->GetMomentum().mag(); 00568 00569 G4double sMand = CalcMandelstamS ( proj_mass , targ_mass , proj_momentum ); 00570 00571 sMand /= GeV*GeV; // in GeV for parametrisation 00572 00573 // General PDG fit constants 00574 00575 G4double s0 = 5.38*5.38; // in Gev^2 00576 G4double eta1 = 0.458; 00577 G4double eta2 = 0.458; 00578 G4double B = 0.308; 00579 00580 00581 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 00582 00583 00584 if(theParticle == theNeutron) // proton-neutron fit 00585 { 00586 xsection = zz*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 00587 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2)); 00588 xsection += nn*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 00589 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); // pp for nn 00590 } 00591 else if(theParticle == theProton) 00592 { 00593 00594 xsection = zz*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 00595 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); 00596 00597 xsection += nn*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 00598 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2)); 00599 } 00600 else if(theParticle == theAProton) 00601 { 00602 xsection = zz*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 00603 + 42.53*std::pow(sMand,-eta1) + 33.34*std::pow(sMand,-eta2)); 00604 00605 xsection += nn*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 00606 + 40.15*std::pow(sMand,-eta1) + 30.*std::pow(sMand,-eta2)); 00607 } 00608 else if(theParticle == thePiPlus) 00609 { 00610 xsection = aa*( 20.86 + B*std::pow(std::log(sMand/s0),2.) 00611 + 19.24*std::pow(sMand,-eta1) - 6.03*std::pow(sMand,-eta2)); 00612 } 00613 else if(theParticle == thePiMinus) 00614 { 00615 xsection = aa*( 20.86 + B*std::pow(std::log(sMand/s0),2.) 00616 + 19.24*std::pow(sMand,-eta1) + 6.03*std::pow(sMand,-eta2)); 00617 } 00618 else if(theParticle == theKPlus || theParticle == theK0L ) 00619 { 00620 xsection = zz*( 17.91 + B*std::pow(std::log(sMand/s0),2.) 00621 + 7.14*std::pow(sMand,-eta1) - 13.45*std::pow(sMand,-eta2)); 00622 00623 xsection += nn*( 17.87 + B*std::pow(std::log(sMand/s0),2.) 00624 + 5.17*std::pow(sMand,-eta1) - 7.23*std::pow(sMand,-eta2)); 00625 } 00626 else if(theParticle == theKMinus || theParticle == theK0S ) 00627 { 00628 xsection = zz*( 17.91 + B*std::pow(std::log(sMand/s0),2.) 00629 + 7.14*std::pow(sMand,-eta1) + 13.45*std::pow(sMand,-eta2)); 00630 00631 xsection += nn*( 17.87 + B*std::pow(std::log(sMand/s0),2.) 00632 + 5.17*std::pow(sMand,-eta1) + 7.23*std::pow(sMand,-eta2)); 00633 } 00634 else if(theParticle == theSMinus) 00635 { 00636 xsection = aa*( 35.20 + B*std::pow(std::log(sMand/s0),2.) 00637 - 199.*std::pow(sMand,-eta1) + 264.*std::pow(sMand,-eta2)); 00638 } 00639 else if(theParticle == theGamma) // modify later on 00640 { 00641 xsection = aa*( 0.0 + B*std::pow(std::log(sMand/s0),2.) 00642 + 0.032*std::pow(sMand,-eta1) - 0.0*std::pow(sMand,-eta2)); 00643 00644 } 00645 else // as proton ??? 00646 { 00647 xsection = zz*( 35.45 + B*std::pow(std::log(sMand/s0),2.) 00648 + 42.53*std::pow(sMand,-eta1) - 33.34*std::pow(sMand,-eta2)); 00649 00650 xsection += nn*( 35.80 + B*std::pow(std::log(sMand/s0),2.) 00651 + 40.15*std::pow(sMand,-eta1) - 30.*std::pow(sMand,-eta2)); 00652 } 00653 xsection *= millibarn; // parametrised in mb 00654 return xsection; 00655 }
G4double G4ComponentGGHadronNucleusXsc::GetHadronNucleonXscPDG | ( | const G4DynamicParticle * | , | |
const G4Element * | ||||
) |
Definition at line 530 of file G4ComponentGGHadronNucleusXsc.cc.
References G4lrint(), G4Element::GetN(), and G4Element::GetZ().
Referenced by GetHadronNucleonXscNS(), and GetKaonNucleonXscVector().
00532 { 00533 G4int At = G4lrint(anElement->GetN()); // number of nucleons 00534 G4int Zt = G4lrint(anElement->GetZ()); // number of protons 00535 00536 return GetHadronNucleonXscPDG(aParticle, At, Zt); 00537 }
G4double G4ComponentGGHadronNucleusXsc::GetHNinelasticXsc | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 1072 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), GetHadronNucleonXscNS(), and GetHNinelasticXscVU().
01074 { 01075 G4ParticleDefinition* hadron = aParticle->GetDefinition(); 01076 G4double sumInelastic; 01077 G4int Nt = At - Zt; 01078 if(Nt < 0) Nt = 0; 01079 01080 if( hadron == theKPlus ) 01081 { 01082 sumInelastic = GetHNinelasticXscVU(aParticle, At, Zt); 01083 } 01084 else 01085 { 01086 //sumInelastic = Zt*GetHadronNucleonXscMK(aParticle, theProton); 01087 // sumInelastic += Nt*GetHadronNucleonXscMK(aParticle, theNeutron); 01088 sumInelastic = G4double(Zt)*GetHadronNucleonXscNS(aParticle, 1, 1); 01089 sumInelastic += G4double(Nt)*GetHadronNucleonXscNS(aParticle, 1, 0); 01090 } 01091 return sumInelastic; 01092 }
G4double G4ComponentGGHadronNucleusXsc::GetHNinelasticXsc | ( | const G4DynamicParticle * | , | |
const G4Element * | ||||
) |
Definition at line 1058 of file G4ComponentGGHadronNucleusXsc.cc.
References G4lrint(), G4Element::GetN(), and G4Element::GetZ().
Referenced by GetIsoCrossSection(), and GetRatioQE().
01060 { 01061 G4int At = G4lrint(anElement->GetN()); // number of nucleons 01062 G4int Zt = G4lrint(anElement->GetZ()); // number of protons 01063 01064 return GetHNinelasticXsc(aParticle, At, Zt); 01065 }
G4double G4ComponentGGHadronNucleusXsc::GetHNinelasticXscVU | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 1100 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetMomentum(), G4ParticleDefinition::GetPDGEncoding(), and G4DynamicParticle::GetTotalEnergy().
Referenced by GetHNinelasticXsc().
01102 { 01103 G4int PDGcode = aParticle->GetDefinition()->GetPDGEncoding(); 01104 G4int absPDGcode = std::abs(PDGcode); 01105 01106 G4double Elab = aParticle->GetTotalEnergy(); 01107 // (s - 2*0.88*GeV*GeV)/(2*0.939*GeV)/GeV; 01108 G4double Plab = aParticle->GetMomentum().mag(); 01109 // std::sqrt(Elab * Elab - 0.88); 01110 01111 Elab /= GeV; 01112 Plab /= GeV; 01113 01114 G4double LogPlab = std::log( Plab ); 01115 G4double sqrLogPlab = LogPlab * LogPlab; 01116 01117 //G4cout<<"Plab = "<<Plab<<G4endl; 01118 01119 G4double NumberOfTargetProtons = G4double(Zt); 01120 G4double NumberOfTargetNucleons = G4double(At); 01121 G4double NumberOfTargetNeutrons = NumberOfTargetNucleons - NumberOfTargetProtons; 01122 01123 if(NumberOfTargetNeutrons < 0.0) NumberOfTargetNeutrons = 0.0; 01124 01125 G4double Xtotal, Xelastic, Xinelastic; 01126 01127 if( absPDGcode > 1000 ) //------Projectile is baryon -------- 01128 { 01129 G4double XtotPP = 48.0 + 0. *std::pow(Plab, 0. ) + 01130 0.522*sqrLogPlab - 4.51*LogPlab; 01131 01132 G4double XtotPN = 47.3 + 0. *std::pow(Plab, 0. ) + 01133 0.513*sqrLogPlab - 4.27*LogPlab; 01134 01135 G4double XelPP = 11.9 + 26.9*std::pow(Plab,-1.21) + 01136 0.169*sqrLogPlab - 1.85*LogPlab; 01137 01138 G4double XelPN = 11.9 + 26.9*std::pow(Plab,-1.21) + 01139 0.169*sqrLogPlab - 1.85*LogPlab; 01140 01141 Xtotal = (NumberOfTargetProtons * XtotPP + 01142 NumberOfTargetNeutrons * XtotPN); 01143 01144 Xelastic = (NumberOfTargetProtons * XelPP + 01145 NumberOfTargetNeutrons * XelPN); 01146 } 01147 else if( PDGcode == 211 ) //------Projectile is PionPlus ------- 01148 { 01149 G4double XtotPiP = 16.4 + 19.3 *std::pow(Plab,-0.42) + 01150 0.19 *sqrLogPlab - 0.0 *LogPlab; 01151 01152 G4double XtotPiN = 33.0 + 14.0 *std::pow(Plab,-1.36) + 01153 0.456*sqrLogPlab - 4.03*LogPlab; 01154 01155 G4double XelPiP = 0.0 + 11.4*std::pow(Plab,-0.40) + 01156 0.079*sqrLogPlab - 0.0 *LogPlab; 01157 01158 G4double XelPiN = 1.76 + 11.2*std::pow(Plab,-0.64) + 01159 0.043*sqrLogPlab - 0.0 *LogPlab; 01160 01161 Xtotal = ( NumberOfTargetProtons * XtotPiP + 01162 NumberOfTargetNeutrons * XtotPiN ); 01163 01164 Xelastic = ( NumberOfTargetProtons * XelPiP + 01165 NumberOfTargetNeutrons * XelPiN ); 01166 } 01167 else if( PDGcode == -211 ) //------Projectile is PionMinus ------- 01168 { 01169 G4double XtotPiP = 33.0 + 14.0 *std::pow(Plab,-1.36) + 01170 0.456*sqrLogPlab - 4.03*LogPlab; 01171 01172 G4double XtotPiN = 16.4 + 19.3 *std::pow(Plab,-0.42) + 01173 0.19 *sqrLogPlab - 0.0 *LogPlab; 01174 01175 G4double XelPiP = 1.76 + 11.2*std::pow(Plab,-0.64) + 01176 0.043*sqrLogPlab - 0.0 *LogPlab; 01177 01178 G4double XelPiN = 0.0 + 11.4*std::pow(Plab,-0.40) + 01179 0.079*sqrLogPlab - 0.0 *LogPlab; 01180 01181 Xtotal = ( NumberOfTargetProtons * XtotPiP + 01182 NumberOfTargetNeutrons * XtotPiN ); 01183 01184 Xelastic = ( NumberOfTargetProtons * XelPiP + 01185 NumberOfTargetNeutrons * XelPiN ); 01186 } 01187 else if( PDGcode == 111 ) //------Projectile is PionZero ------- 01188 { 01189 G4double XtotPiP =(16.4 + 19.3 *std::pow(Plab,-0.42) + 01190 0.19 *sqrLogPlab - 0.0 *LogPlab + //Pi+ 01191 33.0 + 14.0 *std::pow(Plab,-1.36) + 01192 0.456*sqrLogPlab - 4.03*LogPlab)/2; //Pi- 01193 01194 G4double XtotPiN =(33.0 + 14.0 *std::pow(Plab,-1.36) + 01195 0.456*sqrLogPlab - 4.03*LogPlab + //Pi+ 01196 16.4 + 19.3 *std::pow(Plab,-0.42) + 01197 0.19 *sqrLogPlab - 0.0 *LogPlab)/2; //Pi- 01198 01199 G4double XelPiP =( 0.0 + 11.4*std::pow(Plab,-0.40) + 01200 0.079*sqrLogPlab - 0.0 *LogPlab + //Pi+ 01201 1.76 + 11.2*std::pow(Plab,-0.64) + 01202 0.043*sqrLogPlab - 0.0 *LogPlab)/2; //Pi- 01203 01204 G4double XelPiN =( 1.76 + 11.2*std::pow(Plab,-0.64) + 01205 0.043*sqrLogPlab - 0.0 *LogPlab + //Pi+ 01206 0.0 + 11.4*std::pow(Plab,-0.40) + 01207 0.079*sqrLogPlab - 0.0 *LogPlab)/2; //Pi- 01208 01209 Xtotal = ( NumberOfTargetProtons * XtotPiP + 01210 NumberOfTargetNeutrons * XtotPiN ); 01211 01212 Xelastic = ( NumberOfTargetProtons * XelPiP + 01213 NumberOfTargetNeutrons * XelPiN ); 01214 } 01215 else if( PDGcode == 321 ) //------Projectile is KaonPlus ------- 01216 { 01217 G4double XtotKP = 18.1 + 0. *std::pow(Plab, 0. ) + 01218 0.26 *sqrLogPlab - 1.0 *LogPlab; 01219 G4double XtotKN = 18.7 + 0. *std::pow(Plab, 0. ) + 01220 0.21 *sqrLogPlab - 0.89*LogPlab; 01221 01222 G4double XelKP = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 01223 0.16 *sqrLogPlab - 1.3 *LogPlab; 01224 01225 G4double XelKN = 7.3 + 0. *std::pow(Plab,-0. ) + 01226 0.29 *sqrLogPlab - 2.4 *LogPlab; 01227 01228 Xtotal = ( NumberOfTargetProtons * XtotKP + 01229 NumberOfTargetNeutrons * XtotKN ); 01230 01231 Xelastic = ( NumberOfTargetProtons * XelKP + 01232 NumberOfTargetNeutrons * XelKN ); 01233 } 01234 else if( PDGcode ==-321 ) //------Projectile is KaonMinus ------ 01235 { 01236 G4double XtotKP = 32.1 + 0. *std::pow(Plab, 0. ) + 01237 0.66 *sqrLogPlab - 5.6 *LogPlab; 01238 G4double XtotKN = 25.2 + 0. *std::pow(Plab, 0. ) + 01239 0.38 *sqrLogPlab - 2.9 *LogPlab; 01240 01241 G4double XelKP = 7.3 + 0. *std::pow(Plab,-0. ) + 01242 0.29 *sqrLogPlab - 2.4 *LogPlab; 01243 01244 G4double XelKN = 5.0 + 8.1*std::pow(Plab,-1.8 ) + 01245 0.16 *sqrLogPlab - 1.3 *LogPlab; 01246 01247 Xtotal = ( NumberOfTargetProtons * XtotKP + 01248 NumberOfTargetNeutrons * XtotKN ); 01249 01250 Xelastic = ( NumberOfTargetProtons * XelKP + 01251 NumberOfTargetNeutrons * XelKN ); 01252 } 01253 else if( PDGcode == 311 ) //------Projectile is KaonZero ------ 01254 { 01255 G4double XtotKP = ( 18.1 + 0. *std::pow(Plab, 0. ) + 01256 0.26 *sqrLogPlab - 1.0 *LogPlab + //K+ 01257 32.1 + 0. *std::pow(Plab, 0. ) + 01258 0.66 *sqrLogPlab - 5.6 *LogPlab)/2; //K- 01259 01260 G4double XtotKN = ( 18.7 + 0. *std::pow(Plab, 0. ) + 01261 0.21 *sqrLogPlab - 0.89*LogPlab + //K+ 01262 25.2 + 0. *std::pow(Plab, 0. ) + 01263 0.38 *sqrLogPlab - 2.9 *LogPlab)/2; //K- 01264 01265 G4double XelKP = ( 5.0 + 8.1*std::pow(Plab,-1.8 ) 01266 + 0.16 *sqrLogPlab - 1.3 *LogPlab + //K+ 01267 7.3 + 0. *std::pow(Plab,-0. ) + 01268 0.29 *sqrLogPlab - 2.4 *LogPlab)/2; //K- 01269 01270 G4double XelKN = ( 7.3 + 0. *std::pow(Plab,-0. ) + 01271 0.29 *sqrLogPlab - 2.4 *LogPlab + //K+ 01272 5.0 + 8.1*std::pow(Plab,-1.8 ) + 01273 0.16 *sqrLogPlab - 1.3 *LogPlab)/2; //K- 01274 01275 Xtotal = ( NumberOfTargetProtons * XtotKP + 01276 NumberOfTargetNeutrons * XtotKN ); 01277 01278 Xelastic = ( NumberOfTargetProtons * XelKP + 01279 NumberOfTargetNeutrons * XelKN ); 01280 } 01281 else //------Projectile is undefined, Nucleon assumed 01282 { 01283 G4double XtotPP = 48.0 + 0. *std::pow(Plab, 0. ) + 01284 0.522*sqrLogPlab - 4.51*LogPlab; 01285 01286 G4double XtotPN = 47.3 + 0. *std::pow(Plab, 0. ) + 01287 0.513*sqrLogPlab - 4.27*LogPlab; 01288 01289 G4double XelPP = 11.9 + 26.9*std::pow(Plab,-1.21) + 01290 0.169*sqrLogPlab - 1.85*LogPlab; 01291 G4double XelPN = 11.9 + 26.9*std::pow(Plab,-1.21) + 01292 0.169*sqrLogPlab - 1.85*LogPlab; 01293 01294 Xtotal = ( NumberOfTargetProtons * XtotPP + 01295 NumberOfTargetNeutrons * XtotPN ); 01296 01297 Xelastic = ( NumberOfTargetProtons * XelPP + 01298 NumberOfTargetNeutrons * XelPN ); 01299 } 01300 Xinelastic = Xtotal - Xelastic; 01301 01302 if( Xinelastic < 0.) Xinelastic = 0.; 01303 01304 return Xinelastic*= millibarn; 01305 }
G4double G4ComponentGGHadronNucleusXsc::GetInelasticElementCrossSection | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4double | A | |||
) | [virtual] |
Implements G4VComponentCrossSection.
Definition at line 138 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00141 { 00142 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00143 kinEnergy); 00144 fTotalXsc = GetIsoCrossSection(aDP, Z, G4int(A)); 00145 delete aDP; 00146 00147 return fInelasticXsc; 00148 }
G4double G4ComponentGGHadronNucleusXsc::GetInelasticGlauberGribov | ( | const G4DynamicParticle * | , | |
G4int | Z, | |||
G4int | A | |||
) | [inline] |
Definition at line 222 of file G4ComponentGGHadronNucleusXsc.hh.
References GetIsoCrossSection().
00224 { 00225 GetIsoCrossSection(dp, Z, A); 00226 return fInelasticXsc; 00227 }
G4double G4ComponentGGHadronNucleusXsc::GetInelasticGlauberGribovXsc | ( | ) | [inline] |
G4double G4ComponentGGHadronNucleusXsc::GetInelasticIsotopeCrossSection | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4int | A | |||
) | [virtual] |
Implements G4VComponentCrossSection.
Definition at line 124 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00127 { 00128 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00129 kinEnergy); 00130 fTotalXsc = GetIsoCrossSection(aDP, Z, A); 00131 delete aDP; 00132 00133 return fInelasticXsc; 00134 }
G4double G4ComponentGGHadronNucleusXsc::GetIsoCrossSection | ( | const G4DynamicParticle * | , | |
G4int | Z, | |||
G4int | A, | |||
const G4Isotope * | iso = 0 , |
|||
const G4Element * | elm = 0 , |
|||
const G4Material * | mat = 0 | |||
) |
Definition at line 240 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), GetHadronNucleonXscNS(), G4HadronNucleonXsc::GetHadronNucleonXscNS(), GetHNinelasticXsc(), G4HadronNucleonXsc::GetInelasticHadronNucleonXsc(), GetKaonNucleonXscVector(), GetNucleusRadius(), GetParticleBarCorIn(), GetParticleBarCorTot(), and G4INCL::Math::pi.
Referenced by ComputeQuasiElasticRatio(), GetElasticElementCrossSection(), GetElasticGlauberGribov(), GetElasticIsotopeCrossSection(), GetInelasticElementCrossSection(), GetInelasticGlauberGribov(), GetInelasticIsotopeCrossSection(), GetTotalElementCrossSection(), and GetTotalIsotopeCrossSection().
00245 { 00246 G4double xsection, sigma, cofInelastic, cofTotal, nucleusSquare, ratio; 00247 G4double hpInXsc(0.), hnInXsc(0.); 00248 G4double R = GetNucleusRadius(A); 00249 00250 G4int N = A - Z; // number of neutrons 00251 if (N < 0) N = 0; 00252 00253 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 00254 00255 if( theParticle == theProton || 00256 theParticle == theNeutron || 00257 theParticle == thePiPlus || 00258 theParticle == thePiMinus ) 00259 { 00260 // sigma = GetHadronNucleonXscNS(aParticle, A, Z); 00261 00262 sigma = Z*hnXsc->GetHadronNucleonXscNS(aParticle, theProton); 00263 00264 hpInXsc = hnXsc->GetInelasticHadronNucleonXsc(); 00265 00266 sigma += N*hnXsc->GetHadronNucleonXscNS(aParticle, theNeutron); 00267 00268 hnInXsc = hnXsc->GetInelasticHadronNucleonXsc(); 00269 00270 cofInelastic = 2.4; 00271 cofTotal = 2.0; 00272 } 00273 else if( theParticle == theKPlus || 00274 theParticle == theKMinus || 00275 theParticle == theK0S || 00276 theParticle == theK0L ) 00277 { 00278 sigma = GetKaonNucleonXscVector(aParticle, A, Z); 00279 cofInelastic = 2.2; 00280 cofTotal = 2.0; 00281 R = 1.3*fermi; 00282 R *= std::pow(G4double(A), 0.3333); 00283 } 00284 else 00285 { 00286 sigma = GetHadronNucleonXscNS(aParticle, A, Z); 00287 cofInelastic = 2.2; 00288 cofTotal = 2.0; 00289 } 00290 // cofInelastic = 2.0; 00291 00292 if( A > 1 ) 00293 { 00294 nucleusSquare = cofTotal*pi*R*R; // basically 2piRR 00295 ratio = sigma/nucleusSquare; 00296 00297 xsection = nucleusSquare*std::log( 1. + ratio ); 00298 00299 xsection *= GetParticleBarCorTot(theParticle, Z); 00300 00301 fTotalXsc = xsection; 00302 00303 00304 00305 fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; 00306 00307 fInelasticXsc *= GetParticleBarCorIn(theParticle, Z); 00308 00309 fElasticXsc = fTotalXsc - fInelasticXsc; 00310 00311 if(fElasticXsc < 0.) fElasticXsc = 0.; 00312 00313 G4double difratio = ratio/(1.+ratio); 00314 00315 fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) ); 00316 00317 00318 // sigma = GetHNinelasticXsc(aParticle, A, Z); 00319 00320 sigma = Z*hpInXsc + N*hnInXsc; 00321 00322 ratio = sigma/nucleusSquare; 00323 00324 fProductionXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; 00325 00326 if (fElasticXsc < 0.) fElasticXsc = 0.; 00327 } 00328 else // H 00329 { 00330 fTotalXsc = sigma; 00331 xsection = sigma; 00332 00333 if ( theParticle != theAProton ) 00334 { 00335 sigma = GetHNinelasticXsc(aParticle, A, Z); 00336 fInelasticXsc = sigma; 00337 fElasticXsc = fTotalXsc - fInelasticXsc; 00338 } 00339 else 00340 { 00341 fElasticXsc = fTotalXsc - fInelasticXsc; 00342 } 00343 if (fElasticXsc < 0.) fElasticXsc = 0.; 00344 00345 } 00346 return xsection; 00347 }
G4double G4ComponentGGHadronNucleusXsc::GetKaonNucleonXscVector | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 1020 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), GetHadronNucleonXscPDG(), G4DynamicParticle::GetKineticEnergy(), G4HadronNucleonXsc::GetKmNeutronTotXscVector(), G4HadronNucleonXsc::GetKmProtonTotXscVector(), G4HadronNucleonXsc::GetKpNeutronTotXscVector(), and G4HadronNucleonXsc::GetKpProtonTotXscVector().
Referenced by GetIsoCrossSection().
01022 { 01023 G4double Tkin, logTkin, xsc, xscP, xscN; 01024 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 01025 01026 G4int Nt = At-Zt; // number of neutrons 01027 if (Nt < 0) Nt = 0; 01028 01029 Tkin = aParticle->GetKineticEnergy(); // Tkin in MeV 01030 01031 if( Tkin > 70*GeV ) return GetHadronNucleonXscPDG(aParticle,At,Zt); 01032 01033 logTkin = std::log(Tkin); // Tkin in MeV!!! 01034 01035 if( theParticle == theKPlus ) 01036 { 01037 xscP = hnXsc->GetKpProtonTotXscVector(logTkin); 01038 xscN = hnXsc->GetKpNeutronTotXscVector(logTkin); 01039 } 01040 else if( theParticle == theKMinus ) 01041 { 01042 xscP = hnXsc->GetKmProtonTotXscVector(logTkin); 01043 xscN = hnXsc->GetKmNeutronTotXscVector(logTkin); 01044 } 01045 else // K-zero as half of K+ and K- 01046 { 01047 xscP = (hnXsc->GetKpProtonTotXscVector(logTkin)+hnXsc->GetKmProtonTotXscVector(logTkin))*0.5; 01048 xscN = (hnXsc->GetKpNeutronTotXscVector(logTkin)+hnXsc->GetKmNeutronTotXscVector(logTkin))*0.5; 01049 } 01050 xsc = xscP*Zt + xscN*Nt; 01051 return xsc; 01052 }
Definition at line 1369 of file G4ComponentGGHadronNucleusXsc.cc.
References G4INCL::Math::oneThird.
01370 { 01371 G4double oneThird = 1.0/3.0; 01372 G4double cubicrAt = std::pow(G4double(At), oneThird); 01373 01374 G4double R; // = fRadiusConst*cubicrAt; 01375 01376 /* 01377 G4double tmp = std::pow( cubicrAt-1., 3.); 01378 tmp += At; 01379 tmp *= 0.5; 01380 01381 if (At > 20.) 01382 { 01383 R = fRadiusConst*std::pow (tmp, oneThird); 01384 } 01385 else 01386 { 01387 R = fRadiusConst*cubicrAt; 01388 } 01389 */ 01390 01391 R = fRadiusConst*cubicrAt; 01392 01393 G4double meanA = 20.; 01394 G4double tauA = 20.; 01395 01396 if (At > 20) // 20. 01397 { 01398 R *= ( 0.8 + 0.2*std::exp( -(G4double(At) - meanA)/tauA) ); 01399 } 01400 else 01401 { 01402 R *= ( 1.0 + 0.1*( 1. - std::exp( (G4double(At) - meanA)/tauA) ) ); 01403 } 01404 01405 return R; 01406 }
G4double G4ComponentGGHadronNucleusXsc::GetNucleusRadius | ( | const G4DynamicParticle * | , | |
const G4Element * | ||||
) |
Definition at line 1312 of file G4ComponentGGHadronNucleusXsc.cc.
References G4lrint(), G4Element::GetN(), and G4INCL::Math::oneThird.
Referenced by GetIsoCrossSection(), GetRatioQE(), and GetRatioSD().
01314 { 01315 G4int At = G4lrint(anElement->GetN()); 01316 G4double oneThird = 1.0/3.0; 01317 G4double cubicrAt = std::pow(G4double(At), oneThird); 01318 01319 G4double R; // = fRadiusConst*cubicrAt; 01320 /* 01321 G4double tmp = std::pow( cubicrAt-1., 3.); 01322 tmp += At; 01323 tmp *= 0.5; 01324 01325 if (At > 20.) // 20. 01326 { 01327 R = fRadiusConst*std::pow (tmp, oneThird); 01328 } 01329 else 01330 { 01331 R = fRadiusConst*cubicrAt; 01332 } 01333 */ 01334 01335 R = fRadiusConst*cubicrAt; 01336 01337 G4double meanA = 21.; 01338 01339 G4double tauA1 = 40.; 01340 G4double tauA2 = 10.; 01341 G4double tauA3 = 5.; 01342 01343 G4double a1 = 0.85; 01344 G4double b1 = 1. - a1; 01345 01346 G4double b2 = 0.3; 01347 G4double b3 = 4.; 01348 01349 if (At > 20) // 20. 01350 { 01351 R *= ( a1 + b1*std::exp( -(At - meanA)/tauA1) ); 01352 } 01353 else if (At > 3) 01354 { 01355 R *= ( 1.0 + b2*( 1. - std::exp( (At - meanA)/tauA2) ) ); 01356 } 01357 else 01358 { 01359 R *= ( 1.0 + b3*( 1. - std::exp( (At - meanA)/tauA3) ) ); 01360 } 01361 return R; 01362 01363 }
G4double G4ComponentGGHadronNucleusXsc::GetParticleBarCorIn | ( | const G4ParticleDefinition * | theParticle, | |
G4int | Z | |||
) | [inline] |
Definition at line 255 of file G4ComponentGGHadronNucleusXsc.hh.
Referenced by GetIsoCrossSection().
00257 { 00258 if(Z >= 2 && Z <= 92) 00259 { 00260 if( theParticle == theProton ) return fProtonBarCorrectionIn[Z]; 00261 else if( theParticle == theNeutron) return fNeutronBarCorrectionIn[Z]; 00262 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionIn[Z]; 00263 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionIn[Z]; 00264 else return 1.0; 00265 } 00266 else return 1.0; 00267 }
G4double G4ComponentGGHadronNucleusXsc::GetParticleBarCorTot | ( | const G4ParticleDefinition * | theParticle, | |
G4int | Z | |||
) | [inline] |
Definition at line 235 of file G4ComponentGGHadronNucleusXsc.hh.
Referenced by GetIsoCrossSection().
00237 { 00238 if(Z >= 2 && Z <= 92) 00239 { 00240 if( theParticle == theProton ) return fProtonBarCorrectionTot[Z]; 00241 else if( theParticle == theNeutron) return fNeutronBarCorrectionTot[Z]; 00242 else if( theParticle == thePiPlus ) return fPionPlusBarCorrectionTot[Z]; 00243 else if( theParticle == thePiMinus) return fPionMinusBarCorrectionTot[Z]; 00244 else return 1.0; 00245 } 00246 else return 1.0; 00247 }
G4double G4ComponentGGHadronNucleusXsc::GetProductionGlauberGribovXsc | ( | ) | [inline] |
G4double G4ComponentGGHadronNucleusXsc::GetRadiusConst | ( | ) | [inline] |
G4double G4ComponentGGHadronNucleusXsc::GetRatioQE | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 396 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), GetHadronNucleonXscNS(), GetHNinelasticXsc(), GetNucleusRadius(), and G4INCL::Math::pi.
00397 { 00398 G4double sigma, cofInelastic, cofTotal, nucleusSquare, ratio; 00399 G4double R = GetNucleusRadius(A); 00400 00401 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 00402 00403 if( theParticle == theProton || 00404 theParticle == theNeutron || 00405 theParticle == thePiPlus || 00406 theParticle == thePiMinus ) 00407 { 00408 sigma = GetHadronNucleonXscNS(aParticle, A, Z); 00409 cofInelastic = 2.4; 00410 cofTotal = 2.0; 00411 } 00412 else 00413 { 00414 sigma = GetHadronNucleonXscNS(aParticle, A, Z); 00415 cofInelastic = 2.2; 00416 cofTotal = 2.0; 00417 } 00418 nucleusSquare = cofTotal*pi*R*R; // basically 2piRR 00419 ratio = sigma/nucleusSquare; 00420 00421 fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; 00422 00423 sigma = GetHNinelasticXsc(aParticle, A, Z); 00424 ratio = sigma/nucleusSquare; 00425 00426 fProductionXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; 00427 00428 if (fInelasticXsc > fProductionXsc) ratio = (fInelasticXsc-fProductionXsc)/fInelasticXsc; 00429 else ratio = 0.; 00430 if ( ratio < 0. ) ratio = 0.; 00431 00432 return ratio; 00433 }
G4double G4ComponentGGHadronNucleusXsc::GetRatioSD | ( | const G4DynamicParticle * | , | |
G4int | At, | |||
G4int | Zt | |||
) |
Definition at line 354 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), GetHadronNucleonXscNS(), GetNucleusRadius(), and G4INCL::Math::pi.
00355 { 00356 G4double sigma, cofInelastic, cofTotal, nucleusSquare, ratio; 00357 G4double R = GetNucleusRadius(A); 00358 00359 const G4ParticleDefinition* theParticle = aParticle->GetDefinition(); 00360 00361 if( theParticle == theProton || 00362 theParticle == theNeutron || 00363 theParticle == thePiPlus || 00364 theParticle == thePiMinus ) 00365 { 00366 sigma = GetHadronNucleonXscNS(aParticle, A, Z); 00367 cofInelastic = 2.4; 00368 cofTotal = 2.0; 00369 } 00370 else 00371 { 00372 sigma = GetHadronNucleonXscNS(aParticle, A, Z); 00373 cofInelastic = 2.2; 00374 cofTotal = 2.0; 00375 } 00376 nucleusSquare = cofTotal*pi*R*R; // basically 2piRR 00377 ratio = sigma/nucleusSquare; 00378 00379 fInelasticXsc = nucleusSquare*std::log( 1. + cofInelastic*ratio )/cofInelastic; 00380 00381 G4double difratio = ratio/(1.+ratio); 00382 00383 fDiffractionXsc = 0.5*nucleusSquare*( difratio - std::log( 1. + difratio ) ); 00384 00385 if (fInelasticXsc > 0.) ratio = fDiffractionXsc/fInelasticXsc; 00386 else ratio = 0.; 00387 00388 return ratio; 00389 }
G4double G4ComponentGGHadronNucleusXsc::GetTotalElementCrossSection | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4double | A | |||
) | [virtual] |
Implements G4VComponentCrossSection.
Definition at line 110 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00113 { 00114 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00115 kinEnergy); 00116 fTotalXsc = GetIsoCrossSection(aDP, Z, G4int(A)); 00117 delete aDP; 00118 00119 return fTotalXsc; 00120 }
G4double G4ComponentGGHadronNucleusXsc::GetTotalGlauberGribovXsc | ( | ) | [inline] |
G4double G4ComponentGGHadronNucleusXsc::GetTotalIsotopeCrossSection | ( | const G4ParticleDefinition * | aParticle, | |
G4double | kinEnergy, | |||
G4int | Z, | |||
G4int | A | |||
) | [virtual] |
Implements G4VComponentCrossSection.
Definition at line 96 of file G4ComponentGGHadronNucleusXsc.cc.
References GetIsoCrossSection().
00099 { 00100 G4DynamicParticle* aDP = new G4DynamicParticle(aParticle,G4ParticleMomentum(1.,0.,0.), 00101 kinEnergy); 00102 fTotalXsc = GetIsoCrossSection(aDP, Z, A); 00103 delete aDP; 00104 00105 return fTotalXsc; 00106 }
G4bool G4ComponentGGHadronNucleusXsc::IsIsoApplicable | ( | const G4DynamicParticle * | aDP, | |
G4int | Z, | |||
G4int | A, | |||
const G4Element * | elm = 0 , |
|||
const G4Material * | mat = 0 | |||
) |
Definition at line 204 of file G4ComponentGGHadronNucleusXsc.cc.
References G4DynamicParticle::GetDefinition(), and G4DynamicParticle::GetKineticEnergy().
00208 { 00209 G4bool applicable = false; 00210 // G4int baryonNumber = aDP->GetDefinition()->GetBaryonNumber(); 00211 G4double kineticEnergy = aDP->GetKineticEnergy(); 00212 00213 const G4ParticleDefinition* theParticle = aDP->GetDefinition(); 00214 00215 if ( ( kineticEnergy >= fLowerLimit && 00216 Z > 1 && // >= He 00217 ( theParticle == theAProton || 00218 theParticle == theGamma || 00219 theParticle == theKPlus || 00220 theParticle == theKMinus || 00221 theParticle == theK0L || 00222 theParticle == theK0S || 00223 theParticle == theSMinus || 00224 theParticle == theProton || 00225 theParticle == theNeutron || 00226 theParticle == thePiPlus || 00227 theParticle == thePiMinus ) ) ) applicable = true; 00228 00229 return applicable; 00230 }
void G4ComponentGGHadronNucleusXsc::SetEnergyLowerLimit | ( | G4double | E | ) | [inline] |