Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4QProbability.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$
28 //
29 // ------------------------------------------------------------
30 // GEANT 4 class implementation file
31 //
32 // ---------------- G4QProbability ----------------
33 // by Mikhail Kossov Oct, 2006
34 // class for Pomeron & Reggeon amplitudes used by CHIPS
35 // For comparison mirror member functions are taken from G4 class:
36 // G4PomeronCrossSection
37 // ------------------------------------------------------------------
38 // Short description: Pomeron is one of the possible vacuum pole (the
39 // second is Oderon, but they are identical in the present model), by
40 // which particle exchang in the ellastic scattering process. Others
41 // are Reggeons and, possibly Instantons (for spin-flip reactions).
42 // Strings are cuts of Pomerons and Reggeons (optic theorem connects
43 // the amplitude of scattering at zero angle with the total inelastic
44 // cross-section). They describe inelastic processes at high energies.
45 // ------------------------------------------------------------------
46 
47 #include "G4QProbability.hh"
48 #include "G4SystemOfUnits.hh"
49 
51 {
52  S0 = 1.*GeV*GeV; // Must be a constant (just GeV^2 unit !)
53  pom_Alpha = 1.0808; // Must be the same for all hadrons
54  pom_Alphaprime = 0.25/GeV/GeV;
55  qex_Gamma = 9./GeV/GeV;
56  qex_R2 = 27./GeV/GeV;
57  qex_Alphaprime = 1.5/GeV/GeV;
58 
59  G4int aP = std::abs(PDG);
60  if (PDG==2212 || PDG==2112) InitForNucleon();
61  else if(PDG==111 || aP==211) InitForPion();
62  else if(PDG==130 || PDG==310 || aP==311 || aP==321) InitForKaon();
63  else if(PDG==22) InitForGamma();
64  else if(PDG > 3000) InitForHyperon();
65  else if(PDG <-2000) InitForAntiBaryon();
66  else
67  {
68  G4cout<<"-Warning-G4QProbability is initialized for PDGCode="<<PDG<<" as Pion"<<G4endl;
69  InitForPion();
70  }
71  pom_sqC=std::sqrt(pom_C);
72 }
73 
75  const G4int nPom)
76 {
77  static const G4int nft=11;
78  static const G4int nf1=nft-1;
79  static const G4double ft[nft]={1.,1.,2.,6.,24.,120.,720.,5040.,40320.,362880.,3628800.};
80  if(nPom<0) return 0.;
81  G4double f=ft[nf1];
82  if(nPom<nft) f=ft[nPom];
83  else for(G4int i=nft; i<= nPom; i++) f*=i; // Calculate factorial for high nPom
84  G4double e=PomEikonal(s_value,imp2); e+=e; // Doubled Eikonal
85  return std::exp(-e)*std::pow(e,nPom)/pom_C/f;
86 }
87 
89  const G4int nQex)
90 {
91  static const G4int nft=11;
92  static const G4int nf1=nft-1;
93  static const G4double ft[nft]={1.,1.,2.,6.,24.,120.,720.,5040.,40320.,362880.,3628800.};
94  if(nQex<0) return 0.;
95  G4double f=ft[nf1];
96  if(nQex<nft) f=ft[nQex];
97  else for(G4int i=nft; i<= nQex; i++) f*=i; // Calculate factorial for high nPom
98  G4double e=QexEikonal(s_value,imp2); e+=e; // Doubled Eikonal
99  return std::exp(-e)*std::pow(e,nQex)/f;
100 }
101 
102 void G4QProbability::InitForNucleon()
103 {
104  pom_Gamma = 2.16/GeV/GeV; // ? M.K.@@ Must be taken from total cross-sections
105  pom_C = 1.4;
106  pom_R2 = 3.30/GeV/GeV;
107 }
108 
109 void G4QProbability::InitForHyperon()
110 {
111  pom_Gamma = 2.16/GeV/GeV; // ? M.K.@@ Must be taken from total cross-sections
112  pom_C = 1.4;
113  pom_R2 = 3.30/GeV/GeV; // ? M.K.@@ Just a guess
114 }
115 void G4QProbability::InitForAntiBaryon()
116 {
117  pom_Gamma = 2.16/GeV/GeV; // ? M.K.@@ Must be taken from total cross-sections
118  pom_C = 1.4;
119  pom_R2 = 3.30/GeV/GeV;
120 }
121 
122 void G4QProbability::InitForPion()
123 {
124  pom_Gamma = 2.16/GeV/GeV; // ? M.K.@@ Must be taken from total cross-sections
125  pom_C = 1.6; // Only: for mesons it is bigger than for baryons
126  pom_R2 = 2.36/GeV/GeV;
127 }
128 
129 void G4QProbability::InitForKaon()
130 {
131  pom_Gamma = 1.92/GeV/GeV; // ? M.K.@@ Must be taken from total cross-sections
132  pom_C = 1.8; // 1.7 (?)
133  pom_R2 = 1.96/GeV/GeV; // ? M.K.@@ Just a guess
134 }
135 
136 void G4QProbability::InitForGamma()
137 {
138  pom_Gamma = 2.16/GeV/GeV; // ? M.K.@@ Must be taken from total cross-sections
139  pom_C = 1.7;
140  pom_R2 = 2.16/GeV/GeV; // ? M.K.@@ Just a guess
141 }
142 
143 G4double G4QProbability::Expand(G4double z)
144 {
145  G4double sum=1.;
146  G4double current=1.;
147  for(G4int j=2; j<21; j++)
148  {
149  current *= -z*(j-1)/j/j;
150  sum+=current;
151  }
152  return sum;
153 }
154 
156 {
157  G4double ExpPom=std::exp(-PomEikonal(s_value,imp2));
158  G4double ExpQex=std::exp(-QexEikonal(s_value,imp2));
159  G4double Amp=(ExpQex*(1.-ExpPom) + sqr(pom_sqC-1.)*ExpPom*(1.-ExpQex))/pom_C;
160  return Amp+Amp;
161 }
162 
164 {
165  G4double ExpPom=std::exp(-PomEikonal(s_value,imp2));
166  G4double ExpQex=std::exp(-QexEikonal(s_value,imp2));
167  G4double Amp=(ExpQex*(1.-ExpPom) + sqr(pom_sqC-1.)*ExpPom*(1.-ExpQex))/pom_C;
168  return Amp*Amp;
169 }
170 
172 {
173  G4double ExpPom=std::exp(-PomEikonal(s_value,imp2));
174  G4double ExpQex=std::exp(-QexEikonal(s_value,imp2));
175  G4double Amp=sqr(pom_sqC-1.)*(ExpQex*(1.-ExpPom) + ExpPom*(1.-ExpQex))/pom_C;
176  return Amp*Amp;
177 }
178 
180 {
181  G4double ExpPom=std::exp(-PomEikonal(s_value,imp2));
182  G4double ExpQex=std::exp(-QexEikonal(s_value,imp2));
183  G4double Amp=(pom_sqC-1.)*(ExpQex*(1.-ExpPom) - (pom_sqC-1.)*ExpPom*(1.-ExpQex))/pom_C;
184  return Amp*Amp;
185 }
186 
188 {
189  return GetQexDubDiffProbability(s_value,imp2)+2*GetQexSinDiffProbability(s_value,imp2);
190 }
191 
193 {
194  G4double ExpPom=std::exp(-PomEikonal(s_value,imp2));
195  G4double ExpQex=std::exp(-QexEikonal(s_value,imp2));
196  G4double Amp=sqr(pom_sqC-1.)*(ExpQex*(1.-ExpPom) + ExpPom*(1.-ExpQex))/pom_C;
197  return Amp+Amp-Amp*Amp;
198 }