Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ComponentGGNuclNuclXsc.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// 24.11.08 V. Grichine - first implementation
27//
28// 04.09.18 V. Ivantchenko Major revision of interfaces and implementation
29// 27.05.19 V. Ivantchenko Removed obsolete methods and members
30
32
34#include "G4SystemOfUnits.hh"
35#include "G4NucleiProperties.hh"
37#include "G4HadronNucleonXsc.hh"
39#include "G4NuclearRadii.hh"
40#include "G4Pow.hh"
41
42static const G4double inve = 1./CLHEP::eplus;
43
45 : G4VComponentCrossSection("Glauber-Gribov Nucl-nucl"),
46 fTotalXsc(0.0), fElasticXsc(0.0), fInelasticXsc(0.0), fProductionXsc(0.0),
47 fDiffractionXsc(0.0), fEnergy(0.0), fParticle(nullptr), fZ(0), fA(0)
48{
49 theProton = G4Proton::Proton();
50 theNeutron = G4Neutron::Neutron();
51 theLambda = G4Lambda::Lambda();
52 fHNXsc = new G4HadronNucleonXsc();
53 fHadrNucl = new G4ComponentGGHadronNucleusXsc();
54}
55
57{
58 delete fHNXsc;
59}
60
61//////////////////////////////////////////////////////////////////////
62
64 const G4ParticleDefinition* aParticle, G4double kinEnergy,
66{
67 ComputeCrossSections(aParticle, kinEnergy, Z, G4lrint(A));
68 return fTotalXsc;
69}
70
71////////////////////////////////////////////////////////////////////
72
74 const G4ParticleDefinition* aParticle, G4double kinEnergy,
75 G4int Z, G4int A)
76{
77 ComputeCrossSections(aParticle, kinEnergy, Z, A);
78 return fTotalXsc;
79}
80
81/////////////////////////////////////////////////////////////////////
82
84 const G4ParticleDefinition* aParticle, G4double kinEnergy,
86{
87 ComputeCrossSections(aParticle, kinEnergy, Z, G4lrint(A));
88 return fInelasticXsc;
89}
90
91////////////////////////////////////////////////////////////////////
92
94 const G4ParticleDefinition* aParticle, G4double kinEnergy,
95 G4int Z, G4int A)
96{
97 ComputeCrossSections(aParticle, kinEnergy, Z, A);
98 return fInelasticXsc;
99}
100
101//////////////////////////////////////////////////////////////////
102
104 const G4ParticleDefinition* aParticle, G4double kinEnergy,
105 G4int Z, G4double A)
106{
107 ComputeCrossSections(aParticle, kinEnergy, Z, G4lrint(A));
108 return fElasticXsc;
109}
110
111///////////////////////////////////////////////////////////////////
112
114 const G4ParticleDefinition* aParticle, G4double kinEnergy,
115 G4int Z, G4int A)
116{
117 ComputeCrossSections(aParticle, kinEnergy, Z, A);
118 return fElasticXsc;
119}
120
121////////////////////////////////////////////////////////////////
122
124 const G4ParticleDefinition* aParticle, G4double kinEnergy,
125 G4int Z, G4int A)
126{
127 ComputeCrossSections(aParticle, kinEnergy, Z, A);
128 return (fInelasticXsc > fProductionXsc)
129 ? (fInelasticXsc - fProductionXsc)/fInelasticXsc : 0.0;
130}
131
132//////////////////////////////////////////////////////////////////////
133
135{}
136
137//////////////////////////////////////////////////////////////////////
138
140{
141 G4cout << "G4ComponentGGNuclNuclXsc: uses Glauber-Gribov formula" << G4endl;
142}
143
144//////////////////////////////////////////////////////////////////////
145
146void G4ComponentGGNuclNuclXsc::Description(std::ostream& outFile) const
147{
148 outFile << "G4ComponentGGNuclNuclXsc calculates total, inelastic and\n"
149 << "elastic cross sections for nucleus-nucleus collisions using\n"
150 << "the Glauber model with Gribov corrections. It is valid for\n"
151 << "all incident energies above 100 keV./n"
152 << "For the hydrogen target G4HadronNucleonXsc class is used.\n";
153}
154
155///////////////////////////////////////////////////////////////////////////////
156//
157// Calculates total and inelastic Xsc, derives elastic as total - inelastic
158// accordong to Glauber model with Gribov correction calculated in the dipole
159// approximation on light cone. Gaussian density of point-like nucleons helps
160// to calculate rest integrals of the model. [1] B.Z. Kopeliovich,
161// nucl-th/0306044 + simplification above
162
163void G4ComponentGGNuclNuclXsc::ComputeCrossSections(
164 const G4ParticleDefinition* aParticle, G4double kinEnergy,
165 G4int Z, G4int A)
166{
167 // check cache
168 if(aParticle == fParticle && fZ == Z && fA == A && kinEnergy == fEnergy)
169 { return; }
170 fParticle = aParticle;
171 fZ = Z;
172 fA = A;
173 fEnergy = kinEnergy;
174 G4Pow* pG4Pow=G4Pow::GetInstance();
175
176 G4int pZ = G4lrint(aParticle->GetPDGCharge()*inve);
177 G4int pA = aParticle->GetBaryonNumber();
178 G4int pL = aParticle->GetNumberOfLambdasInHypernucleus();
179 G4bool pHN = aParticle->IsHypernucleus();
180 G4double cHN(0.88);
181
182 // hydrogen
183 if(1 == Z && 1 == A) {
184 G4double e = kinEnergy*CLHEP::proton_mass_c2/aParticle->GetPDGMass();
185 fHadrNucl->ComputeCrossSections( theProton, e, pZ, pA, pL );
186 fTotalXsc = fHadrNucl->GetTotalGlauberGribovXsc();
187 fElasticXsc = fHadrNucl->GetElasticGlauberGribovXsc();
188 fInelasticXsc = fHadrNucl->GetInelasticGlauberGribovXsc();
189 fProductionXsc = fHadrNucl->GetProductionGlauberGribovXsc();
190 fDiffractionXsc = fHadrNucl->GetDiffractionGlauberGribovXsc();
191 return;
192 }
193 static const G4double cofInelastic = 2.4;
194 static const G4double cofTotal = 2.0;
195
196 G4double pTkin = kinEnergy/(G4double)pA;
197
198 G4int pN = pA - pZ;
199 G4int tN = A - Z;
200
202 G4double pR = G4NuclearRadii::Radius(pZ, pA);
203
204 if(pHN) pR *= std::sqrt( pG4Pow->Z23( pA - pL ) + cHN*pG4Pow->Z23( pL ) )/pG4Pow->Z13(pA);
205
206 G4double cB = ComputeCoulombBarier(aParticle, kinEnergy, Z, A, pR, tR);
207
208 if ( cB > 0. )
209 {
210 G4double sigma = (pZ*Z+pN*tN)*fHNXsc->HadronNucleonXscNS(theProton, theProton, pTkin);
211 if(pHN) sigma += pL*A*fHNXsc->HadronNucleonXsc(theLambda, theProton, pTkin);
212 G4double ppInXsc = fHNXsc->GetInelasticHadronNucleonXsc();
213
214 sigma += (pZ*tN+pN*Z)*fHNXsc->HadronNucleonXscNS(theNeutron, theProton, pTkin);
215 G4double npInXsc = fHNXsc->GetInelasticHadronNucleonXsc();
216
217 // G4cout<<"ppInXsc = "<<ppInXsc/millibarn<<"; npInXsc = "<<npInXsc/millibarn<<G4endl;
218 // G4cout<<"npTotXsc = "<<fHNXsc->GetTotalHadronNucleonXsc()/millibarn<<"; npElXsc = "
219 // <<fHNXsc->GetElasticHadronNucleonXsc()/millibarn<<G4endl;
220
221 G4double nucleusSquare = cofTotal*CLHEP::pi*( pR*pR + tR*tR ); // basically 2piRR
222
223 G4double ratio= sigma/nucleusSquare;
224 fTotalXsc = nucleusSquare*G4Log( 1. + ratio )*cB;
225 fInelasticXsc = nucleusSquare*G4Log( 1. + cofInelastic*ratio )*cB/cofInelastic;
226 fElasticXsc = std::max(fTotalXsc - fInelasticXsc, 0.0);
227
228 G4double difratio = ratio/(1.+ratio);
229 fDiffractionXsc = 0.5*nucleusSquare*( difratio - G4Log( 1. + difratio ) );
230
231 G4double xratio= ((pZ*Z+pN*tN)*ppInXsc + (pZ*tN+pN*Z)*npInXsc)/nucleusSquare;
232 fProductionXsc = nucleusSquare*G4Log( 1. + cofInelastic*xratio)*cB/cofInelastic;
233 fProductionXsc = std::min(fProductionXsc, fInelasticXsc);
234 }
235 else
236 {
237 fInelasticXsc = 0.;
238 fTotalXsc = 0.;
239 fElasticXsc = 0.;
240 fProductionXsc = 0.;
241 fDiffractionXsc= 0.;
242 }
243}
244
245///////////////////////////////////////////////////////////////////////////////
246
248 const G4ParticleDefinition* aParticle,
249 G4double pTkin, G4int Z, G4int A,
250 G4double pR, G4double tR)
251{
252 G4int pZ = aParticle->GetPDGCharge()*inve;
253 G4double pM = aParticle->GetPDGMass();
255 G4double pElab = pTkin + pM;
256 G4double totEcm = std::sqrt(pM*pM + tM*tM + 2.*pElab*tM);
257 G4double totTcm = totEcm - pM -tM;
258
259 static const G4double qfact = CLHEP::fine_structure_const*CLHEP::hbarc;
260 G4double bC = qfact*pZ*Z*0.5/(pR + tR);
261
262 G4double ratio = (totTcm <= bC ) ? 0. : 1. - bC/totTcm;
263 // G4cout<<"G4ComponentGGNuclNuclXsc::ComputeCoulombBarier= "<<ratio
264 // <<"; pTkin(GeV)= " <<pTkin/GeV<<";
265 // " pPlab = "<<pPlab/GeV<<"; bC = "<<bC/GeV<<"; pTcm = "
266 // <<pTcm/GeV<<G4endl;
267 return ratio;
268}
269
270//////////////////////////////////////////////////////////////////////////
271//
272// Return single-diffraction/inelastic cross-section ratio
273
275 const G4DynamicParticle* aParticle, G4double tA, G4double tZ)
276{
277 ComputeCrossSections(aParticle->GetDefinition(),
278 aParticle->GetKineticEnergy(),
279 G4lrint(tZ), G4lrint(tA));
280
281 return (fInelasticXsc > 0.0) ? fDiffractionXsc/fInelasticXsc : 0.0;
282}
283
284//////////////////////////////////////////////////////////////////////////
285//
286// Return quasi-elastic/inelastic cross-section ratio
287
289 const G4DynamicParticle* aParticle, G4double tA, G4double tZ)
290{
291 ComputeCrossSections(aParticle->GetDefinition(),
292 aParticle->GetKineticEnergy(),
293 G4lrint(tZ), G4lrint(tA));
294
295 return (fInelasticXsc > 0.0) ? 1.0 - fProductionXsc/fInelasticXsc : 0.0;
296}
297
298///////////////////////////////////////////////////////////////////////////////
G4double G4Log(G4double x)
Definition: G4Log.hh:227
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
void ComputeCrossSections(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A, G4int nL=0)
G4double GetTotalElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A) final
G4double ComputeQuasiElasticRatio(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A) final
G4double GetRatioQE(const G4DynamicParticle *, G4double At, G4double Zt)
G4double GetElasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A) final
G4double GetRatioSD(const G4DynamicParticle *, G4double At, G4double Zt)
void DumpPhysicsTable(const G4ParticleDefinition &) final
G4double GetInelasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A) final
G4double ComputeCoulombBarier(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A, G4double pR, G4double tR)
G4double GetTotalIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A) final
void Description(std::ostream &) const final
G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4int A) final
void BuildPhysicsTable(const G4ParticleDefinition &) final
G4double GetInelasticElementCrossSection(const G4ParticleDefinition *aParticle, G4double kinEnergy, G4int Z, G4double A) final
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4double HadronNucleonXsc(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
G4double GetInelasticHadronNucleonXsc() const
G4double HadronNucleonXscNS(const G4ParticleDefinition *theParticle, const G4ParticleDefinition *nucleon, G4double ekin)
static G4Lambda * Lambda()
Definition: G4Lambda.cc:107
static G4Neutron * Neutron()
Definition: G4Neutron.cc:103
static G4double Radius(G4int Z, G4int A)
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double GetPDGCharge() const
G4int GetNumberOfLambdasInHypernucleus() const
G4bool IsHypernucleus() const
Definition: G4Pow.hh:49
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double Z13(G4int Z) const
Definition: G4Pow.hh:123
G4double Z23(G4int Z) const
Definition: G4Pow.hh:125
static G4Proton * Proton()
Definition: G4Proton.cc:92
int G4lrint(double ad)
Definition: templates.hh:134