Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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)