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

Last change on this file since 1239 was 1228, checked in by garnier, 15 years ago

update geant4.9.3 tag

File size: 9.2 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 $
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.