Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4NeutronHPNames.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 #include "G4NeutronHPNames.hh"
39 #include "G4SandiaTable.hh"
40 #include "G4HadronicException.hh"
41 #include <fstream>
42 
43  const G4String G4NeutronHPNames::theString[100] = {"Hydrogen", "Helium",
44  "Lithium", "Berylium", "Boron", "Carbon", "Nitrogen", "Oxygen", "Fluorine",
45  "Neon", "Sodium", "Magnesium", "Aluminum", "Silicon", "Phosphorous",
46  "Sulfur", "Chlorine", "Argon", "Potassium", "Calcium", "Scandium",
47  "Titanium", "Vanadium", "Chromium", "Manganese", "Iron", "Cobalt", "Nickel",
48  "Copper", "Zinc", "Gallium", "Germanium", "Arsenic", "Selenium", "Bromine",
49  "Krypton", "Rubidium", "Strontium", "Yttrium", "Zirconium", "Niobium",
50  "Molybdenum", "Technetium", "Ruthenium", "Rhodium", "Palladium", "Silver",
51  "Cadmium", "Indium", "Tin", "Antimony", "Tellurium", "Iodine", "Xenon",
52  "Cesium", "Barium", "Lanthanum", "Cerium", "Praseodymium", "Neodymium",
53  "Promethium", "Samarium", "Europium", "Gadolinium", "Terbium", "Dysprosium",
54  "Holmium", "Erbium", "Thulium", "Ytterbium", "Lutetium", "Hafnium",
55  "Tantalum", "Tungsten", "Rhenium", "Osmium", "Iridium", "Platinium", "Gold",
56  "Mercury", "Thallium", "Lead", "Bismuth", "Polonium", "Astatine", "Radon",
57  "Francium", "Radium", "Actinium", "Thorium", "Protactinium", "Uranium",
58  "Neptunium", "Plutonium", "Americium", "Curium", "Berkelium", "Californium",
59  "Einsteinium","Fermium"};
60 
61 
63 
64 //G4NeutronHPDataUsed G4NeutronHPNames::GetName(G4int A, G4int Z, G4String base, G4String rest, G4bool & aFlag)
66 {
67 
68  //G4cout << Z << " " << A << " " << M << " " << base << " " << rest << G4endl;
69 
70  //Excited isomer indicator
71  std::stringstream ss;
72  G4String sM;
73  if ( M > 0 )
74  {
75  ss << "m";
76  ss << M;
77  ss >> sM;
78  ss.clear();
79  }
80 
81  G4NeutronHPDataUsed result;
82  aFlag = true;
83 if(getenv("NeutronHPNames")) G4cout << "Names::GetName entered for Z = " << Z << ", A = " << A <<G4endl;
84 
85  G4int myA = A;
86  G4int myZ = Z;
87 
88  if(Z>92.5&&!getenv("AllowForHeavyElements") )
89  {
90  //G4cerr << "Please contact Hans-Peter.Wellisch@cern.ch"<<G4endl;
91  G4cerr << "Please contact Geant4 Hadron Group Coordinator"<<G4endl;
92  throw G4HadronicException(__FILE__, __LINE__, "G4NeutronHPNames::GetName - data with Z>92 are not provided");
93  }
94 
95  G4String * theName = 0;
96  G4String theFileName("");
97 
98 // G4int inc = 1;
99 
100  G4int flip_Z = 1;
101  G4int delta_Z = 0;
102 
103  G4int flip_A = 1;
104  G4int delta_A = 0;
105 
106  std::ifstream * check = new std::ifstream(".dummy");
107  G4bool first = true;
108 if(getenv("NeutronHPNames")) G4cout << "entered GetName!!!"<<G4endl;
109  do
110  {
111  aFlag = true;
112  G4String * biff = new G4String(); // delete here as theName
113  *biff = base+"/CrossSection/"+itoa(myZ)+"_"+itoa(myA)+sM+"_"+theString[myZ-1];
114 
115  if(theName!=0) delete theName;
116  theName = biff;
117  result.SetName(*theName);
118  result.SetA(myA);
119  result.SetZ(myZ);
120  result.SetM(M);
121 if(getenv("NeutronHPNames")) G4cout <<"HPWD 1 "<<*theName<<G4endl;
122 
123  // T.K. debug for memory leak
124  if ( check != 0 )
125  {
126  check->close();
127  delete check;
128  }
129  check = new std::ifstream(*theName);
130  if ( !(*check) )
131  {
132  check->close();
133  delete check;
134  check = 0;
135  aFlag = false;
136  if ( first )
137  {
138  aFlag = true;
139  first = false;
140  biff = new G4String(); // delete here as theName
141  *biff = base+"/CrossSection/"+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
142  if(theName!=0) delete theName;
143  theName = biff;
144 if(getenv("NeutronHPNames")) G4cout <<"HPWD 2 "<<*theName<<G4endl;
145  result.SetName(*theName);
146  G4double natA = myZ/G4SandiaTable::GetZtoA(myZ);
147  result.SetA(natA);
148  result.SetZ(myZ);
149  result.SetM(M);
150  check = new std::ifstream(*theName);
151  if ( !(*check) )
152  {
153  check->close();
154  delete check;
155  check = 0;
156  aFlag = false;
157  }
158  else
159  {
160  biff = new G4String(); // delete here as theName
161  if(theName!=0) delete theName;
162  *biff = base+"/"+rest+"/"+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
163  if ( rest=="/CrossSection" ) *biff = base+rest+"/"+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
164  theName = biff;
165 if(getenv("NeutronHPNames")) G4cout <<"HPWD 3 "<<*theName<<G4endl;
166  result.SetName(*theName);
167  natA = myZ/G4SandiaTable::GetZtoA(myZ);
168  result.SetA(natA);
169  result.SetZ(myZ);
170  result.SetM(M);
171  result.SetNaturalAbundanceFlag();
172  }
173  }
174  }
175  else
176  {
177 // 070706 T. Koi Modified
178 /*
179  biff = new G4String(); // delete here as theName
180  *biff = base+"/"+rest+itoa(myZ)+"_"+itoa(myA)+"_"+theString[myZ-1];
181  if(theName!=0) delete theName;
182  theName = biff;
183 if(getenv("NeutronHPNames")) G4cout <<"HPWD 4 "<<*theName<<G4endl;
184  result.SetName(*theName);
185  result.SetA(myA);
186  result.SetZ(myZ);
187 */
188 
189  G4double tmpA = myA;
190  std::ifstream* file = NULL;
191  G4String fileName;
192 
193  if ( rest == "/CrossSection" )
194  {
195 
196  //fileName = base+"/"+rest+"/"+itoa(myZ)+"_"+itoa(myA)+sM+"_"+theString[myZ-1];
197  fileName = base+rest+"/"+itoa(myZ)+"_"+itoa(myA)+sM+"_"+theString[myZ-1];
198 if(getenv("NeutronHPNames")) G4cout <<"HPWD 4a "<<*theName<<G4endl;
199 
200  }
201  else
202  {
203 
204 // For FS
205  fileName = base+"/"+rest+"/"+itoa(myZ)+"_"+itoa(myA)+sM+"_"+theString[myZ-1];
206  file = new std::ifstream(fileName);
207 
208  if ( *file )
209  {
210 
211 // isotope FS
212 if(getenv("NeutronHPNames")) G4cout <<"HPWD 4b1 "<<*theName<<G4endl;
213  }
214  else
215  {
216 
217 // _nat_ FS
218  fileName = base+"/"+rest+"/"+itoa(myZ)+"_"+"nat"+"_"+theString[myZ-1];
219 
220  delete file;
221  file = new std::ifstream(fileName);
222  if ( *file )
223  {
224 
225 // FS neither isotope nor _nat_
226 if(getenv("NeutronHPNames")) G4cout <<"HPWD 4b2a "<<*theName<<G4endl;
227  G4double natA = myZ/G4SandiaTable::GetZtoA(myZ);
228  tmpA = natA;
229  }
230  else
231  {
232 if(getenv("NeutronHPNames")) G4cout <<"HPWD 4b2c "<<*theName<<G4endl;
233  fileName="INVALID";
234  }
235  }
236 
237  delete file;
238 
239  }
240 
241  result.SetName(fileName);
242  result.SetA(tmpA);
243  result.SetZ(myZ);
244  result.SetM(M);
245 
246  }
247 
248  do
249  {
250 // if (std::abs(myZ-Z)>theMaxOffSet||myZ==0||myA==0)
251  if ( delta_Z > theMaxOffSet )
252  {
253  //if ( inc > 0 )
254  //{
255  // inc*= -1;
256  // myZ = Z;
257  // myA = A;
258  //}
259  //else
260  //{
261  G4cout <<"G4NeutronHPNames: Sorry, this material does not come near to any data."<<G4endl;
262  G4cout <<"G4NeutronHPNames: Please make sure G4NEUTRONHPDATA points to the" << G4endl;
263  G4cout <<" directory, the neutron scattering data are located in." << G4endl;
264  G4cout << "G4NeutronHPNames: The material was: A="<<A<<", Z="<<Z<<G4endl;
265  //throw G4HadronicException(__FILE__, __LINE__, "In case the data sets are at present not available in the neutron data library, please contact Hans-Peter.Wellisch@cern.ch");
266  throw G4HadronicException(__FILE__, __LINE__, "In case the data sets are at present not available in the neutron data library, please contact Hadron Group Coordinator");
267  delete theName;
268  theFileName = "";
269  return result;
270  //}
271  }
272 
273  //if ( std::abs( myA - A ) > theMaxOffSet )
274  if ( delta_A > 2*theMaxOffSet )
275  {
276  delta_A = 0;
277  flip_A = 1;
278 
279  first = true;
280 
281  if ( flip_Z > 0 )
282  {
283  delta_Z +=1;
284  }
285  myZ = Z + flip_Z * delta_Z;
286  flip_Z *= -1;
287 
288  myA = A;
289  if ( myZ > 100 )
290  {
291  myZ = 100;
292  }
293  if ( myZ < 1 )
294  {
295  myZ = 1;
296  }
297 
298 // myZ += inc;
299  }
300  else
301  {
302  if ( flip_A > 0 )
303  {
304  delta_A += 1;
305  }
306  myA = A + flip_A * delta_A;
307  flip_A *= -1;
308 
309  if ( myA < 1 )
310  {
311  myA = 1;
312  }
313 
314 // myA += inc;
315  }
316 
317  }
318  while( myZ == 0 || myA == 0 ); // No meaning
319 
320  }
321  while((!check) || (!(*check)));
322 
323  if(getenv("NeutronHPNamesLogging") || getenv("NeutronHPNames"))
324  {
325  G4cout << "Names::GetName: last theName proposal = "<< G4endl;
326  G4cout << *theName <<" "<<A<<" "<<Z<<" "<<result.GetName()<<G4endl;
327  }
328 
329 // administration and anouncement for lacking of exact data in NDL
330  if ( Z != result.GetZ() || A != result.GetA() )
331  {
332  if ( rest == "/CrossSection" )
333  {
334  G4String reac = base;
335  G4String dir = getenv("G4NEUTRONHPDATA");
336  reac.erase ( 0 , dir.length() );
337  if ( getenv ( "G4NEUTRONHP_SKIP_MISSING_ISOTOPES" ) && !( Z == result.GetZ() && result.IsThisNaturalAbundance() ) )
338  {
339  G4cout << "NeutronHP: " << reac << " file for Z = " << Z << ", A = " << A << " is not found and CrossSection set to 0." << G4endl;
340  G4String new_name = base+"/"+rest+"/"+"0_0_Zero";
341  result.SetName( new_name );
342  }
343  else
344  {
345  //080901 Add protection that deuteron data do not selected for hydrogen and so on by T. Koi
346  if ( ( reac.find("Inelastic") != reac.size() && ( (Z == 1 && A == 1) || (Z == 2 && A == 4) ) )
347  || ( reac.find("Capture") != reac.size() && ( (Z == 1 && A == 3) || (Z == 2 && A == 4) ) )
348  || ( reac.find("Fission") != reac.size() && ( (Z == 88 && A == 224) || (Z == 88 && A == 225) || (Z == 89 && A == 225) || (Z == 88 && A == 226) ) ) )
349 
350  {
351  G4String new_name = base+"/"+rest+"/"+"0_0_Zero";
352  result.SetName( new_name );
353  }
354  else
355  {
356  G4cout << "NeutronHP: " << reac << " file for Z = " << Z << ", A = " << A << " is not found and NeutronHP will use " << result.GetName() << G4endl;
357  }
358  }
359  }
360  }
361 
362  delete theName;
363  if(aFlag)
364  {
365  check->close();
366  delete check;
367  check = 0;
368  }
369  return result;
370  }