Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // neutron_hp -- source file 27 // J.P. Wellisch, Nov-1996 28 // A prototype of the low energy neutron trans 29 // 30 // 24-Jan-07 Enable to use exact data only and 31 // 30-Jan-07 Modified method of searching subs 32 // 07-06-12 fix memory leaking by T. Koi 33 // 07-06-25 Change data selection logic when G 34 // Natural Abundance data are allowed 35 // 07-07-06 Allow _nat_ final state even for i 36 // 08-09-01 Add protection that deuteron data 37 // 38 // P. Arce, June-2014 Conversion neutron_hp to 39 // June-2019 - E. Mendoza --> Modification to 40 // G4NEUTRONHP_SKIP_MISSING_ISOTOPES environme 41 // Oct-2019 - E. Mendoza --> remove restrictio 42 // 43 // V. Ivanchenko, July-2023 Basic revision of 44 45 #include "G4ParticleHPNames.hh" 46 47 #include "G4HadronicException.hh" 48 #include "G4HadronicParameters.hh" 49 #include "G4ParticleHPManager.hh" 50 #include "G4SandiaTable.hh" 51 #include "G4ios.hh" 52 53 #include <fstream> 54 55 const G4String G4ParticleHPNames::theString[10 56 "Hydrogen", "Helium", "Lithium", 57 "Nitrogen", "Oxygen", "Fluorine", 58 "Aluminum", "Silicon", "Phosphorous" 59 "Potassium", "Calcium", "Scandium", 60 "Manganese", "Iron", "Cobalt", 61 "Gallium", "Germanium", "Arsenic", 62 "Rubidium", "Strontium", "Yttrium", 63 "Technetium", "Ruthenium", "Rhodium", 64 "Indium", "Tin", "Antimony", 65 "Cesium", "Barium", "Lanthanum", 66 "Promethium", "Samarium", "Europium", 67 "Holmium", "Erbium", "Thulium", 68 "Tantalum", "Tungsten", "Rhenium", 69 "Gold", "Mercury", "Thallium", 70 "Astatine", "Radon", "Francium", 71 "Protactinium", "Uranium", "Neptunium", 72 "Berkelium", "Californium", "Einsteinium" 73 74 G4ParticleHPNames::G4ParticleHPNames(G4int max 75 { 76 fManager = G4ParticleHPManager::GetInstance( 77 } 78 79 G4String G4ParticleHPNames::GetName(G4int i) c 80 { 81 return (i > 0 && i < 100) ? theString[i] : G 82 } 83 84 G4String G4ParticleHPNames::itoa(G4int current 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, 1 94 return result; 95 } 96 97 G4ParticleHPDataUsed G4ParticleHPNames::GetNam 98 99 { 100 // G4cout << Z << " " << A << " " << M << " 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 112 G4ParticleHPDataUsed result; 113 aFlag = true; 114 115 #ifdef G4VERBOSE 116 if (fManager->GetDEBUG()) 117 G4cout << "Names::GetName entered for Z = 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 her 145 *biff = base + "/CrossSection/" + itoa(myZ 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::i 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 165 *biff = base + "/CrossSection/" + itoa 166 delete theName; 167 theName = biff; 168 result.SetName(*theName); 169 G4double natA = myZ / G4SandiaTable::G 170 result.SetA(natA); 171 result.SetZ(myZ); 172 result.SetM(M); 173 // check = new std::ifstream(*theName) 174 check = new std::istringstream(std::io 175 fManager->GetDataStream2(*theName, *ch 176 if (!(*check)) { 177 // check->close(); 178 delete check; 179 check = nullptr; 180 aFlag = false; 181 } 182 else { 183 biff = new G4String(); // delete he 184 *biff = base + "/" + rest + "/" + it 185 if (rest == "/CrossSection") 186 *biff = base + rest + "/" + itoa(m 187 delete theName; 188 theName = biff; 189 result.SetName(*theName); 190 natA = myZ / G4SandiaTable::GetZtoA( 191 result.SetA(natA); 192 result.SetZ(myZ); 193 result.SetM(M); 194 result.SetNaturalAbundanceFlag(); 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(my 205 // if(fManager->GetDEBUG()) G4cout <<" 206 } 207 else { 208 // For FS 209 fileName = 210 base + "/" + rest + "/" + itoa(myZ) 211 file = new std::istringstream(std::ios 212 fManager->GetDataStream2(fileName, *fi 213 214 if (*file) { 215 // isotope FS 216 // if(fManager->GetDEBUG()) G4cout < 217 } 218 else { 219 // _nat_ FS 220 fileName = base + "/" + rest + "/" + 221 222 delete file; 223 file = new std::istringstream(std::i 224 G4ParticleHPManager::GetInstance()-> 225 if (*file) { 226 // FS neither isotope nor _nat_ 227 // if(fManager->GetDEBUG()) G4cout 228 G4double natA = myZ / G4SandiaTabl 229 tmpA = natA; 230 } 231 else { 232 // if(fManager->GetDEBUG()) G4cout 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: Ther 251 "material " 252 << G4endl; 253 G4cout << "G4ParticleHPNames: nor 254 G4cout << "G4ParticleHPNames: Plea 255 << G4endl; 256 G4cout << "G4ParticleHPNames: in w 257 << G4endl; 258 G4cout << "G4ParticleHPNames: The 259 } 260 #endif 261 G4ExceptionDescription ed; 262 ed << "Data for Z=" << Z << " A=" << A << 263 G4Exception("G4ParticleHPName::Init(...)", 264 JustWarning, ed, ""); 265 } 266 check = new std::istringstream(std::io 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 mea 306 307 } while ((check == nullptr) || (!(*check))); 308 309 #ifdef G4VERBOSE 310 if (fManager->GetDEBUG()) 311 { 312 G4cout << "Names::GetName: last theName pr 313 G4cout << *theName << " " << A << " " << Z 314 } 315 #endif 316 317 // administration and anouncement for lackin 318 if (Z != result.GetZ() || A != result.GetA() 319 if (rest == "/CrossSection") { 320 G4String reac = base; 321 const G4String& dir = fManager->GetNeutr 322 reac.erase(0, dir.length()); 323 if (fManager->GetSkipMissingIsotopes() 324 && (Z != result.GetZ() || !result.Is 325 { 326 #ifdef G4VERBOSE 327 if (fManager->GetVerboseLevel() > 0) { 328 G4cout << "NeutronHP: " << reac << " 329 << " is not found and CrossSe 330 } 331 #endif 332 const G4String& new_name = base + "/" 333 result.SetName(new_name); 334 } 335 else { 336 // 080901 Add protection that deuteron 337 // 160216 Increase protencted isotopes 338 if ((reac.find("Inelastic") != reac.si 339 && ((Z == 1 && A == 1) || (Z == 1 340 || (Z == 2 && A == 3) || (Z = 341 || (reac.find("Capture") != reac.s 342 || (reac.find("Fission") != reac.s 343 && ((Z == 88 && A == 224) || ( 344 || (Z == 88 && A == 226))) 345 346 { 347 const G4String& new_name = base + "/ 348 result.SetName(new_name); 349 } 350 else { 351 #ifdef G4VERBOSE 352 if (fManager->GetVerboseLevel() > 0) 353 G4cout << "NeutronHP: " << reac << 354 << " is not found and Neutr 355 } 356 #endif 357 } 358 } 359 } 360 } 361 362 delete theName; 363 delete check; 364 365 return result; 366 } 367