ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
G4CoulombScattering.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4CoulombScattering.cc
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
//
27
// -------------------------------------------------------------------
28
//
29
// GEANT4 Class file
30
//
31
//
32
// File name: G4CoulombScattering
33
//
34
// Author: Vladimir Ivanchenko
35
//
36
// Creation date: 22.08.2004
37
//
38
// Modifications:
39
// 01.08.06 V.Ivanchenko add choice between G4eCoulombScatteringModel and
40
// G4CoulombScatteringModel
41
//
42
43
//
44
// -------------------------------------------------------------------
45
//
46
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
47
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
48
49
#include "
G4CoulombScattering.hh
"
50
#include "
G4SystemOfUnits.hh
"
51
#include "
G4eCoulombScatteringModel.hh
"
52
#include "
G4IonCoulombScatteringModel.hh
"
53
#include "
G4Proton.hh
"
54
#include "
G4EmParameters.hh
"
55
56
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
57
58
using namespace
std;
59
60
G4CoulombScattering::G4CoulombScattering
(
const
G4String
&
name
)
61
:
G4VEmProcess
(name),q2Max(
TeV
*
TeV
),isInitialised(
false
)
62
{
63
// G4cout << "G4CoulombScattering constructor "<< G4endl;
64
SetBuildTableFlag
(
true
);
65
SetStartFromNullFlag
(
false
);
66
SetIntegral
(
true
);
67
SetSecondaryParticle
(
G4Proton::Proton
());
68
SetProcessSubType
(
fCoulombScattering
);
69
}
70
71
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
72
73
G4CoulombScattering::~G4CoulombScattering
()
74
{}
75
76
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
77
78
G4bool
G4CoulombScattering::IsApplicable
(
const
G4ParticleDefinition
&
p
)
79
{
80
return
(p.
GetPDGCharge
() != 0.0 && !p.
IsShortLived
());
81
}
82
83
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
84
85
void
G4CoulombScattering::InitialiseProcess
(
const
G4ParticleDefinition
*
p
)
86
{
87
// second initialisation not allowed for the time being
88
// this means that polar angle limit change will not be appled
89
// after first initialisation
90
if
(
isInitialised
) {
return
; }
91
92
G4EmParameters
* param =
G4EmParameters::Instance
();
93
G4double
a
= param->
FactorForAngleLimit
()*
CLHEP::hbarc
/
CLHEP::fermi
;
94
q2Max
= 0.5*a*
a
;
95
G4double
theta
= param->
MscThetaLimit
();
96
97
// restricted or non-restricted cross section table
98
G4bool
yes =
false
;
99
if
(theta ==
CLHEP::pi
) { yes =
true
; }
100
SetStartFromNullFlag
(yes);
101
/*
102
G4cout << "### G4CoulombScattering::InitialiseProcess: "
103
<< p->GetParticleName()
104
<< " Emin(MeV)= " << MinKinEnergy()/MeV
105
<< " Emax(TeV)= " << MaxKinEnergy()/TeV
106
<< " nbins= " << LambdaBinning()
107
<< " theta= " << theta
108
<< G4endl;
109
*/
110
111
isInitialised
=
true
;
112
G4double
mass
= p->
GetPDGMass
();
113
G4String
name
= p->
GetParticleName
();
114
//G4cout << name << " type: " << p->GetParticleType()
115
//<< " mass= " << mass << G4endl;
116
yes =
true
;
117
if
(mass >
GeV
|| p->
GetParticleType
() ==
"nucleus"
) {
118
SetBuildTableFlag
(
false
);
119
yes =
false
;
120
if
(name !=
"GenericIon"
) {
SetVerboseLevel
(0); }
121
}
else
{
122
if
(name !=
"e-"
&& name !=
"e+"
&&
123
name !=
"mu+"
&& name !=
"mu-"
&& name !=
"pi+"
&&
124
name !=
"kaon+"
&& name !=
"proton"
) {
SetVerboseLevel
(0); }
125
}
126
127
if
(!
EmModel
(0)) {
128
if
(yes) {
SetEmModel
(
new
G4eCoulombScatteringModel
()); }
129
else
{
SetEmModel
(
new
G4IonCoulombScatteringModel
()); }
130
}
131
G4VEmModel
*
model
=
EmModel
(0);
132
G4double
emin
=
std::max
(param->
MinKinEnergy
(),model->
LowEnergyLimit
());
133
G4double
emax
=
std::min
(param->
MaxKinEnergy
(),model->
HighEnergyLimit
());
134
model->
SetPolarAngleLimit
(theta);
135
model->
SetLowEnergyLimit
(emin);
136
model->
SetHighEnergyLimit
(emax);
137
AddEmModel
(1, model);
138
}
139
140
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
141
142
G4double
G4CoulombScattering::MinPrimaryEnergy
(
const
G4ParticleDefinition
*
part
,
143
const
G4Material
*
mat
)
144
{
145
// Pure Coulomb scattering
146
G4double
emin
= 0.0;
147
148
// Coulomb scattering combined with multiple or hadronic scattering
149
G4double
theta
=
G4EmParameters::Instance
()->
MscThetaLimit
();
150
151
if
(0.0 < theta) {
152
G4double
p2 =
q2Max
*mat->
GetIonisation
()->
GetInvA23
()/(1.0 - cos(theta));
153
G4double
mass
= part->
GetPDGMass
();
154
emin = sqrt(p2 + mass*mass) -
mass
;
155
}
156
157
return
emin
;
158
}
159
160
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
161
162
void
G4CoulombScattering::StreamProcessInfo
(std::ostream& outFile)
const
163
{
164
G4double
tetmin =
G4EmParameters::Instance
()->
MscThetaLimit
()/
degree
;
165
outFile <<
" "
;
166
if
(tetmin > 179.) { outFile <<
"ThetaMin(p)"
; }
167
else
{ outFile << tetmin; }
168
outFile <<
" < Theta(degree) < 180"
;
169
170
if
(
q2Max
<
DBL_MAX
) { outFile <<
"; pLimit(GeV^1)= "
<< sqrt(
q2Max
)/
GeV
; }
171
outFile <<
G4endl
;
172
}
173
174
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
175
176
void
G4CoulombScattering::ProcessDescription
(std::ostream& out)
const
177
{
178
out <<
179
" Coulomb scattering. Simulation of elastic scattering\n"
<<
180
" events individually. May be used in combination with multiple\n"
<<
181
" scattering, where Coulomb scattering is used for hard (large angle)\n"
<<
182
" collisions and multiple scattering for soft collisions."
;
183
G4VEmProcess::ProcessDescription
(out);
184
}
185
186
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
geant4
tree
geant4-10.6-release
source
processes
electromagnetic
standard
src
G4CoulombScattering.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:34
using
1.8.2 with
ECCE GitHub integration