Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
lPoPs.cc
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 
6 #include "PoPs.h"
7 #include "PoPs_mass.h"
8 
9 #if defined __cplusplus
10 namespace GIDI {
11 using namespace GIDI;
12 #endif
13 
14 static struct ZLabels {
15  int Z;
16  char const *Symbol;
17 } Zs[] = { { 0, "n" }, { 1, "H" }, { 2, "He" }, { 3, "Li" }, { 4, "Be" }, { 5, "B" }, { 6, "C" }, { 7, "N" }, { 8, "O" },
18  { 9, "F" }, { 10, "Ne" }, { 11, "Na" }, { 12, "Mg" }, { 13, "Al" }, { 14, "Si" }, { 15, "P" }, { 16, "S" }, { 17, "Cl" },
19  { 18, "Ar" }, { 19, "K" }, { 20, "Ca" }, { 21, "Sc" }, { 22, "Ti" }, { 23, "V" }, { 24, "Cr" }, { 25, "Mn" }, { 26, "Fe" },
20  { 27, "Co" }, { 28, "Ni" }, { 29, "Cu" }, { 30, "Zn" }, { 31, "Ga" }, { 32, "Ge" }, { 33, "As" }, { 34, "Se" }, { 35, "Br" },
21  { 36, "Kr" }, { 37, "Rb" }, { 38, "Sr" }, { 39, "Y" }, { 40, "Zr" }, { 41, "Nb" }, { 42, "Mo" }, { 43, "Tc" }, { 44, "Ru" },
22  { 45, "Rh" }, { 46, "Pd" }, { 47, "Ag" }, { 48, "Cd" }, { 49, "In" }, { 50, "Sn" }, { 51, "Sb" }, { 52, "Te" }, { 53, "I" },
23  { 54, "Xe" }, { 55, "Cs" }, { 56, "Ba" }, { 57, "La" }, { 58, "Ce" }, { 59, "Pr" }, { 60, "Nd" }, { 61, "Pm" }, { 62, "Sm" },
24  { 63, "Eu" }, { 64, "Gd" }, { 65, "Tb" }, { 66, "Dy" }, { 67, "Ho" }, { 68, "Er" }, { 69, "Tm" }, { 70, "Yb" }, { 71, "Lu" },
25  { 72, "Hf" }, { 73, "Ta" }, { 74, "W" }, { 75, "Re" }, { 76, "Os" }, { 77, "Ir" }, { 78, "Pt" }, { 79, "Au" }, { 80, "Hg" },
26  { 81, "Tl" }, { 82, "Pb" }, { 83, "Bi" }, { 84, "Po" }, { 85, "At" }, { 86, "Rn" }, { 87, "Fr" }, { 88, "Ra" }, { 89, "Ac" },
27  { 90, "Th" }, { 91, "Pa" }, { 92, "U" }, { 93, "Np" }, { 94, "Pu" }, { 95, "Am" }, { 96, "Cm" }, { 97, "Bk" }, { 98, "Cf" },
28  { 99, "Es" }, { 100, "Fm" }, { 101, "Md" }, { 102, "No" }, { 103, "Lr" }, { 104, "Rf" }, { 105, "Db" }, { 106, "Sg" }, { 107, "Bh" },
29  { 108, "Hs" }, { 109, "Mt" } };
30 static const int nZs = sizeof( Zs ) / sizeof( Zs[0] );
31 
32 static char const *lPoPs_ZSymbol( int Z );
33 /*
34 ========================================================================
35 */
36 int lPoPs_addParticleIfNeeded( statusMessageReporting *smr, char const *name, char const *special ) {
37 
38  int index = PoPs_particleIndex( name ), ZA, Z = 0, A = 0,/* level = 0,*/ ispecial;
39  char *endptr, name_[256], AStr[32];
40  char const *ZStr, *alias = NULL;
41  PoP *pop, *pop_;
42  /* enum PoPs_genre genre = PoPs_genre_unknown; */
43  char const *yiNames[] = { "p", "h2", "h3", "he3", "he4", "photon" };
44  char const *yiAliases[] = { "h1", "d", "t", "he3", "a", "g" };
45  /* enum PoPs_genre yiGenres[] = { PoPs_genre_baryon, PoPs_genre_nucleus, PoPs_genre_nucleus, PoPs_genre_nucleus,
46  PoPs_genre_nucleus, PoPs_genre_photon }; */
47 
48  if( special == NULL ) special = "";
49  if( index < 0 ) {
50  if( isdigit( name[0] ) ) {
51  ZA = (int) strtol( name, &endptr, 10 );
52  if( *endptr != 0 ) {
53  smr_setReportError2( smr, PoPs_smr_ID, PoPs_errorToken_badName, "string '%s' not a value ZA", name );
54  return( -1 );
55  }
56  Z = ZA / 1000;
57  A = ZA % 1000;
58  /*level = 0;*/
59  ispecial = 0;
60  if( strcmp( special, "LLNL" ) == 0 ) {
61  if( ( ZA > 1 ) && ( ZA < 8 ) ) {
62  strcpy( name_, yiNames[ZA-2] );
63  alias = yiAliases[ZA-2];
64  /* genre = yiGenres[ZA-2];*/
65  ispecial = 1; }
66  else if( ( ZA == 1801 ) || ( ZA == 1901 ) ) {
67  strcpy( name_, yiNames[0] );
68  alias = yiAliases[0];
69  /* genre = yiGenres[0]; */
70  ispecial = 1; }
71  else if( ZA == 1902 ) {
72  strcpy( name_, yiNames[1] );
73  alias = yiAliases[1];
74  /* genre = yiGenres[1]; */
75  ispecial = 1; }
76  else if( ZA == 4809 ) {
77  strcpy( name_, "Be9" );
78  /* genre = PoPs_genre_atom; */
79  ispecial = 1; }
80  else if( ZA == 4909 ) {
81  strcpy( name_, "Be9" );
82  /* genre = PoPs_genre_atom; */
83  ispecial = 1; }
84  else if( ZA == 6912 ) {
85  strcpy( name_, "C12" );
86  /* genre = PoPs_genre_atom; */
87  ispecial = 1; }
88  else if( ZA == 8916 ) {
89  strcpy( name_, "O16" );
90  /* genre = PoPs_genre_atom; */
91  ispecial = 1; }
92  else if( ZA == 95242 ) {
93  strcpy( name_, "Am242_e2" );
94  /*level = 2;*/
95  /* genre = PoPs_genre_atom; */
96  ispecial = 1; }
97  else if( Z == 99 ) {
98  if( ( 120 <= A ) && ( A < 126 ) ) {
99  sprintf( name_, "FissionProductENDL99%d", A );
100  /* genre = PoPs_genre_atom; */
101  ispecial = 1;
102  }
103  }
104  }
105  if( ispecial == 0 ) {
106  if( ZA == 1 ) {
107  AStr[0] = 0; }
108  else if( A == 0 ) {
109  strcpy( AStr, "_natural" ); }
110  else {
111  sprintf( AStr, "%d", A );
112  }
113  if( ( ZStr = lPoPs_ZSymbol( Z ) ) == NULL ) {
114  smr_setReportError2( smr, PoPs_smr_ID, PoPs_errorToken_badName, "string '%s' not a value ZA; Z = %d is not supported", name, Z );
115  return( -1 );
116  }
117  sprintf( name_, "%s%s", ZStr, AStr );
118  /* genre = PoPs_genre_atom; */
119  /* if( ZA == 1 ) genre = PoPs_genre_baryon; */
120  } }
121  else {
122  strcpy( name_, name );
123  ZA = -1;
124  if( strcmp( name, "neutron" ) == 0 ) {
125  strcpy( name_, "n" );
126  alias = name;
127  /* genre = PoPs_genre_baryon; */ }
128  else if( strcmp( name, "electron" ) == 0 ) {
129  strcpy( name_, "e-" );
130  alias = name;
131  /* genre = PoPs_genre_lepton; */ }
132  else if( strcmp( name, "positron" ) == 0 ) {
133  strcpy( name_, "e+" );
134  alias = name;
135  /* genre = PoPs_genre_lepton; */ }
136  else if( ( strcmp( name, "h1" ) == 0 ) || ( strcmp( name, "proton" ) == 0 ) ) {
137  ZA = 2; }
138  else if( ( strcmp( name, "d" ) == 0 ) || ( strcmp( name, "deuteron" ) == 0 ) ) {
139  ZA = 3; }
140  else if( ( strcmp( name, "t" ) == 0 ) || ( strcmp( name, "triton" ) == 0 ) ) {
141  ZA = 4; }
142  else if( strcmp( name, "helium3" ) == 0 ) {
143  ZA = 5; }
144  else if( ( strcmp( name, "a" ) == 0 ) || ( strcmp( name, "alpha" ) == 0 ) || ( strcmp( name, "helium4" ) == 0 ) ) {
145  ZA = 6; }
146  else if( ( strcmp( name, "g" ) == 0 ) || ( strcmp( name, "gamma" ) == 0 ) ) {
147  ZA = 7; }
148  else if( strcmp( name, "FP" ) == 0 ) {
149  strcpy( name_, "FissionProductENDL99120" );
150  /* genre = PoPs_genre_atom; */
151  }
152  if( ZA != -1 ) {
153  strcpy( name_, yiNames[ZA-2] );
154  alias = name;
155  /* genre = yiGenres[ZA-2]; */
156  }
157  }
158 
159  if( ( pop = PoPs_particleCreateLoadInfo( smr, name_ ) ) == NULL ) {
160  smr_setReportError2( smr, PoPs_smr_ID, PoPs_errorToken_badName, "particle '%s' converted to name '%s' not in database", name, name_ );
161  return( -1 );
162  }
163  if( ( pop_ = PoPs_addParticleIfNeeded( smr, pop ) ) != pop ) PoP_free( pop ); /* Still need to add alias as index was < 0. */
164  index = pop_->index;
165 
166  if( PoPs_particleIndex( name ) < 0 ) {
167  if( ( pop = PoP_makeAlias( smr, name_, name ) ) == NULL ) return( -1 );
168  if( ( pop_ = PoPs_addParticleIfNeeded( smr, pop ) ) != pop ) return( -1 ); /* pop_ should be pop as index was < 0. */
169  }
170 
171  if( alias != NULL ) {
172  if( PoPs_particleIndex( alias ) < 0 ) {
173  if( ( pop = PoP_makeAlias( smr, name_, alias ) ) == NULL ) return( -1 );
174  if( ( pop_ = PoPs_addParticleIfNeeded( smr, pop ) ) != pop ) return( -1 ); /* Required for some yis. */
175  }
176  }
177  }
178  return( index );
179 }
180 /*
181 ========================================================================
182 */
183 static char const *lPoPs_ZSymbol( int Z ) {
184 
185  //Coverity #63066
186  if( ( Z < 0 ) || ( Z >= nZs ) ) return( NULL );
187  return( Zs[Z].Symbol );
188 }
189 
190 #if defined __cplusplus
191 }
192 #endif
const XML_Char * name
Definition: expat.h:151
PoP * PoP_makeAlias(statusMessageReporting *smr, char const *name, char const *alias)
Definition: PoPs.cc:647
static char const * lPoPs_ZSymbol(int Z)
Definition: lPoPs.cc:183
char const * Symbol
Definition: lPoPs.cc:16
static struct ZLabels Zs[]
int Z
Definition: lPoPs.cc:15
int lPoPs_addParticleIfNeeded(statusMessageReporting *smr, char const *name, char const *special)
Definition: lPoPs.cc:36
int PoPs_smr_ID
Definition: PoPs.cc:35
double A(double temperature)
#define smr_setReportError2(smr, libraryID, code, fmt,...)
int index
Definition: PoPs.h:46
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
PoP * PoPs_addParticleIfNeeded(statusMessageReporting *smr, PoP *pop)
Definition: PoPs.cc:113
PoP * PoP_free(PoP *pop)
Definition: PoPs.cc:558
Definition: PoPs.h:45
Definition: lPoPs.cc:14
PoP * PoPs_particleCreateLoadInfo(statusMessageReporting *smr, const char *name)
Definition: PoPs_data.cc:61
static const int nZs
Definition: lPoPs.cc:30
int PoPs_particleIndex(char const *name)
Definition: PoPs.cc:204