Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/inclxx/utils/src/G4INCLParticleSpecies.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/inclxx/utils/src/G4INCLParticleSpecies.cc (Version 11.3.0) and /processes/hadronic/models/inclxx/utils/src/G4INCLParticleSpecies.cc (Version 5.1)


  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 // INCL++ intra-nuclear cascade model             
 27 // Alain Boudard, CEA-Saclay, France              
 28 // Joseph Cugnon, University of Liege, Belgium    
 29 // Jean-Christophe David, CEA-Saclay, France      
 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H    
 31 // Sylvie Leray, CEA-Saclay, France               
 32 // Davide Mancusi, CEA-Saclay, France             
 33 //                                                
 34 #define INCLXX_IN_GEANT4_MODE 1                   
 35                                                   
 36 #include "globals.hh"                             
 37                                                   
 38 /*                                                
 39  * G4INCLParticleSpecies.cc                       
 40  *                                                
 41  *  \date Nov 25, 2011                            
 42  * \author Davide Mancusi                         
 43  */                                               
 44                                                   
 45 #include "G4INCLParticleSpecies.hh"               
 46 #include "G4INCLParticleTable.hh"                 
 47 #include <algorithm>                              
 48 #include <cctype>                                 
 49 #include <sstream>                                
 50 #include <algorithm>                              
 51                                                   
 52 namespace G4INCL {                                
 53                                                   
 54   ParticleSpecies::ParticleSpecies(std::string    
 55     // Normalise the string to lower case         
 56     if(pS=="p" || pS=="proton") {                 
 57       theA = 1;                                   
 58       theZ = 1;                                   
 59       theS = 0;                                   
 60       theType = G4INCL::Proton;                   
 61     } else if(pS=="n" || pS=="neutron") {         
 62       theA = 1;                                   
 63       theZ = 0;                                   
 64       theS = 0;                                   
 65       theType = G4INCL::Neutron;                  
 66     } else if(pS=="delta++" || pS=="deltaplusp    
 67       theA = 1;                                   
 68       theZ = 2;                                   
 69       theS = 0;                                   
 70       theType = G4INCL::DeltaPlusPlus;            
 71     } else if(pS=="delta+" || pS=="deltaplus")    
 72       theA = 1;                                   
 73       theZ = 1;                                   
 74       theS = 0;                                   
 75       theType = G4INCL::DeltaPlus;                
 76     } else if(pS=="delta0" || pS=="deltazero")    
 77       theA = 1;                                   
 78       theZ = 0;                                   
 79       theS = 0;                                   
 80       theType = G4INCL::DeltaZero;                
 81     } else if(pS=="delta-" || pS=="deltaminus"    
 82       theA = 1;                                   
 83       theZ = -1;                                  
 84       theS = 0;                                   
 85       theType = G4INCL::DeltaMinus;               
 86     } else if(pS=="pi+" || pS=="pion+" || pS==    
 87       theA = 0;                                   
 88       theZ = 1;                                   
 89       theS = 0;                                   
 90       theType = G4INCL::PiPlus;                   
 91     } else if(pS=="pi0" || pS=="pion0" || pS==    
 92       theA = 0;                                   
 93       theZ = 0;                                   
 94       theS = 0;                                   
 95       theType = G4INCL::PiZero;                   
 96     } else if(pS=="pi-" || pS=="pion-" || pS==    
 97       theA = 0;                                   
 98       theZ = -1;                                  
 99       theS = 0;                                   
100       theType = G4INCL::PiMinus;                  
101     } else if(pS=="lambda" || pS=="l" || pS=="    
102       theA = 1;                                   
103       theZ = 0;                                   
104       theS = -1;                                  
105       theType = G4INCL::Lambda;                   
106     } else if(pS=="s+" || pS=="sigma+" || pS==    
107       theA = 1;                                   
108       theZ = 1;                                   
109       theS = -1;                                  
110       theType = G4INCL::SigmaPlus;                
111     } else if(pS=="s0" || pS=="sigma0" || pS==    
112       theA = 1;                                   
113       theZ = 0;                                   
114       theS = -1;                                  
115       theType = G4INCL::SigmaZero;                
116     } else if(pS=="s-" || pS=="sigma-" || pS==    
117       theA = 1;                                   
118       theZ = -1;                                  
119       theS = -1;                                  
120       theType = G4INCL::SigmaMinus;               
121     } else if(pS=="xi-" || pS=="x-") {            
122       theA = 1;                                   
123       theZ = -1;                                  
124       theS = -2;                                  
125       theType = G4INCL::XiMinus;                  
126     } else if(pS=="xi0" || pS=="x0") {            
127       theA = 1;                                   
128       theZ = 0;                                   
129       theS = -2;                                  
130       theType = G4INCL::XiZero;                   
131     } else if(pS=="pb" || pS=="antiproton") {     
132       theA = -1;                                  
133       theZ = -1;                                  
134       theS = 0;                                   
135       theType = G4INCL::antiProton;               
136     } else if(pS=="nb" || pS=="antineutron") {    
137       theA = -1;                                  
138       theZ = 0;                                   
139       theS = 0;                                   
140       theType = G4INCL::antiNeutron;              
141     } else if(pS=="s+b" || pS=="antisigma+" ||    
142       theA = -1;                                  
143       theZ = -1;                                  
144       theS = 1;                                   
145       theType = G4INCL::antiSigmaPlus;            
146     } else if(pS=="s0b" || pS=="antisigma0" ||    
147       theA = -1;                                  
148       theZ = 0;                                   
149       theS = 1;                                   
150       theType = G4INCL::antiSigmaZero;            
151     } else if(pS=="s-b" || pS=="antisigma-" ||    
152       theA = -1;                                  
153       theZ = 1;                                   
154       theS = 1;                                   
155       theType = G4INCL::antiSigmaMinus;           
156     } else if(pS=="antilambda" || pS=="lb" ||     
157       theA = -1;                                  
158       theZ = 0;                                   
159       theS = 1;                                   
160       theType = G4INCL::antiLambda;               
161     } else if(pS=="antixi-" || pS=="x-b") {       
162       theA = -1;                                  
163       theZ = 1;                                   
164       theS = 2;                                   
165       theType = G4INCL::antiXiMinus;              
166     } else if(pS=="antixi0" || pS=="x0b") {       
167       theA = -1;                                  
168       theZ = 0;                                   
169       theS = 2;                                   
170       theType = G4INCL::antiXiZero;               
171     } else if(pS=="k+" || pS=="kaon+" || pS=="    
172       theA = 0;                                   
173       theZ = 1;                                   
174       theS = 1;                                   
175       theType = G4INCL::KPlus;                    
176     } else if(pS=="k0" || pS=="kaon0" || pS=="    
177       theA = 0;                                   
178       theZ = 0;                                   
179       theS = 1;                                   
180       theType = G4INCL::KZero;                    
181     } else if(pS=="k0b" || pS=="kzb" || pS=="k    
182       theA = 0;                                   
183       theZ = 0;                                   
184       theS = -1;                                  
185       theType = G4INCL::KZeroBar;                 
186     } else if(pS=="k-" || pS=="kaon-" || pS=="    
187       theA = 0;                                   
188       theZ = -1;                                  
189       theS = -1;                                  
190       theType = G4INCL::KMinus;                   
191     } else if(pS=="k0s" || pS=="kshort" || pS=    
192       theA = 0;                                   
193       theZ = 0;                                   
194 //    theS not defined                            
195       theType = G4INCL::KShort;                   
196     } else if(pS=="k0l" || pS=="klong" || pS==    
197       theA = 0;                                   
198       theZ = 0;                                   
199 //    theS not defined                            
200       theType = G4INCL::KLong;                    
201     } else if(pS=="d" || pS=="deuteron") {        
202       theA = 2;                                   
203       theZ = 1;                                   
204       theS = 0;                                   
205       theType = G4INCL::Composite;                
206     } else if(pS=="t" || pS=="triton") {          
207       theA = 3;                                   
208       theZ = 1;                                   
209       theS = 0;                                   
210       theType = G4INCL::Composite;                
211     } else if(pS=="a" || pS=="alpha") {           
212       theA = 4;                                   
213       theZ = 2;                                   
214       theS = 0;                                   
215       theType = G4INCL::Composite;                
216     } else if(pS=="eta") {                        
217       theA = 0;                                   
218       theZ = 0;                                   
219       theS = 0;                                   
220       theType = G4INCL::Eta;                      
221     } else if(pS=="omega") {                      
222       theA = 0;                                   
223       theZ = 0;                                   
224       theS = 0;                                   
225       theType = G4INCL::Omega;                    
226     } else if(pS=="etaprime" || pS=="etap") {     
227       theA = 0;                                   
228       theZ = 0;                                   
229       theS = 0;                                   
230       theType = G4INCL::EtaPrime;                 
231     } else if(pS=="photon") {                     
232       theA = 0;                                   
233       theZ = 0;                                   
234       theS = 0;                                   
235       theType = G4INCL::Photon;                   
236     } else                                        
237       parseNuclide(pS);                           
238   }                                               
239                                                   
240   ParticleSpecies::ParticleSpecies(ParticleTyp    
241     theType(t),                                   
242     theA(ParticleTable::getMassNumber(theType)    
243     theZ(ParticleTable::getChargeNumber(theTyp    
244     theS(ParticleTable::getStrangenessNumber(t    
245   {}                                              
246                                                   
247   ParticleSpecies::ParticleSpecies(const G4int    
248     theType(Composite),                           
249     theA(A),                                      
250     theZ(Z),                                      
251     theS(0)                                       
252   {}                                              
253                                                   
254   ParticleSpecies::ParticleSpecies(const G4int    
255     theType(Composite),                           
256     theA(A),                                      
257     theZ(Z),                                      
258     theS(S)                                       
259   {}                                              
260                                                   
261   void ParticleSpecies::parseNuclide(std::stri    
262     theType = Composite;                          
263     theS = 0; // no hypernuclei projectile or     
264                                                   
265     // Allowed characters                         
266     const std::string separators("-_");           
267     std::string allowed("0123456789abcdefghijk    
268     allowed += separators;                        
269                                                   
270     // There must be at least one character       
271     if(pS.find_first_not_of(allowed)!=std::str    
272       // Malformed input string                   
273       // Setting unknown particle species         
274       (*this) = ParticleSpecies(UnknownParticl    
275       return;                                     
276     }                                             
277     if(pS.size()<1) {                             
278       // Malformed input string                   
279       // Setting unknown particle species         
280       (*this) = ParticleSpecies(UnknownParticl    
281       return;                                     
282     }                                             
283                                                   
284     std::size_t firstSeparator = pS.find_first    
285     std::size_t lastSeparator = pS.find_last_o    
286     if(firstSeparator!=std::string::npos && fi    
287       // Several separators in malformed input    
288       // Setting unknown particle species         
289       (*this) = ParticleSpecies(UnknownParticl    
290       return;                                     
291     }                                             
292                                                   
293     // Identify the type of the first characte    
294     G4int (*predicate)(G4int);                    
295     G4bool startsWithAlpha = std::isalpha(pS.a    
296     if(startsWithAlpha) {                         
297       predicate=std::isdigit;                     
298     } else if(std::isdigit(pS.at(0))) {           
299       predicate=std::isalpha;                     
300     } else {                                      
301       // Non-alphanumeric character in string     
302       // Setting unknown particle species         
303       (*this) = ParticleSpecies(UnknownParticl    
304       return;                                     
305     }                                             
306                                                   
307     G4bool hasIsotope = true;                     
308     size_t endFirstSection, beginSecondSection    
309     if(firstSeparator==std::string::npos) {       
310       // No separator, Fe56 or 56Fe style         
311       // Identify the end of the first section    
312                                                   
313       // Find the first character that is not     
314       beginSecondSection = std::find_if(pS.beg    
315                                                   
316       if(beginSecondSection>=pS.size()) {         
317         if(startsWithAlpha) {                     
318           // Only alphabetic characters are pr    
319           hasIsotope = false;                     
320         } else {                                  
321           // Only numeric characters in the st    
322           // Setting unknown particle species     
323           (*this) = ParticleSpecies(UnknownPar    
324           return;                                 
325         }                                         
326       }                                           
327                                                   
328       endFirstSection = beginSecondSection;       
329                                                   
330     } else {                                      
331       // One separator, Fe-56 or 56-Fe style o    
332       endFirstSection = firstSeparator;           
333       beginSecondSection = firstSeparator+1;      
334     }                                             
335                                                   
336     std::string firstSection(pS.substr(0,endFi    
337     std::string secondSection(pS.substr(beginS    
338     std::stringstream parsingStream;              
339                                                   
340     if(std::isalpha(firstSection.at(0)) && std    
341       std::stringstream parseStrangeness;         
342       parseStrangeness.str(secondSection);        
343       parseStrangeness >> theS;                   
344       if(parsingStream.fail()) {                  
345         // Couldn't parse the strange charge s    
346         // Setting unknown particle species       
347         (*this) = ParticleSpecies(UnknownParti    
348         return;                                   
349       }                                           
350       theS *= (-1);                               
351       beginSecondSection = std::find_if(pS.beg    
352       firstSection = pS.substr(0, beginSecondS    
353       secondSection = pS.substr(beginSecondSec    
354     }                                             
355                                                   
356     // Parse the sections                         
357     G4bool success;                               
358     if(startsWithAlpha) {                         
359       parsingStream.str(secondSection);           
360       success = parseElement(firstSection);       
361     } else {                                      
362       parsingStream.str(firstSection);            
363       success = parseElement(secondSection);      
364     }                                             
365     if(!success) {                                
366       // Couldn't parse the element section       
367       // Setting unknown particle species         
368       (*this) = ParticleSpecies(UnknownParticl    
369       return;                                     
370     }                                             
371                                                   
372     if(hasIsotope) {                              
373       parsingStream >> theA;                      
374       if(parsingStream.fail()) {                  
375         // Couldn't parse the mass section        
376         // Setting unknown particle species       
377         (*this) = ParticleSpecies(UnknownParti    
378         return;                                   
379       }                                           
380     } else                                        
381       theA = 0;                                   
382                                                   
383     // Check that Z<=A                            
384     if(theZ>theA && hasIsotope) {                 
385       // Setting unknown particle species         
386       (*this) = ParticleSpecies(UnknownParticl    
387       return;                                     
388     }                                             
389                                                   
390     // Special particle type for protons          
391     if(theZ==1 && theA==1)                        
392       theType = Proton;                           
393   }                                               
394                                                   
395   G4bool ParticleSpecies::parseElement(std::st    
396     theZ = ParticleTable::parseElement(s);        
397                                                   
398     if(theZ<0)                                    
399       theZ = ParticleTable::parseIUPACElement(    
400                                                   
401     if(theZ<0)                                    
402       return false;                               
403     else                                          
404       return true;                                
405   }                                               
406                                                   
407   G4bool ParticleSpecies::parseIUPACElement(st    
408     theZ = ParticleTable::parseIUPACElement(s)    
409     if(theZ==0)                                   
410       return false;                               
411     else                                          
412       return true;                                
413   }                                               
414                                                   
415   G4int ParticleSpecies::getPDGCode() const {     
416     switch (theType) {                            
417     case Proton:                                  
418         return 2212;                              
419       break;                                      
420     case Neutron:                                 
421         return 2112;                              
422       break;                                      
423     case DeltaPlusPlus:                           
424         return 2224;                              
425       break;                                      
426     case DeltaPlus:                               
427         return 2214;                              
428       break;                                      
429     case DeltaZero:                               
430         return 2114;                              
431       break;                                      
432     case DeltaMinus:                              
433         return 1114;                              
434       break;                                      
435     case PiPlus:                                  
436         return 211;                               
437       break;                                      
438     case PiZero:                                  
439         return 111;                               
440       break;                                      
441     case PiMinus:                                 
442         return -211;                              
443       break;                                      
444     case Eta:                                     
445         return 221;                               
446       break;                                      
447     case Omega:                                   
448         return 223;                               
449       break;                                      
450     case EtaPrime:                                
451         return 331;                               
452       break;                                      
453     case Photon:                                  
454         return 22;                                
455       break;                                      
456     case Lambda:                                  
457         return 3122;                              
458       break;                                      
459     case SigmaPlus:                               
460         return 3222;                              
461       break;                                      
462     case SigmaZero:                               
463         return 3212;                              
464       break;                                      
465     case SigmaMinus:                              
466         return 3112;                              
467       break;                                      
468       case antiProton:                            
469         return -2212;                             
470       break;                                      
471     case XiMinus:                                 
472         return 3312;                              
473       break;                                      
474     case XiZero:                                  
475         return 3322;                              
476       break;                                      
477     case antiNeutron:                             
478         return -2112;                             
479       break;                                      
480     case antiLambda:                              
481         return -3122;                             
482       break;                                      
483     case antiSigmaPlus:                           
484         return -3222;                             
485       break;                                      
486     case antiSigmaZero:                           
487         return -3212;                             
488       break;                                      
489     case antiSigmaMinus:                          
490         return -3112;                             
491       break;                                      
492     case antiXiMinus:                             
493         return -3312;                             
494       break;                                      
495     case antiXiZero:                              
496         return -3322;                             
497       break;                                      
498     case KPlus:                                   
499         return 321;                               
500       break;                                      
501     case KZero:                                   
502         return 311;                               
503       break;                                      
504     case KZeroBar:                                
505         return -311;                              
506       break;                                      
507     case KShort:                                  
508         return 310;                               
509       break;                                      
510     case KLong:                                   
511         return 130;                               
512       break;                                      
513     case KMinus:                                  
514         return -321;                              
515       break;                                      
516     case Composite:                               
517       if(theA == 1 && theZ == 1 && theS == 0)     
518       else if(theA == 1 && theZ == 0 && theS =    
519       else if(theA == 1 && theZ == 0 && theS =    
520       else return theA+theZ*1000-theS*1e6; //     
521       break;                                      
522     default:                                      
523       INCL_ERROR("ParticleSpecies::getPDGCode:    
524       return 0;                                   
525       break;                                      
526   }                                               
527   }                                               
528 }                                                 
529                                                   
530