68 mass2GeV2= massGeV*massGeV;
69 AtomicWeight =
G4int(AWeight + 0.5);
71 DefineNucleusParameters(AWeight);
73 limitQ2 = 35./(R1*R1);
79 for(
G4int ii = 1; ii < ONQ2; ii++)
81 TableQ2[ii] = TableQ2[ii-1]+dQ2;
87 for(
G4int kk = 0; kk < NENERGY; kk++)
91 G4double plab2= eGeV[kk]*(eGeV[kk] + 2.0*massGeV);
92 G4double Q2m = 4.0*plab2*massA2/(mass2GeV2 + massA2 + 2.*massA2*elab);
97 TableCrossSec[ONQ2*kk] = 0.0;
107 void G4ElasticData::DefineNucleusParameters(
G4double A)
109 switch (AtomicWeight)
203 R1 = 4.45*std::pow(A - 1.,0.309)*0.9;
204 R2 = 2.3 *std::pow(A, 0.36);
206 if(A < 100 && A > 3) Pnucl = 0.176 + 0.00275*A;
212 if(A >= 100) Aeff = 0.7;
213 else if(A < 100 && A > 75) Aeff = 1.5 - 0.008*A;
229 dQ2 = hMass = hMass2 = hLabMomentum = hLabMomentum2 = MomentumCM = HadrEnergy
230 = R1 = R2 = Pnucl = Aeff = HadrTot = HadrSlope = HadrReIm = TotP = DDSect2
231 = DDSect3 = ConstU = FmaxT = Slope1 = Slope2 = Coeff1 = Coeff2 = MaxTR
232 = Slope0 = Coeff0 = aAIm = aDIm = Dtot11 = 0.0;
233 NumbN = iHadrCode = iHadron = 0;
236 plabLowLimit = 20.0*
MeV;
237 lowestEnergyLimit = 0.0;
245 protonM2 = protonM*protonM;
247 BoundaryP[0]=9.0;BoundaryTG[0]=5.0;BoundaryTL[0]=0.;
248 BoundaryP[1]=20.0;BoundaryTG[1]=1.5;BoundaryTL[1]=0.;
249 BoundaryP[2]=5.0; BoundaryTG[2]=1.0;BoundaryTL[2]=1.5;
250 BoundaryP[3]=8.0; BoundaryTG[3]=3.0;BoundaryTL[3]=0.;
251 BoundaryP[4]=7.0; BoundaryTG[4]=3.0;BoundaryTL[4]=0.;
252 BoundaryP[5]=5.0; BoundaryTG[5]=2.0;BoundaryTL[5]=0.;
253 BoundaryP[6]=5.0; BoundaryTG[6]=1.5;BoundaryTL[6]=3.0;
260 LowEdgeEnergy[0] = 0.0;
261 LowEdgeEnergy[1] = 0.5;
262 LowEdgeEnergy[2] = 0.7;
265 for(
G4int i=3; i<NENERGY; i++) {
267 LowEdgeEnergy[i] = e/
f;
273 G4int ic[NHADRONS] = {211,-211,2112,2212,321,-321,130,310,311,-311,
274 3122,3222,3112,3212,3312,3322,3334,
275 -2212,-2112,-3122,-3222,-3112,-3212,-3312,-3322,-3334};
277 G4int id[NHADRONS] = {2,3,6,0,4,5,4,4,4,5,
281 G4int id1[NHADRONS] = {3,4,1,0,5,6,5,5,5,6,
285 for(
G4int j=0; j<NHADRONS; j++)
287 HadronCode[j] = ic[j];
288 HadronType[j] =
id[j];
289 HadronType1[j] = id1[j];
291 for(
G4int k = 0; k < 93; k++) { SetOfElasticData[j][k] = 0; }
298 char* dirName = getenv(
"G4PhysListDocDir");
303 outFile.open(pathName);
304 outFile <<
"<html>\n";
305 outFile <<
"<head>\n";
307 outFile <<
"<title>Description of G4ElasticHadrNucleusHE Model</title>\n";
308 outFile <<
"</head>\n";
309 outFile <<
"<body>\n";
311 outFile <<
"G4ElasticHadrNucleusHE is a hadron-nucleus elastic scattering\n"
312 <<
"model developed by N. Starkov which uses a Glauber model\n"
313 <<
"parameterization to calculate the final state. It is valid\n"
314 <<
"for all hadrons with incident energies above 1 GeV.\n";
316 outFile <<
"</body>\n";
317 outFile <<
"</html>\n";
329 for(
G4int j = 0; j < NHADRONS; j++)
331 for(
G4int k = 0; k < 93; k++)
333 if(SetOfElasticData[j][k])
delete SetOfElasticData[j][k];
356 G4cout<<
" G4ElasticHadrNucleusHE::SampleT: "
358 <<
" at Z= " << Z <<
" A= " << N
359 <<
" plab(GeV)= " << plab
364 for( idx = 0 ; idx < NHADRONS; idx++)
366 if(iHadrCode == HadronCode[idx])
break;
371 if( idx >= NHADRONS )
return Q2;
373 iHadron = HadronType[idx];
374 iHadrCode = HadronCode[idx];
379 hMass2 = hMass*hMass;
381 G4double T = sqrt(plab*plab+hMass2)-hMass;
397 SetOfElasticData[idx][
Z] = ElD1;
401 G4cout<<
" G4ElasticHadrNucleusHE::SampleT: new record " << idx
412 (hMass2 + M2 + 2.*M*std::sqrt(plab2 + hMass2));
415 G4double T = sqrt(plab2+hMass2)-hMass;
420 G4cout<<
" SampleT: Q2(GeV^2)= "<<Q2<<
" t/tmax= " << Q2/Q2max <<
G4endl;
453 G4double ekin = std::sqrt(hMass2 + ptot2) - hMass;
456 G4cout<<
"Q2_2: ekin plab "<<ekin<<
" "<<plab<<
" tmax "<<tmax<<
G4endl;
460 for( NumbOnE = 0; NumbOnE < NENERGY-1; NumbOnE++ )
462 if( ekin <= LowEdgeEnergy[NumbOnE+1] )
break;
470 hLabMomentum2 = T*(T + 2.*hMass);
481 hLabMomentum = std::sqrt(hLabMomentum2);
487 G4cout<<
"1 plab T "<<plab<<
" "<<T<<
" sigTot B ReIm "
488 <<HadrTot<<
" "<<HadrSlope<<
" "<<HadrReIm<<
G4endl;
489 G4cout<<
" R1 R2 Aeff p "<<R1<<
" "<<R2<<
" "<<Aeff<<
" "
496 G4cout<<
" HadrNucleusQ2_2: NumbOnE= " << NumbOnE
497 <<
" length= " << length
498 <<
" Q2max= " << Q2max
499 <<
" ekin= " << ekin <<
G4endl;
508 for(
G4int ii=0; ii<ONQ2; ii++)
517 pElD->
dnkE[NumbOnE] = ONQ2;
523 for( iNumbQ2 = 1; iNumbQ2<length; iNumbQ2++ )
525 if(Rand <= pElD->TableCrossSec[index+iNumbQ2])
break;
527 Q2 =
GetQ2_2(iNumbQ2, dNumbQ2, dNumbFQ2, Rand);
529 if(tmax < Q2max) Q2 *= tmax/Q2max;
532 G4cout<<
" HadrNucleusQ2_2(2): Q2= "<<Q2<<
" iNumbQ2= " << iNumbQ2
533 <<
" rand= " << Rand <<
G4endl;
555 G4cout <<
"GetQ2_2 kk= " << kk <<
" X2= " << X2 <<
" X3= " << X3
556 <<
" F2= " << F2 <<
" F3= " << F3 <<
" Rndm= " << ranUni <<
G4endl;
558 if(kk == 1 || kk == 0)
572 G4double D0 = F12*F2+F1*F32+F3*F22-F32*F2-F22*F1-F12*F3;
575 G4cout <<
" X1= " << X1 <<
" F1= " << F1 <<
" D0= "
578 if(std::abs(D0) < 0.00000001)
580 ranQ2 = X2 + (ranUni - F2)*(X3 - X2)/(F3 - F2);
584 G4double DA = X1*F2+X3*F1+X2*F3-X3*F2-X1*F3-X2*F1;
585 G4double DB = X2*F12+X1*F32+X3*F22-X2*F32-X3*F12-X1*
F22;
586 G4double DC = X3*F2*F12+X2*F1*F32+X1*F3*F22
587 -X1*F2*F32-X2*F3*F12-X3*F1*
F22;
588 ranQ2 = (DA*ranUni*ranUni + DB*ranUni + DC)/D0;
607 for(ii = 1; ii<ONQ2; ii++)
612 for(jj = 0; jj<20; jj++)
617 curSum += curSec*aSimp;
619 if(aSimp > 3) aSimp = 2;
623 G4cout<<
" Q2 "<<curQ2<<
" AIm "<<aAIm<<
" DIm "<<aDIm
624 <<
" Diff "<<curSec<<
" totSum "<<totSum<<
G4endl;
634 G4cout<<
" GetHeavy: Q2 dQ2 totSum "<<Q2l<<
" "<<dQ2<<
" "<<totSum
636 <<curSec<<
" totSum "<< totSum<<
" DTot "
653 G4double valueConstU = 2.*(hMass2 + protonM2) - Q2;
655 G4double y = (1.-Coeff1-Coeff0)/HadrSlope*(1.-std::exp(-HadrSlope*Q2))
656 + Coeff0*(1.-std::exp(-Slope0*Q2))
657 + Coeff2/Slope2*std::exp(Slope2*valueConstU)*(std::exp(Slope2*Q2)-1.)
658 + 2.*Coeff1/Slope1*(1./Slope1-(1./Slope1+SqrQ2)*std::exp(-Slope1*SqrQ2));
665 G4double prec = Nucleus > 208 ? 1.0e-7 : 1.0e-6;
673 G4cout<<
" Fq2 Before for i Tot B Im "<<HadrTot<<
" "<<HadrSlope<<
" "
677 G4cout <<
"GetFq2: Stot= " << Stot <<
" Bhad= " << Bhad
679 <<
" Asq= " << Asq <<
G4endl;
680 G4cout <<
"R1= " << R1 <<
" R2= " << R2 <<
" Pnucl= " << Pnucl <<
G4endl;
687 G4double Norm = (R12*R1-Pnucl*R22*R2);
694 G4double FiH = std::asin(HadrReIm/Rho2);
698 G4cout <<
"UnucRho2= " << UnucRho2 <<
" FiH= " << FiH <<
" NN2= " << NN2
699 <<
" Norm= " << Norm <<
G4endl;
711 G4int i1, i2, j1, j2;
713 for(i1 = 1; i1<= Nucleus; i1++)
715 N1 = -N1*Unucl*(Nucleus-i1+1)/i1*Rho2;
720 for(i2 = 1; i2<=Nucleus; i2++)
722 N2 = -N2*Unucl*(Nucleus-i2+1)/i2*Rho2;
725 for(j2=0; j2<= i2; j2++)
728 exp2 = 1/(j2/R22B+(i2-j2)/R12B);
731 for(j1=0; j1<=i1; j1++)
733 exp1 = 1/(j1/R22B+(i1-j1)/R12B);
736 Prod3 = Prod3+N4*exp1*exp2*
737 (1-std::exp(-Q2*dddd/4))/dddd*4*SetBinom[i1][j1];
739 Prod2 = Prod2 +Prod3*N5*SetBinom[i2][j2];
741 Prod1 = Prod1 + Prod2*N2*std::cos(FiH*(i1-i2));
743 if (std::fabs(Prod2*N2/Prod1)<prec)
break;
745 Prod0 = Prod0 + Prod1*N1;
746 if(std::fabs(N1*Prod1/Prod0) < prec)
break;
750 Prod0 *= 0.25*
pi/MbToGeV2;
753 G4cout <<
"GetLightFq2 Z= " << Z <<
" A= " << Nucleus
754 <<
" Q2= " << Q2 <<
" Res= " << Prod0 <<
G4endl;
772 G4double valueConstU = hMass2 + protonM2-2*protonM*HadrEnergy - aQ2;
774 G4double MaxT = 4*MomentumCM*MomentumCM;
776 BoundaryTL[0] = MaxT;
777 BoundaryTL[1] = MaxT;
778 BoundaryTL[3] = MaxT;
779 BoundaryTL[4] = MaxT;
780 BoundaryTL[5] = MaxT;
784 dSigPodT = HadrTot*HadrTot*(1+HadrReIm*HadrReIm)*
786 Coeff1*std::exp(-Slope1*SqrQ2)+
787 Coeff2*std::exp( Slope2*(valueConstU)+aQ2)+
788 (1-Coeff1-Coeff0)*std::exp(-HadrSlope*aQ2)+
789 +Coeff0*std::exp(-Slope0*aQ2)
809 G4double R23Ap = R22*R2/R22Ap*Pnuclp;
813 G4double R12ApdR22Ap = 0.5*(R12Apd+R22Apd);
815 G4double DDSec1p = (DDSect2+DDSect3*std::log(1.06*2*HadrEnergy/R1/4));
816 G4double DDSec2p = (DDSect2+DDSect3*std::log(1.06*2*HadrEnergy/
817 std::sqrt((R12+R22)/2)/4));
818 G4double DDSec3p = (DDSect2+DDSect3*std::log(1.06*2*HadrEnergy/R2/4));
820 G4double Norm = (R12*R1-Pnucl*R22*R2)*Aeff;
821 G4double Normp = (R12*R1-Pnuclp*R22*R2)*Aeff;
836 G4double Prod1, Tot1=0, medTot, DTot1, DmedTot;
839 for( i=1; i<=NWeight; i++)
841 N = -N*Unucl*(NWeight-i+1)/i*Rho2;
843 Prod1 = std::exp(-theQ2/i*R12B/4)/i*R12B;
846 for(
G4int l=1; l<=i; l++)
848 exp1 = l/R22B+(i-l)/R12B;
849 N4 = -N4*(i-l+1)/l*N2;
850 Prod1 = Prod1+N4/exp1*std::exp(-theQ2/exp1/4);
851 medTot = medTot+N4/exp1;
854 ReElasticAmpl0 = ReElasticAmpl0+Prod1*N*std::sin(FiH*i);
855 ImElasticAmpl0 = ImElasticAmpl0+Prod1*N*std::cos(FiH*i);
856 Tot1 = Tot1+medTot*N*std::cos(FiH*i);
857 if(std::fabs(Prod1*N/ImElasticAmpl0) < 0.000001)
break;
860 ImElasticAmpl0 = ImElasticAmpl0*
pi/2.568;
861 ReElasticAmpl0 = ReElasticAmpl0*
pi/2.568;
862 Tot1 = Tot1*
twopi/2.568;
865 G4double C2 = 2*R23Ap*R13Ap/2*DDSec2p;
872 Din1 = 0.5*(C1*std::exp(-theQ2/8*R12Ap)/2*R12Ap-
873 C2/R12ApdR22Ap*std::exp(-theQ2/4/R12ApdR22Ap)+
874 C3*R22Ap/2*std::exp(-theQ2/8*R22Ap));
876 DTot1 = 0.5*(C1/2*R12Ap-C2/R12ApdR22Ap+C3*R22Ap/2);
886 for( i = 1; i<= NWeight-2; i++)
888 N1p = -N1p*UnuclScr*(NWeight-i-1)/i*Rho2;
892 for(
G4int l = 0; l<=i; l++)
894 if(l == 0) BinCoeff = 1;
895 else if(l !=0 ) BinCoeff = BinCoeff*(i-l+1)/l;
897 exp1 = l/R22B+(i-l)/R12B;
899 exp2p = exp1+R12ApdR22Ap;
902 Din2 = Din2 + N2p*BinCoeff*
903 (C1/exp1p*std::exp(-theQ2/4/exp1p)-
904 C2/exp2p*std::exp(-theQ2/4/exp2p)+
905 C3/exp3p*std::exp(-theQ2/4/exp3p));
907 DmedTot = DmedTot + N2p*BinCoeff*
908 (C1/exp1p-C2/exp2p+C3/exp3p);
913 Din1 = Din1+Din2*N1p/(i+2)/(i+1)*std::cos(FiH*i);
914 DTot1 = DTot1+DmedTot*N1p/(i+2)/(i+1)*std::cos(FiH*i);
916 if(std::fabs(Din2*N1p/Din1) < 0.000001)
break;
919 Din1 = -Din1*NWeight*(NWeight-1)
922 DTot1 = DTot1*NWeight*(NWeight-1)
930 G4double DiffCrSec2 = (ReElasticAmpl0*ReElasticAmpl0+
931 (ImElasticAmpl0+Din1)*
932 (ImElasticAmpl0+Din1))*2/4/
pi;
937 aAIm = ImElasticAmpl0;
940 return DiffCrSec2*1.0;
950 HadrEnergy = std::sqrt(hMass2 + hLabMomentum2);
952 G4double sHadr = 2.*HadrEnergy*protonM+protonM2+hMass2;
954 G4double Ecm = 0.5*(sHadr-hMass2+protonM2)/sqrS;
955 MomentumCM = std::sqrt(Ecm*Ecm-protonM2);
958 G4cout <<
"GetHadrVall.: Z= " << Z <<
" iHadr= " << iHadron
959 <<
" E(GeV)= " << HadrEnergy <<
" sqrS= " << sqrS
960 <<
" plab= " << hLabMomentum
961 <<
" E - m "<<HadrEnergy - hMass<<
G4endl;
964 G4double logE = std::log(HadrEnergy);
973 if(hLabMomentum > 10)
974 TotP = TotN = 7.5*logE - 40.12525 + 103*std::pow(sHadr,-0.165);
983 if( hLabMomentum > 1.4 )
984 TotN = 33.3+15.2*(hLabMomentum2-1.35)/
985 (std::pow(hLabMomentum,2.37)+0.95);
987 else if(hLabMomentum > 0.8)
990 TotN = 33.0 + 25.5*A0*A0;
995 TotN = 33.0 + 30.*A0*A0*A0*A0;
1000 if(hLabMomentum >= 1.05)
1002 TotP = 39.0+75.*(hLabMomentum-1.2)/
1003 (hLabMomentum2*hLabMomentum+0.15);
1006 else if(hLabMomentum >= 0.7)
1009 TotP = 23.0 + 40.*A0*A0;
1013 TotP = 23.+50.*std::pow(std::log(0.73/hLabMomentum),3.5);
1019 HadrTot = 0.5*(TotP+TotN);
1022 if(hLabMomentum >= 2.) HadrSlope = 5.44 + 0.88*logS;
1024 else if(hLabMomentum >= 0.5) HadrSlope = 3.73*hLabMomentum-0.37;
1026 else HadrSlope = 1.5;
1029 if(hLabMomentum >= 1.2)
1030 HadrReIm = 0.13*(logS - 5.8579332)*std::pow(sHadr,-0.18);
1032 else if(hLabMomentum >= 0.6)
1033 HadrReIm = -75.5*(std::pow(hLabMomentum,0.25)-0.95)/
1034 (std::pow(3*hLabMomentum,2.2)+1);
1037 HadrReIm = 15.5*hLabMomentum/(27*hLabMomentum2*hLabMomentum+2);
1042 if( iHadrCode == 3122)
1048 else if( iHadrCode == 3222)
1054 else if(iHadrCode == 3112 || iHadrCode == 3212 )
1060 else if( iHadrCode == 3312 || iHadrCode == 3322 )
1066 else if( iHadrCode == 3334)
1077 HadrTot = 5.2+5.2*logE + 123.2/sqrS;
1078 HadrSlope = 8.32+0.57*logS;
1080 if( HadrEnergy < 1000 )
1081 HadrReIm = 0.06*(sqrS-2.236)*(sqrS-14.14)*std::pow(sHadr,-0.8);
1083 HadrReIm = 0.6*(logS - 5.8579332)*std::pow(sHadr,-0.25);
1088 if( iHadrCode == -3122)
1094 else if( iHadrCode == -3222)
1100 else if(iHadrCode == -3112 || iHadrCode == -3212 )
1106 else if( iHadrCode == -3312 || iHadrCode == -3322 )
1112 else if( iHadrCode == -3334)
1123 if(hLabMomentum >= 3.5)
1124 TotP = 10.6+2.*logE + 25.*std::pow(HadrEnergy,-0.43);
1126 else if(hLabMomentum >= 1.15)
1128 G4double x = (hLabMomentum - 2.55)/0.55;
1129 G4double y = (hLabMomentum - 1.47)/0.225;
1130 TotP = 3.2*std::exp(-x*x) + 12.*std::exp(-y*y) + 27.5;
1133 else if(hLabMomentum >= 0.4)
1135 TotP = 88*(logE+0.2877)*(logE+0.2877)+14.0;
1140 G4double x = (hLabMomentum - 0.29)/0.085;
1141 TotP = 20. + 180.*std::exp(-x*x);
1145 if(hLabMomentum >= 3.0 )
1146 TotN = 10.6 + 2.*logE + 30.*std::pow(HadrEnergy,-0.43);
1148 else if(hLabMomentum >= 1.3)
1152 TotN = 36.1+0.079 - 4.313*logE + 3.*std::exp(-x*x) +
1155 else if(hLabMomentum >= 0.65)
1157 G4double x = (hLabMomentum - 0.72)/0.06;
1158 G4double y = (hLabMomentum - 1.015)/0.075;
1159 TotN = 36.1 + 10.*std::exp(-x*x) + 24*std::exp(-y*y);
1161 else if(hLabMomentum >= 0.37)
1163 G4double x = std::log(hLabMomentum/0.48);
1164 TotN = 26. + 110.*x*
x;
1168 G4double x = (hLabMomentum - 0.29)/0.07;
1169 TotN = 28.0 + 40.*std::exp(-x*x);
1171 HadrTot = (TotP+TotN)/2;
1173 HadrSlope = 7.28+0.245*logS;
1174 HadrReIm = 0.2*(logS - 4.6051702)*std::pow(sHadr,-0.15);
1183 HadrTot = 10.6+1.8*logE + 9.0*std::pow(HadrEnergy,-0.55);
1184 if(HadrEnergy>100) HadrSlope = 15.0;
1185 else HadrSlope = 1.0+1.76*logS - 2.84/sqrS;
1187 HadrReIm = 0.4*(sHadr-20)*(sHadr-150)*std::pow(sHadr+50,-2.1);
1194 HadrTot = 10+1.8*logE + 25./sqrS;
1195 HadrSlope = 6.98+0.127*logS;
1196 HadrReIm = 0.4*(sHadr-20)*(sHadr-20)*std::pow(sHadr+50,-2.1);
1203 G4cout <<
"HadrTot= " << HadrTot <<
" HadrSlope= " << HadrSlope
1204 <<
" HadrReIm= " << HadrReIm <<
" DDSect2= " << DDSect2
1205 <<
" DDSect3= " << DDSect3 <<
G4endl;
1211 Coeff0 = Coeff1 = Coeff2 = 0.0;
1212 Slope0 = Slope1 = 1.0;
1216 static const G4double EnP0[6]={1.5,3.0,5.0,9.0,14.0,19.0};
1217 static const G4double C0P0[6]={0.15,0.02,0.06,0.08,0.0003,0.0002};
1218 static const G4double C1P0[6]={0.05,0.02,0.03,0.025,0.0,0.0};
1219 static const G4double B0P0[6]={1.5,2.5,3.0,4.5,1.4,1.25};
1220 static const G4double B1P0[6]={5.0,1.0,3.5,4.0,4.8,4.8};
1223 static const G4double EnN[5]={1.5,5.0,10.0,14.0,20.0};
1224 static const G4double C0N[5]={0.0,0.0,0.02,0.02,0.01};
1225 static const G4double C1N[5]={0.06,0.008,0.0015,0.001,0.0003};
1226 static const G4double B0N[5]={1.5,2.5,3.8,3.8,3.5};
1227 static const G4double B1N[5]={1.5,2.2,3.6,4.5,4.8};
1230 static const G4double EnP[2]={1.5,4.0};
1231 static const G4double C0P[2]={0.001,0.0005};
1232 static const G4double C1P[2]={0.003,0.001};
1233 static const G4double B0P[2]={2.5,4.5};
1234 static const G4double B1P[2]={1.0,4.0};
1237 static const G4double EnPP[4]={1.0,2.0,3.0,4.0};
1238 static const G4double C0PP[4]={0.0,0.0,0.0,0.0};
1239 static const G4double C1PP[4]={0.15,0.08,0.02,0.01};
1240 static const G4double B0PP[4]={1.5,2.8,3.8,3.8};
1241 static const G4double B1PP[4]={0.8,1.6,3.6,4.6};
1244 static const G4double EnPPN[4]={1.0,2.0,3.0,4.0};
1245 static const G4double C0PPN[4]={0.0,0.0,0.0,0.0};
1246 static const G4double C1PPN[4]={0.0,0.0,0.0,0.0};
1247 static const G4double B0PPN[4]={1.5,2.8,3.8,3.8};
1248 static const G4double B1PPN[4]={0.8,1.6,3.6,4.6};
1251 static const G4double EnK[4]={1.4,2.33,3.0,5.0};
1252 static const G4double C0K[4]={0.0,0.0,0.0,0.0};
1253 static const G4double C1K[4]={0.01,0.007,0.005,0.003};
1254 static const G4double B0K[4]={1.5,2.0,3.8,3.8};
1255 static const G4double B1K[4]={1.6,1.6,1.6,1.6};
1258 static const G4double EnKM[2]={1.4,4.0};
1259 static const G4double C0KM[2]={0.006,0.002};
1260 static const G4double C1KM[2]={0.00,0.00};
1261 static const G4double B0KM[2]={2.5,3.5};
1262 static const G4double B1KM[2]={1.6,1.6};
1268 if(hLabMomentum <BoundaryP[0])
1271 Coeff2 = 0.8/hLabMomentum/hLabMomentum;
1276 if(hLabMomentum < BoundaryP[1])
1279 Coeff2 = 0.8/hLabMomentum/hLabMomentum;
1284 if(hLabMomentum < BoundaryP[2])
1290 if(hLabMomentum < BoundaryP[3])
1293 Coeff2 = 0.02/hLabMomentum;
1298 if(hLabMomentum < BoundaryP[4])
1301 Coeff2 = 0.02/hLabMomentum;
1306 if(hLabMomentum < BoundaryP[5])
1309 if(hLabMomentum < 1) Coeff2 = 0.34;
1310 else Coeff2 = 0.34/hLabMomentum2/hLabMomentum;
1314 if(hLabMomentum < BoundaryP[6])
1317 if(hLabMomentum < 1) Coeff2 = 0.01;
1318 else Coeff2 = 0.01/hLabMomentum2/hLabMomentum;
1323 G4cout<<
" HadrVal : Plasb "<<hLabMomentum
1324 <<
" iHadron "<<iHadron<<
" HadrTot "<<HadrTot<<
G4endl;
1333 G4cout<<
"1 GetKin.: HadronName MomentumH "
1338 G4double Sh = 2.0*protonM*HadrEnergy+protonM2+hMass2;
1340 ConstU = 2*protonM2+2*hMass2-Sh;
1342 G4double MaxT = 4*MomentumCM*MomentumCM;
1344 BoundaryTL[0] = MaxT;
1345 BoundaryTL[1] = MaxT;
1346 BoundaryTL[3] = MaxT;
1347 BoundaryTL[4] = MaxT;
1348 BoundaryTL[5] = MaxT;
1352 while(iHadrCode!=HadronCode[NumberH]) NumberH++;
1354 NumberH = HadronType1[NumberH];
1356 if(MomentumH<BoundaryP[NumberH]) MaxTR = BoundaryTL[NumberH];
1357 else MaxTR = BoundaryTG[NumberH];
1360 G4cout<<
"3 GetKin. : NumberH "<<NumberH
1361 <<
" Bound.P[NumberH] "<<BoundaryP[NumberH]
1362 <<
" Bound.TL[NumberH] "<<BoundaryTL[NumberH]
1363 <<
" Bound.TG[NumberH] "<<BoundaryTG[NumberH]
1364 <<
" MaxT MaxTR "<<MaxT<<
" "<<MaxTR<<
G4endl;
1374 Fdistr = (1-Coeff1-Coeff0)
1375 /HadrSlope*(1-std::exp(-HadrSlope*Q2))
1376 + Coeff0*(1-std::exp(-Slope0*Q2))
1377 + Coeff2/Slope2*std::exp(Slope2*ConstU)*(std::exp(Slope2*Q2)-1)
1378 + 2*Coeff1/Slope1*(1/Slope1-(1/Slope1+SqrQ2)*std::exp(-Slope1*SqrQ2));
1381 G4cout<<
"Old: Coeff0 Coeff1 Coeff2 "<<Coeff0<<
" "
1382 <<Coeff1<<
" "<<Coeff2<<
" Slope Slope0 Slope1 Slope2 "
1383 <<HadrSlope<<
" "<<Slope0<<
" "<<Slope1<<
" "<<Slope2
1384 <<
" Fdistr "<<Fdistr<<
G4endl;
1390 G4double DDD0=MaxTR*0.5, DDD1=0.0, DDD2=MaxTR, delta;
1393 FmaxT =
GetFt(MaxTR);
1396 while(std::fabs(delta) > 0.0001)
1401 DDD0 = (DDD0+DDD1)*0.5;
1406 DDD0 = (DDD0+DDD2)*0.5;
1422 hMass2 = hMass*hMass;
1423 hLabMomentum = inLabMom;
1424 hLabMomentum2 = hLabMomentum*hLabMomentum;
1425 HadrEnergy = sqrt(hLabMomentum2+hMass2);
1442 void G4ElasticHadrNucleusHE::Binom()
1447 for(N = 0; N < 240; N++)
1451 for( M = 0; M <=
N; M++ )
1455 if ( ( N > 0 ) && ( N > M ) && M > 0 )
1460 SetBinom[
N][M] = Fact1;
G4double SampleT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
G4double GetQ2(G4double Ran)
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
void DefineHadronValues(G4int Z)
G4double GetDistrFun(G4double Q2)
G4double HadronProtonQ2(const G4ParticleDefinition *aHadron, G4double inLabMom)
G4int GetPDGEncoding() const
const G4String & GetModelName() const
static G4NistManager * Instance()
const G4String & GetParticleName() const
void GetKinematics(const G4ParticleDefinition *aHadron, G4double MomentumH)
G4GLOB_DLL std::ostream G4cout
G4ElasticHadrNucleusHE(const G4String &name="hElasticGlauber")
G4double TableCrossSec[NQTABLE]
G4double HadrNucDifferCrSec(G4int Z, G4int Nucleus, G4double Q2)
static G4Proton * Proton()
virtual void Description() const
virtual ~G4ElasticHadrNucleusHE()
G4double GetPDGMass() const
G4ElasticData(const G4ParticleDefinition *h, G4int Z, G4double A, G4double *eGeV)
G4double GetLightFq2(G4int Z, G4int A, G4double Q)
G4double GetAtomicMassAmu(const G4String &symb) const
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double GetHeavyFq2(G4int Z, G4int Nucleus, G4double *LineFq2)
G4double GetQ2_2(G4int N, G4double *Q, G4double *F, G4double R)
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)
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)