Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/particle_hp/src/G4ParticleHPNames.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/hadronic/models/particle_hp/src/G4ParticleHPNames.cc (Version 11.3.0) and /processes/hadronic/models/particle_hp/src/G4ParticleHPNames.cc (Version 8.3)


  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