source: trunk/source/processes/hadronic/models/parton_string/management/src/G4PomeronCrossSection.cc@ 1201

Last change on this file since 1201 was 1196, checked in by garnier, 16 years ago

update CVS release candidate geant4.9.3.01

File size: 9.3 KB
Line 
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,v 1.6 2006/11/07 12:51:39 gunter Exp $
28// GEANT4 tag $Name: geant4-09-03-cand-01 $
29//
30
31#include "G4PomeronCrossSection.hh"
32
33G4PomeronCrossSection::G4PomeronCrossSection()
34{;}
35
36
37G4PomeronCrossSection::~G4PomeronCrossSection()
38{;}
39//**********************************************************************************************
40
41G4PomeronCrossSection::G4PomeronCrossSection(const G4ParticleDefinition * particle)
42 {
43 G4int Encoding = std::abs(particle->GetPDGEncoding());
44
45 if (std::abs(particle->GetBaryonNumber())!=0)
46 InitForNucleon();
47 else if (Encoding/100== 3 || Encoding/10 == 3)
48 InitForKaon();
49 else
50 InitForPion();
51 }
52
53//**********************************************************************************************
54
55G4PomeronCrossSection::G4PomeronCrossSection(const G4Proton * )
56{
57 InitForNucleon();
58}
59G4PomeronCrossSection::G4PomeronCrossSection(const G4Neutron * )
60{
61 InitForNucleon();
62}
63
64G4PomeronCrossSection::G4PomeronCrossSection(const G4PionPlus * )
65{
66 InitForPion();
67}
68G4PomeronCrossSection::G4PomeronCrossSection(const G4PionMinus * )
69{
70 InitForPion();
71}
72G4PomeronCrossSection::G4PomeronCrossSection(const G4PionZero * )
73{
74 InitForPion();
75}
76
77G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonPlus * )
78{
79 InitForKaon();
80}
81G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonMinus * )
82{
83 InitForKaon();
84}
85G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZero * )
86{
87 InitForKaon();
88}
89G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZeroLong * )
90{
91 InitForKaon();
92}
93G4PomeronCrossSection::G4PomeronCrossSection(const G4KaonZeroShort * )
94{
95 InitForKaon();
96}
97G4PomeronCrossSection::G4PomeronCrossSection(const G4Gamma * )
98{
99 InitForGamma();
100}
101
102G4double G4PomeronCrossSection::GetTotalCrossSection(const G4double s)
103{
104 G4double FZ2= Expand(Z(s)/2);
105 return SigP(s) * FZ2;
106}
107
108
109G4double G4PomeronCrossSection::GetElasticCrossSection(const G4double s)
110{
111 return SigP(s)/pomeron_C *(Expand(Z(s)/2) - Expand(Z(s)));
112}
113
114G4double G4PomeronCrossSection::GetDiffractiveCrossSection(const G4double s)
115{
116 return ( pomeron_C -1) * GetElasticCrossSection(s);
117}
118
119G4double G4PomeronCrossSection::GetInelasticCrossSection(const G4double s)
120{
121 return GetTotalCrossSection(s) - GetElasticCrossSection(s);
122}
123
124//-------------------------Probabilities ----------------------------
125
126G4double G4PomeronCrossSection::GetTotalProbability(const G4double s,
127 const G4double impactsquare)
128{
129 return 2/pomeron_C*(1-std::exp(-1*Eikonal(s,impactsquare)));
130}
131
132G4double G4PomeronCrossSection::GetDiffractiveProbability(const G4double s,
133 const G4double impactsquare)
134{
135 return (pomeron_C-1)/pomeron_C *
136 (GetTotalProbability(s,impactsquare) -
137 GetNondiffractiveProbability(s,impactsquare));
138}
139
140G4double G4PomeronCrossSection::GetNondiffractiveProbability(const G4double s,
141 const G4double impactsquare)
142{
143 return (1-std::exp(-2*Eikonal(s,impactsquare)))/pomeron_C;
144}
145
146G4double G4PomeronCrossSection::GetElasticProbability(const G4double s,
147 const G4double impactsquare)
148{
149 return (GetTotalProbability(s,impactsquare) -
150 GetInelasticProbability(s,impactsquare));
151}
152
153G4double G4PomeronCrossSection::GetInelasticProbability(const G4double s,
154 const G4double impactsquare)
155{
156 return GetNondiffractiveProbability(s,impactsquare) +
157 GetDiffractiveProbability(s,impactsquare);
158}
159
160G4double G4PomeronCrossSection::GetCutPomeronProbability(const G4double s,
161 const G4double impactsquare, const G4int nPomerons)
162{
163 G4double factorial=1;
164 for (G4int i=2; i<= nPomerons ; i++)
165 { factorial *= i;
166 }
167
168 return std::exp(-2*Eikonal(s,impactsquare))/pomeron_C*
169 std::pow(2*Eikonal(s,impactsquare),nPomerons)/factorial;
170}
171
172// ---------------Temporary --- GF
173void G4PomeronCrossSection::Setgamma(const G4double agam)
174{
175 pomeron_Gamma=agam/GeV/GeV;
176}
177
178
179//----------------- private/Implementation methods
180
181void G4PomeronCrossSection::InitForNucleon()
182{
183// pomeron_S= 3.0*GeV*GeV;
184 pomeron_S= 2.7*GeV*GeV;
185// pomeron_Gamma= 2.16/GeV/GeV;
186// pomeron_Gamma= 3.96/GeV/GeV;
187 pomeron_Gamma= (2.6+3.96)/GeV/GeV;
188 pomeron_C= 1.4;
189 pomeron_Rsquare= 3.56/GeV/GeV;
190// pomeron_Alpha= 1.0808;
191 pomeron_Alpha= 0.9808;
192 pomeron_Alphaprime= 0.25/GeV/GeV;
193 pomeron_Gamma_Hard = 0.0002/GeV/GeV; // Note! if pomeron_Gamma_Hard != 0 to fit total pp-crosscection
194 // pomeron_Gamma_Soft shold be 2.35/GeV/GeV
195 pomeron_Alpha_Hard = 1.47;
196}
197
198void G4PomeronCrossSection::InitForPion()
199{
200 pomeron_S= 1.5*GeV*GeV;
201// pomeron_Gamma= 1.46/GeV/GeV;
202 pomeron_Gamma= 2.17/GeV/GeV;
203 pomeron_C= 1.6;
204 pomeron_Rsquare= 2.36/GeV/GeV;
205 pomeron_Alpha= 1.0808;
206 pomeron_Alphaprime= 0.25/GeV/GeV;
207 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
208 pomeron_Alpha_Hard = 1.47;
209}
210
211void G4PomeronCrossSection::InitForKaon()
212{
213 pomeron_S= 2.3*GeV*GeV;
214// pomeron_Gamma= 1.31/GeV/GeV;
215 pomeron_Gamma= 1.92/GeV/GeV;
216 pomeron_C= 1.8;
217 pomeron_Rsquare= 1.96/GeV/GeV;
218 pomeron_Alpha= 1.0808;
219 pomeron_Alphaprime= 0.25/GeV/GeV;
220 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
221 pomeron_Alpha_Hard = 1.47;
222}
223
224void G4PomeronCrossSection::InitForGamma()
225{
226 pomeron_S= 1.7*GeV*GeV;
227// pomeron_Gamma= 1.42/GeV/GeV;
228 pomeron_Gamma= 2.07/GeV/GeV;
229 pomeron_C= 1.7;
230 pomeron_Rsquare= 2.16/GeV/GeV;
231 pomeron_Alpha= 1.0808;
232 pomeron_Alphaprime= 0.25/GeV/GeV;
233 pomeron_Gamma_Hard = 0.0002/GeV/GeV;
234 pomeron_Alpha_Hard = 1.47;
235}
236
237G4double G4PomeronCrossSection::Expand(G4double z)
238{
239
240 G4double sum=1.;
241 G4double current=1.;
242 for (G4int j=2; j<21; j++ )
243 {
244 current *= -z *(j-1)/sqr(j);
245 sum+=current;
246 }
247 return sum;
248}
249
250inline G4double G4PomeronCrossSection::Power(const G4double s)
251{
252 return pomeron_Gamma *std::pow(s/pomeron_S, pomeron_Alpha -1);
253}
254
255inline G4double G4PomeronCrossSection::Z(const G4double s)
256{
257 return 2*pomeron_C * Power(s) / Lambda(s);
258}
259
260inline G4double G4PomeronCrossSection::Lambda(const G4double s)
261{
262 return pomeron_Rsquare+pomeron_Alphaprime*std::log(s/pomeron_S);
263}
264
265inline G4double G4PomeronCrossSection::SigP(const G4double s)
266{
267 return 8 * pi * hbarc_squared * Power(s);
268}
269
270inline G4double G4PomeronCrossSection::Eikonal(const G4double s,
271 const G4double impactsquare)
272{
273 return Z(s)/2 * std::exp(-impactsquare/(4*Lambda(s)*hbarc_squared));
274}
275//*************************************************************************************************
276inline G4double G4PomeronCrossSection::PowerSoft(const G4double s)
277 {
278 return pomeron_Gamma *std::pow(s/pomeron_S, pomeron_Alpha -1);
279 }
280
281inline G4double G4PomeronCrossSection::PowerHard(const G4double s)
282 {
283 return pomeron_Gamma_Hard*std::pow(s/pomeron_S, pomeron_Alpha_Hard -1);
284 }
285
286inline G4double G4PomeronCrossSection::LambdaSoft(const G4double s)
287 {
288 return pomeron_Rsquare+pomeron_Alphaprime*std::log(s/pomeron_S);
289 }
290
291inline G4double G4PomeronCrossSection::LambdaHard(const G4double /*s*/)
292 {
293 return pomeron_Rsquare; //+pomeron_Alphaprime*std::log(s/pomeron_S);
294 }
295
296inline G4double G4PomeronCrossSection::Zsoft(const G4double s)
297 {
298 return 2*pomeron_C*PowerHard(s) / LambdaSoft(s);
299 }
300
301inline G4double G4PomeronCrossSection::Zhard(const G4double s)
302 {
303 return 2*pomeron_C*PowerHard(s)/LambdaHard(s);
304 }
305
306G4double G4PomeronCrossSection::SoftEikonal(G4double s, G4double impactsquare)
307 {
308 return Zsoft(s)/2*std::exp(-impactsquare/LambdaSoft(s)/hbarc_squared/4);
309 }
310
311G4double G4PomeronCrossSection::HardEikonal(G4double s, G4double impactsquare)
312 {
313 return Zhard(s)/2*std::exp(-impactsquare/LambdaHard(s)/hbarc_squared/4);
314 }
315
316//*************************************************************************************************
Note: See TracBrowser for help on using the repository browser.