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
G4IonCoulombCrossSection.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// G4IonCoulombCrossSection.cc
27//-------------------------------------------------------------------
28//
29// GEANT4 Class header file
30//
31// File name: G4IonCoulombCrossSection
32//
33// Author: Cristina Consolandi
34//
35// Creation date: 05.10.2010 from G4eCoulombScatteringModel
36//
37// Class Description:
38// Computation of Screen-Coulomb Cross Section
39// for protons, alpha and heavy Ions
40//
41//
42// Reference:
43// M.J. Boschini et al. "Nuclear and Non-Ionizing Energy-Loss
44// for Coulomb Scattered Particles from Low Energy up to Relativistic
45// Regime in Space Radiation Environment"
46// Accepted for publication in the Proceedings of the ICATPP Conference
47// on Cosmic Rays for Particle and Astroparticle Physics, Villa Olmo, 7-8
48// October, 2010, to be published by World Scientific (Singapore).
49//
50// Available for downloading at:
51// http://arxiv.org/abs/1011.4822
52//
53// -------------------------------------------------------------------
54//
55//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
56
59#include "Randomize.hh"
60#include "G4Proton.hh"
61#include "G4Exp.hh"
62#include "G4Log.hh"
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
65
66using namespace std;
67
68const G4double a0 = CLHEP::electron_mass_c2/0.88534;
69
71 cosThetaMin(1.0),
72 cosThetaMax(-1.0),
73 alpha2(fine_structure_const*fine_structure_const)
74{
75 fNistManager = G4NistManager::Instance();
76 fG4pow = G4Pow::GetInstance();
77 theProton = G4Proton::Proton();
78 particle = nullptr;
79
80 G4double p0 = electron_mass_c2*classic_electr_radius;
81 coeff = twopi*p0*p0;
82
83 cosTetMinNuc=0;
84 cosTetMaxNuc=0;
85 nucXSection =0;
86
87 chargeSquare = spin = mass = 0.0;
88 tkinLab = momLab2 = invbetaLab2 = tkin = mom2 = invbeta2 = 0.0;
89
90 targetZ = targetMass = screenZ = ScreenRSquare = etag = 0.0;
91}
92
93//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
94
96 G4double CosThetaLim)
97{
99 nucXSection = tkin = targetZ = mom2 = 0.0;
100 etag = DBL_MAX;
101 particle = p;
102 cosThetaMin = CosThetaLim;
103}
104
105//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
106
108{
109 if(ekin != tkinLab || tmass != targetMass) {
110
111 // lab
112 tkinLab = ekin;
113 momLab2 = tkinLab*(tkinLab + 2.0*mass);
114 invbetaLab2 = 1.0 + mass*mass/momLab2;
115
116 G4double etot = tkinLab + mass;
117 G4double ptot = sqrt(momLab2);
118 G4double m12 = mass*mass;
119 // relativistic reduced mass from publucation
120 // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
121
122 //incident particle & target nucleus
123 targetMass = tmass;
124 G4double Ecm=sqrt(m12 + targetMass*targetMass + 2.0*etot*targetMass);
125 G4double mu_rel=mass*targetMass/Ecm;
126 G4double momCM= ptot*targetMass/Ecm;
127 // relative system
128 mom2 = momCM*momCM;
129 invbeta2 = 1.0 + mu_rel*mu_rel/mom2;
130 tkin = momCM*sqrt(invbeta2) - mu_rel;//Ekin of mu_rel
131
132 cosTetMinNuc = cosThetaMin;
133 cosTetMaxNuc = cosThetaMax;
134 }
135}
136
137//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
138
140 G4int)
141{
142 if(Z != targetZ || e != etag) {
143 etag = e;
144 targetZ = Z;
145 G4int iz= G4lrint(Z);
146
147 SetScreenRSquare(iz);
148 screenZ = 0;
149 screenZ = ScreenRSquare/mom2;
150 //heavycorr = 0;
151 // G4cout<< "heavycorr "<<heavycorr<<G4endl;
152
153 G4double corr=5.*twopi*Z*std::sqrt(chargeSquare*alpha2);
154 corr=G4Exp(G4Log(corr)*0.04);
155 screenZ *=0.5*(1.13 + corr*3.76*Z*Z*chargeSquare*invbeta2*alpha2);
156 // G4cout<<" heavycorr Z e corr....2As "<< heavycorr << "\t"
157 // <<Z <<"\t"<<e/MeV <<"\t"<<screenZ<<G4endl;
158
159 if(1 == iz && particle == theProton && cosTetMaxNuc < 0.0) {
160 cosTetMaxNuc = 0.0;
161 }
162 }
163}
164
165//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
166
167void G4IonCoulombCrossSection::SetScreenRSquare(G4int iz)
168{
169 //for proton Thomas-Fermi screening length
170 G4int Z1 = G4lrint(std::sqrt(chargeSquare));
171 G4double Z113 = fG4pow->Z13(iz);
172 G4double Z1023 = fG4pow->powZ(Z1,0.23);
173 G4double Z2023 = fG4pow->powZ(iz,0.23);
174 G4double x=a0*(Z1023+Z2023);
175
176 // Universal screening length
177 if(particle == theProton){
178 x = a0*Z113;
179 }
180
181 ScreenRSquare = alpha2*x*x;
182}
183
184//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
185
187{
188 // This method needs initialisation before be called
189 // scattering with target nucleus
190 G4double fac = coeff*targetZ*(targetZ)*chargeSquare*invbeta2/mom2;
191
192 nucXSection = 0.0;
193
194 G4double x = 1.0 - cosTetMinNuc;
195 G4double x1 = x + screenZ;
196
197 // scattering with nucleus
198 if(cosTetMaxNuc < cosTetMinNuc) {
199 nucXSection = fac*(cosTetMinNuc - cosTetMaxNuc)/
200 (x1*(1.0 - cosTetMaxNuc + screenZ));
201 }
202
203 return nucXSection;
204}
205
206//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
207
209{
210 G4double z1 = 0.0;
211 if(cosTetMaxNuc < cosTetMinNuc) {
212
213 G4double x1 = 1. - cosTetMinNuc + screenZ;
214 G4double x2 = 1. - cosTetMaxNuc + screenZ;
215 G4double dx = cosTetMinNuc - cosTetMaxNuc;
216 z1 = x1*x2/(x1 + G4UniformRand()*dx) - screenZ;
217 }
218 return z1;
219}
220
221//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
222
223
224
225
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
const G4double a0
G4double G4Log(G4double x)
Definition: G4Log.hh:227
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double alpha2
#define G4UniformRand()
Definition: Randomize.hh:52
void Initialise(const G4ParticleDefinition *, G4double cosThetaLim)
void SetupTarget(G4double Z, G4double kinEnergy, G4int heavycorr)
void SetupKinematic(G4double kinEnergy, G4double tmass)
void SetupParticle(const G4ParticleDefinition *)
static G4NistManager * Instance()
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powZ(G4int Z, G4double y) const
Definition: G4Pow.hh:225
G4double Z13(G4int Z) const
Definition: G4Pow.hh:123
static G4Proton * Proton()
Definition: G4Proton.cc:92
int G4lrint(double ad)
Definition: templates.hh:134
#define DBL_MAX
Definition: templates.hh:62