Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ParticleHPNames.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// neutron_hp -- source file
27// J.P. Wellisch, Nov-1996
28// A prototype of the low energy neutron transport model.
29//
30// 24-Jan-07 Enable to use exact data only and add warnig when substitute file is used T. Koi
31// 30-Jan-07 Modified method of searching substitute isotope data by T. Koi
32// 07-06-12 fix memory leaking by T. Koi
33// 07-06-25 Change data selection logic when G4NEUTRONHP_SKIP_MISSING_ISOTOPES is turn on
34// Natural Abundance data are allowed. by T. Koi
35// 07-07-06 Allow _nat_ final state even for isotoped cross sections by T. Koi
36// 08-09-01 Add protection that deuteron data do not selected for hydrogen and so on by T. Koi
37//
38// P. Arce, June-2014 Conversion neutron_hp to particle_hp
39// June-2019 - E. Mendoza --> Modification to allow using an incomplete data library if the
40// G4NEUTRONHP_SKIP_MISSING_ISOTOPES environmental flag is defined. The missing XS are set to 0.
41// Oct-2019 - E. Mendoza --> remove restriction of using isotopes with Z>92
42//
43// V. Ivanchenko, July-2023 Basic revision of particle HP classes
44
45#include "G4ParticleHPNames.hh"
46
50#include "G4SandiaTable.hh"
51#include "G4ios.hh"
52
53#include <fstream>
54
55const G4String G4ParticleHPNames::theString[100] = {
56 "Hydrogen", "Helium", "Lithium", "Berylium", "Boron", "Carbon",
57 "Nitrogen", "Oxygen", "Fluorine", "Neon", "Sodium", "Magnesium",
58 "Aluminum", "Silicon", "Phosphorous", "Sulfur", "Chlorine", "Argon",
59 "Potassium", "Calcium", "Scandium", "Titanium", "Vanadium", "Chromium",
60 "Manganese", "Iron", "Cobalt", "Nickel", "Copper", "Zinc",
61 "Gallium", "Germanium", "Arsenic", "Selenium", "Bromine", "Krypton",
62 "Rubidium", "Strontium", "Yttrium", "Zirconium", "Niobium", "Molybdenum",
63 "Technetium", "Ruthenium", "Rhodium", "Palladium", "Silver", "Cadmium",
64 "Indium", "Tin", "Antimony", "Tellurium", "Iodine", "Xenon",
65 "Cesium", "Barium", "Lanthanum", "Cerium", "Praseodymium", "Neodymium",
66 "Promethium", "Samarium", "Europium", "Gadolinium", "Terbium", "Dysprosium",
67 "Holmium", "Erbium", "Thulium", "Ytterbium", "Lutetium", "Hafnium",
68 "Tantalum", "Tungsten", "Rhenium", "Osmium", "Iridium", "Platinium",
69 "Gold", "Mercury", "Thallium", "Lead", "Bismuth", "Polonium",
70 "Astatine", "Radon", "Francium", "Radium", "Actinium", "Thorium",
71 "Protactinium", "Uranium", "Neptunium", "Plutonium", "Americium", "Curium",
72 "Berkelium", "Californium", "Einsteinium", "Fermium"};
73
74G4ParticleHPNames::G4ParticleHPNames(G4int maxOffSet) : theMaxOffSet(maxOffSet)
75{
77}
78
80{
81 return (i > 0 && i < 100) ? theString[i] : G4String("");
82}
83
85{
86 const char theDigits[11] = "0123456789";
87 G4String result;
88 G4int digit;
89 do {
90 digit = current - 10 * (current / 10);
91 result = theDigits[digit] + result;
92 current /= 10;
93 } while (current != 0); // Loop checking, 11.05.2015, T. Koi
94 return result;
95}
96
98 const G4String& rest, G4bool& aFlag)
99{
100 // G4cout << Z << " " << A << " " << M << " " << base << " " << rest << G4endl;
101
102 // Excited isomer indicator
103 std::stringstream ss;
104 G4String sM;
105 if (M > 0) {
106 ss << "m";
107 ss << M;
108 ss >> sM;
109 ss.clear();
110 }
111
113 aFlag = true;
114
115#ifdef G4VERBOSE
116 if (fManager->GetDEBUG())
117 G4cout << "Names::GetName entered for Z = " << Z << ", A = " << A << G4endl;
118#endif
119
120 G4int myA = A;
121 G4int myZ = Z;
122
123 G4String* theName = nullptr;
124 G4String theFileName("");
125
126 // G4int inc = 1;
127
128 G4int flip_Z = 1;
129 G4int delta_Z = 0;
130
131 G4int flip_A = 1;
132 G4int delta_A = 0;
133
134 std::istringstream* check = nullptr;
135 G4bool first = true;
136
137#ifdef G4VERBOSE
138 if (fManager->GetDEBUG())
139 G4cout << "entered GetName!!!" << G4endl;
140#endif
141
142 do {
143 aFlag = true;
144 auto biff = new G4String(); // delete here as theName
145 *biff = base + "/CrossSection/" + itoa(myZ) + "_" + itoa(myA) + sM + "_" + theString[myZ - 1];
146
147 delete theName;
148 theName = biff;
149 result.SetName(*theName);
150 result.SetA(myA);
151 result.SetZ(myZ);
152 result.SetM(M);
153 delete check;
154
155 check = new std::istringstream(std::ios::in);
156 fManager->GetDataStream2(*theName, *check);
157 if (!(*check)) {
158 delete check;
159 check = nullptr;
160 aFlag = false;
161 if (first) {
162 aFlag = true;
163 first = false;
164 biff = new G4String(); // delete here as theName
165 *biff = base + "/CrossSection/" + itoa(myZ) + "_" + "nat" + "_" + theString[myZ - 1];
166 delete theName;
167 theName = biff;
168 result.SetName(*theName);
169 G4double natA = myZ / G4SandiaTable::GetZtoA(myZ);
170 result.SetA(natA);
171 result.SetZ(myZ);
172 result.SetM(M);
173 // check = new std::ifstream(*theName);
174 check = new std::istringstream(std::ios::in);
175 fManager->GetDataStream2(*theName, *check);
176 if (!(*check)) {
177 // check->close();
178 delete check;
179 check = nullptr;
180 aFlag = false;
181 }
182 else {
183 biff = new G4String(); // delete here as theName
184 *biff = base + "/" + rest + "/" + itoa(myZ) + "_" + "nat" + "_" + theString[myZ - 1];
185 if (rest == "/CrossSection")
186 *biff = base + rest + "/" + itoa(myZ) + "_" + "nat" + "_" + theString[myZ - 1];
187 delete theName;
188 theName = biff;
189 result.SetName(*theName);
190 natA = myZ / G4SandiaTable::GetZtoA(myZ);
191 result.SetA(natA);
192 result.SetZ(myZ);
193 result.SetM(M);
195 }
196 }
197 }
198 else {
199 G4double tmpA = myA;
200 std::istringstream* file = nullptr;
201 G4String fileName;
202
203 if (rest == "/CrossSection") {
204 fileName = base + rest + "/" + itoa(myZ) + "_" + itoa(myA) + sM + "_" + theString[myZ - 1];
205 // if(fManager->GetDEBUG()) G4cout <<"HPWD 4a "<<*theName<<G4endl;
206 }
207 else {
208 // For FS
209 fileName =
210 base + "/" + rest + "/" + itoa(myZ) + "_" + itoa(myA) + sM + "_" + theString[myZ - 1];
211 file = new std::istringstream(std::ios::in);
212 fManager->GetDataStream2(fileName, *file);
213
214 if (*file) {
215 // isotope FS
216 // if(fManager->GetDEBUG()) G4cout <<"HPWD 4b1 "<<*theName<<G4endl;
217 }
218 else {
219 // _nat_ FS
220 fileName = base + "/" + rest + "/" + itoa(myZ) + "_" + "nat" + "_" + theString[myZ - 1];
221
222 delete file;
223 file = new std::istringstream(std::ios::in);
225 if (*file) {
226 // FS neither isotope nor _nat_
227 // if(fManager->GetDEBUG()) G4cout <<"HPWD 4b2a "<<*theName<<G4endl;
228 G4double natA = myZ / G4SandiaTable::GetZtoA(myZ);
229 tmpA = natA;
230 }
231 else {
232 // if(fManager->GetDEBUG()) G4cout <<"HPWD 4b2c "<<*theName<<G4endl;
233 fileName = "INVALID";
234 }
235 }
236 delete file;
237 }
238
239 result.SetName(fileName);
240 result.SetA(tmpA);
241 result.SetZ(myZ);
242 result.SetM(M);
243 }
244
245 do {
246 if (delta_Z > theMaxOffSet) {
247 if (!fManager->GetSkipMissingIsotopes()) {
248#ifdef G4VERBOSE
249 if (fManager->GetVerboseLevel() > 0) {
250 G4cout << "G4ParticleHPNames: There are no data available for some isotopes in this "
251 "material "
252 << G4endl;
253 G4cout << "G4ParticleHPNames: nor are there data for nearby isotopes." << G4endl;
254 G4cout << "G4ParticleHPNames: Please make sure G4NEUTRONHPDATA points to the directory "
255 << G4endl;
256 G4cout << "G4ParticleHPNames: in which the neutron scattering data are located."
257 << G4endl;
258 G4cout << "G4ParticleHPNames: The material was A = " << A << ", Z = " << Z << G4endl;
259 }
260#endif
262 ed << "Data for Z=" << Z << " A=" << A << " M=" << M << " does not exist in G4NEUTRONHPDATA";
263 G4Exception("G4ParticleHPName::Init(...)","hadhp01",
264 JustWarning, ed, "");
265 }
266 check = new std::istringstream(std::ios::in);
267 break;
268 }
269 if (delta_A > 2 * theMaxOffSet) {
270 delta_A = 0;
271 flip_A = 1;
272
273 first = true;
274
275 if (flip_Z > 0) {
276 delta_Z += 1;
277 }
278 myZ = Z + flip_Z * delta_Z;
279 flip_Z *= -1;
280
281 myA = A;
282 if (myZ > 100) {
283 myZ = 100;
284 }
285 if (myZ < 1) {
286 myZ = 1;
287 }
288
289 // myZ += inc;
290 }
291 else {
292 if (flip_A > 0) {
293 delta_A += 1;
294 }
295 myA = A + flip_A * delta_A;
296 flip_A *= -1;
297
298 if (myA < 1) {
299 myA = 1;
300 }
301
302 // myA += inc;
303 }
304
305 } while (myZ == 0 || myA == 0); // No meaning // Loop checking, 11.05.2015, T. Koi
306
307 } while ((check == nullptr) || (!(*check))); // Loop checking, 11.05.2015, T. Koi
308
309#ifdef G4VERBOSE
310 if (fManager->GetDEBUG())
311 {
312 G4cout << "Names::GetName: last theName proposal = " << G4endl;
313 G4cout << *theName << " " << A << " " << Z << " " << result.GetName() << G4endl;
314 }
315#endif
316
317 // administration and anouncement for lacking of exact data in NDL
318 if (Z != result.GetZ() || A != result.GetA()) {
319 if (rest == "/CrossSection") {
320 G4String reac = base;
321 G4String dir = fManager->GetNeutronHPPath();
322 reac.erase(0, dir.length());
323 if (fManager->GetSkipMissingIsotopes()
324 && (Z != result.GetZ() || !result.IsThisNaturalAbundance()))
325 {
326#ifdef G4VERBOSE
327 if (fManager->GetVerboseLevel() > 0) {
328 G4cout << "NeutronHP: " << reac << " file for Z = " << Z << ", A = " << A
329 << " is not found and CrossSection set to 0." << G4endl;
330 }
331#endif
332 G4String new_name = base + "/" + rest + "/" + "0_0_Zero";
333 result.SetName(new_name);
334 }
335 else {
336 // 080901 Add protection that deuteron data do not selected for hydrogen and so on by T. Koi
337 // 160216 Increase protencted isotopes for fixing problem on charged particle HP
338 if ((reac.find("Inelastic") != reac.size()
339 && ((Z == 1 && A == 1) || (Z == 1 && A == 2) || (Z == 1 && A == 3)
340 || (Z == 2 && A == 3) || (Z == 2 && A == 4)))
341 || (reac.find("Capture") != reac.size() && ((Z == 1 && A == 3) || (Z == 2 && A == 4)))
342 || (reac.find("Fission") != reac.size()
343 && ((Z == 88 && A == 224) || (Z == 88 && A == 225) || (Z == 89 && A == 225)
344 || (Z == 88 && A == 226))))
345
346 {
347 G4String new_name = base + "/" + rest + "/" + "0_0_Zero";
348 result.SetName(new_name);
349 }
350 else {
351#ifdef G4VERBOSE
352 if (fManager->GetVerboseLevel() > 0) {
353 G4cout << "NeutronHP: " << reac << " file for Z = " << Z << ", A = " << A
354 << " is not found and NeutronHP will use " << result.GetName() << G4endl;
355 }
356#endif
357 }
358 }
359 }
360 }
361
362 delete theName;
363 delete check;
364
365 return result;
366}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
#define M(row, col)
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
void SetName(const G4String &aName)
void GetDataStream2(const G4String &, std::istringstream &iss)
const G4String & GetNeutronHPPath() const
G4bool GetSkipMissingIsotopes() const
static G4ParticleHPManager * GetInstance()
G4String itoa(G4int current)
G4ParticleHPDataUsed GetName(G4int A, G4int Z, const G4String &base, const G4String &rest, G4bool &active)
G4ParticleHPNames(G4int maxOffSet=5)
static G4double GetZtoA(G4int Z)