Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4XPDGElastic.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: G4XPDGElastic.cc,v 1.4 2010-03-12 15:45:18 gunter Exp $ //
28// -------------------------------------------------------------------
29//
30// PDG Elastic cross section
31// PDG fits, Phys.Rev. D50 (1994), 1335
32//
33//
34// -------------------------------------------------------------------
35
36#include "globals.hh"
37#include "G4ios.hh"
38#include "G4SystemOfUnits.hh"
39#include "G4XPDGElastic.hh"
40#include "G4KineticTrack.hh"
42#include "G4DataVector.hh"
43
44#include "G4AntiProton.hh"
45#include "G4AntiNeutron.hh"
46#include "G4Proton.hh"
47#include "G4Neutron.hh"
48#include "G4PionPlus.hh"
49#include "G4PionMinus.hh"
50#include "G4KaonMinus.hh"
51#include "G4KaonPlus.hh"
52
53const G4double G4XPDGElastic::_lowLimit = 5. * GeV;
54const G4double G4XPDGElastic::_highLimit = DBL_MAX;
55
56// Parameters of the PDG Elastic cross-section fit (Rev. Particle Properties, 1998)
57// Columns are: lower and higher fit range, X, Y1, Y2
58const G4int G4XPDGElastic::nPar = 7;
59// p pi+
60const G4double G4XPDGElastic::pPiPlusPDGFit[7] = { 2., 200., 0., 11.4, -0.4, 0.079, 0. };
61// p pi-
62const G4double G4XPDGElastic::pPiMinusPDGFit[7] = { 2., 360., 1.76, 11.2, -0.64, 0.043, 0. };
63// p K+
64const G4double G4XPDGElastic::pKPlusPDGFit[7] = { 2., 175., 5.0, 8.1, -1.8, 0.16, -1.3 };
65// p K-
66const G4double G4XPDGElastic::pKMinusPDGFit[7] = { 2., 175., 7.3, 0., 0., 0.29, -2.40 };
67// p p
68const G4double G4XPDGElastic::ppPDGFit[7] = { 2., 2100., 11.9, 26.9, -1.21, 0.169, -1.85 };
69// p pbar
70const G4double G4XPDGElastic::ppbarPDGFit[7] = { 5., 1730000., 10.2, 52.7, -1.16, 0.125, -1.28 };
71// n pbar
72const G4double G4XPDGElastic::npbarPDGFit[7] = { 1.1, 5.55, 36.5, 0., 0., 0., -11.9 };
73
74
76{
84
85 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> pp(proton,proton);
86 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> pn(proton,neutron);
87 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> piPlusp(piPlus,proton);
88 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> piMinusp(piMinus,proton);
89 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> KPlusp(KPlus,proton);
90 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> KMinusp(KMinus,proton);
91 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> nn(neutron,neutron);
92 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> ppbar(proton,antiproton);
93 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> npbar(antiproton,neutron);
94
95 std::vector<G4double> ppData;
96 std::vector<G4double> pPiPlusData;
97 std::vector<G4double> pPiMinusData;
98 std::vector<G4double> pKPlusData;
99 std::vector<G4double> pKMinusData;
100 std::vector<G4double> ppbarData;
101 std::vector<G4double> npbarData;
102
103 G4int i;
104 for (i=0; i<2; i++)
105 {
106 ppData.push_back(ppPDGFit[i] * GeV);
107 pPiPlusData.push_back(pPiPlusPDGFit[i] * GeV);
108 pPiMinusData.push_back(pPiMinusPDGFit[i] * GeV);
109 pKPlusData.push_back(pKPlusPDGFit[i] * GeV);
110 pKMinusData.push_back(pKMinusPDGFit[i] * GeV);
111 ppbarData.push_back(ppbarPDGFit[i] * GeV);
112 npbarData.push_back(npbarPDGFit[i] * GeV);
113 }
114
115 for (i=2; i<nPar; i++)
116 {
117 ppData.push_back(ppPDGFit[i]);
118 pPiPlusData.push_back(pPiPlusPDGFit[i]);
119 pPiMinusData.push_back(pPiMinusPDGFit[i]);
120 pKPlusData.push_back(pKPlusPDGFit[i]);
121 pKMinusData.push_back(pKMinusPDGFit[i]);
122 ppbarData.push_back(ppbarPDGFit[i]);
123 npbarData.push_back(npbarPDGFit[i]);
124 }
125
126 xMap[nn] = ppData;
127 xMap[pp] = ppData;
128 xMap[pn] = ppData;
129 xMap[piPlusp] = pPiPlusData;
130 xMap[piMinusp] = pPiMinusData;
131 xMap[KPlusp] = pKPlusData;
132 xMap[KMinusp] = pKMinusData;
133 xMap[ppbar] = ppbarData;
134 xMap[npbar] = npbarData;
135}
136
137
139{ }
140
141
143{
144 return (this == (G4XPDGElastic *) &right);
145}
146
147
149{
150 return (this != (G4XPDGElastic *) &right);
151}
152
153
155{
156 // Elastic Cross-section fit, 1994 Review of Particle Properties, (1994), 1
157
158 G4double sigma = 0.;
159
160 G4ParticleDefinition* def1 = trk1.GetDefinition();
161 G4ParticleDefinition* def2 = trk2.GetDefinition();
162
163 G4double sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
164 G4double m_1 = def1->GetPDGMass();
165 G4double m_2 = def2->GetPDGMass();
166 G4double m_max = std::max(m_1,m_2);
167 // if (m1 > m) m = m1;
168
169 G4double pLab = 0.;
170
171 if (m_max > 0. && sqrtS > (m_1 + m_2))
172 {
173 pLab = std::sqrt( (sqrtS*sqrtS - (m_1+m_2)*(m_1+m_2) ) * (sqrtS*sqrtS - (m_1-m_2)*(m_1-m_2)) ) / (2*m_max);
174
175 // The PDG fit formula requires p in GeV/c
176
177 // Order the pair: first is the lower mass particle, second is the higher mass one
178 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> trkPair(def1,def2);
179 if (def1->GetPDGMass() > def2->GetPDGMass())
180 trkPair = std::pair<G4ParticleDefinition *,G4ParticleDefinition *>(def2,def1);
181
182 std::vector<G4double> data;
183 G4double pMinFit = 0.;
184 G4double pMaxFit = 0.;
185 G4double aFit = 0.;
186 G4double bFit = 0.;
187 G4double cFit = 0.;
188 G4double dFit = 0.;
189 G4double nFit = 0.;
190
191 // Debug
192// G4cout << "Map has " << xMap.size() << " elements" << G4endl;
193 // Debug end
194
195 if (xMap.find(trkPair) != xMap.end())
196 {
197 PairDoubleMap::const_iterator iter;
198 for (iter = xMap.begin(); iter != xMap.end(); ++iter)
199 {
200 std::pair<G4ParticleDefinition *,G4ParticleDefinition *> thePair = (*iter).first;
201 if (thePair == trkPair)
202 {
203 data = (*iter).second;
204 pMinFit = data[0];
205 pMaxFit = data[1];
206 aFit = data[2];
207 bFit = data[3];
208 cFit = data[5];
209 dFit = data[6];
210 nFit = data[4];
211
212 if (pLab < pMinFit) return 0.0;
213 if (pLab > pMaxFit )
214 G4cout << "WARNING! G4XPDGElastic::PDGElastic "
215 << trk1.GetDefinition()->GetParticleName() << "-"
216 << trk2.GetDefinition()->GetParticleName()
217 << " elastic cross section: momentum "
218 << pLab / GeV << " GeV outside valid fit range "
219 << pMinFit /GeV << "-" << pMaxFit / GeV
220 << G4endl;
221
222 pLab /= GeV;
223 if (pLab > 0.)
224 {
225 G4double logP = std::log(pLab);
226 sigma = aFit + bFit * std::pow(pLab, nFit) + cFit * logP*logP + dFit * logP;
227 sigma = sigma * millibarn;
228 }
229 }
230 }
231 }
232 else
233 {
234 G4cout << "G4XPDGElastic::CrossSection - Data not found in Map" << G4endl;
235 }
236 }
237
238 if (sigma < 0.)
239 {
240 G4cout << "WARNING! G4XPDGElastic::PDGElastic "
241 << def1->GetParticleName() << "-" << def2->GetParticleName()
242 << " elastic cross section: momentum "
243 << pLab << " GeV, negative cross section "
244 << sigma / millibarn << " mb set to 0" << G4endl;
245 sigma = 0.;
246 }
247
248 return sigma;
249}
250
251
253{
254 G4String name = "PDGElastic ";
255 return name;
256}
257
258
260{
261 G4bool answer = InLimits(e,_lowLimit,_highLimit);
262
263 return answer;
264}
265
266
267
268
269
270
271
272
273
274
275
@ neutron
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
static G4AntiProton * AntiProtonDefinition()
Definition: G4AntiProton.cc:88
static G4KaonMinus * KaonMinusDefinition()
Definition: G4KaonMinus.cc:108
static G4KaonPlus * KaonPlusDefinition()
Definition: G4KaonPlus.cc:108
G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
static G4Neutron * NeutronDefinition()
Definition: G4Neutron.cc:99
const G4String & GetParticleName() const
static G4PionMinus * PionMinusDefinition()
Definition: G4PionMinus.cc:93
static G4PionPlus * PionPlusDefinition()
Definition: G4PionPlus.cc:93
static G4Proton * ProtonDefinition()
Definition: G4Proton.cc:88
G4bool InLimits(G4double e, G4double eLow, G4double eHigh) const
virtual G4bool IsValid(G4double e) const
virtual ~G4XPDGElastic()
G4bool operator==(const G4XPDGElastic &right) const
G4bool operator!=(const G4XPDGElastic &right) const
virtual G4double CrossSection(const G4KineticTrack &trk1, const G4KineticTrack &trk2) const
virtual G4String Name() const
#define DBL_MAX
Definition: templates.hh:83