Geant4-11
G4ComponentAntiNuclNuclearXS.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// Calculation of the total, elastic and inelastic cross-sections
27// of anti-nucleon and anti-nucleus interactions with nuclei
28// based on Glauber approach and V. Grishine formulaes for
29// interpolations (ref. V.M.Grichine, Eur.Phys.J., C62(2009) 399;
30// NIM, B267 (2009) 2460) and our parametrization of hadron-nucleon
31// cross-sections
32//
33//
34// Created by A.Galoyan and V. Uzhinsky, 18.11.2010
35
36
38
40#include "G4SystemOfUnits.hh"
41#include "G4ParticleTable.hh"
42#include "G4IonTable.hh"
45
46
48
50: G4VComponentCrossSection("AntiAGlauber"),
51 fRadiusEff(0.0),
52 fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0),
53 fAntiHadronNucleonTotXsc(0.0), fAntiHadronNucleonElXsc(0.0),
54 Elab(0.0), S(0.0), SqrtS(0)
55{
62 Mn = 0.93827231; // GeV
63 b0 = 11.92; // GeV^(-2)
64 b2 = 0.3036; // GeV^(-2)
65 SqrtS0 = 20.74; // GeV
66 S0 = 33.0625; // GeV^2
67 R0 = 1.0; // default value (V.Ivanchenko)
68}
69
70
72
74{
75}
76
77
79//
80// Calculation of total CrossSection of Anti-Nucleus - Nucleus
81
83(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
84{
85 const G4ParticleDefinition* theParticle = aParticle;
86 G4double sigmaTotal = GetAntiHadronNucleonTotCrSc(theParticle,kinEnergy);
87
88 // calculation of squared radius of NN-collision
89 G4int i(-1), j(-1);
90 if ( theParticle == theAProton ||
91 theParticle == theANeutron ) { i=0; }
92 else if ( theParticle == theADeuteron ) { i=1; }
93 else if ( theParticle == theATriton ) { i=2; }
94 else if ( theParticle == theAHe3 ) { i=3; }
95 else if ( theParticle == theAAlpha ) { i=4; }
96 else {};
97
98 if ( i < 0 ) {
100 ed << "Unknown anti-nucleus : "
101 << ( theParticle != nullptr ? theParticle->GetParticleName() : "nullptr" ) << G4endl
102 << "Target (Z, A)=(" << Z << "," << A << ")" << G4endl;
103 G4Exception( "G4ComponentAntiNuclNuclearXS::GetTotalElementCrossSection",
104 "antiNuclNuclearXS001", JustWarning, ed );
105 }
106
107 if ( Z == 1 && A == 1 ) { j=0; }
108 else if ( Z == 1 && A == 2 ) { j=1; }
109 else if ( Z == 1 && A == 3 ) { j=2; }
110 else if ( Z == 2 && A == 3 ) { j=3; }
111 else if ( Z == 2 && A == 4 ) { j=4; }
112 else {}
113
114 if ( i == 0 && j == 0 ) return sigmaTotal * millibarn; // Pbar/Nbar + P
115 if ( i > 0 && j >= 0 ) { fRadiusEff = ReffTot[i][j]; } // Light anti-nuclei + Light nuclei
116
117 if ( j < 0 ) {
118 if ( i == 0 ) { fRadiusEff = 1.34 * theG4Pow->powA(A, 0.23) // Anti-proton/Anti-neutron + Nucleus
119 + 1.35 / theG4Pow->A13(A); }
120 else if ( i == 1 ) { fRadiusEff = 1.46 * theG4Pow->powA(A, 0.21) // Anti-deuteron + Nucleus
121 + 1.45 / theG4Pow->A13(A); }
122 else if ( i == 2 ) { fRadiusEff = 1.40 * theG4Pow->powA(A, 0.21) // Anti-Tritium + Nucleus
123 + 1.63 / theG4Pow->A13(A); }
124 else if ( i == 3 ) { fRadiusEff = 1.40 * theG4Pow->powA(A, 0.21) // Anti-He3 + Nucleus
125 + 1.63 / theG4Pow->A13(A); }
126 else if ( i == 4 ) { fRadiusEff = 1.35 * theG4Pow->powA(A, 0.21) // Anti-Tritium + Nucleus
127 + 1.10 / theG4Pow->A13(A); }
128 else {}
129 }
130
132 G4double ApAt = std::abs(theParticle->GetBaryonNumber()) * A;
133
134 G4double xsection = millibarn*2.*pi*R2*10.*G4Log(1.+(ApAt*sigmaTotal/(2.*pi*R2*10.))); //mb
135 fTotalXsc = xsection;
136
137 return fTotalXsc;
138}
139
140
142//
143// Calculation of total CrossSection of Anti-Nucleus - Nucleus
144
146(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A )
147{
148 return GetTotalElementCrossSection(aParticle, kinEnergy, Z, (G4double) A);
149}
150
151
153// Calculation of inelastic CrossSection of Anti-Nucleus - Nucleus
154
156(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
157{
158 const G4ParticleDefinition* theParticle = aParticle;
159 G4double sigmaTotal = GetAntiHadronNucleonTotCrSc(theParticle,kinEnergy);
160 G4double sigmaElastic = GetAntiHadronNucleonElCrSc(theParticle,kinEnergy);
161
162 // calculation of sqr of radius NN-collision
163 G4int i(-1), j(-1);
164 if ( theParticle == theAProton ||
165 theParticle == theANeutron ) { i=0; }
166 else if ( theParticle == theADeuteron ) { i=1; }
167 else if ( theParticle == theATriton ) { i=2; }
168 else if ( theParticle == theAHe3 ) { i=3; }
169 else if ( theParticle == theAAlpha ) { i=4; }
170 else {};
171
172 if ( i < 0 ) {
174 ed << "Unknown anti-nucleus : "
175 << ( theParticle != nullptr ? theParticle->GetParticleName() : "nullptr" ) << G4endl
176 << "Target (Z, A)=(" << Z << "," << A << ")" << G4endl;
177 G4Exception( "G4ComponentAntiNuclNuclearXS::GetInelasticElementCrossSection",
178 "antiNuclNuclearXS002", JustWarning, ed );
179 }
180
181 if ( Z == 1 && A == 1 ) { j=0; }
182 else if ( Z == 1 && A == 2 ) { j=1; }
183 else if ( Z == 1 && A == 3 ) { j=2; }
184 else if ( Z == 2 && A == 3 ) { j=3; }
185 else if ( Z == 2 && A == 4 ) { j=4; }
186 else {}
187
188 if ( i == 0 && j == 0 ) return (sigmaTotal - sigmaElastic) * millibarn; // Pbar/Nbar + P
189 if ( i > 0 && j >= 0 ) { fRadiusEff = ReffInel[i][j]; } // Light anti-nuclei + Light nuclei
190
191 if ( j < 0) {
192 if ( i == 0 ) { fRadiusEff = 1.31*theG4Pow->powA(A, 0.22) // Anti-proton/Anti-neutron + Nucleus
193 + 0.90/theG4Pow->A13(A); }
194 else if ( i == 1 ) { fRadiusEff = 1.38*theG4Pow->powA(A, 0.21) // Anti-deuteron + Nucleus
195 + 1.55/theG4Pow->A13(A); }
196 else if ( i == 2 ) { fRadiusEff = 1.34*theG4Pow->powA(A, 0.21) // Anti-Tritium + Nucleus
197 + 1.51/theG4Pow->A13(A); }
198 else if ( i == 3 ) { fRadiusEff = 1.34*theG4Pow->powA(A, 0.21) // Anti-He3 + Nucleus
199 + 1.51/theG4Pow->A13(A); }
200 else if ( i == 4 ) { fRadiusEff = 1.30*theG4Pow->powA(A, 0.21) // Anti-Tritium + Nucleus
201 + 1.05/theG4Pow->A13(A); }
202 else {}
203 }
204
206 G4double ApAt = std::abs(theParticle->GetBaryonNumber()) * A;
207
208 G4double inelxsection = millibarn*pi*R2*10.*G4Log(1.+(ApAt*sigmaTotal/(pi*R2*10.))); //mb
209 fInelasticXsc = inelxsection;
210
211 return fInelasticXsc;
212}
213
214
216//
217// Calculates Inelastic Anti-nucleus-Nucleus cross-section
218
220(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
221{
222 return GetInelasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A);
223}
224
225
227//
228// Calculates elastic Anti-nucleus-Nucleus cross-section as Total - Inelastic
229
231(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
232{
233 fElasticXsc = GetTotalElementCrossSection(aParticle, kinEnergy, Z, A)-
234 GetInelasticElementCrossSection(aParticle, kinEnergy, Z, A);
235 if (fElasticXsc < 0.) fElasticXsc = 0.;
236 return fElasticXsc;
237}
238
239
241//
242// Calculates elastic Anti-nucleus-Nucleus cross-section
243
245(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
246{
247 return GetElasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A);
248}
249
250
252// Calculation of Antihadron - hadron Total Cross-section
253
255(const G4ParticleDefinition* aParticle, G4double kinEnergy)
256{
257 G4double xsection, Pmass, Energy, momentum;
258 const G4ParticleDefinition* theParticle = aParticle;
259 Pmass=theParticle->GetPDGMass();
260 Energy=Pmass+kinEnergy;
261 momentum=std::sqrt(Energy*Energy-Pmass*Pmass)/std::abs(theParticle->GetBaryonNumber());
262 G4double Plab = momentum / GeV;
263
264 G4double B, SigAss;
265 G4double C, d1, d2, d3;
266 Elab = std::sqrt(Mn*Mn + Plab*Plab); // GeV
267 S = 2.*Mn*Mn + 2. *Mn*Elab; // GeV^2
268 SqrtS = std::sqrt(S); // GeV
269 B = b0+b2*G4Log(SqrtS/SqrtS0)*G4Log(SqrtS/SqrtS0); //GeV^(-2)
270 SigAss = 36.04 +0.304*G4Log(S/S0)*G4Log(S/S0); //mb
271 R0 = std::sqrt(0.40874044*SigAss - B); //GeV^(-2)
272 C = 13.55;
273 d1 = -4.47;
274 d2 = 12.38;
275 d3 = -12.43;
276
277 xsection = SigAss * ( 1 + 1./(std::sqrt(S-4.*Mn*Mn)) / (theG4Pow->powN(R0, 3))
278 * C * ( 1 + d1/SqrtS + d2/(theG4Pow->powN(SqrtS, 2))
279 + d3/(theG4Pow->powN(SqrtS, 3)) ) );
280
281 //xsection *= millibarn;
282 fAntiHadronNucleonTotXsc = xsection;
283
285}
286
287
288// //////////////////////////////////////////////////////////////////////////
289// Calculation of Antihadron - hadron Elastic Cross-section
290
293{
294 G4double xsection;
295 G4double SigAss;
296 G4double C, d1, d2, d3;
297 GetAntiHadronNucleonTotCrSc(aParticle,kinEnergy);
298 SigAss = 4.5 + 0.101*G4Log(S/S0)*G4Log(S/S0); //mb
299 C = 59.27;
300 d1 = -6.95;
301 d2 = 23.54;
302 d3 = -25.34;
303
304 xsection = SigAss * ( 1 + 1. / (std::sqrt(S-4.*Mn*Mn)) / (theG4Pow->powN(R0, 3))
305 * C * ( 1 + d1/SqrtS + d2/(theG4Pow->powN(SqrtS, 2))
306 + d3/(theG4Pow->powN(SqrtS, 3)) ) );
307
308 //xsection *= millibarn;
309 fAntiHadronNucleonElXsc = xsection;
310
312}
313
314
316
318{
319 outFile << "The G4ComponentAntiNuclNuclearXS calculates total,\n"
320 << "inelastic, elastic cross sections of anti-nucleons and light \n"
321 << "anti-nucleus interactions with nuclei using Glauber's approach.\n"
322 << "It uses parametrizations of antiproton-proton total and elastic \n"
323 << "cross sections and Wood-Saxon distribution of nuclear density.\n"
324 << "See details in Phys.Lett. B705 (2011) 235. \n";
325}
326
G4double C(G4double temp)
G4double S(G4double temp)
G4double B(G4double temperature)
static const G4double d1
static const G4double d2
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
G4double G4Log(G4double x)
Definition: G4Log.hh:226
static constexpr double millibarn
Definition: G4SIunits.hh:86
static constexpr double GeV
Definition: G4SIunits.hh:203
static constexpr double pi
Definition: G4SIunits.hh:55
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
static G4AntiAlpha * AntiAlpha()
Definition: G4AntiAlpha.cc:88
static G4AntiDeuteron * AntiDeuteron()
static G4AntiHe3 * AntiHe3()
Definition: G4AntiHe3.cc:93
static G4AntiNeutron * AntiNeutron()
static G4AntiProton * AntiProton()
Definition: G4AntiProton.cc:92
static G4AntiTriton * AntiTriton()
Definition: G4AntiTriton.cc:93
virtual G4double GetTotalIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual void CrossSectionDescription(std::ostream &) const
G4double GetAntiHadronNucleonElCrSc(const G4ParticleDefinition *aParticle, G4double kinEnergy)
virtual G4double GetTotalElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
virtual G4double GetInelasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual G4double GetElasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
virtual G4double GetInelasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
G4double GetAntiHadronNucleonTotCrSc(const G4ParticleDefinition *aParticle, G4double kinEnergy)
const G4String & GetParticleName() const
G4double A13(G4double A) const
Definition: G4Pow.cc:120
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:166
G4double powA(G4double A, G4double y) const
Definition: G4Pow.hh:230