Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ComponentSAIDTotalXS.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//
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
40#include "G4PhysicsVector.hh"
42
43const 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
54 : G4VComponentCrossSection("xsSAID")
55{
56 for(G4int i=0; i<numberOfSaidXS; ++i) {
57 elastdata[i] = nullptr;
58 inelastdata[i] = nullptr;
59 }
60}
61
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
78 const G4ParticleDefinition* part,
80{
81 PrintWarning(part,0,Z,G4lrint(N),
82 "G4ComponentSAIDTotalXS::GetTotalElementCrossSection",
83 "Method is not implemented");
84 return 0.0;
85}
86
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
98 const G4ParticleDefinition* part,
100{
101 PrintWarning(part,0,Z,G4lrint(N),
102 "G4ComponentSAIDTotalXS::GetTotalElementCrossSection",
103 "Method is not implemented");
104 return 0.0;
105}
106
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
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
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
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
170void G4ComponentSAIDTotalXS::Description(std::ostream&) const
171{
172}
173
175G4ComponentSAIDTotalXS::GetType(const G4ParticleDefinition* prim,
176 const G4ParticleDefinition* sec,
177 G4int Z, G4int N)
178{
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
215void 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",
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
246void G4ComponentSAIDTotalXS::ReadData(G4int index,
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)) {
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
272void
273G4ComponentSAIDTotalXS::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}
G4SAIDCrossSectionType
@ numberOfSaidXS
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:85
#define G4MUTEXLOCK(mutex)
Definition: G4Threading.hh:251
#define G4MUTEXUNLOCK(mutex)
Definition: G4Threading.hh:254
std::mutex G4Mutex
Definition: G4Threading.hh:81
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
virtual G4double GetInelasticElementCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4double)
G4double GetChargeExchangeCrossSection(const G4ParticleDefinition *prim, const G4ParticleDefinition *sec, G4double kinEnergy, G4int, G4int)
virtual G4double GetInelasticIsotopeCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4int)
virtual G4double GetElasticElementCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4double)
virtual G4double GetTotalElementCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4double)
virtual void Description(std::ostream &) const final
virtual G4double GetTotalIsotopeCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4int)
virtual G4double GetElasticIsotopeCrossSection(const G4ParticleDefinition *, G4double kinEnergy, G4int, G4int)
const G4String & GetParticleName() const
virtual void ScaleVector(G4double factorE, G4double factorV)
virtual G4bool Retrieve(std::ifstream &fIn, G4bool ascii=false)
void SetSpline(G4bool)
Definition: inftrees.h:24
int G4lrint(double ad)
Definition: templates.hh:134