67 G4bool onlyOnceInit =
true;
68 G4bool onlyOnceDestroy =
true;
81 mass2GeV2= massGeV*massGeV;
82 AtomicWeight =
G4lrint(AWeight);
84 DefineNucleusParameters(AWeight);
86 limitQ2 = 35./(R1*R1);
94 TableQ2[ii] = TableQ2[ii-1]+dQ2;
104 G4double plab2= eGeV[kk]*(eGeV[kk] + 2.0*massGeV);
105 G4double Q2m = 4.0*plab2*massA2/(mass2GeV2 + massA2 + 2.*massA2*elab);
110 TableCrossSec[ONQ2*kk] = 0.0;
120 void G4ElasticData::DefineNucleusParameters(
G4double A)
122 switch (AtomicWeight)
219 if(A < 100 && A > 3) Pnucl = 0.176 + 0.00275*
A;
225 if(A >= 100) Aeff = 0.7;
226 else if(A < 100 && A > 75) Aeff = 1.5 - 0.008*
A;
244 if ( onlyOnceInit ) {
245 for (
int i = 0 ; i<
NHADRONS ; ++i) {
246 for (
int j = 0 ; j<
ZMAX ; ++j ) {
247 SetOfElasticData[i][j]=0;
251 onlyOnceInit =
false;
256 dQ2 = hMass = hMass2 = hLabMomentum = hLabMomentum2 = MomentumCM = HadrEnergy
257 = R1 = R2 = Pnucl = Aeff = HadrTot = HadrSlope = HadrReIm = TotP = DDSect2
258 = DDSect3 = ConstU = FmaxT = Slope1 = Slope2 = Coeff1 = Coeff2 = MaxTR
259 = Slope0 = Coeff0 = aAIm = aDIm = Dtot11 = 0.0;
260 NumbN = iHadrCode = iHadron = 0;
263 plabLowLimit = 20.0*
MeV;
264 lowestEnergyLimit = 0.0;
272 protonM2 = protonM*protonM;
274 BoundaryP[0]=9.0;BoundaryTG[0]=5.0;BoundaryTL[0]=0.;
275 BoundaryP[1]=20.0;BoundaryTG[1]=1.5;BoundaryTL[1]=0.;
276 BoundaryP[2]=5.0; BoundaryTG[2]=1.0;BoundaryTL[2]=1.5;
277 BoundaryP[3]=8.0; BoundaryTG[3]=3.0;BoundaryTL[3]=0.;
278 BoundaryP[4]=7.0; BoundaryTG[4]=3.0;BoundaryTL[4]=0.;
279 BoundaryP[5]=5.0; BoundaryTG[5]=2.0;BoundaryTL[5]=0.;
280 BoundaryP[6]=5.0; BoundaryTG[6]=1.5;BoundaryTL[6]=3.0;
287 LowEdgeEnergy[0] = 0.0;
288 LowEdgeEnergy[1] = 0.5;
289 LowEdgeEnergy[2] = 0.7;
294 LowEdgeEnergy[i] = e/f;
300 G4int ic[
NHADRONS] = {211,-211,2112,2212,321,-321,130,310,311,-311,
301 3122,3222,3112,3212,3312,3322,3334,
302 -2212,-2112,-3122,-3222,-3112,-3212,-3312,-3322,-3334};
304 G4int id[
NHADRONS] = {2,3,6,0,4,5,4,4,4,5,
308 G4int id1[
NHADRONS] = {3,4,1,0,5,6,5,5,5,6,
314 HadronCode[j] = ic[j];
315 HadronType[j] =
id[j];
316 HadronType1[j] = id1[j];
318 for(
G4int k = 0; k <
ZMAX; k++) { SetOfElasticData[j][k] = 0; }
326 outFile <<
"G4ElasticHadrNucleusHE is a hadron-nucleus elastic scattering\n"
327 <<
"model developed by N. Starkov which uses a Glauber model\n"
328 <<
"parameterization to calculate the final state. It is valid\n"
329 <<
"for all hadrons with incident energies above 1 GeV.\n";
342 if ( onlyOnceDestroy ) {
347 if ( SetOfElasticData[j][k] ) {
348 delete SetOfElasticData[j][k];
349 SetOfElasticData[j][k]=0;
354 onlyOnceDestroy =
false;
378 G4cout<<
" G4ElasticHadrNucleusHE::SampleT: "
380 <<
" at Z= " << Z <<
" A= " << N
381 <<
" plab(GeV)= " << plab
386 for( idx = 0 ; idx <
NHADRONS; idx++)
388 if(iHadrCode == HadronCode[idx])
break;
393 if( idx >= NHADRONS )
return Q2;
395 iHadron = HadronType[idx];
396 iHadrCode = HadronCode[idx];
401 hMass2 = hMass*hMass;
403 G4double T = sqrt(plab*plab+hMass2)-hMass;
420 SetOfElasticData[idx][
Z] = ElD1;
424 G4cout<<
" G4ElasticHadrNucleusHE::SampleT: new record " << idx
435 (hMass2 + M2 + 2.*M*std::sqrt(plab2 + hMass2));
438 G4double T = sqrt(plab2+hMass2)-hMass;
443 G4cout<<
" SampleT: Q2(GeV^2)= "<<Q2<<
" t/tmax= " << Q2/Q2max <<
G4endl;
480 G4double ekin = std::sqrt(hMass2 + ptot2) - hMass;
483 G4cout<<
"Q2_2: ekin plab "<<ekin<<
" "<<plab<<
" tmax "<<tmax<<
G4endl;
487 for( NumbOnE = 0; NumbOnE <
NENERGY-1; NumbOnE++ )
489 if( ekin <= LowEdgeEnergy[NumbOnE+1] )
break;
493 if(NumbOnE >= NENERGY-1) { NumbOnE = NENERGY-2; }
498 hLabMomentum2 = T*(T + 2.*hMass);
509 hLabMomentum = std::sqrt(hLabMomentum2);
515 G4cout<<
"1 plab T "<<plab<<
" "<<T<<
" sigTot B ReIm "
516 <<HadrTot<<
" "<<HadrSlope<<
" "<<HadrReIm<<
G4endl;
517 G4cout<<
" R1 R2 Aeff p "<<R1<<
" "<<R2<<
" "<<Aeff<<
" "
524 G4cout<<
" HadrNucleusQ2_2: NumbOnE= " << NumbOnE
525 <<
" length= " << length
526 <<
" Q2max= " << Q2max
527 <<
" ekin= " << ekin <<
G4endl;
551 for( iNumbQ2 = 1; iNumbQ2<length; ++iNumbQ2)
553 if(Rand <= pElD->TableCrossSec[index+iNumbQ2])
break;
555 if(iNumbQ2 >= ONQ2) { iNumbQ2 = ONQ2 - 1; }
556 Q2 =
GetQ2_2(iNumbQ2, dNumbQ2, dNumbFQ2, Rand);
558 if(tmax < Q2max) Q2 *= tmax/Q2max;
561 G4cout<<
" HadrNucleusQ2_2(2): Q2= "<<Q2<<
" iNumbQ2= " << iNumbQ2
562 <<
" rand= " << Rand <<
G4endl;
584 G4cout <<
"GetQ2_2 kk= " << kk <<
" X2= " << X2 <<
" X3= " << X3
585 <<
" F2= " << F2 <<
" F3= " << F3 <<
" Rndm= " << ranUni <<
G4endl;
587 if(kk == 1 || kk == 0)
601 G4double D0 = F12*F2+F1*F32+F3*F22-F32*F2-F22*F1-F12*F3;
604 G4cout <<
" X1= " << X1 <<
" F1= " << F1 <<
" D0= "
607 if(std::abs(D0) < 0.00000001)
609 ranQ2 = X2 + (ranUni - F2)*(X3 - X2)/(F3 - F2);
613 G4double DA = X1*F2+X3*F1+X2*F3-X3*F2-X1*F3-X2*F1;
614 G4double DB = X2*F12+X1*F32+X3*F22-X2*F32-X3*F12-X1*
F22;
615 G4double DC = X3*F2*F12+X2*F1*F32+X1*F3*F22
616 -X1*F2*F32-X2*F3*F12-X3*F1*
F22;
617 ranQ2 = (DA*ranUni*ranUni + DB*ranUni + DC)/D0;
636 for(ii = 1; ii<
ONQ2; ii++)
641 for(jj = 0; jj<20; jj++)
646 curSum += curSec*aSimp;
648 if(aSimp > 3) aSimp = 2;
652 G4cout<<
" Q2 "<<curQ2<<
" AIm "<<aAIm<<
" DIm "<<aDIm
653 <<
" Diff "<<curSec<<
" totSum "<<totSum<<
G4endl;
663 G4cout<<
" GetHeavy: Q2 dQ2 totSum "<<Q2l<<
" "<<dQ2<<
" "<<totSum
665 <<curSec<<
" totSum "<< totSum<<
" DTot "
682 G4double valueConstU = 2.*(hMass2 + protonM2) - Q2;
684 G4double y = (1.-Coeff1-Coeff0)/HadrSlope*(1.-
G4Exp(-HadrSlope*Q2))
685 + Coeff0*(1.-
G4Exp(-Slope0*Q2))
686 + Coeff2/Slope2*
G4Exp(Slope2*valueConstU)*(
G4Exp(Slope2*Q2)-1.)
687 + 2.*Coeff1/Slope1*(1./Slope1-(1./Slope1+SqrQ2)*
G4Exp(-Slope1*SqrQ2));
702 G4cout<<
" Fq2 Before for i Tot B Im "<<HadrTot<<
" "<<HadrSlope<<
" "
706 G4cout <<
"GetFq2: Stot= " << Stot <<
" Bhad= " << Bhad
708 <<
" Asq= " << Asq <<
G4endl;
709 G4cout <<
"R1= " << R1 <<
" R2= " << R2 <<
" Pnucl= " << Pnucl <<
G4endl;
716 G4double Norm = (R12*R1-Pnucl*R22*R2);
723 G4double FiH = std::asin(HadrReIm/Rho2);
727 G4cout <<
"UnucRho2= " << UnucRho2 <<
" FiH= " << FiH <<
" NN2= " << NN2
728 <<
" Norm= " << Norm <<
G4endl;
740 G4int i1, i2, j1, j2;
742 for(i1 = 1; i1<= Nucleus; i1++)
744 N1 = -N1*Unucl*(Nucleus-i1+1)/i1*Rho2;
749 for(i2 = 1; i2<=Nucleus; i2++)
751 N2 = -N2*Unucl*(Nucleus-i2+1)/i2*Rho2;
754 for(j2=0; j2<= i2; j2++)
757 exp2 = 1/(j2/R22B+(i2-j2)/R12B);
760 for(j1=0; j1<=i1; j1++)
762 exp1 = 1/(j1/R22B+(i1-j1)/R12B);
765 Prod3 = Prod3+N4*exp1*exp2*
766 (1-
G4Exp(-Q2*dddd/4))/dddd*4*SetBinom[i1][j1];
768 Prod2 = Prod2 +Prod3*N5*SetBinom[i2][j2];
770 Prod1 = Prod1 + Prod2*N2*std::cos(FiH*(i1-i2));
772 if (std::fabs(Prod2*N2/Prod1)<prec)
break;
774 Prod0 = Prod0 + Prod1*N1;
775 if(std::fabs(N1*Prod1/Prod0) < prec)
break;
779 Prod0 *= 0.25*
pi/MbToGeV2;
782 G4cout <<
"GetLightFq2 Z= " << Z <<
" A= " << Nucleus
783 <<
" Q2= " << Q2 <<
" Res= " << Prod0 <<
G4endl;
801 G4double valueConstU = hMass2 + protonM2-2*protonM*HadrEnergy - aQ2;
803 G4double MaxT = 4*MomentumCM*MomentumCM;
805 BoundaryTL[0] = MaxT;
806 BoundaryTL[1] = MaxT;
807 BoundaryTL[3] = MaxT;
808 BoundaryTL[4] = MaxT;
809 BoundaryTL[5] = MaxT;
813 dSigPodT = HadrTot*HadrTot*(1+HadrReIm*HadrReIm)*
815 Coeff1*
G4Exp(-Slope1*SqrQ2)+
816 Coeff2*
G4Exp( Slope2*(valueConstU)+aQ2)+
817 (1-Coeff1-Coeff0)*
G4Exp(-HadrSlope*aQ2)+
818 +Coeff0*
G4Exp(-Slope0*aQ2)
838 G4double R23Ap = R22*R2/R22Ap*Pnuclp;
842 G4double R12ApdR22Ap = 0.5*(R12Apd+R22Apd);
844 G4double DDSec1p = (DDSect2+DDSect3*
G4Log(0.53*HadrEnergy/R1));
846 std::sqrt((R12+R22)/2)));
847 G4double DDSec3p = (DDSect2+DDSect3*
G4Log(0.53*HadrEnergy/R2));
849 G4double Norm = (R12*R1-Pnucl*R22*R2)*Aeff;
850 G4double Normp = (R12*R1-Pnuclp*R22*R2)*Aeff;
865 G4double Prod1, Tot1=0, medTot, DTot1, DmedTot;
868 for( i=1; i<=NWeight; i++)
870 N = -N*Unucl*(NWeight-i+1)/i*Rho2;
872 Prod1 =
G4Exp(-theQ2/i*R12B/4)/i*R12B;
875 for(
G4int l=1; l<=i; l++)
877 exp1 = l/R22B+(i-l)/R12B;
878 N4 = -N4*(i-l+1)/l*N2;
879 Prod1 = Prod1+N4/exp1*
G4Exp(-theQ2/(exp1*4));
880 medTot = medTot+N4/exp1;
883 ReElasticAmpl0 = ReElasticAmpl0+Prod1*N*std::sin(FiH*i);
884 ImElasticAmpl0 = ImElasticAmpl0+Prod1*N*std::cos(FiH*i);
885 Tot1 = Tot1+medTot*N*std::cos(FiH*i);
886 if(std::fabs(Prod1*N/ImElasticAmpl0) < 0.000001)
break;
889 ImElasticAmpl0 = ImElasticAmpl0*
pi/2.568;
890 ReElasticAmpl0 = ReElasticAmpl0*
pi/2.568;
891 Tot1 = Tot1*
twopi/2.568;
901 Din1 = 0.5*(C1*
G4Exp(-theQ2/8*R12Ap)/2*R12Ap-
902 C2/R12ApdR22Ap*
G4Exp(-theQ2/(4*R12ApdR22Ap))+
903 C3*R22Ap/2*
G4Exp(-theQ2/8*R22Ap));
905 DTot1 = 0.5*(C1/2*R12Ap-C2/R12ApdR22Ap+C3*R22Ap/2);
915 for( i = 1; i<= NWeight-2; i++)
917 N1p = -N1p*UnuclScr*(NWeight-i-1)/i*Rho2;
921 for(
G4int l = 0; l<=i; l++)
923 if(l == 0) BinCoeff = 1;
924 else if(l !=0 ) BinCoeff = BinCoeff*(i-l+1)/l;
926 exp1 = l/R22B+(i-l)/R12B;
928 exp2p = exp1+R12ApdR22Ap;
931 Din2 = Din2 + N2p*BinCoeff*
932 (C1/exp1p*
G4Exp(-theQ2/(4*exp1p))-
933 C2/exp2p*
G4Exp(-theQ2/(4*exp2p))+
934 C3/exp3p*
G4Exp(-theQ2/(4*exp3p)));
936 DmedTot = DmedTot + N2p*BinCoeff*
937 (C1/exp1p-C2/exp2p+C3/exp3p);
942 Din1 = Din1+Din2*N1p/((i+2)*(i+1))*std::cos(FiH*i);
943 DTot1 = DTot1+DmedTot*N1p/((i+2)*(i+1))*std::cos(FiH*i);
945 if(std::fabs(Din2*N1p/Din1) < 0.000001)
break;
948 Din1 = -Din1*NWeight*(NWeight-1)*4/(Normp*Normp);
950 DTot1 = DTot1*NWeight*(NWeight-1)*4/(Normp*Normp);
957 G4double DiffCrSec2 = (ReElasticAmpl0*ReElasticAmpl0+
958 (ImElasticAmpl0+Din1)*
959 (ImElasticAmpl0+Din1))/
twopi;
964 aAIm = ImElasticAmpl0;
977 HadrEnergy = std::sqrt(hMass2 + hLabMomentum2);
979 G4double sHadr = 2.*HadrEnergy*protonM+protonM2+hMass2;
981 G4double Ecm = 0.5*(sHadr-hMass2+protonM2)/sqrS;
982 MomentumCM = std::sqrt(Ecm*Ecm-protonM2);
985 G4cout <<
"GetHadrVall.: Z= " << Z <<
" iHadr= " << iHadron
986 <<
" E(GeV)= " << HadrEnergy <<
" sqrS= " << sqrS
987 <<
" plab= " << hLabMomentum
988 <<
" E - m "<<HadrEnergy - hMass<<
G4endl;
1000 if(hLabMomentum > 10)
1001 TotP = TotN = 7.5*logE - 40.12525 + 103*
G4Exp(-
G4Log(sHadr)*0.165);
1010 if( hLabMomentum > 1.4 )
1011 TotN = 33.3+15.2*(hLabMomentum2-1.35)/
1014 else if(hLabMomentum > 0.8)
1017 TotN = 33.0 + 25.5*A0*A0;
1022 TotN = 33.0 + 30.*A0*A0*A0*A0;
1027 if(hLabMomentum >= 1.05)
1029 TotP = 39.0+75.*(hLabMomentum-1.2)/
1030 (hLabMomentum2*hLabMomentum+0.15);
1033 else if(hLabMomentum >= 0.7)
1036 TotP = 23.0 + 40.*A0*A0;
1046 HadrTot = 0.5*(TotP+TotN);
1049 if(hLabMomentum >= 2.) HadrSlope = 5.44 + 0.88*logS;
1051 else if(hLabMomentum >= 0.5) HadrSlope = 3.73*hLabMomentum-0.37;
1053 else HadrSlope = 1.5;
1056 if(hLabMomentum >= 1.2)
1057 HadrReIm = 0.13*(logS - 5.8579332)*
G4Exp(-
G4Log(sHadr)*0.18);
1059 else if(hLabMomentum >= 0.6)
1060 HadrReIm = -75.5*(
G4Exp(
G4Log(hLabMomentum)*0.25)-0.95)/
1064 HadrReIm = 15.5*hLabMomentum/(27*hLabMomentum2*hLabMomentum+2);
1069 if( iHadrCode == 3122)
1075 else if( iHadrCode == 3222)
1081 else if(iHadrCode == 3112 || iHadrCode == 3212 )
1087 else if( iHadrCode == 3312 || iHadrCode == 3322 )
1093 else if( iHadrCode == 3334)
1104 HadrTot = 5.2+5.2*logE + 123.2/sqrS;
1105 HadrSlope = 8.32+0.57*logS;
1107 if( HadrEnergy < 1000 )
1108 HadrReIm = 0.06*(sqrS-2.236)*(sqrS-14.14)*
G4Exp(-
G4Log(sHadr)*0.8);
1110 HadrReIm = 0.6*(logS - 5.8579332)*
G4Exp(-
G4Log(sHadr)*0.25);
1115 if( iHadrCode == -3122)
1121 else if( iHadrCode == -3222)
1127 else if(iHadrCode == -3112 || iHadrCode == -3212 )
1133 else if( iHadrCode == -3312 || iHadrCode == -3322 )
1139 else if( iHadrCode == -3334)
1150 if(hLabMomentum >= 3.5)
1151 TotP = 10.6+2.*logE + 25.*
G4Exp(-
G4Log(HadrEnergy)*0.43);
1153 else if(hLabMomentum >= 1.15)
1155 G4double x = (hLabMomentum - 2.55)/0.55;
1156 G4double y = (hLabMomentum - 1.47)/0.225;
1157 TotP = 3.2*
G4Exp(-x*x) + 12.*
G4Exp(-y*y) + 27.5;
1160 else if(hLabMomentum >= 0.4)
1162 TotP = 88*(logE+0.2877)*(logE+0.2877)+14.0;
1167 G4double x = (hLabMomentum - 0.29)/0.085;
1168 TotP = 20. + 180.*
G4Exp(-x*x);
1172 if(hLabMomentum >= 3.0 )
1173 TotN = 10.6 + 2.*logE + 30.*
G4Exp(-
G4Log(HadrEnergy)*0.43);
1175 else if(hLabMomentum >= 1.3)
1178 G4double y = (hLabMomentum - 1.4)/0.12;
1179 TotN = 36.1+0.079 - 4.313*logE + 3.*
G4Exp(-x*x) +
1182 else if(hLabMomentum >= 0.65)
1184 G4double x = (hLabMomentum - 0.72)/0.06;
1185 G4double y = (hLabMomentum - 1.015)/0.075;
1186 TotN = 36.1 + 10.*
G4Exp(-x*x) + 24*
G4Exp(-y*y);
1188 else if(hLabMomentum >= 0.37)
1191 TotN = 26. + 110.*x*
x;
1195 G4double x = (hLabMomentum - 0.29)/0.07;
1196 TotN = 28.0 + 40.*
G4Exp(-x*x);
1198 HadrTot = (TotP+TotN)/2;
1200 HadrSlope = 7.28+0.245*logS;
1201 HadrReIm = 0.2*(logS - 4.6051702)*
G4Exp(-
G4Log(sHadr)*0.15);
1210 HadrTot = 10.6+1.8*logE + 9.0*
G4Exp(-
G4Log(HadrEnergy)*0.55);
1211 if(HadrEnergy>100) HadrSlope = 15.0;
1212 else HadrSlope = 1.0+1.76*logS - 2.84/sqrS;
1214 HadrReIm = 0.4*(sHadr-20)*(sHadr-150)*
G4Exp(-
G4Log(sHadr+50)*2.1);
1221 HadrTot = 10+1.8*logE + 25./sqrS;
1222 HadrSlope = 6.98+0.127*logS;
1223 HadrReIm = 0.4*(sHadr-20)*(sHadr-20)*
G4Exp(-
G4Log(sHadr+50)*2.1);
1230 G4cout <<
"HadrTot= " << HadrTot <<
" HadrSlope= " << HadrSlope
1231 <<
" HadrReIm= " << HadrReIm <<
" DDSect2= " << DDSect2
1232 <<
" DDSect3= " << DDSect3 <<
G4endl;
1238 Coeff0 = Coeff1 = Coeff2 = 0.0;
1239 Slope0 = Slope1 = 1.0;
1243 static const G4double EnP0[6]={1.5,3.0,5.0,9.0,14.0,19.0};
1244 static const G4double C0P0[6]={0.15,0.02,0.06,0.08,0.0003,0.0002};
1245 static const G4double C1P0[6]={0.05,0.02,0.03,0.025,0.0,0.0};
1246 static const G4double B0P0[6]={1.5,2.5,3.0,4.5,1.4,1.25};
1247 static const G4double B1P0[6]={5.0,1.0,3.5,4.0,4.8,4.8};
1250 static const G4double EnN[5]={1.5,5.0,10.0,14.0,20.0};
1251 static const G4double C0N[5]={0.0,0.0,0.02,0.02,0.01};
1252 static const G4double C1N[5]={0.06,0.008,0.0015,0.001,0.0003};
1253 static const G4double B0N[5]={1.5,2.5,3.8,3.8,3.5};
1254 static const G4double B1N[5]={1.5,2.2,3.6,4.5,4.8};
1257 static const G4double EnP[2]={1.5,4.0};
1258 static const G4double C0P[2]={0.001,0.0005};
1259 static const G4double C1P[2]={0.003,0.001};
1260 static const G4double B0P[2]={2.5,4.5};
1261 static const G4double B1P[2]={1.0,4.0};
1264 static const G4double EnPP[4]={1.0,2.0,3.0,4.0};
1265 static const G4double C0PP[4]={0.0,0.0,0.0,0.0};
1266 static const G4double C1PP[4]={0.15,0.08,0.02,0.01};
1267 static const G4double B0PP[4]={1.5,2.8,3.8,3.8};
1268 static const G4double B1PP[4]={0.8,1.6,3.6,4.6};
1271 static const G4double EnPPN[4]={1.0,2.0,3.0,4.0};
1272 static const G4double C0PPN[4]={0.0,0.0,0.0,0.0};
1273 static const G4double C1PPN[4]={0.0,0.0,0.0,0.0};
1274 static const G4double B0PPN[4]={1.5,2.8,3.8,3.8};
1275 static const G4double B1PPN[4]={0.8,1.6,3.6,4.6};
1278 static const G4double EnK[4]={1.4,2.33,3.0,5.0};
1279 static const G4double C0K[4]={0.0,0.0,0.0,0.0};
1280 static const G4double C1K[4]={0.01,0.007,0.005,0.003};
1281 static const G4double B0K[4]={1.5,2.0,3.8,3.8};
1282 static const G4double B1K[4]={1.6,1.6,1.6,1.6};
1285 static const G4double EnKM[2]={1.4,4.0};
1286 static const G4double C0KM[2]={0.006,0.002};
1287 static const G4double C1KM[2]={0.00,0.00};
1288 static const G4double B0KM[2]={2.5,3.5};
1289 static const G4double B1KM[2]={1.6,1.6};
1295 if(hLabMomentum <BoundaryP[0])
1298 Coeff2 = 0.8/hLabMomentum/hLabMomentum;
1303 if(hLabMomentum < BoundaryP[1])
1306 Coeff2 = 0.8/hLabMomentum/hLabMomentum;
1311 if(hLabMomentum < BoundaryP[2])
1317 if(hLabMomentum < BoundaryP[3])
1320 Coeff2 = 0.02/hLabMomentum;
1325 if(hLabMomentum < BoundaryP[4])
1328 Coeff2 = 0.02/hLabMomentum;
1333 if(hLabMomentum < BoundaryP[5])
1336 if(hLabMomentum < 1) Coeff2 = 0.34;
1337 else Coeff2 = 0.34/hLabMomentum2/hLabMomentum;
1341 if(hLabMomentum < BoundaryP[6])
1344 if(hLabMomentum < 1) Coeff2 = 0.01;
1345 else Coeff2 = 0.01/hLabMomentum2/hLabMomentum;
1350 G4cout<<
" HadrVal : Plasb "<<hLabMomentum
1351 <<
" iHadron "<<iHadron<<
" HadrTot "<<HadrTot<<
G4endl;
1360 G4cout<<
"1 GetKin.: HadronName MomentumH "
1365 G4double Sh = 2.0*protonM*HadrEnergy+protonM2+hMass2;
1367 ConstU = 2*protonM2+2*hMass2-Sh;
1369 G4double MaxT = 4*MomentumCM*MomentumCM;
1371 BoundaryTL[0] = MaxT;
1372 BoundaryTL[1] = MaxT;
1373 BoundaryTL[3] = MaxT;
1374 BoundaryTL[4] = MaxT;
1375 BoundaryTL[5] = MaxT;
1379 while(iHadrCode!=HadronCode[NumberH]) NumberH++;
1381 NumberH = HadronType1[NumberH];
1383 if(MomentumH<BoundaryP[NumberH]) MaxTR = BoundaryTL[NumberH];
1384 else MaxTR = BoundaryTG[NumberH];
1387 G4cout<<
"3 GetKin. : NumberH "<<NumberH
1388 <<
" Bound.P[NumberH] "<<BoundaryP[NumberH]
1389 <<
" Bound.TL[NumberH] "<<BoundaryTL[NumberH]
1390 <<
" Bound.TG[NumberH] "<<BoundaryTG[NumberH]
1391 <<
" MaxT MaxTR "<<MaxT<<
" "<<MaxTR<<
G4endl;
1401 Fdistr = (1-Coeff1-Coeff0)
1402 /HadrSlope*(1-
G4Exp(-HadrSlope*Q2))
1403 + Coeff0*(1-
G4Exp(-Slope0*Q2))
1404 + Coeff2/Slope2*
G4Exp(Slope2*ConstU)*(
G4Exp(Slope2*Q2)-1)
1405 + 2*Coeff1/Slope1*(1/Slope1-(1/Slope1+SqrQ2)*
G4Exp(-Slope1*SqrQ2));
1408 G4cout<<
"Old: Coeff0 Coeff1 Coeff2 "<<Coeff0<<
" "
1409 <<Coeff1<<
" "<<Coeff2<<
" Slope Slope0 Slope1 Slope2 "
1410 <<HadrSlope<<
" "<<Slope0<<
" "<<Slope1<<
" "<<Slope2
1411 <<
" Fdistr "<<Fdistr<<
G4endl;
1417 G4double DDD0=MaxTR*0.5, DDD1=0.0, DDD2=MaxTR, delta;
1420 FmaxT =
GetFt(MaxTR);
1423 const G4int maxNumberOfLoops = 10000;
1424 G4int loopCounter = -1;
1425 while ( (std::fabs(delta) > 0.0001) &&
1426 ++loopCounter < maxNumberOfLoops )
1431 DDD0 = (DDD0+DDD1)*0.5;
1436 DDD0 = (DDD0+DDD2)*0.5;
1440 if ( loopCounter >= maxNumberOfLoops ) {
1455 hMass2 = hMass*hMass;
1456 hLabMomentum = inLabMom;
1457 hLabMomentum2 = hLabMomentum*hLabMomentum;
1458 HadrEnergy = sqrt(hLabMomentum2+hMass2);
1475 void G4ElasticHadrNucleusHE::Binom()
1480 for(N = 0; N < 240; N++)
1484 for( M = 0; M <=
N; M++ )
1488 if ( ( N > 0 ) && ( N > M ) && M > 0 )
1493 SetBinom[
N][M] = Fact1;
G4double SampleT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
G4double GetQ2(G4double Ran)
void DefineHadronValues(G4int Z)
G4double GetDistrFun(G4double Q2)
#define G4MUTEXINIT(mutex)
G4double HadronProtonQ2(const G4ParticleDefinition *aHadron, G4double inLabMom)
G4int GetPDGEncoding() const
static G4NistManager * Instance()
#define G4MUTEX_INITIALIZER
const G4String & GetParticleName() const
void GetKinematics(const G4ParticleDefinition *aHadron, G4double MomentumH)
static constexpr double twopi
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4ElasticHadrNucleusHE(const G4String &name="hElasticGlauber")
G4double TableCrossSec[NQTABLE]
G4double HadrNucDifferCrSec(G4int Z, G4int Nucleus, G4double Q2)
static G4Proton * Proton()
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
static const G4int NENERGY
virtual ~G4ElasticHadrNucleusHE()
G4double GetPDGMass() const
G4ElasticData(const G4ParticleDefinition *h, G4int Z, G4double A, G4double *eGeV)
G4double GetLightFq2(G4int Z, G4int A, G4double Q)
virtual void ModelDescription(std::ostream &) const
G4double GetAtomicMassAmu(const G4String &symb) const
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static constexpr double GeV
G4double GetHeavyFq2(G4int Z, G4int Nucleus, G4double *LineFq2)
static constexpr double MeV
G4double GetQ2_2(G4int N, G4double *Q, G4double *F, G4double R)
static constexpr double pi
G4double HadronNucleusQ2_2(G4ElasticData *pElD, G4int Z, G4double plabGeV, G4double tmax)
void InterpolateHN(G4int n, const G4double EnP[], const G4double C0P[], const G4double C1P[], const G4double B0P[], const G4double B1P[])
G4double GetFt(G4double Q2)
#define G4MUTEXDESTROY(mutex)
static const G4int NHADRONS
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)