Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
39 #include "G4PhysicalConstants.hh"
40 #include "G4SystemOfUnits.hh"
41 #include "G4ParticleTable.hh"
42 #include "G4IonTable.hh"
43 #include "G4ParticleDefinition.hh"
44 
45 ///////////////////////////////////////////////////////////////////////////////
46 
48 : G4VComponentCrossSection("AntiAGlauber"),
49 // fUpperLimit(10000*GeV), fLowerLimit(10*MeV),
50  fRadiusEff(0.0), fRadiusNN2(0.0),
51  fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0),
52  fAntiHadronNucleonTotXsc(0.0), fAntiHadronNucleonElXsc(0.0),
53  Elab(0.0), S(0.0), SqrtS(0)
54 {
55  theAProton = G4AntiProton::AntiProton();
56  theANeutron = G4AntiNeutron::AntiNeutron();
57  theADeuteron = G4AntiDeuteron::AntiDeuteron();
58  theATriton = G4AntiTriton::AntiTriton();
59  theAAlpha = G4AntiAlpha::AntiAlpha();
60  theAHe3 = G4AntiHe3::AntiHe3();
61 
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 ///////////////////////////////////////////////////////////////////////////////////////
71 //
72 //
73 
75 {
76 }
77 
78 ////////////////////////////////////////////////////////////////////////////////
79 
80 
81 
82 ////////////////////////////////////////////////////////////////////////////////
83 //
84 // Calculation of total CrossSection of Anti-Nucleus - Nucleus
85 
86 
88 (const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
89 {
90  G4double xsection, sigmaTotal, sigmaElastic;
91 
92  const G4ParticleDefinition* theParticle = aParticle;
93 
94  sigmaTotal = GetAntiHadronNucleonTotCrSc(theParticle,kinEnergy);
95  sigmaElastic = GetAntiHadronNucleonElCrSc(theParticle,kinEnergy);
96 
97 // calculation of squared radius of NN-collision
98  fRadiusNN2=sigmaTotal*sigmaTotal*0.1/(8.*sigmaElastic*pi) ; //fm^2
99 
100 // calculation of effective nuclear radius for Pbar and Nbar interactions (can be changed)
101 
102  //A.R. 29-Jan-2013 : use antiprotons/antineutrons as the default case,
103  // to be used for instance, as first approximation
104  // without validation, for anti-hyperons.
105  //if ( (theParticle == theAProton) || (theParticle == theANeutron) ) {
106  if(A==1)
107  { fTotalXsc = sigmaTotal * millibarn;
108  return fTotalXsc; }
109 
110  fRadiusEff = 1.34*std::pow(A,0.23)+1.35/std::pow(A,1./3.); //fm
111 
112  if( (Z==1) && (A==2) ) fRadiusEff = 3.800; //fm
113  if( (Z==1) && (A==3) ) fRadiusEff = 3.300;
114  if( (Z==2) && (A==3) ) fRadiusEff = 3.300;
115  if( (Z==2) && (A==4) ) fRadiusEff = 2.376;
116  //}
117 
118 //calculation of effective nuclear radius for AntiDeuteron interaction (can be changed)
119  if (theParticle == theADeuteron)
120  { fRadiusEff = 1.46 * std::pow(A,0.21) + 1.45 / std::pow(A,1./3.);
121 
122  if( (Z==1) && (A==2) ) fRadiusEff = 3.238; //fm
123  if( (Z==1) && (A==3) ) fRadiusEff = 3.144;
124  if( (Z==2) && (A==3) ) fRadiusEff = 3.144;
125  if( (Z==2) && (A==4) ) fRadiusEff = 2.544;
126  }
127 // calculation of effective nuclear radius for AntiHe3 interaction (can be changed)
128 
129  if( (theParticle ==theAHe3) || (theParticle ==theATriton) )
130  { fRadiusEff = 1.40* std::pow(A,0.21)+1.63/std::pow(A,1./3.);
131 
132  if( (Z==1) && (A==2) ) fRadiusEff = 3.144; //fm
133  if( (Z==1) && (A==3) ) fRadiusEff = 3.075;
134  if( (Z==2) && (A==3) ) fRadiusEff = 3.075;
135  if( (Z==2) && (A==4) ) fRadiusEff = 2.589;
136  }
137 
138 //calculation of effective nuclear radius for AntiAlpha interaction (can be changed)
139 
140  if (theParticle == theAAlpha)
141  {
142  fRadiusEff = 1.35* std::pow(A,0.21)+1.1/std::pow(A,1./3.);
143 
144  if( (Z==1) && (A==2) ) fRadiusEff = 2.544; //fm
145  if( (Z==1) && (A==3) ) fRadiusEff = 2.589;
146  if( (Z==2) && (A==3) ) fRadiusEff = 2.589;
147  if( (Z==2) && (A==4) ) fRadiusEff = 2.241;
148 
149  }
150 
151  G4double R2 = fRadiusEff*fRadiusEff;
152  G4double REf2 = R2+fRadiusNN2;
153  G4double ApAt = std::abs(theParticle->GetBaryonNumber()) * A;
154 
155  xsection = 2*pi*REf2*10.*std::log(1+(ApAt*sigmaTotal/(2*pi*REf2*10.))); //mb
156  xsection =xsection *millibarn;
157  fTotalXsc = xsection;
158 
159  return fTotalXsc;
160 }
161 
162 
163 ////////////////////////////////////////////////////////////////////////////////
164 //
165 // Calculation of total CrossSection of Anti-Nucleus - Nucleus
166 //////////////////////////////////////////////////////////////////////////////
168 (const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A )
169 { return GetTotalElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
170 
171 ////////////////////////////////////////////////////////////////
172 // Calculation of inelastic CrossSection of Anti-Nucleus - Nucleus
173 ////////////////////////////////////////////////////////////////
174 
176 (const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
177 {
178  G4double inelxsection, sigmaTotal, sigmaElastic;
179 
180  const G4ParticleDefinition* theParticle = aParticle;
181 
182  sigmaTotal = GetAntiHadronNucleonTotCrSc(theParticle,kinEnergy);
183  sigmaElastic = GetAntiHadronNucleonElCrSc(theParticle,kinEnergy);
184 
185 // calculation of sqr of radius NN-collision
186  fRadiusNN2=sigmaTotal*sigmaTotal*0.1/(8.*sigmaElastic*pi); // fm^2
187 
188 
189 // calculation of effective nuclear radius for Pbar and Nbar interaction (can be changed)
190 
191  //A.R. 29-Jan-2013 : use antiprotons/antineutrons as the default case,
192  // to be used for instance, as first approximation
193  // without validation, for anti-hyperons.
194  //if ( (theParticle == theAProton) || (theParticle == theANeutron) ) {
195  if (A==1)
196  { fInelasticXsc = (sigmaTotal - sigmaElastic) * millibarn;
197  return fInelasticXsc;
198  }
199  fRadiusEff = 1.31*std::pow(A, 0.22)+0.9/std::pow(A, 1./3.); //fm
200 
201  if( (Z==1) && (A==2) ) fRadiusEff = 3.582; //fm
202  if( (Z==1) && (A==3) ) fRadiusEff = 3.105;
203  if( (Z==2) && (A==3) ) fRadiusEff = 3.105;
204  if( (Z==2) && (A==4) ) fRadiusEff = 2.209;
205  //}
206 
207 //calculation of effective nuclear radius for AntiDeuteron interaction (can be changed)
208 
209  if (theParticle ==theADeuteron)
210 {
211  fRadiusEff = 1.38*std::pow(A, 0.21)+1.55/std::pow(A, 1./3.);
212 
213  if( (Z==1) && (A==2) ) fRadiusEff = 3.169; //fm
214  if( (Z==1) && (A==3) ) fRadiusEff = 3.066;
215  if( (Z==2) && (A==3) ) fRadiusEff = 3.066;
216  if( (Z==2) && (A==4) ) fRadiusEff = 2.498;
217  }
218 
219 //calculation of effective nuclear radius for AntiHe3 interaction (can be changed)
220 
221  if( (theParticle ==theAHe3) || (theParticle ==theATriton) )
222  {
223  fRadiusEff = 1.34 * std::pow(A, 0.21)+1.51/std::pow(A, 1./3.);
224 
225  if( (Z==1) && (A==2) ) fRadiusEff = 3.066; //fm
226  if( (Z==1) && (A==3) ) fRadiusEff = 2.973;
227  if( (Z==2) && (A==3) ) fRadiusEff = 2.973;
228  if( (Z==2) && (A==4) ) fRadiusEff = 2.508;
229 
230  }
231 
232 //calculation of effective nuclear radius for AntiAlpha interaction (can be changed)
233 
234  if (theParticle == theAAlpha)
235  {
236  fRadiusEff = 1.3*std::pow(A, 0.21)+1.05/std::pow(A, 1./3.);
237 
238  if( (Z==1) && (A==2) ) fRadiusEff = 2.498; //fm
239  if( (Z==1) && (A==3) ) fRadiusEff = 2.508;
240  if( (Z==2) && (A==3) ) fRadiusEff = 2.508;
241  if( (Z==2) && (A==4) ) fRadiusEff = 2.158;
242  }
243  G4double R2 = fRadiusEff*fRadiusEff;
244  G4double REf2 = R2+fRadiusNN2;
245  G4double ApAt= std::abs(theParticle->GetBaryonNumber()) * A;
246 
247  inelxsection = pi*REf2 *10* std::log(1+(ApAt*sigmaTotal/(pi*REf2*10.))); //mb
248  inelxsection = inelxsection * millibarn;
249  fInelasticXsc = inelxsection;
250  return fInelasticXsc;
251 }
252 
253 ///////////////////////////////////////////////////////////////////////////////
254 //
255 // Calculates Inelastic Anti-nucleus-Nucleus cross-section
256 //
258 (const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
259 {return GetInelasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
260 
261 
262 
263 ///////////////////////////////////////////////////////////////////////////////
264 //
265 // Calculates elastic Anti-nucleus-Nucleus cross-section as Total - Inelastic
266 //
268 (const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4double A)
269 {
270  fElasticXsc = GetTotalElementCrossSection(aParticle, kinEnergy, Z, A)-
271  GetInelasticElementCrossSection(aParticle, kinEnergy, Z, A);
272 
273  if (fElasticXsc < 0.) fElasticXsc = 0.;
274 
275  return fElasticXsc;
276 }
277 
278 ///////////////////////////////////////////////////////////////////////////////
279 //
280 // Calculates elastic Anti-nucleus-Nucleus cross-section
281 //
283 (const G4ParticleDefinition* aParticle, G4double kinEnergy, G4int Z, G4int A)
284 { return GetElasticElementCrossSection(aParticle, kinEnergy, Z, (G4double) A); }
285 
286 
287 ///////////////////////////////////////////////////////////////////////////////////
288 // Calculation of Antihadron - hadron Total Cross-section
289 
291 (const G4ParticleDefinition* aParticle, G4double kinEnergy)
292 {
293  G4double xsection, Pmass, Energy, momentum;
294  const G4ParticleDefinition* theParticle = aParticle;
295  Pmass=theParticle->GetPDGMass();
296  Energy=Pmass+kinEnergy;
297  momentum=std::sqrt(Energy*Energy-Pmass*Pmass)/std::abs(theParticle->GetBaryonNumber());
298  G4double Plab = momentum / GeV;
299 
300  G4double B, SigAss;
301  G4double C, d1, d2, d3 ;
302 
303  Elab = std::sqrt(Mn*Mn + Plab*Plab); // GeV
304  S = 2.*Mn*Mn + 2. *Mn*Elab; // GeV^2
305  SqrtS = std::sqrt(S); // GeV
306 
307  B = b0+b2*std::log(SqrtS/SqrtS0)*std::log(SqrtS/SqrtS0); //GeV^(-2)
308  SigAss = 36.04 +0.304*std::log(S/S0)*std::log(S/S0); //mb
309  R0 = std::sqrt(0.40874044*SigAss - B); //GeV^(-2)
310 
311  C = 13.55;
312  d1 = -4.47;
313  d2 = 12.38;
314  d3 = -12.43;
315  xsection = SigAss*(1 + 1./(std::sqrt(S-4.*Mn*Mn)) / (std::pow(R0, 3.))
316  *C* (1+d1/SqrtS+d2/(std::pow(SqrtS,2.))+d3/(std::pow(SqrtS,3.)) ));
317 
318 // xsection *= millibarn;
319 
320  fAntiHadronNucleonTotXsc = xsection;
321  return fAntiHadronNucleonTotXsc;
322 }
323 
324 
325 //
326 // /////////////////////////////////////////////////////////////////////////////////
327 // Calculation of Antihadron - hadron Elastic Cross-section
328 
331 {
332  G4double xsection;
333 
334  G4double SigAss;
335  G4double C, d1, d2, d3 ;
336 
337  GetAntiHadronNucleonTotCrSc(aParticle,kinEnergy);
338 
339  SigAss = 4.5 + 0.101*std::log(S/S0)*std::log(S/S0); //mb
340 
341  C = 59.27;
342  d1 = -6.95;
343  d2 = 23.54;
344  d3 = -25.34;
345 
346  xsection = SigAss* (1 + 1. / (std::sqrt(S-4.*Mn*Mn)) / (std::pow(R0, 3.))
347  *C* ( 1+d1/SqrtS+d2/(std::pow(SqrtS,2.))+d3/(std::pow(SqrtS,3.)) ));
348 
349 // xsection *= millibarn;
350 
351  fAntiHadronNucleonElXsc = xsection;
352  return fAntiHadronNucleonElXsc;
353 }
354 
356 {
357  outFile << "The G4ComponentAntiNuclNuclearXS calculates total,\n"
358  << "inelastic, elastic cross sections of anti-nucleons and light \n"
359  << "anti-nucleus interactions with nuclei using Glauber's approach.\n"
360  << "It uses parametrizations of antiproton-proton total and elastic \n"
361  << "cross sections and Wood-Saxon distribution of nuclear density.\n"
362  << "The lower limit is 10 MeV, the upper limit is 10 TeV. \n"
363  << "See details in Phys.Lett. B705 (2011) 235. \n";
364 }
static G4AntiHe3 * AntiHe3()
Definition: G4AntiHe3.cc:94
virtual G4double GetElasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
std::ofstream outFile
Definition: GammaRayTel.cc:68
static G4AntiDeuteron * AntiDeuteron()
virtual G4double GetInelasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
G4double GetAntiHadronNucleonElCrSc(const G4ParticleDefinition *aParticle, G4double kinEnergy)
static G4AntiAlpha * AntiAlpha()
Definition: G4AntiAlpha.cc:89
int G4int
Definition: G4Types.hh:78
int millibarn
Definition: hepunit.py:40
G4double GetAntiHadronNucleonTotCrSc(const G4ParticleDefinition *aParticle, G4double kinEnergy)
virtual void CrossSectionDescription(std::ostream &) const
static G4AntiProton * AntiProton()
Definition: G4AntiProton.cc:93
virtual G4double GetTotalElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A)
G4double GetPDGMass() const
virtual G4double GetTotalIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
virtual G4double GetInelasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)
double G4double
Definition: G4Types.hh:76
static G4AntiTriton * AntiTriton()
Definition: G4AntiTriton.cc:94
static G4AntiNeutron * AntiNeutron()
virtual G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A)