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
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"
44
45///////////////////////////////////////////////////////////////////////////////
46
47
49: G4VComponentCrossSection("AntiAGlauber"), fUpperLimit( 10000 * GeV ),
50 fLowerLimit( 10 * MeV )
51{
52 theAProton = G4AntiProton::AntiProton();
53 theANeutron = G4AntiNeutron::AntiNeutron();
54 theADeuteron = G4AntiDeuteron::AntiDeuteron();
55 theATriton = G4AntiTriton::AntiTriton();
56 theAAlpha = G4AntiAlpha::AntiAlpha();
57 theAHe3 = G4AntiHe3::AntiHe3();
58
59 Mn = 0.93827231; // GeV
60 b0 = 11.92; // GeV^(-2)
61 b2 = 0.3036; // GeV^(-2)
62 SqrtS0 = 20.74; // GeV
63 S0 = 33.0625; // GeV^2
64
65}
66
67///////////////////////////////////////////////////////////////////////////////////////
68//
69//
70
72{
73}
74
75////////////////////////////////////////////////////////////////////////////////
76
77void
79{
80 outFile << "G4ComponentAntiNuclNuclearXS describes the total, elastic\n"
81 << "and inelastic cross sections for the scattering of light\n"
82 << "antinuclei from nuclei using the Glauber approach and Grichine\n"
83 << "parameterization. It is valid from 10 MeV to 10 TeV incident\n"
84 << "energies and applies to antiprotons, antineutrons, antideuterons,\n"
85 << "anti3He, antitritons and antialphas. This is a cross section\n"
86 << "component which is to be used as part of a cross section data\n"
87 << "set.\n";
88}
89
90////////////////////////////////////////////////////////////////////////////////
91//
92// Calculation of total CrossSection of Anti-Nucleus - Nucleus
93
94
96(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
97{
98 G4double xsection, sigmaTotal, sigmaElastic;
99
100 const G4ParticleDefinition* theParticle = aParticle;
101
102 sigmaTotal = GetAntiHadronNucleonTotCrSc(theParticle,kinEnergy);
103 sigmaElastic = GetAntiHadronNucleonElCrSc(theParticle,kinEnergy);
104
105// calculation of squared radius of NN-collision
106 fRadiusNN2=sigmaTotal*sigmaTotal*0.1/(8.*sigmaElastic*pi) ; //fm^2
107
108// calculation of effective nuclear radius for Pbar and Nbar interactions (can be changed)
109
110 if ( (theParticle == theAProton) || (theParticle == theANeutron) )
111 {
112 if(A==1)
113 { fTotalXsc = sigmaTotal * millibarn;
114 return fTotalXsc; }
115
116 fRadiusEff = 1.34*std::pow(A,0.23)+1.35/std::pow(A,1./3.); //fm
117
118 if( (Z==1) && (A==2) ) fRadiusEff = 3.800; //fm
119 if( (Z==1) && (A==3) ) fRadiusEff = 3.300;
120 if( (Z==2) && (A==3) ) fRadiusEff = 3.300;
121 if( (Z==2) && (A==4) ) fRadiusEff = 2.376;
122 }
123
124//calculation of effective nuclear radius for AntiDeuteron interaction (can be changed)
125 if (theParticle == theADeuteron)
126 { fRadiusEff = 1.46 * std::pow(A,0.21) + 1.45 / std::pow(A,1./3.);
127
128 if( (Z==1) && (A==2) ) fRadiusEff = 3.238; //fm
129 if( (Z==1) && (A==3) ) fRadiusEff = 3.144;
130 if( (Z==2) && (A==3) ) fRadiusEff = 3.144;
131 if( (Z==2) && (A==4) ) fRadiusEff = 2.544;
132 }
133// calculation of effective nuclear radius for AntiHe3 interaction (can be changed)
134
135 if( (theParticle ==theAHe3) || (theParticle ==theATriton) )
136 { fRadiusEff = 1.40* std::pow(A,0.21)+1.63/std::pow(A,1./3.);
137
138 if( (Z==1) && (A==2) ) fRadiusEff = 3.144; //fm
139 if( (Z==1) && (A==3) ) fRadiusEff = 3.075;
140 if( (Z==2) && (A==3) ) fRadiusEff = 3.075;
141 if( (Z==2) && (A==4) ) fRadiusEff = 2.589;
142 }
143
144//calculation of effective nuclear radius for AntiAlpha interaction (can be changed)
145
146 if (theParticle == theAAlpha)
147 {
148 fRadiusEff = 1.35* std::pow(A,0.21)+1.1/std::pow(A,1./3.);
149
150 if( (Z==1) && (A==2) ) fRadiusEff = 2.544; //fm
151 if( (Z==1) && (A==3) ) fRadiusEff = 2.589;
152 if( (Z==2) && (A==3) ) fRadiusEff = 2.589;
153 if( (Z==2) && (A==4) ) fRadiusEff = 2.241;
154
155 }
156
157 G4double R2 = fRadiusEff*fRadiusEff;
158 G4double REf2 = R2+fRadiusNN2;
159 G4double ApAt = std::abs(theParticle->GetBaryonNumber()) * A;
160
161 xsection = 2*pi*REf2*10.*std::log(1+(ApAt*sigmaTotal/(2*pi*REf2*10.))); //mb
162 xsection =xsection *millibarn;
163 fTotalXsc = xsection;
164
165 return fTotalXsc;
166}
167
168
169////////////////////////////////////////////////////////////////////////////////
170//
171// Calculation of total CrossSection of Anti-Nucleus - Nucleus
172//////////////////////////////////////////////////////////////////////////////
174(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A )
175{ return GetTotalElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
176
177////////////////////////////////////////////////////////////////
178// Calculation of inelastic CrossSection of Anti-Nucleus - Nucleus
179////////////////////////////////////////////////////////////////
180
182(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
183{
184 G4double inelxsection, sigmaTotal, sigmaElastic;
185
186 const G4ParticleDefinition* theParticle = aParticle;
187
188 sigmaTotal = GetAntiHadronNucleonTotCrSc(theParticle,kinEnergy);
189 sigmaElastic = GetAntiHadronNucleonElCrSc(theParticle,kinEnergy);
190
191// calculation of sqr of radius NN-collision
192 fRadiusNN2=sigmaTotal*sigmaTotal*0.1/(8.*sigmaElastic*pi); // fm^2
193
194
195// calculation of effective nuclear radius for Pbar and Nbar interaction (can be changed)
196
197 if ( (theParticle == theAProton) || (theParticle == theANeutron) )
198 {
199 if (A==1)
200 { fInelasticXsc = (sigmaTotal - sigmaElastic) * millibarn;
201 return fInelasticXsc;
202 }
203 fRadiusEff = 1.31*std::pow(A, 0.22)+0.9/std::pow(A, 1./3.); //fm
204
205 if( (Z==1) && (A==2) ) fRadiusEff = 3.582; //fm
206 if( (Z==1) && (A==3) ) fRadiusEff = 3.105;
207 if( (Z==2) && (A==3) ) fRadiusEff = 3.105;
208 if( (Z==2) && (A==4) ) fRadiusEff = 2.209;
209 }
210
211//calculation of effective nuclear radius for AntiDeuteron interaction (can be changed)
212
213 if (theParticle ==theADeuteron)
214 {
215 fRadiusEff = 1.38*std::pow(A, 0.21)+1.55/std::pow(A, 1./3.);
216
217 if( (Z==1) && (A==2) ) fRadiusEff = 3.169; //fm
218 if( (Z==1) && (A==3) ) fRadiusEff = 3.066;
219 if( (Z==2) && (A==3) ) fRadiusEff = 3.066;
220 if( (Z==2) && (A==4) ) fRadiusEff = 2.498;
221 }
222
223//calculation of effective nuclear radius for AntiHe3 interaction (can be changed)
224
225 if( (theParticle ==theAHe3) || (theParticle ==theATriton) )
226 {
227 fRadiusEff = 1.34 * std::pow(A, 0.21)+1.51/std::pow(A, 1./3.);
228
229 if( (Z==1) && (A==2) ) fRadiusEff = 3.066; //fm
230 if( (Z==1) && (A==3) ) fRadiusEff = 2.973;
231 if( (Z==2) && (A==3) ) fRadiusEff = 2.973;
232 if( (Z==2) && (A==4) ) fRadiusEff = 2.508;
233
234 }
235
236//calculation of effective nuclear radius for AntiAlpha interaction (can be changed)
237
238 if (theParticle == theAAlpha)
239 {
240 fRadiusEff = 1.3*std::pow(A, 0.21)+1.05/std::pow(A, 1./3.);
241
242 if( (Z==1) && (A==2) ) fRadiusEff = 2.498; //fm
243 if( (Z==1) && (A==3) ) fRadiusEff = 2.508;
244 if( (Z==2) && (A==3) ) fRadiusEff = 2.508;
245 if( (Z==2) && (A==4) ) fRadiusEff = 2.158;
246 }
247 G4double R2 = fRadiusEff*fRadiusEff;
248 G4double REf2 = R2+fRadiusNN2;
249 G4double ApAt= std::abs(theParticle->GetBaryonNumber()) * A;
250
251 inelxsection = pi*REf2 *10* std::log(1+(ApAt*sigmaTotal/(pi*REf2*10.))); //mb
252 inelxsection = inelxsection * millibarn;
253 fInelasticXsc = inelxsection;
254 return fInelasticXsc;
255}
256
257///////////////////////////////////////////////////////////////////////////////
258//
259// Calculates Inelastic Anti-nucleus-Nucleus cross-section
260//
262(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
263{return GetInelasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
264
265
266
267///////////////////////////////////////////////////////////////////////////////
268//
269// Calculates elastic Anti-nucleus-Nucleus cross-section as Total - Inelastic
270//
272(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
273{
274 fElasticXsc = GetTotalElementCrossSection(aParticle, kinEnergy, Z, A)-
275 GetInelasticElementCrossSection(aParticle, kinEnergy, Z, A);
276
277 if (fElasticXsc < 0.) fElasticXsc = 0.;
278
279 return fElasticXsc;
280}
281
282///////////////////////////////////////////////////////////////////////////////
283//
284// Calculates elastic Anti-nucleus-Nucleus cross-section
285//
287(const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
288{ return GetElasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
289
290
291///////////////////////////////////////////////////////////////////////////////////
292// Calculation of Antihadron - hadron Total Cross-section
293
295(const G4ParticleDefinition* aParticle, G4double kinEnergy)
296{
297 G4double xsection, Pmass, Energy, momentum;
298 const G4ParticleDefinition* theParticle = aParticle;
299 Pmass=theParticle->GetPDGMass();
300 Energy=Pmass+kinEnergy;
301 momentum=std::sqrt(Energy*Energy-Pmass*Pmass)/std::abs(theParticle->GetBaryonNumber());
302 G4double Plab = momentum / GeV/std::abs(aParticle->GetBaryonNumber()); // Uzhi 24 Nov. 2011
303
304 if(Plab < 0.1) { Plab = 0.1; } // Uzhi 24 Nov. 2011
305
306 G4double B, SigAss;
307 G4double C, d1, d2, d3 ;
308
309 Elab = std::sqrt(Mn*Mn + Plab*Plab); // GeV
310 S = 2.*Mn*Mn + 2. *Mn*Elab; // GeV^2
311 SqrtS = std::sqrt(S); // GeV
312
313 B = b0+b2*std::log(SqrtS/SqrtS0)*std::log(SqrtS/SqrtS0); //GeV^(-2)
314 SigAss = 36.04 +0.304*std::log(S/S0)*std::log(S/S0); //mb
315 R0 = std::sqrt(0.40874044*SigAss - B); //GeV^(-2)
316
317 C = 13.55;
318 d1 = -4.47;
319 d2 = 12.38;
320 d3 = -12.43;
321 xsection = SigAss*(1 + 1./(std::sqrt(S-4.*Mn*Mn)) / (std::pow(R0, 3.))
322 *C* (1+d1/SqrtS+d2/(std::pow(SqrtS,2.))+d3/(std::pow(SqrtS,3.)) ));
323
324// xsection *= millibarn;
325
326 fAntiHadronNucleonTotXsc = xsection;
327 return fAntiHadronNucleonTotXsc;
328}
329
330
331//
332// /////////////////////////////////////////////////////////////////////////////////
333// Calculation of Antihadron - hadron Elastic Cross-section
334
335G4double G4ComponentAntiNuclNuclearXS ::
336GetAntiHadronNucleonElCrSc(const G4ParticleDefinition* aParticle, G4double kinEnergy)
337{
338 G4double xsection;
339
340 G4double SigAss;
341 G4double C, d1, d2, d3 ;
342
343 GetAntiHadronNucleonTotCrSc(aParticle,kinEnergy);
344
345 SigAss = 4.5 + 0.101*std::log(S/S0)*std::log(S/S0); //mb
346
347 C = 59.27;
348 d1 = -6.95;
349 d2 = 23.54;
350 d3 = -25.34;
351
352 xsection = SigAss* (1 + 1. / (std::sqrt(S-4.*Mn*Mn)) / (std::pow(R0, 3.))
353 *C* ( 1+d1/SqrtS+d2/(std::pow(SqrtS,2.))+d3/(std::pow(SqrtS,3.)) ));
354
355// xsection *= millibarn;
356
357 fAntiHadronNucleonElXsc = xsection;
358 return fAntiHadronNucleonElXsc;
359}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
static G4AntiAlpha * AntiAlpha()
Definition: G4AntiAlpha.cc:89
static G4AntiDeuteron * AntiDeuteron()
static G4AntiHe3 * AntiHe3()
Definition: G4AntiHe3.cc:94
static G4AntiNeutron * AntiNeutron()
static G4AntiProton * AntiProton()
Definition: G4AntiProton.cc:93
static G4AntiTriton * AntiTriton()
Definition: G4AntiTriton.cc:94
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)