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
G4ComponentSAIDTotalXS.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4ComponentSAIDTotalXS.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: G4ComponentSAIDTotalXS
33
//
34
// Authors: G.Folger, V.Ivanchenko, D.Wright
35
//
36
// Modifications:
37
//
38
39
#include "
G4ComponentSAIDTotalXS.hh
"
40
#include "
G4PhysicsVector.hh
"
41
#include "
G4LPhysicsFreeVector.hh
"
42
43
const
G4String
G4ComponentSAIDTotalXS::fnames
[13] = {
44
""
,
"pp"
,
"np"
,
"pip"
,
"pim"
,
45
"pin"
,
"pie"
,
46
"gp_pi0p"
,
"gp_pi+n"
,
"gn_pi-p"
,
"gn_pi0n"
,
"gp_etap"
,
"gp_etapp"
47
};
48
49
#ifdef G4MULTITHREADED
50
G4Mutex
G4ComponentSAIDTotalXS::saidXSMutex =
G4MUTEX_INITIALIZER
;
51
#endif
52
53
G4ComponentSAIDTotalXS::G4ComponentSAIDTotalXS
()
54
:
G4VComponentCrossSection
(
"xsSAID"
)
55
{
56
for
(
G4int
i=0; i<
numberOfSaidXS
; ++i) {
57
elastdata
[i] =
nullptr
;
58
inelastdata
[i] =
nullptr
;
59
}
60
}
61
62
G4ComponentSAIDTotalXS::~G4ComponentSAIDTotalXS
()
63
{
64
for
(
G4int
i=0; i<
numberOfSaidXS
; ++i) {
65
if
(
elastdata
[i]) {
66
delete
elastdata
[i];
67
elastdata
[i] =
nullptr
;
68
}
69
if
(
inelastdata
[i]) {
70
delete
inelastdata
[i];
71
inelastdata
[i] =
nullptr
;
72
}
73
}
74
}
75
76
G4double
77
G4ComponentSAIDTotalXS::GetTotalElementCrossSection
(
78
const
G4ParticleDefinition
*
part
,
79
G4double
,
G4int
Z
,
G4double
N
)
80
{
81
PrintWarning
(part,0,Z,
G4lrint
(N),
82
"G4ComponentSAIDTotalXS::GetTotalElementCrossSection"
,
83
"Method is not implemented"
);
84
return
0.0;
85
}
86
87
G4double
88
G4ComponentSAIDTotalXS::GetTotalIsotopeCrossSection
(
89
const
G4ParticleDefinition
*
part
,
90
G4double
kinEnergy,
G4int
Z
,
G4int
N
)
91
{
92
return
GetInelasticIsotopeCrossSection
(part,kinEnergy,Z,N)
93
+
GetElasticIsotopeCrossSection
(part,kinEnergy,Z,N);
94
}
95
96
G4double
97
G4ComponentSAIDTotalXS::GetInelasticElementCrossSection
(
98
const
G4ParticleDefinition
*
part
,
99
G4double
,
G4int
Z
,
G4double
N
)
100
{
101
PrintWarning
(part,0,Z,
G4lrint
(N),
102
"G4ComponentSAIDTotalXS::GetTotalElementCrossSection"
,
103
"Method is not implemented"
);
104
return
0.0;
105
}
106
107
G4double
108
G4ComponentSAIDTotalXS::GetInelasticIsotopeCrossSection
(
109
const
G4ParticleDefinition
*
part
,
110
G4double
kinEnergy,
G4int
Z
,
G4int
N
)
111
{
112
G4double
cross
= 0.0;
113
G4SAIDCrossSectionType
tp
=
GetType
(part,0,Z,N);
114
if
(
saidUnknown
!= tp) {
115
G4int
idx
=
G4int
(tp);
116
if
(!
inelastdata
[idx]) {
Initialise
(tp); }
117
if
(
inelastdata
[idx]) {
118
cross = (
inelastdata
[
idx
])->Value(kinEnergy);
119
}
120
}
121
return
cross
;
122
}
123
124
G4double
125
G4ComponentSAIDTotalXS::GetElasticElementCrossSection
(
126
const
G4ParticleDefinition
*
part
,
127
G4double
,
G4int
Z
,
G4double
N
)
128
{
129
PrintWarning
(part,0,Z,
G4lrint
(N),
130
"G4ComponentSAIDTotalXS::GetTotalElementCrossSection"
,
131
"Method is not implemented"
);
132
return
0.0;
133
}
134
135
G4double
136
G4ComponentSAIDTotalXS::GetElasticIsotopeCrossSection
(
137
const
G4ParticleDefinition
*
part
,
138
G4double
kinEnergy,
G4int
Z
,
G4int
N
)
139
{
140
G4double
cross
= 0.0;
141
G4SAIDCrossSectionType
tp
=
GetType
(part,0,Z,N);
142
if
(
saidUnknown
!= tp) {
143
G4int
idx
=
G4int
(tp);
144
if
(!
elastdata
[idx]) {
Initialise
(tp); }
145
if
(
elastdata
[idx]) {
146
cross = (
elastdata
[
idx
])->Value(kinEnergy);
147
}
148
}
149
return
cross
;
150
}
151
152
G4double
153
G4ComponentSAIDTotalXS::GetChargeExchangeCrossSection
(
154
const
G4ParticleDefinition
* prim,
155
const
G4ParticleDefinition
* sec,
156
G4double
kinEnergy,
G4int
Z
,
G4int
N
)
157
{
158
G4double
cross
= 0.0;
159
G4SAIDCrossSectionType
tp
=
GetType
(prim,sec,Z,N);
160
if
(
saidUnknown
!= tp) {
161
G4int
idx
=
G4int
(tp);
162
if
(!
inelastdata
[idx]) {
Initialise
(tp); }
163
if
(
inelastdata
[idx]) {
164
cross = (
inelastdata
[
idx
])->Value(kinEnergy);
165
}
166
}
167
return
cross
;
168
}
169
170
void
G4ComponentSAIDTotalXS::Description
(std::ostream&)
const
171
{
172
}
173
174
G4SAIDCrossSectionType
175
G4ComponentSAIDTotalXS::GetType
(
const
G4ParticleDefinition
* prim,
176
const
G4ParticleDefinition
* sec,
177
G4int
Z
,
G4int
N
)
178
{
179
G4SAIDCrossSectionType
type =
saidUnknown
;
180
if
(1 == N && prim) {
181
G4int
code
= prim->
GetPDGEncoding
();
182
183
// only gamma + N x-sections available
184
if
(0 == Z && sec && 22 == code) {
185
G4int
code1 = sec->
GetPDGEncoding
();
186
if
(-211 == code1) { type =
saidGN_PINP
; }
187
else
if
(111 == code1) { type =
saidGN_PI0N
; }
188
189
// x-sections off proton
190
}
else
if
(1 == Z) {
191
if
(sec) {
192
G4int
code1 = sec->
GetPDGEncoding
();
193
if
(-211 == code) {
194
if
(111 == code1) { type =
saidPINP_PI0N
; }
195
else
if
(221 == code1) { type =
saidPINP_ETAN
; }
196
197
}
else
if
(22 == code) {
198
if
(111 == code1) { type =
saidGP_PI0P
; }
199
else
if
(211 == code1) { type =
saidGP_PIPN
; }
200
else
if
(221 == code1) { type =
saidGP_ETAP
; }
201
else
if
(331 == code1) { type =
saidGP_ETAPP
; }
202
}
203
}
else
{
204
if
(2212 == code) { type =
saidPP
; }
205
else
if
(2112 == code) { type =
saidNP
; }
206
else
if
(211 == code) { type =
saidPIPP
; }
207
else
if
(-211 == code) { type =
saidPINP
; }
208
}
209
}
210
}
211
//G4cout << "G4ComponentSAIDTotalXS::Type= " << type << G4endl;
212
return
type;
213
}
214
215
void
G4ComponentSAIDTotalXS::Initialise
(
G4SAIDCrossSectionType
tp
)
216
{
217
G4int
idx
=
G4int
(tp);
218
#ifdef G4MULTITHREADED
219
G4MUTEXLOCK
(&saidXSMutex);
220
if
(!
inelastdata
[idx]) {
221
#endif
222
// check environment variable
223
// Build the complete string identifying the file with the data set
224
char
* path = std::getenv(
"G4SAIDXSDATA"
);
225
if
(!path){
226
G4Exception
(
"G4ComponentSAIDTotalXS::Initialise(..)"
,
"had013"
,
227
FatalException
,
228
"Environment variable G4SAIDXSDATA is not defined"
);
229
return
;
230
}
231
if
(idx <= 4) {
232
elastdata
[
idx
] =
new
G4LPhysicsFreeVector
();
233
inelastdata
[
idx
] =
new
G4LPhysicsFreeVector
();
234
ReadData
(idx,
elastdata
[idx],path,
"_el.dat"
);
235
ReadData
(idx,
inelastdata
[idx],path,
"_in.dat"
);
236
}
else
{
237
inelastdata
[
idx
] =
new
G4LPhysicsFreeVector
();
238
ReadData
(idx,
inelastdata
[idx],path,
".dat"
);
239
}
240
#ifdef G4MULTITHREADED
241
}
242
G4MUTEXUNLOCK
(&saidXSMutex);
243
#endif
244
}
245
246
void
G4ComponentSAIDTotalXS::ReadData
(
G4int
index,
247
G4PhysicsVector
*
v
,
248
const
G4String
& ss1,
249
const
G4String
& ss2)
250
{
251
std::ostringstream ost;
252
ost << ss1 <<
"/"
<<
fnames
[index] << ss2;
253
std::ifstream filein(ost.str().c_str());
254
if
(!(filein)) {
255
G4ExceptionDescription
ed;
256
ed <<
"Data file <"
<< ost.str().c_str()
257
<<
"> is not opened!"
;
258
G4Exception
(
"G4ComponentSAIDTotalXS::ReadData(..)"
,
"had014"
,
259
FatalException
, ed,
"Check G4SAIDXSDATA"
);
260
}
else
{
261
if
(
GetVerboseLevel
() > 1) {
262
G4cout
<<
"File "
<< ost.str()
263
<<
" is opened by G4ComponentSAIDTotalXS"
<<
G4endl
;
264
}
265
// retrieve data from DB
266
v->
Retrieve
(filein,
true
);
267
v->
ScaleVector
(
CLHEP::MeV
,
CLHEP::millibarn
);
268
v->
SetSpline
(
true
);
269
}
270
}
271
272
void
273
G4ComponentSAIDTotalXS::PrintWarning
(
const
G4ParticleDefinition
* prim,
274
const
G4ParticleDefinition
* sec,
275
G4int
Z
,
G4int
N
,
276
const
G4String
& ss1,
277
const
G4String
& ss2)
278
{
279
G4cout
<< ss1 <<
": "
<< ss2 <<
G4endl
;
280
G4cout
<<
"For Z= "
<< Z <<
" N= "
<< N <<
" of "
;
281
if
(prim) {
G4cout
<< prim->
GetParticleName
() <<
" "
; }
282
if
(sec) {
G4cout
<<
" x-section to "
<< sec->
GetParticleName
(); }
283
G4cout
<<
G4endl
;
284
}
geant4
tree
geant4-10.6-release
source
processes
hadronic
cross_sections
src
G4ComponentSAIDTotalXS.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:37
using
1.8.2 with
ECCE GitHub integration