00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "G4PomeronCrossSection.hh"
00031 #include "G4PhysicalConstants.hh"
00032 #include "G4SystemOfUnits.hh"
00033 #include "G4Pow.hh"
00034
00035 G4PomeronCrossSection::G4PomeronCrossSection() :
00036 pomeron_Alpha(0), pomeron_Alpha_Hard(0), pomeron_Alphaprime(0),
00037 pomeron_C(0), pomeron_Gamma(0), pomeron_Gamma_Hard(0),
00038 pomeron_Rsquare(0), pomeron_S(0)
00039 {}
00040
00041
00042 G4PomeronCrossSection::~G4PomeronCrossSection()
00043 {;}
00044
00045
00046 G4PomeronCrossSection::G4PomeronCrossSection(const G4ParticleDefinition * particle)
00047 {
00048 G4int Encoding = std::abs(particle->GetPDGEncoding());
00049
00050 if (std::abs(particle->GetBaryonNumber())!=0)
00051 InitForNucleon();
00052 else if (Encoding/100== 3 || Encoding/10 == 3)
00053 InitForKaon();
00054 else
00055 InitForPion();
00056 }
00057
00058
00059
00060 G4PomeronCrossSection::G4PomeronCrossSection(const G4Proton * )
00061 {
00062 InitForNucleon();
00063 }
00064 G4PomeronCrossSection::G4PomeronCrossSection(const G4Neutron * )
00065 {
00066 InitForNucleon();
00067 }
00068
00069 G4PomeronCrossSection::G4PomeronCrossSection(const G4PionPlus * )
00070 {
00071 InitForPion();
00072 }
00073 G4PomeronCrossSection::G4PomeronCrossSection(const G4PionMinus * )
00074 {
00075 InitForPion();
00076 }
00077 G4PomeronCrossSection::G4PomeronCrossSection(const G4PionZero * )
00078 {
00079 InitForPion();
00080 }
00081
00082 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonPlus * )
00083 {
00084 InitForKaon();
00085 }
00086 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonMinus * )
00087 {
00088 InitForKaon();
00089 }
00090 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZero * )
00091 {
00092 InitForKaon();
00093 }
00094 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZeroLong * )
00095 {
00096 InitForKaon();
00097 }
00098 G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZeroShort * )
00099 {
00100 InitForKaon();
00101 }
00102 G4PomeronCrossSection::G4PomeronCrossSection(const G4Gamma * )
00103 {
00104 InitForGamma();
00105 }
00106
00107 G4double G4PomeronCrossSection::GetTotalCrossSection(const G4double S)
00108 {
00109 G4double FZ2= Expand(Z(S)/2);
00110 return SigP(S) * FZ2;
00111 }
00112
00113
00114 G4double G4PomeronCrossSection::GetElasticCrossSection(const G4double S)
00115 {
00116 return SigP(S)/pomeron_C *(Expand(Z(S)/2) - Expand(Z(S)));
00117 }
00118
00119 G4double G4PomeronCrossSection::GetDiffractiveCrossSection(const G4double S)
00120 {
00121 return ( pomeron_C -1) * GetElasticCrossSection(S);
00122 }
00123
00124 G4double G4PomeronCrossSection::GetInelasticCrossSection(const G4double S)
00125 {
00126 return GetTotalCrossSection(S) - GetElasticCrossSection(S);
00127 }
00128
00129
00130
00131 G4double G4PomeronCrossSection::GetTotalProbability(const G4double S,
00132 const G4double impactsquare)
00133 {
00134 return 2/pomeron_C*(1-std::exp(-1*Eikonal(S,impactsquare)));
00135 }
00136
00137 G4double G4PomeronCrossSection::GetDiffractiveProbability(const G4double S,
00138 const G4double impactsquare)
00139 {
00140 return (pomeron_C-1)/pomeron_C *
00141 (GetTotalProbability(S,impactsquare) -
00142 GetNondiffractiveProbability(S,impactsquare));
00143 }
00144
00145 G4double G4PomeronCrossSection::GetNondiffractiveProbability(const G4double S,
00146 const G4double impactsquare)
00147 {
00148 return (1-std::exp(-2*Eikonal(S,impactsquare)))/pomeron_C;
00149 }
00150
00151 G4double G4PomeronCrossSection::GetElasticProbability(const G4double S,
00152 const G4double impactsquare)
00153 {
00154 return (GetTotalProbability(S,impactsquare) -
00155 GetInelasticProbability(S,impactsquare));
00156 }
00157
00158 G4double G4PomeronCrossSection::GetInelasticProbability(const G4double S,
00159 const G4double impactsquare)
00160 {
00161 return GetNondiffractiveProbability(S,impactsquare) +
00162 GetDiffractiveProbability(S,impactsquare);
00163 }
00164
00165 G4double G4PomeronCrossSection::GetCutPomeronProbability(const G4double S,
00166 const G4double impactsquare, const G4int nPomerons)
00167 {
00168 G4double factorial=G4Pow::GetInstance()->factorial(nPomerons);
00169
00170 return std::exp(-2*Eikonal(S,impactsquare))/pomeron_C*
00171 std::pow(2*Eikonal(S,impactsquare),nPomerons)/factorial;
00172 }
00173
00174
00175 void G4PomeronCrossSection::Setgamma(const G4double agam)
00176 {
00177 pomeron_Gamma=agam/GeV/GeV;
00178 }
00179
00180
00181
00182
00183 void G4PomeronCrossSection::InitForNucleon()
00184 {
00185
00186 pomeron_S= 2.7*GeV*GeV;
00187
00188
00189 pomeron_Gamma= (2.6+3.96)/GeV/GeV;
00190 pomeron_C= 1.4;
00191 pomeron_Rsquare= 3.56/GeV/GeV;
00192
00193 pomeron_Alpha= 0.9808;
00194 pomeron_Alphaprime= 0.25/GeV/GeV;
00195 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
00196
00197 pomeron_Alpha_Hard = 1.47;
00198 }
00199
00200 void G4PomeronCrossSection::InitForPion()
00201 {
00202 pomeron_S= 1.5*GeV*GeV;
00203
00204 pomeron_Gamma= 2.17/GeV/GeV;
00205 pomeron_C= 1.6;
00206 pomeron_Rsquare= 2.36/GeV/GeV;
00207 pomeron_Alpha= 1.0808;
00208 pomeron_Alphaprime= 0.25/GeV/GeV;
00209 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
00210 pomeron_Alpha_Hard = 1.47;
00211 }
00212
00213 void G4PomeronCrossSection::InitForKaon()
00214 {
00215 pomeron_S= 2.3*GeV*GeV;
00216
00217 pomeron_Gamma= 1.92/GeV/GeV;
00218 pomeron_C= 1.8;
00219 pomeron_Rsquare= 1.96/GeV/GeV;
00220 pomeron_Alpha= 1.0808;
00221 pomeron_Alphaprime= 0.25/GeV/GeV;
00222 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
00223 pomeron_Alpha_Hard = 1.47;
00224 }
00225
00226 void G4PomeronCrossSection::InitForGamma()
00227 {
00228 pomeron_S= 1.7*GeV*GeV;
00229
00230 pomeron_Gamma= 2.07/GeV/GeV;
00231 pomeron_C= 1.7;
00232 pomeron_Rsquare= 2.16/GeV/GeV;
00233 pomeron_Alpha= 1.0808;
00234 pomeron_Alphaprime= 0.25/GeV/GeV;
00235 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
00236 pomeron_Alpha_Hard = 1.47;
00237 }
00238
00239 G4double G4PomeronCrossSection::Expand(G4double z)
00240 {
00241
00242 G4double sum=1.;
00243 G4double current=1.;
00244 for (G4int j=2; j<21; j++ )
00245 {
00246 current *= -z *(j-1)/sqr(j);
00247 sum+=current;
00248 }
00249 return sum;
00250 }
00251
00252 inline G4double G4PomeronCrossSection::Power(const G4double S)
00253 {
00254 return pomeron_Gamma *std::pow(S/pomeron_S, pomeron_Alpha -1);
00255 }
00256
00257 inline G4double G4PomeronCrossSection::Z(const G4double S)
00258 {
00259 return 2*pomeron_C * Power(S) / Lambda(S);
00260 }
00261
00262 inline G4double G4PomeronCrossSection::Lambda(const G4double S)
00263 {
00264 return pomeron_Rsquare+pomeron_Alphaprime*std::log(S/pomeron_S);
00265 }
00266
00267 inline G4double G4PomeronCrossSection::SigP(const G4double S)
00268 {
00269 return 8 * pi * hbarc_squared * Power(S);
00270 }
00271
00272 inline G4double G4PomeronCrossSection::Eikonal(const G4double S,
00273 const G4double impactsquare)
00274 {
00275 return Z(S)/2 * std::exp(-impactsquare/(4*Lambda(S)*hbarc_squared));
00276 }
00277
00278 inline G4double G4PomeronCrossSection::PowerSoft(const G4double S)
00279 {
00280 return pomeron_Gamma *std::pow(S/pomeron_S, pomeron_Alpha -1);
00281 }
00282
00283 inline G4double G4PomeronCrossSection::PowerHard(const G4double S)
00284 {
00285 return pomeron_Gamma_Hard*std::pow(S/pomeron_S, pomeron_Alpha_Hard -1);
00286 }
00287
00288 inline G4double G4PomeronCrossSection::LambdaSoft(const G4double S)
00289 {
00290 return pomeron_Rsquare+pomeron_Alphaprime*std::log(S/pomeron_S);
00291 }
00292
00293 inline G4double G4PomeronCrossSection::LambdaHard(const G4double )
00294 {
00295 return pomeron_Rsquare;
00296 }
00297
00298 inline G4double G4PomeronCrossSection::Zsoft(const G4double S)
00299 {
00300 return 2*pomeron_C*PowerHard(S) / LambdaSoft(S);
00301 }
00302
00303 inline G4double G4PomeronCrossSection::Zhard(const G4double S)
00304 {
00305 return 2*pomeron_C*PowerHard(S)/LambdaHard(S);
00306 }
00307
00308 G4double G4PomeronCrossSection::SoftEikonal(G4double S, G4double impactsquare)
00309 {
00310 return Zsoft(S)/2*std::exp(-impactsquare/LambdaSoft(S)/hbarc_squared/4);
00311 }
00312
00313 G4double G4PomeronCrossSection::HardEikonal(G4double S, G4double impactsquare)
00314 {
00315 return Zhard(S)/2*std::exp(-impactsquare/LambdaHard(S)/hbarc_squared/4);
00316 }
00317
00318