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
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....
58#include "Randomize.hh"
59#include "G4Proton.hh"
60#include "G4LossTableManager.hh"
61
62//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63
64
65using namespace std;
66
68 cosThetaMin(1.0),
69 cosThetaMax(-1.0),
70 alpha2(fine_structure_const*fine_structure_const)
71{
72 fNistManager = G4NistManager::Instance();
73 theProton = G4Proton::Proton();
74 particle=0;
75
76 G4double p0 = electron_mass_c2*classic_electr_radius;
77 coeff = twopi*p0*p0;
78
81 nucXSection =0;
82
83
84 chargeSquare = spin = mass =0;
86 tkin = mom2 = invbeta2=0;
87
89 ScreenRSquare=0.;
90
91 etag = ecut = 0.0;
92
93}
94//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
95
97{}
98//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
99
101 G4double CosThetaLim)
102{
103
104 SetupParticle(p);
105 nucXSection = 0.0;
106 tkin = targetZ = mom2 = DBL_MIN;
107 ecut = etag = DBL_MAX;
108 particle = p;
109
110
111 cosThetaMin = CosThetaLim;
112
113}
114//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
115
117 G4double cut,G4int iz )
118{
119 if(ekin != tkinLab || ecut != cut) {
120
121 // lab
122 tkinLab = ekin;
123 momLab2 = tkinLab*(tkinLab + 2.0*mass);
125
126 G4double etot = tkinLab + mass;
127 G4double ptot = sqrt(momLab2);
128 G4double m12 = mass*mass;
129
130 targetMass=fNistManager->GetAtomicMassAmu(iz)*amu_c2;
131
132 // relativistic reduced mass from publucation
133 // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
134
135 //incident particle & target nucleus
136 G4double Ecm=sqrt(m12 + targetMass*targetMass + 2.0*etot*targetMass);
137 G4double mu_rel=mass*targetMass/Ecm;
138 G4double momCM= ptot*targetMass/Ecm;
139 // relative system
140 mom2 = momCM*momCM;
141 invbeta2 = 1.0 + mu_rel*mu_rel/mom2;
142 tkin = momCM*sqrt(invbeta2) - mu_rel;//Ekin of mu_rel
143 //.........................................................
144
147
148 }
149
150}
151//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
152
153
155{
156 if(Z != targetZ || e != etag) {
157 etag = e;
158 targetZ = Z;
159 G4int iz= G4int(Z);
160
161 SetScreenRSquare(iz);
162 screenZ =0;
163 screenZ = ScreenRSquare/mom2;
164
165 // G4cout<< "heavycorr "<<heavycorr<<G4endl;
166
167 if(heavycorr!=0 && particle != theProton){
168 G4double corr=5.*twopi*Z*std::sqrt(chargeSquare*alpha2);
169 corr=std::pow(corr,0.12);
170 screenZ *=(1.13 + corr*3.76*Z*Z*chargeSquare*invbeta2*alpha2)/2.;
171// G4cout<<" heavycorr Z e corr....2As "<< heavycorr << "\t"
172// <<Z <<"\t"<<e/MeV <<"\t"<<screenZ<<G4endl;
173
174 }else{ screenZ *=(1.13 + 3.76*Z*Z*chargeSquare*invbeta2*alpha2)/2.;
175// G4cout<<" heavycorr Z e....2As "<< heavycorr << "\t"
176// <<Z <<"\t"<< e/MeV <<"\t" <<screenZ<<G4endl;
177 }
178
179 if(1 == iz && particle == theProton && cosTetMaxNuc < 0.0) {
180 cosTetMaxNuc = 0.0;
181 }
182
183 }
184}
185
186//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
187void G4IonCoulombCrossSection::SetScreenRSquare(G4int iz){
188
189 G4double a0 = electron_mass_c2/0.88534;
190
191 //target nucleus
192 G4double Z1=std::sqrt(chargeSquare);
193 G4double Z2=targetZ;
194
195 G4double Z1023=std::pow(Z1,0.23);
196 G4double Z2023=std::pow(Z2,0.23);
197
198 // Universal screening length
199 G4double x=a0*(Z1023+Z2023);
200
201 //for proton Thomas-Fermi screening length
202 if(particle == theProton){
203 x = a0*fNistManager->GetZ13(iz);
204 }
205 ScreenRSquare = alpha2*x*x;
206
207
208}
209//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
210
212{
213 // This method needs initialisation before be called
214
215 // scattering with target nucleus
217
218 nucXSection = 0.0;
219
220 G4double x = 1.0 - cosTetMinNuc;
221 G4double x1 = x + screenZ;
222
223 // scattering with nucleus
225
227 (x1*(1.0 - cosTetMaxNuc + screenZ));
228
229 }
230
231 return nucXSection;
232}
233
234//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
235
237{
238
239 if(cosTetMaxNuc >= cosTetMinNuc) return 0.0;
240
241 G4double x1 = 1. - cosTetMinNuc + screenZ;
242 G4double x2 = 1. - cosTetMaxNuc + screenZ;
244 G4double /*grej,*/ z1;
245
246 z1 = x1*x2/(x1 + G4UniformRand()*dx) - screenZ;
247 //grej = 1.0/(1.0 + z1);
248 return z1;
249}
250
251//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
252
253
254
255
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4UniformRand()
Definition: Randomize.hh:53
void Initialise(const G4ParticleDefinition *, G4double cosThetaLim)
void SetupTarget(G4double Z, G4double kinEnergy, G4int heavycorr)
void SetupKinematic(G4double kinEnergy, G4double cut, G4int iz)
const G4ParticleDefinition * particle
void SetupParticle(const G4ParticleDefinition *)
G4double GetZ13(G4double Z)
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
static G4Proton * Proton()
Definition: G4Proton.cc:93
#define DBL_MIN
Definition: templates.hh:75
#define DBL_MAX
Definition: templates.hh:83