Geant4
9.6.p02
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
geant4_9_6_p02
source
processes
electromagnetic
standard
src
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
#include "
G4IonCoulombCrossSection.hh
"
57
#include "
G4PhysicalConstants.hh
"
58
#include "
Randomize.hh
"
59
#include "
G4Proton.hh
"
60
#include "
G4LossTableManager.hh
"
61
62
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63
64
65
using namespace
std;
66
67
G4IonCoulombCrossSection::G4IonCoulombCrossSection
():
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
79
cosTetMinNuc
=0;
80
cosTetMaxNuc
=0;
81
nucXSection
=0;
82
83
84
chargeSquare
=
spin
=
mass
=0;
85
tkinLab
=
momLab2
=
invbetaLab2
=0;
86
tkin
=
mom2
=
invbeta2
=0;
87
88
targetZ
=
targetMass
=
screenZ
=0;
89
ScreenRSquare=0.;
90
91
etag
=
ecut
= 0.0;
92
93
}
94
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
95
96
G4IonCoulombCrossSection::~G4IonCoulombCrossSection
()
97
{}
98
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
99
100
void
G4IonCoulombCrossSection::Initialise
(
const
G4ParticleDefinition
*
p
,
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
116
void
G4IonCoulombCrossSection::SetupKinematic
(
G4double
ekin,
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
);
124
invbetaLab2
= 1.0 +
mass
*
mass
/
momLab2
;
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
145
cosTetMinNuc
=
cosThetaMin
;
146
cosTetMaxNuc
=
cosThetaMax
;
147
148
}
149
150
}
151
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
152
153
154
void
G4IonCoulombCrossSection::SetupTarget
(
G4double
Z
,
G4double
e
,
G4int
heavycorr)
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....
187
void
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
211
G4double
G4IonCoulombCrossSection::NuclearCrossSection
()
212
{
213
// This method needs initialisation before be called
214
215
// scattering with target nucleus
216
G4double
fac =
coeff
*
targetZ
*
targetZ
*
chargeSquare
*
invbeta2
/
mom2
;
217
218
nucXSection
= 0.0;
219
220
G4double
x = 1.0 -
cosTetMinNuc
;
221
G4double
x1
= x +
screenZ
;
222
223
// scattering with nucleus
224
if
(
cosTetMaxNuc
<
cosTetMinNuc
) {
225
226
nucXSection
=fac*(
cosTetMinNuc
-
cosTetMaxNuc
)/
227
(x1*(1.0 -
cosTetMaxNuc
+ screenZ));
228
229
}
230
231
return
nucXSection
;
232
}
233
234
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
235
236
G4double
G4IonCoulombCrossSection::SampleCosineTheta
()
237
{
238
239
if
(
cosTetMaxNuc
>=
cosTetMinNuc
)
return
0.0;
240
241
G4double
x1
= 1. -
cosTetMinNuc
+
screenZ
;
242
G4double
x2
= 1. -
cosTetMaxNuc
+
screenZ
;
243
G4double
dx =
cosTetMinNuc
-
cosTetMaxNuc
;
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
Generated on Sat May 25 2013 14:33:37 for Geant4 by
1.8.4