15#define PoPI_gaugeBosonsChars "gaugeBosons"
16#define PoPI_leptonsChars "leptons"
17#define PoPI_baryonsChars "baryons"
18#define PoPI_unorthodoxesChars "unorthodoxes"
20#define MsgSize (8 * 1024)
22#define __func__ __FUNCTION__
27static void parseAliases(
HAPI::Node const &a_node, Database *a_DB );
88 addFile( a_fileName.c_str( ), a_warnIfDuplicate );
123 snprintf( Msg,
MsgSize,
"ERROR: in file '%s' in method '%s': %s.", __FILE__, __func__, result.
description( ) );
151 std::string s_name( child.name( ) );
154 m_gaugeBosons.appendFromParentNode( child,
this,
this ); }
156 m_leptons.appendFromParentNode( child,
this,
this ); }
158 m_baryons.appendFromParentNode( child,
this,
this ); }
160 m_chemicalElements.appendFromParentNode( child,
this,
this ); }
162 m_unorthodoxes.appendFromParentNode( child,
this,
this ); }
164 parseAliases( child,
this ); }
169 std::vector<Alias *> unresolvedAliases2;
170 for( std::vector<Alias *>::iterator iter = m_unresolvedAliases.begin( ); iter != m_unresolvedAliases.end( ); ++iter ) {
171 auto pidIter = m_idsMap.find( (*iter)->pid( ) );
173 if( pidIter == m_idsMap.end( ) ) {
174 unresolvedAliases2.push_back( *iter ); }
176 (*iter)->setPidIndex( pidIter->second );
179 m_unresolvedAliases.clear( );
180 for(
auto iter = unresolvedAliases2.begin( ); iter != unresolvedAliases2.end( ); ++iter ) {
181 m_unresolvedAliases.push_back( *iter );
192static void parseAliases( HAPI::Node
const &a_node,
Database *a_DB ) {
194 for( HAPI::Node child = a_node.
first_child( ); !child.
empty( ); child.to_next_sibling( ) ) {
195 std::string
name = child.name( );
205 throw Exception(
"Node '" + name +
"' not supported as a child node of PoPs/aliases." );
207 a_DB->addAlias(
alias );
217 for( std::vector<Alias *>::iterator iter = m_aliases.begin( ); iter != m_aliases.end( ); ++iter )
delete *iter;
228 std::vector<std::string> ids;
230 for( std::vector<Alias *>::const_iterator iter = m_unresolvedAliases.begin( ); iter != m_unresolvedAliases.end( ); ++iter ) {
231 ids.push_back( (*iter)->ID( ) );
248 auto iter = m_idsMap.find( a_id );
249 if( iter == m_idsMap.end( ) ) {
250 std::string errorMessage(
"particle '" + a_id +
"' not in database -3." );
254 return( iter->second );
268 if( a_index >= m_list.size( ) )
return(
false );
282 auto iter = m_idsMap.find( a_id );
283 return( iter != m_idsMap.end( ) );
296 return( m_intidsMap.find( a_intid ) != m_intidsMap.end( ) );
309 std::vector<std::string> ids;
311 for(
auto aliasIter = m_aliases.begin( ); aliasIter != m_aliases.end( ); ++aliasIter ) {
312 if(
final( (*aliasIter)->pid( ) ) == a_id ) ids.push_back( (*aliasIter)->ID( ) );
329std::string
Database::final( std::string
const &a_id,
bool a_returnAtMetaStableAlias )
const {
331 std::size_t index(
final( (*
this)[a_id], a_returnAtMetaStableAlias ) );
333 return( m_list[index]->ID( ) );
347std::size_t
Database::final( std::size_t a_index,
bool a_returnAtMetaStableAlias )
const {
351 a_index = ((
Alias *) m_list[a_index])->pidIndex( );
368 Base const *base =
nullptr;
370 auto iter = m_idsMap.find( a_id );
371 if( iter != m_idsMap.end( ) ) {
372 std::string finalId =
final( a_id );
373 iter = m_idsMap.find( finalId );
374 base = m_list[iter->second]; }
376 auto iter2 = m_symbolMap.find( a_id );
377 if( iter2 != m_symbolMap.end( ) ) base = m_symbolList[iter2->second];
380 if( base !=
nullptr ) {
402 Base const *base =
nullptr;
404 auto iter = m_idsMap.find( a_id );
405 if( iter != m_idsMap.end( ) ) {
406 std::string finalId =
final( a_id );
407 iter = m_idsMap.find( finalId );
408 base = m_list[iter->second]; }
410 auto iter2 = m_symbolMap.find( a_id );
411 if( iter2 != m_symbolMap.end( ) ) base = m_symbolList[iter2->second];
414 if( base !=
nullptr ) {
437 intid2 = base.
intid( );
477 auto iter = m_intidsMap.find( a_intid );
478 if( iter == m_intidsMap.end( ) ) {
482 return( iter->second );
495 std::size_t index = m_list.size( );
497 m_idsMap[a_item->
ID( )] = index;
498 m_list.push_back( a_item );
501 if( a_item->
intid( ) > 0 ) m_intidsMap[a_item->
intid( )] = index;
503 if( a_item->
isAlias( ) ) m_unresolvedAliases.push_back( (
Alias *) a_item );
520 std::size_t index = m_symbolList.size( );
522 m_symbolMap[a_item->
symbol( )] = index;
523 m_symbolList.push_back( a_item );
538 std::vector<std::string> &a_extraGammaBranchStates )
const {
542 if( a_pops2 !=
nullptr ) {
544 for(
auto iter = a_extraGammaBranchStates.begin( ); iter != a_extraGammaBranchStates.end( ); ++iter ) {
550 std::vector<NuclideGammaBranchStateInfo *> &nuclideGammaBranchStateInfos = a_nuclideGammaBranchStateInfos.
nuclideGammaBranchStateInfos( );
551 for( std::size_t i1 = 0; i1 < nuclideGammaBranchStateInfos.size( ); ++i1 ) {
566 for( std::size_t i1 = 0; i1 < m_chemicalElements.size( ); ++i1 ) {
596 std::string indent1(
"" );
597 std::vector<std::string> XMLList;
599 XMLList.push_back(
"<?xml version=\"1.0\"?>" );
602 std::ofstream fileio;
603 fileio.open( a_fileName.c_str( ) );
604 for( std::vector<std::string>::iterator iter = XMLList.begin( ); iter != XMLList.end( ); ++iter ) {
605 fileio << *iter << std::endl;
619 std::string indent2 = a_indent1 +
" ";
620 std::string indent3 = indent2 +
" ";
622 std::string header1 = a_indent1 +
"<PoPs name=\"" + m_name +
"\" version=\"" + m_version +
"\" format=\"" + m_formatVersion.format( ) +
"\">";
623 a_XMLList.push_back( std::move( header1 ) );
625 if( m_aliases.size( ) > 0 ) {
627 a_XMLList.push_back( std::move( header2 ) );
628 for( std::vector<Alias *>::const_iterator iter = m_aliases.begin( ); iter != m_aliases.end( ); ++iter )
629 (*iter)->toXMLList( a_XMLList, indent3 );
632 m_gaugeBosons.toXMLList( a_XMLList, indent2 );
633 m_leptons.toXMLList( a_XMLList, indent2 );
634 m_baryons.toXMLList( a_XMLList, indent2 );
635 m_unorthodoxes.toXMLList( a_XMLList, indent2 );
636 m_chemicalElements.toXMLList( a_XMLList, indent2 );
649 for(
auto iter = m_idsMap.begin( ); iter != m_idsMap.end( ); ++iter ) {
650 std::string label( iter->first );
651 std::size_t index = iter->second;
652 Base *item = m_list[index];
653 std::string is_alias(
"" );
654 std::string mass(
"" );
657 is_alias =
" is an alias (final is label = '";
658 std::size_t finalIndex =
final( index );
660 is_alias += std::string( myfinal.
ID( ) );
661 is_alias += std::string(
"')" ); }
666 double dmass =
particle->massValue(
"amu" );
669 mass =
" particle has no mass data.";
673 std::cout << iter->first <<
" (" << item->
ID( ) <<
") --> ";
674 if( a_printIndices ) std::cout << index <<
" (" << item->
index( ) <<
")";
675 std::cout << is_alias << mass << std::endl;
#define PoPI_versionChars
#define PoPI_particleChars
#define PoPI_aliasesChars
#define PoPI_chemicalElementsChars
#define PoPI_metaStableChars
#define PoPI_unorthodoxesChars
#define PoPI_baryonsChars
#define PoPI_gaugeBosonsChars
#define PoPI_leptonsChars
std::string const value() const
virtual Node first_child()=0
Attribute attribute(const char *a_name) const
void setIndex(std::size_t a_index)
std::size_t index(void) const
Particle_class Class(void) const
bool isChemicalElement() const
virtual bool isParticle() const
std::string const & ID(void) const
void calculateNuclideGammaBranchStateInfos(PoPI::Database const &a_pops, NuclideGammaBranchStateInfos &a_nuclideGammaBranchStateInfos) const
std::vector< std::string > aliasReferences(std::string const &a_id)
std::string isotopeSymbol(std::string const &a_id) const
bool existsIntid(int a_intid) const
std::size_t addSymbol(SymbolBase *a_item)
LUPI::FormatVersion const & formatVersion(void) const
void toXMLList(std::vector< std::string > &a_XMLList, std::string const &a_indent1) const
void addFile(char const *a_fileName, bool a_warnIfDuplicate)
double massValue(std::string const &a_id, std::string const &a_unit) const
void print(bool a_printIndices)
std::size_t operator[](std::string const &a_id) const
T const & get(std::string const &a_id) const
std::string final(std::string const &a_id, bool a_returnAtMetaStableAlias=false) const
bool exists(std::string const &a_id) const
void addDatabase(std::string const &a_string, bool a_warnIfDuplicate)
bool isMetaStableAlias(std::string const &a_id) const
void calculateNuclideGammaBranchStateInfos2(NuclideGammaBranchStateInfos &a_nuclideGammaBranchStateInfos) const
Particle const & particle(std::string const &a_id) const
void saveAs(std::string const &a_fileName) const
IDBase const & idBase(std::string const &a_id) const
std::string chemicalElementSymbol(std::string const &a_id) const
std::size_t indexFromIntid(int a_intid) const
std::vector< std::string > unresolvedAliasIds() const
int intid(std::string const &a_id) const
bool isAlias(std::string const &a_id) const
std::size_t add(Base *a_item)
void calculateNuclideGammaBranchStateInfos(NuclideGammaBranchStateInfos &a_nuclideGammaBranchStateInfos, Database const *a_pops2, std::vector< std::string > &a_extraGammaBranchStates) const
void calculateDerivedData(NuclideGammaBranchStateInfos &a_nuclideGammaBranchStateInfos)
std::vector< NuclideGammaBranchStateInfo * > & nuclideGammaBranchStateInfos()
void calculateNuclideGammaBranchStateInfos(PoPI::Database const &a_pops, NuclideGammaBranchStateInfos &a_nuclideGammaBranchStateInfos, bool a_alwaysAdd=false) const
virtual double massValue(char const *a_unit) const
std::string const & symbol() const
xml_parse_result load_string(const char_t *contents, unsigned int options=parse_default)
xml_node first_child() const
const char * name(G4int ptype)
std::string argumentsToString(char const *a_format,...)
bool supportedFormat(LUPI::FormatVersion const &a_formatVersion)
void appendXMLEnd(std::vector< std::string > &a_XMLList, std::string const &a_label)
const char * description() const