Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4PomeronCrossSection.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id: G4PomeronCrossSection.cc 100828 2016-11-02 15:25:59Z gcosmo $
28 //
29 
30 #include "G4PomeronCrossSection.hh"
31 #include "G4PhysicalConstants.hh"
32 #include "G4SystemOfUnits.hh"
33 #include "G4Pow.hh"
34 #include "G4Exp.hh"
35 #include "G4Log.hh"
36 
37 
39  pomeron_Alpha(0), pomeron_Alpha_Hard(0), pomeron_Alphaprime(0),
40  pomeron_C(0), pomeron_Gamma(0), pomeron_Gamma_Hard(0),
41  pomeron_Rsquare(0), pomeron_S(0)
42 {}
43 
44 
46 {;}
47 
48 //**********************************************************************************************
49 
51 {
52  G4int Encoding = std::abs(particle->GetPDGEncoding());
53 
54  if (std::abs(particle->GetBaryonNumber())!=0)
55  InitForNucleon();
56  else if (Encoding/100== 3 || Encoding/10 == 3)
57  InitForKaon();
58  else
59  InitForPion();
60 }
61 
62 //**********************************************************************************************
63 
65 {
66  InitForNucleon();
67 }
68 
70 {
71  InitForNucleon();
72 }
73 
75 {
76  InitForPion();
77 }
78 
80 {
81  InitForPion();
82 }
83 
85 {
86  InitForPion();
87 }
88 
90 {
91  InitForKaon();
92 }
93 
95 {
96  InitForKaon();
97 }
98 
100 {
101  InitForKaon();
102 }
103 
105 {
106  InitForKaon();
107 }
108 
110 {
111  InitForKaon();
112 }
113 
115 {
116  InitForGamma();
117 }
118 
120 {
121  G4double FZ2= Expand(Z(S)/2);
122  return SigP(S) * FZ2;
123 }
124 
126 {
127  return SigP(S)/pomeron_C *(Expand(Z(S)/2) - Expand(Z(S)));
128 }
129 
131 {
132  return ( pomeron_C -1) * GetElasticCrossSection(S);
133 }
134 
136 {
138 }
139 
140 //-------------------------Probabilities ----------------------------
141 
143  const G4double impactsquare)
144 {
145  return 2/pomeron_C*(1-G4Exp(-1*Eikonal(S,impactsquare)));
146 }
147 
149  const G4double impactsquare)
150 {
151  return (pomeron_C-1)/pomeron_C *
152  (GetTotalProbability(S,impactsquare) - GetNondiffractiveProbability(S,impactsquare));
153 }
154 
156  const G4double impactsquare)
157 {
158  return (1-G4Exp(-2*Eikonal(S,impactsquare)))/pomeron_C;
159 }
160 
162  const G4double impactsquare)
163 {
164  return (GetTotalProbability(S,impactsquare) - GetInelasticProbability(S,impactsquare));
165 }
166 
168  const G4double impactsquare)
169 {
170  return GetNondiffractiveProbability(S,impactsquare) + GetDiffractiveProbability(S,impactsquare);
171 }
172 
174  const G4double impactsquare, const G4int nPomerons)
175 {
176  G4double factorial=G4Pow::GetInstance()->factorial(nPomerons);
177 
178  return G4Exp(-2*Eikonal(S,impactsquare))/pomeron_C*
179  G4Pow::GetInstance()->powN(2*Eikonal(S,impactsquare),nPomerons)/factorial;
180 }
181 
182 // ---------------Temporary --- GF
184 {
185  pomeron_Gamma=agam/GeV/GeV;
186 }
187 
188 
189 //----------------- private/Implementation methods
190 
191 void G4PomeronCrossSection::InitForNucleon()
192 {
193  //pomeron_S= 3.0*GeV*GeV;
194  pomeron_S= 2.7*GeV*GeV;
195  //pomeron_Gamma= 2.16/GeV/GeV;
196  //pomeron_Gamma= 3.96/GeV/GeV;
197  pomeron_Gamma= (2.6+3.96)/GeV/GeV;
198  pomeron_C= 1.4;
199  pomeron_Rsquare= 3.56/GeV/GeV;
200  //pomeron_Alpha= 1.0808;
201  pomeron_Alpha= 0.9808;
202  pomeron_Alphaprime= 0.25/GeV/GeV;
203  pomeron_Gamma_Hard = 0.0002/GeV/GeV; // Note! if pomeron_Gamma_Hard != 0 to fit total pp-crosscection
204  // pomeron_Gamma_Soft shold be 2.35/GeV/GeV
205  pomeron_Alpha_Hard = 1.47;
206 }
207 
208 void G4PomeronCrossSection::InitForPion()
209 {
210  pomeron_S= 1.5*GeV*GeV;
211  //pomeron_Gamma= 1.46/GeV/GeV;
212  pomeron_Gamma= 2.17/GeV/GeV;
213  pomeron_C= 1.6;
214  pomeron_Rsquare= 2.36/GeV/GeV;
215  pomeron_Alpha= 1.0808;
216  pomeron_Alphaprime= 0.25/GeV/GeV;
217  pomeron_Gamma_Hard = 0.0002/GeV/GeV;
218  pomeron_Alpha_Hard = 1.47;
219 }
220 
221 void G4PomeronCrossSection::InitForKaon()
222 {
223  pomeron_S= 2.3*GeV*GeV;
224  //pomeron_Gamma= 1.31/GeV/GeV;
225  pomeron_Gamma= 1.92/GeV/GeV;
226  pomeron_C= 1.8;
227  pomeron_Rsquare= 1.96/GeV/GeV;
228  pomeron_Alpha= 1.0808;
229  pomeron_Alphaprime= 0.25/GeV/GeV;
230  pomeron_Gamma_Hard = 0.0002/GeV/GeV;
231  pomeron_Alpha_Hard = 1.47;
232 }
233 
234 void G4PomeronCrossSection::InitForGamma()
235 {
236  pomeron_S= 1.7*GeV*GeV;
237  //pomeron_Gamma= 1.42/GeV/GeV;
238  pomeron_Gamma= 2.07/GeV/GeV;
239  pomeron_C= 1.7;
240  pomeron_Rsquare= 2.16/GeV/GeV;
241  pomeron_Alpha= 1.0808;
242  pomeron_Alphaprime= 0.25/GeV/GeV;
243  pomeron_Gamma_Hard = 0.0002/GeV/GeV;
244  pomeron_Alpha_Hard = 1.47;
245 }
246 
247 G4double G4PomeronCrossSection::Expand(G4double z)
248 {
249  G4double sum=1.;
250  G4double current=1.;
251  for (G4int j=2; j<21; j++ ) {
252  current *= -z *(j-1)/sqr(j);
253  sum+=current;
254  }
255  return sum;
256 }
257 
258 G4double G4PomeronCrossSection::Power(const G4double S)
259 {
260  return pomeron_Gamma * G4Pow::GetInstance()->powA(S/pomeron_S, pomeron_Alpha -1);
261 }
262 
263 G4double G4PomeronCrossSection::Z(const G4double S)
264 {
265  return 2*pomeron_C * Power(S) / Lambda(S);
266 }
267 
268 G4double G4PomeronCrossSection::Lambda(const G4double S)
269 {
270  return pomeron_Rsquare+pomeron_Alphaprime*G4Log(S/pomeron_S);
271 }
272 
273 G4double G4PomeronCrossSection::SigP(const G4double S)
274 {
275  return 8 * pi * hbarc_squared * Power(S);
276 }
277 
278 G4double G4PomeronCrossSection::Eikonal(const G4double S, const G4double impactsquare)
279 {
280  return Z(S)/2 * G4Exp(-impactsquare/(4*Lambda(S)*hbarc_squared));
281 }
282 
283 //*************************************************************************************************
284 
285 G4double G4PomeronCrossSection::PowerSoft(const G4double S)
286 {
287  return pomeron_Gamma * G4Pow::GetInstance()->powA(S/pomeron_S, pomeron_Alpha -1);
288 }
289 
290 G4double G4PomeronCrossSection::PowerHard(const G4double S)
291 {
292  return pomeron_Gamma_Hard*G4Pow::GetInstance()->powA(S/pomeron_S, pomeron_Alpha_Hard -1);
293 }
294 
295 G4double G4PomeronCrossSection::LambdaSoft(const G4double S)
296 {
297  return pomeron_Rsquare+pomeron_Alphaprime*G4Log(S/pomeron_S);
298 }
299 
300 G4double G4PomeronCrossSection::LambdaHard(const G4double /*S*/)
301 {
302  return pomeron_Rsquare; //+pomeron_Alphaprime*G4Log(s/pomeron_S);
303 }
304 
305 G4double G4PomeronCrossSection::Zsoft(const G4double S)
306 {
307  return 2*pomeron_C*PowerHard(S) / LambdaSoft(S);
308 }
309 
310 G4double G4PomeronCrossSection::Zhard(const G4double S)
311 {
312  return 2*pomeron_C*PowerHard(S)/LambdaHard(S);
313 }
314 
316 {
317  return Zsoft(S)/2*G4Exp(-impactsquare/LambdaSoft(S)/hbarc_squared/4);
318 }
319 
321 {
322  return Zhard(S)/2*G4Exp(-impactsquare/LambdaHard(S)/hbarc_squared/4);
323 }
324 
325 //*************************************************************************************************
326 
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
G4double powA(G4double A, G4double y) const
Definition: G4Pow.hh:259
G4double GetCutPomeronProbability(const G4double s, const G4double impactsquare, const G4int nPomerons)
G4double SoftEikonal(G4double s, G4double impactsquare)
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
G4double GetTotalCrossSection(const G4double s)
double S(double temp)
G4double GetInelasticProbability(const G4double s, const G4double impactsquare)
static constexpr double hbarc_squared
int G4int
Definition: G4Types.hh:78
G4double GetTotalProbability(const G4double s, const G4double impactsquare)
G4PomeronCrossSection(const G4ParticleDefinition *)
G4double factorial(G4int Z) const
Definition: G4Pow.hh:264
G4double GetDiffractiveCrossSection(const G4double s)
G4double GetElasticProbability(const G4double s, const G4double impactsquare)
G4double GetElasticCrossSection(const G4double s)
G4double GetNondiffractiveProbability(const G4double s, const G4double impactsquare)
G4double GetDiffractiveProbability(const G4double s, const G4double impactsquare)
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
G4double GetInelasticCrossSection(const G4double s)
static constexpr double GeV
Definition: G4SIunits.hh:217
void Setgamma(const G4double agam)
static constexpr double pi
Definition: G4SIunits.hh:75
T sqr(const T &x)
Definition: templates.hh:145
double G4double
Definition: G4Types.hh:76
G4double HardEikonal(G4double s, G4double impactsquare)