diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ad51c09ff9454132f5a4a3c945aeb81c7deaaee..599f51c198a3ada009c0c075ed08730b0c0bb34b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,7 @@ after the configuration or use ccmake or cmake-gui. * GAUDI_GENCONF_NO_FAIL * Compile options * GAUDI_ENABLE_GAUDIALG + * GAUDI_ENABLE_GAUDIPARTPROP * GAUDI_REFLEX_COMPONENT_ALIASES * Doxygen * DOXYGEN_WITH_LOCAL_MATHJAX @@ -110,7 +111,10 @@ string(APPEND GAUDI_OPTIONAL_DEPENDENCIES "set(GAUDI_USE_PYTHON_MAJOR ${GAUDI_US list(PREPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules") # (Find*.cmake) include(cmake/GaudiDependencies.cmake) -string(APPEND GAUDI_OPTIONAL_DEPENDENCIES "set(GAUDI_ENABLE_GAUDIALG ${GAUDI_ENABLE_GAUDIALG})\n") +string(APPEND GAUDI_OPTIONAL_DEPENDENCIES " +set(GAUDI_ENABLE_GAUDIALG ${GAUDI_ENABLE_GAUDIALG}) +set(GAUDI_ENABLE_GAUDIPARTPROP ${GAUDI_ENABLE_GAUDIPARTPROP}) +") # The C++ standard used must be the same as ROOT's if(NOT GAUDI_CXX_STANDARD) diff --git a/GaudiExamples/CMakeLists.txt b/GaudiExamples/CMakeLists.txt index f5c56310e343f5e1d2ddee3770b426778ae280d6..cd8c22d862127d56625fe7d929150e2691b52a45 100644 --- a/GaudiExamples/CMakeLists.txt +++ b/GaudiExamples/CMakeLists.txt @@ -1,5 +1,5 @@ ##################################################################################### -# (c) Copyright 1998-2021 CERN for the benefit of the LHCb and ATLAS collaborations # +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # # # # This software is distributed under the terms of the Apache version 2 licence, # # copied verbatim in the file "LICENSE". # @@ -127,8 +127,7 @@ if(GAUDI_USE_AIDA) target_link_libraries(GaudiExamples PRIVATE AIDA::aida) endif() if(GAUDI_USE_HEPPDT) - target_sources(GaudiExamples PRIVATE src/PartProp/GaudiPPS.cpp - src/PartProp/PartPropExa.cpp) + target_sources(GaudiExamples PRIVATE src/PartProp/PartPropExa.cpp) target_link_libraries(GaudiExamples PRIVATE HepPDT::heppdt) endif() if(TARGET RootCnvLib) @@ -137,6 +136,13 @@ if(TARGET RootCnvLib) src/MultiInput/MIWriteAlg.cpp) target_link_libraries(GaudiExamples PRIVATE RootCnvLib) endif() +if(GAUDI_ENABLE_GAUDIPARTPROP) + target_sources(GaudiExamples PRIVATE + src/PartProp/GaudiPPS.cpp + src/PartProp/PartPropAlg.cpp + ) + target_link_libraries(GaudiExamples PRIVATE Gaudi::GaudiPartProp) +endif() # Build the executable gaudi_add_executable(Allocator @@ -188,6 +194,12 @@ if(BUILD_TESTING) PROPERTIES DISABLED TRUE ) endif() + if(NOT GAUDI_ENABLE_GAUDIPARTPROP) + set_tests_properties( + GaudiExamples.particlepropsvc + PROPERTIES DISABLED TRUE + ) + endif() endif() gaudi_add_pytest(tests/pytest) diff --git a/GaudiExamples/src/PartProp/GaudiPPS.cpp b/GaudiExamples/src/PartProp/GaudiPPS.cpp index 88678b1d3c3d38ae78eabdf68057f8f998f7beee..e66878360623dcca94f927f05cd864d3071fed7b 100644 --- a/GaudiExamples/src/PartProp/GaudiPPS.cpp +++ b/GaudiExamples/src/PartProp/GaudiPPS.cpp @@ -1,5 +1,5 @@ /***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * * * * This software is distributed under the terms of the Apache version 2 licence, * * copied verbatim in the file "LICENSE". * @@ -8,45 +8,29 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \***********************************************************************************/ -// Include files -// from Gaudi -#include "GaudiKernel/IParticlePropertySvc.h" +#include <Gaudi/Functional/Consumer.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> -// local -#include "GaudiPPS.h" - -//----------------------------------------------------------------------------- -// Implementation file for class : GaudiPPS -// -// 2008-05-23 : Marco CLEMENCIC -//----------------------------------------------------------------------------- namespace GaudiExamples { - // Declaration of the Algorithm Factory - DECLARE_COMPONENT( GaudiPPS ) - - //============================================================================= - // Initialization - //============================================================================= - StatusCode GaudiPPS::initialize() { - StatusCode sc = Algorithm::initialize(); // must be executed first - if ( sc.isFailure() ) return sc; // error printed already by Algorithm - - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; - - auto pps = service<IParticlePropertySvc>( "Gaudi::ParticlePropertySvc", true ); - - return StatusCode::SUCCESS; - } - - //============================================================================= - // Main execution - //============================================================================= - StatusCode GaudiPPS::execute() { - - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Execute" << endmsg; - - return StatusCode::SUCCESS; - } + /** Small algorithm using Gaudi::ParticlePropertySvc. + * + * @author Marco CLEMENCIC + * @date 2008-05-23 + */ + struct GaudiPPS : public Gaudi::Functional::Consumer<void()> { + using Consumer::Consumer; + + StatusCode initialize() override { + return Consumer::initialize().andThen( [&] { + using Gaudi::Interfaces::IParticlePropertySvc; + if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; + auto pps = service<IParticlePropertySvc>( "Gaudi::ParticlePropertySvc", true ); + } ); + } + void operator()() const override { + if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Execute" << endmsg; + } + }; + DECLARE_COMPONENT( GaudiPPS ) } // namespace GaudiExamples -//============================================================================= diff --git a/GaudiExamples/src/PartProp/PartPropAlg.cpp b/GaudiExamples/src/PartProp/PartPropAlg.cpp new file mode 100644 index 0000000000000000000000000000000000000000..efd22f4768ebc9f8c4c446113d5ae03920d764ce --- /dev/null +++ b/GaudiExamples/src/PartProp/PartPropAlg.cpp @@ -0,0 +1,167 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <iostream> + +#include "PartPropAlg.h" + +Gaudi::Examples::PartPropAlg::PartPropAlg( const std::string& name, ISvcLocator* pSvcLocator ) + : Gaudi::Algorithm( name, pSvcLocator ) {} + +StatusCode Gaudi::Examples::PartPropAlg::initialize() { + StatusCode sc = Algorithm::initialize(); // initialize the base + if ( sc.isFailure() ) { return sc; } + // locate particle property service + Gaudi::Examples::PartPropAlg::ppSvc(); + return StatusCode::SUCCESS; +} + +StatusCode Gaudi::Examples::PartPropAlg::finalize() { + // release the aquired service + m_ppSvc.reset(); + return Algorithm::finalize(); // finalize the base +} + +// locate the new particle property service +const Gaudi::Interfaces::IParticlePropertySvc* Gaudi::Examples::PartPropAlg::ppSvc() const { + if ( !m_ppSvc ) { + m_ppSvc = service( "Gaudi::ParticlePropertySvc", true ); + if ( !m_ppSvc ) { + throw GaudiException( "Service [Gaudi::ParticlePropertySvc] not found", name(), StatusCode::FAILURE ); + } + } + return m_ppSvc.get(); +} + +// execute the algorithm +StatusCode Gaudi::Examples::PartPropAlg::execute( const EventContext& ctx ) const { + // get the service + const Gaudi::Interfaces::IParticlePropertySvc* svc = ppSvc(); + + if ( !svc ) { return StatusCode::FAILURE; } + if ( !ctx.valid() ) { return StatusCode::FAILURE; } + + // avoid long names + typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties PPs; + + MsgStream log( msgSvc(), name() ); + + { // get all invalid + PPs invalid; + svc->get( + // functor : invalid + []( const Gaudi::ParticleProperty* pp ) { return !pp->pid().isValid(); }, + // output + std::back_inserter( invalid ) ); + // print as the table + // header ? + log << MSG::INFO << " # Invalid = " << invalid.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( invalid, log, svc ); + log << endmsg; + } + + { // get all not from quarks + PPs noquarks; + svc->get( + // functor : has no quarks + []( const Gaudi::ParticleProperty* pp ) { return !pp->pid().hasQuarks(); }, + // output + std::back_inserter( noquarks ) ); + // print as the table + // header ? + log << MSG::INFO << " # Has no quarks = " << noquarks.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( noquarks, log, svc ); + log << endmsg; + } + + { // get all 'fundamental' + PPs fundamental; + svc->get( + // functor : fundamental + []( const Gaudi::ParticleProperty* pp ) { + auto fid = pp->pid().fundamentalID(); + return 0 < fid && 100 >= fid; + }, + // output + std::back_inserter( fundamental ) ); + // print as the table + // header ? + log << MSG::INFO << " # Fundamental (0,100] = " << fundamental.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( fundamental, log, svc ); + log << endmsg; + } + + { // get all leptons + PPs leptons; + svc->get( + // functor : lepton + []( const Gaudi::ParticleProperty* pp ) { return pp->pid().isLepton(); }, + // output + std::back_inserter( leptons ) ); + // print as the table + // header ? + log << MSG::INFO << " # Leptons = " << leptons.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( leptons, log, svc ); + log << endmsg; + } + + { // get all long-lived (>1um) + PPs longlived; + svc->get( + // functor : ctau>1um + []( const Gaudi::ParticleProperty* pp ) { return pp->ctau() > 1 * Gaudi::Units::micrometer; }, + // output + std::back_inserter( longlived ) ); + // print as the table + // header ? + log << MSG::INFO << " # Long-lived(>1mu) = " << longlived.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( longlived, log, svc ); + log << endmsg; + } + + { // get all nuclea + PPs nuclea; + svc->get( + // functor : nucleus + []( const Gaudi::ParticleProperty* pp ) { return pp->pid().isNucleus(); }, + // output + std::back_inserter( nuclea ) ); + // print as the table + // header ? + log << MSG::INFO << " # Nuclea = " << nuclea.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( nuclea, log, svc ); + log << endmsg; + } + + { // get all beauty baryons + PPs bbaryons; + svc->get( + // functor : beauty & baryon + []( const Gaudi::ParticleProperty* pp ) { return pp->pid().hasBottom() && pp->pid().isBaryon(); }, + // output + std::back_inserter( bbaryons ) ); + // print as the table + // header ? + log << MSG::INFO << " # Beauty Baryons = " << bbaryons.size() << std::endl; + // content + Gaudi::ParticleProperties::printAsTable( bbaryons, log, svc ); + log << endmsg; + } + + return StatusCode::SUCCESS; +} + +DECLARE_COMPONENT( Gaudi::Examples::PartPropAlg ) diff --git a/GaudiExamples/src/PartProp/PartPropAlg.h b/GaudiExamples/src/PartProp/PartPropAlg.h new file mode 100644 index 0000000000000000000000000000000000000000..038e96ab9fffcfcba8a3d10e50aee39e10ef49e0 --- /dev/null +++ b/GaudiExamples/src/PartProp/PartPropAlg.h @@ -0,0 +1,44 @@ +/***********************************************************************************\ +* (c) Copyright 2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#ifndef GAUDIEXAMPLES_PARTPROPALG_H +#define GAUDIEXAMPLES_PARTPROPALG_H + +#include <Gaudi/Algorithm.h> + +#include "Gaudi/ParticleID.h" +#include "Gaudi/ParticleProperty.h" +#include <Gaudi/Interfaces/IParticlePropertySvc.h> + +namespace Gaudi { + namespace Examples { + /** @class PartPropAlg + * @brief an algorithm to test the particle property service + * @author Graeme Stewart + * @author author Vanya Belyaev + */ + class PartPropAlg : public Gaudi::Algorithm { + + public: + PartPropAlg( const std::string& name, ISvcLocator* pSvcLocator ); + StatusCode initialize() override; + StatusCode execute( const EventContext& ctx ) const override; + StatusCode finalize() override; + + const Gaudi::Interfaces::IParticlePropertySvc* ppSvc() const; + + private: + // the pointer to new particle property service + mutable SmartIF<Gaudi::Interfaces::IParticlePropertySvc> m_ppSvc; // new part.property.svc + }; + } // namespace Examples +} // namespace Gaudi + +#endif // GAUDIEXAMPLES_PARTPROPALG_H diff --git a/GaudiExamples/tests/data/ParticleTable.txt b/GaudiExamples/tests/data/ParticleTable.txt index e35a084ed85a04fb27569cfe4473252677f63ef3..1db00136629a4f760fad3ee20a965e1a607fcd84 100644 --- a/GaudiExamples/tests/data/ParticleTable.txt +++ b/GaudiExamples/tests/data/ParticleTable.txt @@ -1,25 +1,986 @@ -# -# Example of a file containing particle properties for ParticlePropertySvc, -# EvtGen and Pythia. +# ParticleTable.txt file containing particle +# properties for ParticlePropertySvc, EvtGen and Pythia. +# Uses PDG 2014 when available. # PARTICLE # -# GEANTID PDGID CHARGE MASS(GeV) TLIFE(s) EVTGENNAME PYTHIAID MAXWIDTH +# GEANTID PDGID CHARGE MASS(GeV) TLIFE(s) EVTGENNAME PYTHIAID MAXWIDTH # - gamma 1 22 0.0 0.000000e+000 1.000000e+016 gamma 22 0.000000e+000 - e+ 2 -11 1.0 5.109989e-004 1.000000e+016 e+ -11 0.000000e+000 - e- 3 11 -1.0 5.109989e-004 1.000000e+016 e- 11 0.000000e+000 - nu 4 12 0.0 0.000000e+000 1.000000e+016 nu_e 12 0.000000e+000 - mu+ 5 -13 1.0 0.105658 2.197036e-006 mu+ -13 0.000000e+000 - mu- 6 13 -1.0 0.105658 2.197036e-006 mu- 13 0.000000e+000 - pi0 7 111 0.0 0.134977 8.438618e-017 pi0 111 0.000000e+000 - pi+ 8 211 1.0 0.139570 2.603276e-008 pi+ 211 0.000000e+000 - pi- 9 -211 -1.0 0.139570 2.603276e-008 pi- -211 0.000000e+000 - KL0 10 130 0.0 0.497672 5.174624e-008 K_L0 130 0.000000e+000 - K+ 11 321 1.0 0.493677 1.238405e-008 K+ 321 0.000000e+000 - K- 12 -321 -1.0 0.493677 1.238405e-008 K- -321 0.000000e+000 - n0 13 2112 0.0 0.939565 885.646128 n0 2112 0.000000e+000 - p+ 14 2212 1.0 0.938272 1.000000e+016 p+ 2212 0.000000e+000 - p~- 15 -2212 -1.0 0.938272 1.000000e+016 anti-p- -2212 0.000000e+000 + gamma 1 22 0.0 0.00000000 1.000000e+16 gamma 22 0.00000000 + W+ 53 24 1.0 80.37900000 3.156893e-25 W+ 24 0.00000000 + W- 54 -24 -1.0 80.37900000 3.156893e-25 W- -24 0.00000000 + Z0 55 23 0.0 91.18760000 2.637914e-25 Z0 23 0.00000000 + e+ 2 -11 1.0 0.00051100 1.000000e+16 e+ -11 0.00000000 + e- 3 11 -1.0 0.00051100 1.000000e+16 e- 11 0.00000000 + nu_e 4 12 0.0 0.00000000 1.000000e+16 nu_e 12 0.00000000 + nu_e~ 302 -12 0.0 0.00000000 1.000000e+16 anti-nu_e -12 0.00000000 + mu+ 5 -13 1.0 0.10565837 2.196981e-06 mu+ -13 0.00000000 + mu- 6 13 -1.0 0.10565837 2.196981e-06 mu- 13 0.00000000 + nu_mu 300 14 0.0 0.00000000 1.000000e+16 nu_mu 14 0.00000000 + nu_mu~ 301 -14 0.0 0.00000000 1.000000e+16 anti-nu_mu -14 0.00000000 + tau+ 51 -15 1.0 1.77686000 2.903449e-13 tau+ -15 0.00000000 + tau- 52 15 -1.0 1.77686000 2.903449e-13 tau- 15 0.00000000 + pi0 7 111 0.0 0.13497700 8.520000e-17 pi0 111 0.00000000 + pi+ 8 211 1.0 0.13957061 2.603300e-08 pi+ 211 0.00000000 + pi- 9 -211 -1.0 0.13957061 2.603300e-08 pi- -211 0.00000000 + eta 17 221 0.0 0.54786200 5.063171e-19 eta 221 0.00000000 + rho(770)0 33 113 0.0 0.77526000 4.414569e-24 rho0 113 0.00000000 + rho(770)+ 34 213 1.0 0.77526000 4.414569e-24 rho+ 213 0.00000000 + rho(770)- 35 -213 -1.0 0.77526000 4.414569e-24 rho- -213 0.00000000 + omega(782) 36 223 0.0 0.78265000 7.752794e-23 omega 223 0.00000000 + eta_prime 127 331 0.0 0.95778000 3.358224e-21 eta' 331 0.00000000 + sigma_0 850 9000221 0.0 0.47500000 1.196749e-24 sigma_0 0 0.00000000 + f_0(980) 596 9010221 0.0 0.99000000 1.097020e-23 f_0 10221 0.00000000 + a_0(980)0 132 9000111 0.0 0.98000000 8.776163e-24 a_00 10111 0.00000000 + a_0(980)+ 133 9000211 1.0 0.98000000 8.776163e-24 a_0+ 10211 0.00000000 + a_0(980)- 134 -9000211 -1.0 0.98000000 8.776163e-24 a_0- -10211 0.00000000 + phi(1020) 37 333 0.0 1.01946100 1.549099e-22 phi 333 0.00000000 + h_1(1170) 597 10223 0.0 1.17000000 1.828367e-24 h_1 10223 0.00000000 + b_1(1235)0 588 10113 0.0 1.22950000 4.635297e-24 b_10 10113 0.00000000 + b_1(1235)+ 592 10213 1.0 1.22950000 4.635297e-24 b_1+ 10213 0.00000000 + b_1(1235)- 593 -10213 -1.0 1.22950000 4.635297e-24 b_1- -10213 0.00000000 + a_1(1260)0 135 20113 0.0 1.23000000 1.567172e-24 a_10 20113 0.00000000 + a_1(1260)+ 42 20213 1.0 1.23000000 1.567172e-24 a_1+ 20213 0.00000000 + a_1(1260)- 43 -20213 -1.0 1.23000000 1.567172e-24 a_1- -20213 0.00000000 + f_2(1270) 367 225 0.0 1.27550000 3.555982e-24 f_2 225 0.00000000 + f_1(1285) 687 20223 0.0 1.28190000 2.899612e-23 f_1 20223 0.00000000 + eta(1295) 811 100221 0.0 1.29400000 1.196749e-23 eta(2S) 0 0.00000000 + pi(1300)0 805 100111 0.0 1.30000000 1.645530e-24 pi(2S)0 0 0.00000000 + pi(1300)+ 807 100211 1.0 1.30000000 1.645530e-24 pi(2S)+ 0 0.00000000 + pi(1300)- 808 -100211 -1.0 1.30000000 1.645530e-24 pi(2S)- 0 0.00000000 + a_2(1320)0 136 115 0.0 1.31690000 6.151516e-24 a_20 115 0.00000000 + a_2(1320)+ 137 215 1.0 1.31690000 6.151516e-24 a_2+ 215 0.00000000 + a_2(1320)- 138 -215 -1.0 1.31690000 6.151516e-24 a_2- -215 0.00000000 + f_0(1370) 686 10221 0.0 1.35000000 1.880606e-24 f'_0 10331 0.00000000 + h_1(1380) 604 10333 0.0 1.41600000 7.313467e-24 h'_1 10333 0.00000000 + pi_1(1400)0 1021 9000113 0.0 1.35400000 1.994582e-24 pi_1(1400)0 0 0.00000000 + pi_1(1400)+ 1023 9000213 1.0 1.35400000 1.994582e-24 pi_1(1400)+ 0 0.00000000 + pi_1(1400)- 1024 -9000213 -1.0 1.35400000 1.994582e-24 pi_1(1400)- 0 0.00000000 + eta(1405)0 1025 9020221 0.0 1.40880000 1.313796e-23 eta(1405)0 0 0.00000000 + omega(1420) 812 100223 0.0 1.42500000 3.061452e-24 omega(2S) 0 0.00000000 + f_1(1420) 692 20333 0.0 1.42640000 1.198929e-23 f'_1 20333 0.00000000 + rho(1450)0 806 100113 0.0 1.46500000 1.645530e-24 rho(2S)0 0 0.00000000 + rho(1450)+ 809 100213 1.0 1.46500000 1.645530e-24 rho(2S)+ 0 0.00000000 + rho(1450)- 810 -100213 -1.0 1.46500000 1.645530e-24 rho(2S)- 0 0.00000000 + a_0(1450)0 587 10111 0.0 1.46700000 2.483820e-24 a_0(1450)0 0 0.00000000 + a_0(1450)+ 590 10211 1.0 1.46700000 2.483820e-24 a_0(1450)+ 0 0.00000000 + a_0(1450)- 591 -10211 -1.0 1.46700000 2.483820e-24 a_0(1450)- 0 0.00000000 + eta(1475) 826 100331 0.0 1.47500000 7.743673e-24 eta(1475) 0 0.00000000 + f_0(1500) 855 9030221 0.0 1.50600000 6.038644e-24 f_0(1500) 0 0.00000000 + f'_2(1525) 380 335 0.0 1.52500000 9.016605e-24 f'_2 335 0.00000000 + pi_1(1600)0 1027 9010113 0.0 1.66000000 2.742551e-24 pi_1(1600)0 0 0.00000000 + pi_1(1600)+ 1029 9010213 1.0 1.66000000 2.742551e-24 pi_1(1600)+ 0 0.00000000 + pi_1(1600)- 1030 -9010213 -1.0 1.66000000 2.742551e-24 pi_1(1600)- 0 0.00000000 + eta_2(1645) 598 10225 0.0 1.61700000 3.636531e-24 eta_2(1645) 0 0.00000000 + omega(1650) 746 30223 0.0 1.67000000 2.089563e-24 omega(1650) 0 0.00000000 + pi_2(1670)0 589 10115 0.0 1.67060000 2.551209e-24 pi_2(1670)0 0 0.00000000 + pi_2(1670)+ 594 10215 1.0 1.67060000 2.551209e-24 pi_2(1670)+ 0 0.00000000 + pi_2(1670)- 595 -10215 -1.0 1.67060000 2.551209e-24 pi_2(1670)- 0 0.00000000 + omega_3(1670) 368 227 0.0 1.66700000 3.917930e-24 omega_3(1670) 0 0.00000000 + phi(1680) 827 100333 0.0 1.68000000 4.388081e-24 phi(1680) 0 0.00000000 + rho_3(1690)0 361 117 0.0 1.68880000 4.088274e-24 rho_3(1690)0 0 0.00000000 + rho_3(1690)+ 363 217 1.0 1.68880000 4.088274e-24 rho_3(1690)+ 0 0.00000000 + rho_3(1690)- 364 -217 -1.0 1.68880000 4.088274e-24 rho_3(1690)- 0 0.00000000 + rho(1700)0 743 30113 0.0 1.72000000 2.632849e-24 rho(3S)0 0 0.00000000 + rho(1700)+ 744 30213 1.0 1.72000000 2.632849e-24 rho(3S)+ 0 0.00000000 + rho(1700)- 745 -30213 -1.0 1.72000000 2.632849e-24 rho(3S)- 0 0.00000000 + f_0(1710) 603 10331 0.0 1.70400000 5.351317e-24 f_0(1710) 0 0.00000000 + pi(1800)0 840 9010111 0.0 1.81000000 3.164482e-24 pi(1800)0 0 0.00000000 + pi(1800)+ 841 9010211 1.0 1.81000000 3.164482e-24 pi(1800)+ 0 0.00000000 + pi(1800)- 842 -9010211 -1.0 1.81000000 3.164482e-24 pi(1800)- 0 0.00000000 + phi_3(1850) 381 337 0.0 1.85400000 7.565657e-24 phi_3(1850) 0 0.00000000 + eta_2(1870) 605 10335 0.0 1.85400000 0.000000e+00 eta_2(1870) 0 0.00000000 + f_2(1950) 813 9050225 0.0 1.93600000 1.418560e-24 f_2(1950) 0 0.00000000 + f_2(2010) 828 9060225 0.0 2.01000000 3.291061e-24 f_2(2010) 0 0.00000000 + a_4(2040)0 362 119 0.0 1.96700000 2.581224e-24 a_4(2040)0 0 0.00000000 + a_4(2040)+ 365 219 1.0 1.96700000 2.581224e-24 a_4(2040)+ 0 0.00000000 + a_4(2040)- 366 -219 -1.0 1.96700000 2.581224e-24 a_4(2040)- 0 0.00000000 + f_4(2050) 369 229 0.0 2.01800000 2.777267e-24 f_4(2050) 0 0.00000000 + f_2(2300) 857 9080225 0.0 2.29700000 4.417530e-24 f_2(2300) 0 0.00000000 + f_2(2340) 858 9090225 0.0 2.35000000 2.063361e-24 f_2(2340) 0 0.00000000 + K0 370 311 0.0 0.49761100 0.000000e+00 K0 311 0.00000000 + K~0 371 -311 0.0 0.49761100 0.000000e+00 anti-K0 -311 0.00000000 + KS0 16 310 0.0 0.49761100 8.956400e-11 K_S0 310 0.00000000 + KL0 10 130 0.0 0.49761100 5.116000e-08 K_L0 130 0.00000000 + K+ 11 321 1.0 0.49367700 1.238000e-08 K+ 321 0.00000000 + K- 12 -321 -1.0 0.49367700 1.238000e-08 K- -321 0.00000000 + K*(892)0 40 313 0.0 0.89555000 1.391569e-23 K*0 313 0.00000000 + K*(892)~0 41 -313 0.0 0.89555000 1.391569e-23 anti-K*0 -313 0.00000000 + K*(892)+ 38 323 1.0 0.89166000 1.308573e-23 K*+ 323 0.00000000 + K*(892)- 39 -323 -1.0 0.89166000 1.308573e-23 K*- -323 0.00000000 + K_1(1270)0 141 10313 0.0 1.27200000 7.313469e-24 K_10 10313 0.00000000 + K_1(1270)~0 142 -10313 0.0 1.27200000 7.313469e-24 anti-K_10 -10313 0.00000000 + K_1(1270)+ 139 10323 1.0 1.27200000 7.313469e-24 K_1+ 10323 0.00000000 + K_1(1270)- 140 -10323 -1.0 1.27200000 7.313469e-24 K_1- -10323 0.00000000 + K_1(1400)0 145 20313 0.0 1.40300000 3.782829e-24 K'_10 20313 0.00000000 + K_1(1400)~0 146 -20313 0.0 1.40300000 3.782829e-24 anti-K'_10 -20313 0.00000000 + K_1(1400)+ 143 20323 1.0 1.40300000 3.782829e-24 K'_1+ 20323 0.00000000 + K_1(1400)- 144 -20323 -1.0 1.40300000 3.782829e-24 K'_1- -20323 0.00000000 + K*(1410)0 816 100313 0.0 1.42100000 2.837122e-24 K'*0 0 0.00000000 + K*(1410)~0 817 -100313 0.0 1.42100000 2.837122e-24 anti-K'*0 0 0.00000000 + K*(1410)+ 822 100323 1.0 1.42100000 2.837122e-24 K'*+ 0 0.00000000 + K*(1410)- 823 -100323 -1.0 1.42100000 2.837122e-24 K'*- 0 0.00000000 + K*_0(1430)0 149 10311 0.0 1.43000000 2.437823e-24 K_0*0 10311 0.00000000 + K*_0(1430)~0 150 -10311 0.0 1.43000000 2.437823e-24 anti-K_0*0 -10311 0.00000000 + K*_0(1430)+ 147 10321 1.0 1.43000000 2.437823e-24 K_0*+ 10321 0.00000000 + K*_0(1430)- 148 -10321 -1.0 1.43000000 2.437823e-24 K_0*- -10321 0.00000000 + K*_2(1430)0 153 315 0.0 1.43240000 6.038644e-24 K_2*0 315 0.00000000 + K*_2(1430)~0 154 -315 0.0 1.43240000 6.038644e-24 anti-K_2*0 -315 0.00000000 + K*_2(1430)+ 151 325 1.0 1.42560000 6.682357e-24 K_2*+ 325 0.00000000 + K*_2(1430)- 152 -325 -1.0 1.42560000 6.682357e-24 K_2*- -325 0.00000000 + K(1460)0 814 100311 0.0 1.43240000 0.000000e+00 K(1460)0 0 0.00000000 + K(1460)~0 815 -100311 0.0 1.43240000 0.000000e+00 anti-K(1460)0 0 0.00000000 + K(1460)+ 820 100321 1.0 1.43240000 0.000000e+00 K(1460)+ 0 0.00000000 + K(1460)- 821 -100321 -1.0 1.43240000 0.000000e+00 K(1460)- 0 0.00000000 + K*(1680)0 747 30313 0.0 1.71800000 2.056913e-24 K''*0 0 0.00000000 + K*(1680)~0 748 -30313 0.0 1.71800000 2.056913e-24 anti-K''*0 0 0.00000000 + K*(1680)+ 749 30323 1.0 1.71800000 2.056913e-24 K''*+ 0 0.00000000 + K*(1680)- 750 -30323 -1.0 1.71800000 2.056913e-24 K''*- 0 0.00000000 + K_2(1770)0 599 10315 0.0 1.77300000 3.538775e-24 K_2(1770)0 0 0.00000000 + K_2(1770)~0 600 -10315 0.0 1.77300000 3.538775e-24 anti-K_2(1770)0 0 0.00000000 + K_2(1770)+ 601 10325 1.0 1.77300000 3.538775e-24 K_2(1770)+ 0 0.00000000 + K_2(1770)- 602 -10325 -1.0 1.77300000 3.538775e-24 K_2(1770)- 0 0.00000000 + K*_3(1780)0 372 317 0.0 1.77600000 4.139699e-24 K_3*0 0 0.00000000 + K*_3(1780)~0 373 -317 0.0 1.77600000 4.139699e-24 anti-K_3*0 0 0.00000000 + K*_3(1780)+ 376 327 1.0 1.77600000 4.139699e-24 K_3*+ 0 0.00000000 + K*_3(1780)- 377 -327 -1.0 1.77600000 4.139699e-24 K_3*- 0 0.00000000 + K_2(1820)0 688 20315 0.0 1.81900000 2.493227e-24 K_2(1820)0 0 0.00000000 + K_2(1820)~0 689 -20315 0.0 1.81900000 2.493227e-24 anti-K_2(1820)0 0 0.00000000 + K_2(1820)+ 690 20325 1.0 1.81900000 2.493227e-24 K_2(1820)+ 0 0.00000000 + K_2(1820)- 691 -20325 -1.0 1.81900000 2.493227e-24 K_2(1820)- 0 0.00000000 + K*_2(1980)0 818 100315 0.0 1.97300000 0.000000e+00 K*_2(1980)0 0 0.00000000 + K*_2(1980)~0 819 -100315 0.0 1.97300000 0.000000e+00 anti-K*_2(1980)0 0 0.00000000 + K*_2(1980)+ 824 100325 1.0 1.97300000 0.000000e+00 K*_2(1980)+ 0 0.00000000 + K*_2(1980)- 825 -100325 -1.0 1.97300000 0.000000e+00 K*_2(1980)- 0 0.00000000 + K*_4(2045)0 374 319 0.0 2.04500000 3.324304e-24 K_4*0 0 0.00000000 + K*_4(2045)~0 375 -319 0.0 2.04500000 3.324304e-24 anti-K_4*0 0 0.00000000 + K*_4(2045)+ 378 329 1.0 2.04500000 3.324304e-24 K_4*+ 0 0.00000000 + K*_4(2045)- 379 -329 -1.0 2.04500000 3.324304e-24 K_4*- 0 0.00000000 + D0 58 421 0.0 1.86483000 4.101000e-13 D0 421 0.00000000 + D~0 59 -421 0.0 1.86483000 4.101000e-13 anti-D0 -421 0.00000000 + D+ 56 411 1.0 1.86965000 1.040000e-12 D+ 411 0.00000000 + D- 57 -411 -1.0 1.86965000 1.040000e-12 D- -411 0.00000000 + D*(2007)0 67 423 0.0 2.00685000 1.000003e-19 D*0 423 0.00000000 + D*(2007)~0 68 -423 0.0 2.00685000 1.000003e-19 anti-D*0 -423 0.00000000 + D*(2010)+ 65 413 1.0 2.01026000 7.892230e-21 D*+ 413 0.00000000 + D*(2010)- 66 -413 -1.0 2.01026000 7.892230e-21 D*- -413 0.00000000 + D*_0+ 155 10411 1.0 2.34900000 2.978335e-24 D_0*+ 10411 0.00000000 + D*_0- 159 -10411 -1.0 2.34900000 2.978335e-24 D_0*- -10411 0.00000000 + D*_00 163 10421 0.0 2.30000000 2.402234e-24 D_0*0 10421 0.00000000 + D*_0~0 167 -10421 0.0 2.30000000 2.402234e-24 anti-D_0*0 -10421 0.00000000 + D_1(H)0 164 20423 0.0 2.44500000 2.630000e-24 D'_10 20423 0.00000000 + D_1(H)~0 168 -20423 0.0 2.44500000 2.630000e-24 anti-D'_10 -20423 0.00000000 + D_1(H)+ 156 20413 1.0 2.44500000 2.630000e-24 D'_1+ 20413 0.00000000 + D_1(H)- 160 -20413 -1.0 2.44500000 2.630000e-24 D'_1- -20413 0.00000000 + D_1(2420)0 165 10423 0.0 2.42080000 2.428827e-23 D_10 10423 0.00000000 + D_1(2420)~0 169 -10423 0.0 2.42080000 2.428827e-23 anti-D_10 -10423 0.00000000 + D_1(2420)+ 157 10413 1.0 2.42300000 3.290000e-23 D_1+ 10413 0.00000000 + D_1(2420)- 161 -10413 -1.0 2.42300000 3.290000e-23 D_1- -10413 0.00000000 + D*_2(2460)0 170 425 0.0 2.46070000 1.385709e-23 D_2*0 425 0.00000000 + D*_2(2460)~0 166 -425 0.0 2.46070000 1.385709e-23 anti-D_2*0 -425 0.00000000 + D*_2(2460)+ 162 415 1.0 2.46540000 1.778952e-23 D_2*+ 415 0.00000000 + D*_2(2460)- 158 -415 -1.0 2.46540000 1.778952e-23 D_2*- -415 0.00000000 + D(2S)0 761 100421 0.0 2.58000000 0.000000e+00 D(2S)0 0 0.00000000 + D(2S)~0 762 -100421 0.0 2.58000000 0.000000e+00 anti-D(2S)0 0 0.00000000 + D(2S)+ 757 100411 1.0 2.58000000 0.000000e+00 D(2S)+ 0 0.00000000 + D(2S)- 758 -100411 -1.0 2.58000000 0.000000e+00 D(2S)- 0 0.00000000 + D*(2640)0 763 100423 0.0 2.64000000 0.000000e+00 D*(2S)0 0 0.00000000 + D*(2640)~0 764 -100423 0.0 2.64000000 0.000000e+00 anti-D*(2S)0 0 0.00000000 + D*(2640)+ 759 100413 1.0 2.64000000 0.000000e+00 D*(2S)+ 0 0.00000000 + D*(2640)- 760 -100413 -1.0 2.64000000 0.000000e+00 D*(2S)- 0 0.00000000 + D_s+ 60 431 1.0 1.96834000 5.043770e-13 D_s+ 431 0.00000000 + D_s- 61 -431 -1.0 1.96834000 5.043770e-13 D_s- -431 0.00000000 + D*_s+ 69 433 1.0 2.11220000 1.000003e-19 D_s*+ 433 0.00000000 + D*_s- 70 -433 -1.0 2.11220000 1.000003e-19 D_s*- -433 0.00000000 + D*_s0+ 171 10431 1.0 2.31780000 6.582100e-22 D_s0*+ 10431 0.00000000 + D*_s0- 175 -10431 -1.0 2.31780000 6.582100e-22 D_s0*- -10431 0.00000000 + D_s1(2460)+ 172 20433 1.0 2.45950000 6.582100e-22 D_s1+ 20433 0.00000000 + D_s1(2460)- 176 -20433 -1.0 2.45950000 6.582100e-22 D_s1- -20433 0.00000000 + D_s1(2536)+ 173 10433 1.0 2.53511000 7.154480e-22 D'_s1+ 10433 0.00000000 + D_s1(2536)- 177 -10433 -1.0 2.53511000 7.154480e-22 D'_s1- -10433 0.00000000 + D*_s2+ 174 435 1.0 2.56910000 3.894746e-23 D_s2*+ 435 0.00000000 + D*_s2- 178 -435 -1.0 2.56910000 3.894746e-23 D_s2*- -435 0.00000000 + B0 73 511 0.0 5.27964000 1.520120e-12 B0 511 0.00000000 + B~0 74 -511 0.0 5.27964000 1.520120e-12 anti-B0 -511 0.00000000 + B0H 99998 510 0.0 5.27958000 1.519000e-12 B0H 0 0.00000000 + B0L 99999 150 0.0 5.27958000 1.519000e-12 B0L 0 0.00000000 + B+ 71 521 1.0 5.27933000 1.638158e-12 B+ 521 0.00000000 + B- 72 -521 -1.0 5.27933000 1.638158e-12 B- -521 0.00000000 + B*0 189 513 0.0 5.32470000 1.000019e-19 B*0 513 0.00000000 + B*~0 190 -513 0.0 5.32470000 1.000019e-19 anti-B*0 -513 0.00000000 + B*- 187 -523 -1.0 5.32470000 1.000019e-19 B*- -523 0.00000000 + B*+ 188 523 1.0 5.32470000 1.000019e-19 B*+ 523 0.00000000 + B*_00 201 10511 0.0 5.73800000 4.390000e-24 B_0*0 10511 0.00000000 + B*_0~0 205 -10511 0.0 5.73800000 4.390000e-24 anti-B_0*0 -10511 0.00000000 + B*_0+ 193 10521 1.0 5.73800000 4.390000e-24 B_0*+ 10521 0.00000000 + B*_0- 197 -10521 -1.0 5.73800000 4.390000e-24 B_0*- -10521 0.00000000 + B_1(H)0 202 20513 0.0 5.75700000 2.630000e-24 B'_10 20513 0.00000000 + B_1(H)~0 206 -20513 0.0 5.75700000 2.630000e-24 anti-B'_10 -20513 0.00000000 + B_1(H)+ 194 20523 1.0 5.75700000 2.630000e-24 B'_1+ 20523 0.00000000 + B_1(H)- 198 -20523 -1.0 5.75700000 2.630000e-24 B'_1- -20523 0.00000000 + B_1(L)0 203 10513 0.0 5.72610000 3.134000e-23 B_10 10513 0.00000000 + B_1(L)~0 207 -10513 0.0 5.72610000 3.134000e-23 anti-B_10 -10513 0.00000000 + B_1(L)+ 195 10523 1.0 5.72590000 3.134000e-23 B_1+ 10523 0.00000000 + B_1(L)- 199 -10523 -1.0 5.72590000 3.134000e-23 B_1- -10523 0.00000000 + B*_20 204 515 0.0 5.73950000 2.861792e-23 B_2*0 515 0.00000000 + B*_2~0 208 -515 0.0 5.73950000 2.861792e-23 anti-B_2*0 -515 0.00000000 + B*_2+ 196 525 1.0 5.73720000 3.291060e-23 B_2*+ 525 0.00000000 + B*_2- 200 -525 -1.0 5.73720000 3.291060e-23 B_2*- -525 0.00000000 + B_s0 75 531 0.0 5.36688000 1.512000e-12 B_s0 531 0.00000000 + B_s~0 76 -531 0.0 5.36688000 1.512000e-12 anti-B_s0 -531 0.00000000 + B_s0H 99996 530 0.0 5.36677000 1.661000e-12 B_s0H 0 0.00000000 + B_s0L 99997 350 0.0 5.36677000 1.405000e-12 B_s0L 0 0.00000000 + B*_s0 191 533 0.0 5.41540000 1.000000e-19 B_s*0 533 0.00000000 + B*_s~0 192 -533 0.0 5.41540000 1.000000e-19 anti-B_s*0 -533 0.00000000 + B*_s00 209 10531 0.0 5.84100000 4.390000e-24 B_s0*0 10531 0.00000000 + B*_s0~0 213 -10531 0.0 5.84100000 4.390000e-24 anti-B_s0*0 -10531 0.00000000 + B_s1(H)0 210 20533 0.0 5.85900000 2.630000e-24 B'_s10 20533 0.00000000 + B_s1(H)~0 214 -20533 0.0 5.85900000 2.630000e-24 anti-B'_s10 -20533 0.00000000 + B_s1(L)0 211 10533 0.0 5.82870000 1.316424e-21 B_s10 10533 0.00000000 + B_s1(L)~0 215 -10533 0.0 5.82870000 1.316424e-21 anti-B_s10 -10533 0.00000000 + B*_s20 212 535 0.0 5.83985000 4.477633e-22 B_s2*0 535 0.00000000 + B*_s2~0 216 -535 0.0 5.83985000 4.477633e-22 anti-B_s2*0 -535 0.00000000 + B_c+ 77 541 1.0 6.27447000 5.070971e-13 B_c+ 541 0.00000000 + B_c- 78 -541 -1.0 6.27447000 5.070971e-13 B_c- -541 0.00000000 + B_c*+ 382 543 1.0 6.33330000 0.000000e+00 B_c*+ 543 0.00000000 + B_c*- 383 -543 -1.0 6.33330000 0.000000e+00 B_c*- -543 0.00000000 + B_c0*+ 607 10541 1.0 6.70600000 0.000000e+00 B_c0*+ 10541 0.00000000 + B_c0*- 608 -10541 -1.0 6.70600000 0.000000e+00 B_c0*- -10541 0.00000000 + B_c1(L)+ 609 10543 1.0 6.74100000 0.000000e+00 B_c1+ 10543 0.00000000 + B_c1(L)- 610 -10543 -1.0 6.74100000 0.000000e+00 B_c1- -10543 0.00000000 + B_c1(H)+ 693 20543 1.0 6.75000000 0.000000e+00 B'_c1+ 20543 0.00000000 + B_c1(H)- 694 -20543 -1.0 6.75000000 0.000000e+00 B'_c1- -20543 0.00000000 + B_c2*+ 384 545 1.0 6.76800000 0.000000e+00 B_c2*+ 545 0.00000000 + B_c2*- 385 -545 -1.0 6.76800000 0.000000e+00 B_c2*- -545 0.00000000 + B_c(2S)+ 100541 100541 1.0 6.87210000 0.000000e+00 B_c(2S)+ 100541 0.00000000 + B_c(2S)- 100542 -100541 -1.0 6.87210000 0.000000e+00 B_c(2S)- -100541 0.00000000 + B_c*(2S)+ 100543 100543 1.0 6.90000000 0.000000e+00 B_c*(2S)+ 100543 0.00000000 + B_c*(2S)- 100544 -100543 -1.0 6.90000000 0.000000e+00 B_c*(2S)- -100543 0.00000000 + eta_c(1S) 128 441 0.0 2.98390000 2.216203e-23 eta_c 441 0.00000000 + J/psi(1S) 64 443 0.0 3.09690000 7.085169e-21 J/psi 443 0.00000000 + chi_c0(1P) 129 10441 0.0 3.41471000 6.328963e-23 chi_c0 10441 0.00000000 + chi_c1(1P) 130 20443 0.0 3.51067000 7.835857e-22 chi_c1 20443 0.00000000 + h_c(1P) 606 10443 0.0 3.52538000 9.403029e-22 h_c 10443 0.00000000 + chi_c2(1P) 131 445 0.0 3.55617000 3.410425e-22 chi_c2 445 0.00000000 + eta_c(2S) 829 100441 0.0 3.63750000 6.582122e-23 eta_c(2S) 100441 0.00000000 + psi(2S) 126 100443 0.0 3.68609700 2.238816e-21 psi(2S) 100443 0.00000000 + psi(3770) 765 30443 0.0 3.77313000 2.419898e-23 psi(3770) 30443 0.00000000 + chi_c2(2P) 1031 100445 0.0 3.92720000 2.742551e-23 chi_c2(2P) 0 0.00000000 + psi(4040) 851 9000443 0.0 4.03900000 8.227652e-24 psi(4040) 0 0.00000000 + psi(4160) 853 9010443 0.0 4.19100000 9.403029e-24 psi(4160) 0 0.00000000 + psi(4415) 856 9020443 0.0 4.42100000 1.061633e-23 psi(4415) 0 0.00000000 + X_1(3872) 1016 9920443 0.0 3.87169000 2.076340e-21 X_1(3872) 9920443 0.00000000 + X_2(3872) 1017 9910445 0.0 3.87169000 2.076340e-21 X_2(3872) 9910445 0.00000000 + Z(4430)+ 1018 9042413 1.0 4.47800000 3.630504e-24 Z(4430)+ 9042413 0.00000000 + Z(4430)- 1019 -9042413 -1.0 4.47800000 3.630504e-24 Z(4430)- -9042413 0.00000000 + eta_b(1S) 386 551 0.0 9.39870000 6.582120e-23 eta_b 551 0.00000000 + eta_b(2S) 830 100551 0.0 9.99700000 0.000000e+00 eta_b(2S) 0 0.00000000 + eta_b(3S) 843 200551 0.0 10.33500000 0.000000e+00 eta_b(3S) 0 0.00000000 + eta_b2(1D) 613 10555 0.0 10.15700000 0.000000e+00 eta_b2(1D) 10555 0.00000000 + eta_b2(2D) 836 110555 0.0 10.44100000 0.000000e+00 eta_b2(2D) 110555 0.00000000 + Upsilon(1S) 387 553 0.0 9.46030000 1.218911e-20 Upsilon 553 0.00000000 + Upsilon(2S) 831 100553 0.0 10.02326000 2.058199e-20 Upsilon(2S) 100553 0.00000000 + Upsilon(3S) 844 200553 0.0 10.35520000 3.242425e-20 Upsilon(3S) 200553 0.00000000 + Upsilon_1(1D) 766 30553 0.0 10.16370000 0.000000e+00 Upsilon_1(1D) 30553 0.00000000 + Upsilon_1(2D) 839 130553 0.0 10.43490000 0.000000e+00 Upsilon_1(2D) 130553 0.00000000 + Upsilon_2(1D) 696 20555 0.0 10.15620000 0.000000e+00 Upsilon_2(1D) 20555 0.00000000 + Upsilon_2(2D) 838 120555 0.0 10.44060000 0.000000e+00 Upsilon_2(2D) 120555 0.00000000 + Upsilon_3(1D) 389 557 0.0 10.15990000 0.000000e+00 Upsilon_3(1D) 557 0.00000000 + Upsilon_3(2D) 833 100557 0.0 10.44430000 0.000000e+00 Upsilon_3(2D) 100557 0.00000000 + Upsilon(4S) 849 300553 0.0 10.57940000 3.210791e-23 Upsilon(4S) 300553 0.00000000 + Upsilon(10860) 852 9000553 0.0 10.88990000 1.290612e-23 Upsilon(5S) 0 0.00000000 + Upsilon(11020) 854 9010553 0.0 10.99290000 1.343290e-23 Upsilon(11020) 0 0.00000000 + chi_b0(1P) 611 10551 0.0 9.85940000 0.000000e+00 chi_b0 10551 0.00000000 + chi_b0(2P) 834 110551 0.0 10.23250000 0.000000e+00 chi_b0(2P) 110551 0.00000000 + chi_b0(3P) 846 210551 0.0 10.50040000 0.000000e+00 chi_b0(3P) 210551 0.00000000 + chi_b1(3P) 848 220553 0.0 10.51210000 0.000000e+00 chi_b1(3P) 220553 0.00000000 + chi_b1(1P) 695 20553 0.0 9.89287800 0.000000e+00 chi_b1 20553 0.00000000 + chi_b1(2P) 837 120553 0.0 10.25546000 0.000000e+00 chi_b1(2P) 120553 0.00000000 + chi_b2(1P) 388 555 0.0 9.91221000 0.000000e+00 chi_b2 555 0.00000000 + chi_b2(2P) 832 100555 0.0 10.26865000 0.000000e+00 chi_b2(2P) 100555 0.00000000 + chi_b2(3P) 845 200555 0.0 10.52620000 0.000000e+00 chi_b2(3P) 200555 0.00000000 + h_b(1P) 612 10553 0.0 9.89930000 0.000000e+00 h_b 10553 0.00000000 + h_b(2P) 835 110553 0.0 10.25500000 0.000000e+00 h_b(2P) 110553 0.00000000 + h_b(3P) 847 210553 0.0 10.51600000 0.000000e+00 h_b(3P) 210553 0.00000000 + n0 13 2112 0.0 0.93956541 8.803000e+02 n0 2112 0.00000000 + n~0 25 -2112 0.0 0.93956541 8.803000e+02 anti-n0 -2112 0.00000000 + p+ 14 2212 1.0 0.93827208 1.000000e+16 p+ 2212 0.00000000 + p~- 15 -2212 -1.0 0.93827208 1.000000e+16 anti-p- -2212 0.00000000 + N(1440)0 624 12112 0.0 1.44000000 2.194041e-24 N(1440)0 0 0.00000000 + N(1440)~0 625 -12112 0.0 1.44000000 2.194041e-24 anti-N(1440)0 0 0.00000000 + N(1440)+ 636 12212 1.0 1.44000000 2.194041e-24 N(1440)+ 0 0.00000000 + N(1440)~- 637 -12212 -1.0 1.44000000 2.194041e-24 anti-N(1440)- 0 0.00000000 + N(1520)0 404 1214 0.0 1.51500000 5.983745e-24 N(1520)0 0 0.00000000 + N(1520)~0 405 -1214 0.0 1.51500000 5.983745e-24 anti-N(1520)0 0 0.00000000 + N(1520)+ 420 2124 1.0 1.51500000 5.983745e-24 N(1520)+ 0 0.00000000 + N(1520)~- 421 -2124 -1.0 1.51500000 5.983745e-24 anti-N(1520)- 0 0.00000000 + N(1535)0 705 22112 0.0 1.53000000 4.388081e-24 N(1535)0 0 0.00000000 + N(1535)~0 706 -22112 0.0 1.53000000 4.388081e-24 anti-N(1535)0 0 0.00000000 + N(1535)+ 713 22212 1.0 1.53000000 4.388081e-24 N(1535)+ 0 0.00000000 + N(1535)~- 714 -22212 -1.0 1.53000000 4.388081e-24 anti-N(1535)- 0 0.00000000 + N(1650)0 771 32112 0.0 1.65000000 5.265696e-24 N(1650)0 0 0.00000000 + N(1650)~0 772 -32112 0.0 1.65000000 5.265696e-24 anti-N(1650)0 0 0.00000000 + N(1650)+ 777 32212 1.0 1.65000000 5.265696e-24 N(1650)+ 0 0.00000000 + N(1650)~- 778 -32212 -1.0 1.65000000 5.265696e-24 anti-N(1650)- 0 0.00000000 + N(1675)0 414 2116 0.0 1.67500000 4.539393e-24 N(1675)0 0 0.00000000 + N(1675)~0 415 -2116 0.0 1.67500000 4.539393e-24 anti-N(1675)0 0 0.00000000 + N(1675)+ 428 2216 1.0 1.67500000 4.539393e-24 N(1675)+ 0 0.00000000 + N(1675)~- 429 -2216 -1.0 1.67500000 4.539393e-24 anti-N(1675)- 0 0.00000000 + N(1680)0 628 12116 0.0 1.68500000 5.485100e-24 N(1680)0 0 0.00000000 + N(1680)~0 629 -12116 0.0 1.68500000 5.485100e-24 anti-N(1680)0 0 0.00000000 + N(1680)+ 640 12216 1.0 1.68500000 5.485100e-24 N(1680)+ 0 0.00000000 + N(1680)~- 641 -12216 -1.0 1.68500000 5.485100e-24 anti-N(1680)- 0 0.00000000 + N(1700)+ 711 22124 1.0 1.72000000 4.388081e-24 N(1700)+ 0 0.00000000 + N(1700)~- 712 -22124 -1.0 1.72000000 4.388081e-24 anti-N(1700)- 0 0.00000000 + N(1700)0 703 21214 0.0 1.72000000 4.388081e-24 N(1700)0 0 0.00000000 + N(1700)~0 704 -21214 0.0 1.72000000 4.388081e-24 anti-N(1700)0 0 0.00000000 + N(1710)0 791 42112 0.0 1.71000000 6.582122e-24 N(1710)0 0 0.00000000 + N(1710)~0 792 -42112 0.0 1.71000000 6.582122e-24 anti-N(1710)0 0 0.00000000 + N(1710)+ 795 42212 1.0 1.71000000 6.582122e-24 N(1710)+ 0 0.00000000 + N(1710)~- 796 -42212 -1.0 1.71000000 6.582122e-24 anti-N(1710)- 0 0.00000000 + N(1720)0 769 31214 0.0 1.72000000 2.632849e-24 N(1720)0 0 0.00000000 + N(1720)~0 770 -31214 0.0 1.72000000 2.632849e-24 anti-N(1720)0 0 0.00000000 + N(1720)+ 775 32124 1.0 1.72000000 2.632849e-24 N(1720)+ 0 0.00000000 + N(1720)~- 776 -32124 -1.0 1.72000000 2.632849e-24 anti-N(1720)- 0 0.00000000 + N(1900)0 789 41214 0.0 1.89500000 5.476011e-24 N(1900)0 0 0.00000000 + N(1900)~0 790 -41214 0.0 1.89500000 5.476011e-24 anti-N(1900)0 0 0.00000000 + N(1900)+ 793 42124 1.0 1.89500000 5.476011e-24 N(1900)+ 0 0.00000000 + N(1900)~- 794 -42124 -1.0 1.89500000 5.476011e-24 anti-N(1900)- 0 0.00000000 + N(1990)0 630 12118 0.0 1.95000000 0.000000e+00 N(1990)0 0 0.00000000 + N(1990)~0 631 -12118 0.0 1.95000000 0.000000e+00 anti-N(1990)0 0 0.00000000 + N(1990)+ 642 12218 1.0 1.95000000 0.000000e+00 N(1990)+ 0 0.00000000 + N(1990)~- 643 -12218 -1.0 1.95000000 0.000000e+00 anti-N(1990)- 0 0.00000000 + N(2090)0 799 52114 0.0 2.00000000 0.000000e+00 N(2090)0 0 0.00000000 + N(2090)~0 800 -52114 0.0 2.00000000 0.000000e+00 anti-N(2090)0 0 0.00000000 + N(2090)+ 801 52214 1.0 2.00000000 0.000000e+00 N(2090)+ 0 0.00000000 + N(2090)~- 802 -52214 -1.0 2.00000000 0.000000e+00 anti-N(2090)- 0 0.00000000 + N(2190)0 408 1218 0.0 2.18000000 1.645530e-24 N(2190)0 0 0.00000000 + N(2190)~0 409 -1218 0.0 2.18000000 1.645530e-24 anti-N(2190)0 0 0.00000000 + N(2190)+ 424 2128 1.0 2.18000000 1.645530e-24 N(2190)+ 0 0.00000000 + N(2190)~- 425 -2128 -1.0 2.18000000 1.645530e-24 anti-N(2190)- 0 0.00000000 + Delta- 182 1114 -1.0 1.23200000 5.625745e-24 Delta- 1114 0.00000000 + Delta~+ 186 -1114 1.0 1.23200000 5.625745e-24 anti-Delta+ -1114 0.00000000 + Delta0 181 2114 0.0 1.23200000 5.625745e-24 Delta0 2114 0.00000000 + Delta~0 185 -2114 0.0 1.23200000 5.625745e-24 anti-Delta0 -2114 0.00000000 + Delta+ 180 2214 1.0 1.23200000 5.625745e-24 Delta+ 2214 0.00000000 + Delta~- 184 -2214 -1.0 1.23200000 5.625745e-24 anti-Delta- -2214 0.00000000 + Delta++ 179 2224 2.0 1.23200000 5.625745e-24 Delta++ 2224 0.00000000 + Delta~-- 183 -2224 -2.0 1.23200000 5.625745e-24 anti-Delta-- -2224 0.00000000 + Delta(1600)- 767 31114 -1.0 1.57000000 2.632848e-24 Delta(1600)- 0 0.00000000 + Delta(1600)~+ 768 -31114 1.0 1.57000000 2.632848e-24 anti-Delta(1600)+ 0 0.00000000 + Delta(1600)0 773 32114 0.0 1.57000000 2.632848e-24 Delta(1600)0 0 0.00000000 + Delta(1600)~0 774 -32114 0.0 1.57000000 2.632848e-24 anti-Delta(1600)0 0 0.00000000 + Delta(1600)+ 779 32214 1.0 1.57000000 2.632848e-24 Delta(1600)+ 0 0.00000000 + Delta(1600)~- 780 -32214 -1.0 1.57000000 2.632848e-24 anti-Delta(1600)- 0 0.00000000 + Delta(1600)++ 781 32224 2.0 1.57000000 2.632848e-24 Delta(1600)++ 0 0.00000000 + Delta(1600)~-- 782 -32224 -2.0 1.57000000 2.632848e-24 anti-Delta(1600)-- 0 0.00000000 + Delta(1620)- 396 1112 -1.0 1.61000000 5.063169e-24 Delta(1620)- 0 0.00000000 + Delta(1620)~+ 397 -1112 1.0 1.61000000 5.063169e-24 anti-Delta(1620)+ 0 0.00000000 + Delta(1620)0 402 1212 0.0 1.61000000 5.063169e-24 Delta(1620)0 0 0.00000000 + Delta(1620)~0 403 -1212 0.0 1.61000000 5.063169e-24 anti-Delta(1620)0 0 0.00000000 + Delta(1620)+ 418 2122 1.0 1.61000000 5.063169e-24 Delta(1620)+ 0 0.00000000 + Delta(1620)~- 419 -2122 -1.0 1.61000000 5.063169e-24 anti-Delta(1620)- 0 0.00000000 + Delta(1620)++ 432 2222 2.0 1.61000000 5.063169e-24 Delta(1620)++ 0 0.00000000 + Delta(1620)~-- 433 -2222 -2.0 1.61000000 5.063169e-24 anti-Delta(1620)-- 0 0.00000000 + Delta(1700)- 616 11114 -1.0 1.71000000 2.194041e-24 Delta(1700)- 0 0.00000000 + Delta(1700)~+ 617 -11114 1.0 1.71000000 2.194041e-24 anti-Delta(1700)+ 0 0.00000000 + Delta(1700)0 626 12114 0.0 1.71000000 2.194041e-24 Delta(1700)0 0 0.00000000 + Delta(1700)~0 627 -12114 0.0 1.71000000 2.194041e-24 anti-Delta(1700)0 0 0.00000000 + Delta(1700)+ 638 12214 1.0 1.71000000 2.194041e-24 Delta(1700)+ 0 0.00000000 + Delta(1700)~- 639 -12214 -1.0 1.71000000 2.194041e-24 anti-Delta(1700)- 0 0.00000000 + Delta(1700)++ 646 12224 2.0 1.71000000 2.194041e-24 Delta(1700)++ 0 0.00000000 + Delta(1700)~-- 647 -12224 -2.0 1.71000000 2.194041e-24 anti-Delta(1700)-- 0 0.00000000 + Delta(1900)- 614 11112 -1.0 1.86000000 2.632848e-24 Delta(1900)- 0 0.00000000 + Delta(1900)~+ 615 -11112 1.0 1.86000000 2.632848e-24 anti-Delta(1900)+ 0 0.00000000 + Delta(1900)0 620 11212 0.0 1.86000000 2.632848e-24 Delta(1900)0 0 0.00000000 + Delta(1900)~0 621 -11212 0.0 1.86000000 2.632848e-24 anti-Delta(1900)0 0 0.00000000 + Delta(1900)+ 632 12122 1.0 1.86000000 2.632848e-24 Delta(1900)+ 0 0.00000000 + Delta(1900)~- 633 -12122 -1.0 1.86000000 2.632848e-24 anti-Delta(1900)- 0 0.00000000 + Delta(1900)++ 644 12222 2.0 1.86000000 2.632848e-24 Delta(1900)++ 0 0.00000000 + Delta(1900)~-- 645 -12222 -2.0 1.86000000 2.632848e-24 anti-Delta(1900)-- 0 0.00000000 + Delta(1905)- 398 1116 -1.0 1.88000000 1.994582e-24 Delta(1905)- 0 0.00000000 + Delta(1905)~+ 399 -1116 1.0 1.88000000 1.994582e-24 anti-Delta(1905)+ 0 0.00000000 + Delta(1905)0 406 1216 0.0 1.88000000 1.994582e-24 Delta(1905)0 0 0.00000000 + Delta(1905)~0 407 -1216 0.0 1.88000000 1.994582e-24 anti-Delta(1905)0 0 0.00000000 + Delta(1905)+ 422 2126 1.0 1.88000000 1.994582e-24 Delta(1905)+ 0 0.00000000 + Delta(1905)~- 423 -2126 -1.0 1.88000000 1.994582e-24 anti-Delta(1905)- 0 0.00000000 + Delta(1905)++ 434 2226 2.0 1.88000000 1.994582e-24 Delta(1905)++ 0 0.00000000 + Delta(1905)~-- 435 -2226 -2.0 1.88000000 1.994582e-24 anti-Delta(1905)-- 0 0.00000000 + Delta(1910)- 697 21112 -1.0 1.90000000 2.350758e-24 Delta(1910)- 0 0.00000000 + Delta(1910)~+ 698 -21112 1.0 1.90000000 2.350758e-24 anti-Delta(1910)+ 0 0.00000000 + Delta(1910)0 701 21212 0.0 1.90000000 2.350758e-24 Delta(1910)0 0 0.00000000 + Delta(1910)~0 702 -21212 0.0 1.90000000 2.350758e-24 anti-Delta(1910)0 0 0.00000000 + Delta(1910)+ 709 22122 1.0 1.90000000 2.350758e-24 Delta(1910)+ 0 0.00000000 + Delta(1910)~- 710 -22122 -1.0 1.90000000 2.350758e-24 anti-Delta(1910)- 0 0.00000000 + Delta(1910)++ 717 22222 2.0 1.90000000 2.350758e-24 Delta(1910)++ 0 0.00000000 + Delta(1910)~-- 718 -22222 -2.0 1.90000000 2.350758e-24 anti-Delta(1910)-- 0 0.00000000 + Delta(1920)- 699 21114 -1.0 1.92000000 2.531585e-24 Delta(1920)- 0 0.00000000 + Delta(1920)~+ 700 -21114 1.0 1.92000000 2.531585e-24 anti-Delta(1920)+ 0 0.00000000 + Delta(1920)0 707 22114 0.0 1.92000000 2.531585e-24 Delta(1920)0 0 0.00000000 + Delta(1920)~0 708 -22114 0.0 1.92000000 2.531585e-24 anti-Delta(1920)0 0 0.00000000 + Delta(1920)+ 715 22214 1.0 1.92000000 2.531585e-24 Delta(1920)+ 0 0.00000000 + Delta(1920)~- 716 -22214 -1.0 1.92000000 2.531585e-24 anti-Delta(1920)- 0 0.00000000 + Delta(1920)++ 719 22224 2.0 1.92000000 2.531585e-24 Delta(1920)++ 0 0.00000000 + Delta(1920)~-- 720 -22224 -2.0 1.92000000 2.531585e-24 anti-Delta(1920)-- 0 0.00000000 + Delta(1930)- 618 11116 -1.0 1.95000000 2.194040e-24 Delta(1930)- 0 0.00000000 + Delta(1930)~+ 619 -11116 1.0 1.95000000 2.194040e-24 anti-Delta(1930)+ 0 0.00000000 + Delta(1930)0 622 11216 0.0 1.95000000 2.194040e-24 Delta(1930)0 0 0.00000000 + Delta(1930)~0 623 -11216 0.0 1.95000000 2.194040e-24 anti-Delta(1930)0 0 0.00000000 + Delta(1930)+ 634 12126 1.0 1.95000000 2.194040e-24 Delta(1930)+ 0 0.00000000 + Delta(1930)~- 635 -12126 -1.0 1.95000000 2.194040e-24 anti-Delta(1930)- 0 0.00000000 + Delta(1930)++ 648 12226 2.0 1.95000000 2.194040e-24 Delta(1930)++ 0 0.00000000 + Delta(1930)~-- 649 -12226 -2.0 1.95000000 2.194040e-24 anti-Delta(1930)-- 0 0.00000000 + Delta(1950)- 400 1118 -1.0 1.93000000 2.350758e-24 Delta(1950)- 0 0.00000000 + Delta(1950)~+ 401 -1118 1.0 1.93000000 2.350758e-24 anti-Delta(1950)+ 0 0.00000000 + Delta(1950)0 416 2118 0.0 1.93000000 2.350758e-24 Delta(1950)0 0 0.00000000 + Delta(1950)~0 417 -2118 0.0 1.93000000 2.350758e-24 anti-Delta(1950)0 0 0.00000000 + Delta(1950)+ 430 2218 1.0 1.93000000 2.350758e-24 Delta(1950)+ 0 0.00000000 + Delta(1950)~- 431 -2218 -1.0 1.93000000 2.350758e-24 anti-Delta(1950)- 0 0.00000000 + Delta(1950)++ 436 2228 2.0 1.93000000 2.350758e-24 Delta(1950)++ 0 0.00000000 + Delta(1950)~-- 437 -2228 -2.0 1.93000000 2.350758e-24 anti-Delta(1950)-- 0 0.00000000 + Lambda0 18 3122 0.0 1.11568300 2.632000e-10 Lambda0 3122 0.00000000 + Lambda~0 26 -3122 0.0 1.11568300 2.632000e-10 anti-Lambda0 -3122 0.00000000 + Lambda(1405)0 656 13122 0.0 1.40510000 1.316424e-23 Lambda(1405)0 0 0.00000000 + Lambda(1405)~0 657 -13122 0.0 1.40510000 1.316424e-23 anti-Lambda(1405)0 0 0.00000000 + Lambda(1520)0 448 3124 0.0 1.51950000 4.219309e-23 Lambda(1520)0 0 0.00000000 + Lambda(1520)~0 449 -3124 0.0 1.51950000 4.219309e-23 anti-Lambda(1520)0 0 0.00000000 + Lambda(1600)0 725 23122 0.0 1.60000000 4.388081e-24 Lambda(1600)0 0 0.00000000 + Lambda(1600)~0 726 -23122 0.0 1.60000000 4.388081e-24 anti-Lambda(1600)0 0 0.00000000 + Lambda(1670)0 783 33122 0.0 1.67000000 1.880606e-23 Lambda(1670)0 0 0.00000000 + Lambda(1670)~0 784 -33122 0.0 1.67000000 1.880606e-23 anti-Lambda(1670)0 0 0.00000000 + Lambda(1690)0 658 13124 0.0 1.69000000 1.097020e-23 Lambda(1690)0 0 0.00000000 + Lambda(1690)~0 659 -13124 0.0 1.69000000 1.097020e-23 anti-Lambda(1690)0 0 0.00000000 + Lambda(1800)0 797 43122 0.0 1.80000000 2.194041e-24 Lambda(1800)0 0 0.00000000 + Lambda(1800)~0 798 -43122 0.0 1.80000000 2.194041e-24 anti-Lambda(1800)0 0 0.00000000 + Lambda(1810)0 803 53122 0.0 1.81000000 4.388081e-24 Lambda(1810)0 0 0.00000000 + Lambda(1810)~0 804 -53122 0.0 1.81000000 4.388081e-24 anti-Lambda(1810)0 0 0.00000000 + Lambda(1820)0 450 3126 0.0 1.82000000 8.227652e-24 Lambda(1820)0 0 0.00000000 + Lambda(1820)~0 451 -3126 0.0 1.82000000 8.227652e-24 anti-Lambda(1820)0 0 0.00000000 + Lambda(1830)0 660 13126 0.0 1.83000000 6.928549e-24 Lambda(1830)0 0 0.00000000 + Lambda(1830)~0 661 -13126 0.0 1.83000000 6.928549e-24 anti-Lambda(1830)0 0 0.00000000 + Lambda(1890)0 727 23124 0.0 1.89000000 6.582122e-24 Lambda(1890)0 0 0.00000000 + Lambda(1890)~0 728 -23124 0.0 1.89000000 6.582122e-24 anti-Lambda(1890)0 0 0.00000000 + Lambda(2100)0 452 3128 0.0 2.10000000 3.291061e-24 Lambda(2100)0 0 0.00000000 + Lambda(2100)~0 453 -3128 0.0 2.10000000 3.291061e-24 anti-Lambda(2100)0 0 0.00000000 + Lambda(2110)0 729 23126 0.0 2.11000000 3.291061e-24 Lambda(2110)0 0 0.00000000 + Lambda(2110)~0 730 -23126 0.0 2.11000000 3.291061e-24 anti-Lambda(2110)0 0 0.00000000 + Sigma- 21 3112 -1.0 1.19744900 1.479128e-10 Sigma- 3112 0.00000000 + Sigma~+ 29 -3112 1.0 1.19744900 1.479128e-10 anti-Sigma+ -3112 0.00000000 + Sigma0 20 3212 0.0 1.19264200 7.400000e-20 Sigma0 3212 0.00000000 + Sigma~0 28 -3212 0.0 1.19264200 7.400000e-20 anti-Sigma0 -3212 0.00000000 + Sigma+ 19 3222 1.0 1.18937000 8.018175e-11 Sigma+ 3222 0.00000000 + Sigma~- 27 -3222 -1.0 1.18937000 8.018175e-11 anti-Sigma- -3222 0.00000000 + Sigma*- 442 3114 -1.0 1.38720000 1.670589e-23 Sigma*- 3114 0.00000000 + Sigma*~+ 443 -3114 1.0 1.38720000 1.670589e-23 anti-Sigma*+ -3114 0.00000000 + Sigma*0 458 3214 0.0 1.38370000 1.828367e-23 Sigma*0 3214 0.00000000 + Sigma*~0 459 -3214 0.0 1.38370000 1.828367e-23 anti-Sigma*0 -3214 0.00000000 + Sigma*+ 464 3224 1.0 1.38280000 1.828367e-23 Sigma*+ 3224 0.00000000 + Sigma*~- 465 -3224 -1.0 1.38280000 1.828367e-23 anti-Sigma*- -3224 0.00000000 + Sigma(1660)- 650 13112 -1.0 1.66000000 6.582122e-24 Sigma(1660)- 0 0.00000000 + Sigma(1660)~+ 651 -13112 1.0 1.66000000 6.582122e-24 anti-Sigma(1660)+ 0 0.00000000 + Sigma(1660)0 662 13212 0.0 1.66000000 6.582122e-24 Sigma(1660)0 0 0.00000000 + Sigma(1660)~0 663 -13212 0.0 1.66000000 6.582122e-24 anti-Sigma(1660)0 0 0.00000000 + Sigma(1660)+ 668 13222 1.0 1.66000000 6.582122e-24 Sigma(1660)+ 0 0.00000000 + Sigma(1660)~- 669 -13222 -1.0 1.66000000 6.582122e-24 anti-Sigma(1660)- 0 0.00000000 + Sigma(1670)- 652 13114 -1.0 1.67000000 1.097020e-23 Sigma(1670)- 0 0.00000000 + Sigma(1670)~+ 653 -13114 1.0 1.67000000 1.097020e-23 anti-Sigma(1670)+ 0 0.00000000 + Sigma(1670)0 664 13214 0.0 1.67000000 1.097020e-23 Sigma(1670)0 0 0.00000000 + Sigma(1670)~0 665 -13214 0.0 1.67000000 1.097020e-23 anti-Sigma(1670)0 0 0.00000000 + Sigma(1670)+ 670 13224 1.0 1.67000000 1.097020e-23 Sigma(1670)+ 0 0.00000000 + Sigma(1670)~- 671 -13224 -1.0 1.67000000 1.097020e-23 anti-Sigma(1670)- 0 0.00000000 + Sigma(1750)- 721 23112 -1.0 1.75000000 7.313469e-24 Sigma(1750)- 0 0.00000000 + Sigma(1750)~+ 722 -23112 1.0 1.75000000 7.313469e-24 anti-Sigma(1750)+ 0 0.00000000 + Sigma(1750)0 731 23212 0.0 1.75000000 7.313469e-24 Sigma(1750)0 0 0.00000000 + Sigma(1750)~0 732 -23212 0.0 1.75000000 7.313469e-24 anti-Sigma(1750)0 0 0.00000000 + Sigma(1750)+ 735 23222 1.0 1.75000000 7.313469e-24 Sigma(1750)+ 0 0.00000000 + Sigma(1750)~- 736 -23222 -1.0 1.75000000 7.313469e-24 anti-Sigma(1750)- 0 0.00000000 + Sigma(1775)- 444 3116 -1.0 1.77500000 5.485102e-24 Sigma(1775)- 0 0.00000000 + Sigma(1775)~+ 445 -3116 1.0 1.77500000 5.485102e-24 anti-Sigma(1775)+ 0 0.00000000 + Sigma(1775)0 460 3216 0.0 1.77500000 5.485102e-24 Sigma(1775)0 0 0.00000000 + Sigma(1775)~0 461 -3216 0.0 1.77500000 5.485102e-24 anti-Sigma(1775)0 0 0.00000000 + Sigma(1775)+ 466 3226 1.0 1.77500000 5.485102e-24 Sigma(1775)+ 0 0.00000000 + Sigma(1775)~- 467 -3226 -1.0 1.77500000 5.485102e-24 anti-Sigma(1775)- 0 0.00000000 + Sigma(1915)- 654 13116 -1.0 1.91500000 5.485102e-24 Sigma(1915)- 0 0.00000000 + Sigma(1915)~+ 655 -13116 1.0 1.91500000 5.485102e-24 anti-Sigma(1915)+ 0 0.00000000 + Sigma(1915)0 666 13216 0.0 1.91500000 5.485102e-24 Sigma(1915)0 0 0.00000000 + Sigma(1915)~0 667 -13216 0.0 1.91500000 5.485102e-24 anti-Sigma(1915)0 0 0.00000000 + Sigma(1915)+ 672 13226 1.0 1.91500000 5.485102e-24 Sigma(1915)+ 0 0.00000000 + Sigma(1915)~- 673 -13226 -1.0 1.91500000 5.485102e-24 anti-Sigma(1915)- 0 0.00000000 + Sigma(1940)- 723 23114 -1.0 1.94000000 2.991874e-24 Sigma(1940)- 0 0.00000000 + Sigma(1940)~+ 724 -23114 1.0 1.94000000 2.991874e-24 anti-Sigma(1940)+ 0 0.00000000 + Sigma(1940)0 733 23214 0.0 1.94000000 2.991874e-24 Sigma(1940)0 0 0.00000000 + Sigma(1940)~0 734 -23214 0.0 1.94000000 2.991874e-24 anti-Sigma(1940)0 0 0.00000000 + Sigma(1940)+ 737 23224 1.0 1.94000000 2.991874e-24 Sigma(1940)+ 0 0.00000000 + Sigma(1940)~- 738 -23224 -1.0 1.94000000 2.991874e-24 anti-Sigma(1940)- 0 0.00000000 + Sigma(2030)0 462 3218 0.0 2.03000000 3.656734e-24 Sigma(2030)0 0 0.00000000 + Sigma(2030)~0 463 -3218 0.0 2.03000000 3.656734e-24 anti-Sigma(2030)0 0 0.00000000 + Sigma(2030)+ 468 3228 1.0 2.03000000 3.656734e-24 Sigma(2030)+ 0 0.00000000 + Sigma(2030)~- 469 -3228 -1.0 2.03000000 3.656734e-24 anti-Sigma(2030)- 0 0.00000000 + Sigma(2030)- 446 3118 -1.0 2.03000000 3.656734e-24 Sigma(2030)- 0 0.00000000 + Sigma(2030)~+ 447 -3118 1.0 2.03000000 3.656734e-24 anti-Sigma(2030)+ 0 0.00000000 + Sigma(2250)0 1059 103212 0.0 2.25000000 6.580000e-24 Sigma(2250)0 0 0.00000000 + Sigma(2250)~0 1060 -103212 0.0 2.25000000 6.580000e-24 anti-Sigma(2250)0 0 0.00000000 + Sigma(2250)+ 1061 103222 1.0 2.25000000 6.580000e-24 Sigma(2250)+ 0 0.00000000 + Sigma(2250)~- 1062 -103222 -1.0 2.25000000 6.580000e-24 anti-Sigma(2250)- 0 0.00000000 + Sigma(2250)- 1063 103112 -1.0 2.25000000 6.580000e-24 Sigma(2250)- 0 0.00000000 + Sigma(2250)~+ 1064 -103112 1.0 2.25000000 6.580000e-24 anti-Sigma(2250)+ 0 0.00000000 + Xi- 23 3312 -1.0 1.32171000 1.639000e-10 Xi- 3312 0.00000000 + Xi~+ 31 -3312 1.0 1.32171000 1.639000e-10 anti-Xi+ -3312 0.00000000 + Xi0 22 3322 0.0 1.31486000 2.900000e-10 Xi0 3322 0.00000000 + Xi~0 30 -3322 0.0 1.31486000 2.900000e-10 anti-Xi0 -3322 0.00000000 + Xi*- 472 3314 -1.0 1.53500000 6.648608e-23 Xi*- 3314 0.00000000 + Xi*~+ 473 -3314 1.0 1.53500000 6.648608e-23 anti-Xi*+ -3314 0.00000000 + Xi*0 474 3324 0.0 1.53180000 7.233101e-23 Xi*0 3324 0.00000000 + Xi*~0 475 -3324 0.0 1.53180000 7.233101e-23 anti-Xi*0 -3324 0.00000000 + Xi(1690)- 1033 203312 -1.0 1.69000000 0.000000e+00 Xi(1690)- 0 0.00000000 + Xi(1690)~+ 1034 -203312 1.0 1.69000000 0.000000e+00 anti-Xi(1690)+ 0 0.00000000 + Xi(1690)0 1035 203322 0.0 1.69000000 0.000000e+00 Xi(1690)0 0 0.00000000 + Xi(1690)~0 1036 -203322 0.0 1.69000000 0.000000e+00 anti-Xi(1690)0 0 0.00000000 + Xi(1820)- 674 13314 -1.0 1.82300000 2.742551e-23 Xi(1820)- 0 0.00000000 + Xi(1820)~+ 675 -13314 1.0 1.82300000 2.742551e-23 anti-Xi(1820)+ 0 0.00000000 + Xi(1820)0 678 13324 0.0 1.82300000 2.742551e-23 Xi(1820)0 0 0.00000000 + Xi(1820)~0 679 -13324 0.0 1.82300000 2.742551e-23 anti-Xi(1820)0 0 0.00000000 + Xi(1950)- 1037 103316 -1.0 1.95000000 1.097020e-23 Xi(1950)- 0 0.00000000 + Xi(1950)~+ 1038 -103316 1.0 1.95000000 1.097020e-23 anti-Xi(1950)+ 0 0.00000000 + Xi(1950)0 1039 103326 0.0 1.95000000 1.097020e-23 Xi(1950)0 0 0.00000000 + Xi(1950)~0 1040 -103326 0.0 1.95000000 1.097020e-23 anti-Xi(1950)0 0 0.00000000 + Xi(2030)- 1041 203316 -1.0 2.02500000 3.291061e-23 Xi(2030)- 0 0.00000000 + Xi(2030)~+ 1042 -203316 1.0 2.02500000 3.291061e-23 anti-Xi(2030)+ 0 0.00000000 + Xi(2030)0 1043 203326 0.0 2.02500000 3.291061e-23 Xi(2030)0 0 0.00000000 + Xi(2030)~0 1044 -203326 0.0 2.02500000 3.291061e-23 anti-Xi(2030)0 0 0.00000000 + Omega- 24 3334 -1.0 1.67245000 8.210000e-11 Omega- 3334 0.00000000 + Omega~+ 32 -3334 1.0 1.67245000 8.210000e-11 anti-Omega+ -3334 0.00000000 + Omega(2250)- 1045 203338 -1.0 2.25200000 1.196749e-23 Omega(2250)- 0 0.00000000 + Omega(2250)~+ 1046 -203338 1.0 2.25200000 1.196749e-23 anti-Omega(2250)+ 0 0.00000000 + Lambda_c+ 62 4122 1.0 2.28646000 2.000000e-13 Lambda_c+ 4122 0.00000000 + Lambda_c~- 63 -4122 -1.0 2.28646000 2.000000e-13 anti-Lambda_c- -4122 0.00000000 + Lambda_c(2595)+ 682 14122 1.0 2.59225000 2.531585e-22 Lambda_c(2593)+ 0 0.00000000 + Lambda_c(2595)~- 683 -14122 -1.0 2.59225000 2.531585e-22 anti-Lambda_c(2593)- 0 0.00000000 + Lambda_c(2625)+ 1047 104124 1.0 2.62811000 0.000000e+00 Lambda_c(2625)+ 0 0.00000000 + Lambda_c(2625)~- 1048 -104124 -1.0 2.62811000 0.000000e+00 anti-Lambda_c(2625)- 0 0.00000000 + Lambda_c(2880)+ 1049 204126 1.0 2.88163000 1.175379e-22 Lambda_c(2880)+ 0 0.00000000 + Lambda_c(2880)~- 1050 -204126 -1.0 2.88163000 1.175379e-22 anti-Lambda_c(2880)- 0 0.00000000 + Sigma_c0 81 4112 0.0 2.45375000 3.596787e-22 Sigma_c0 4112 0.00000000 + Sigma_c~0 82 -4112 0.0 2.45375000 3.596787e-22 anti-Sigma_c0 -4112 0.00000000 + Sigma_c+ 83 4212 1.0 2.45290000 3.999999e-22 Sigma_c+ 4212 0.00000000 + Sigma_c~- 84 -4212 -1.0 2.45290000 3.999999e-22 anti-Sigma_c- -4212 0.00000000 + Sigma_c++ 85 4222 2.0 2.45397000 3.482603e-22 Sigma_c++ 4222 0.00000000 + Sigma_c~-- 86 -4222 -2.0 2.45397000 3.482603e-22 anti-Sigma_c-- -4222 0.00000000 + Sigma_c*0 480 4114 0.0 2.51848000 4.539394e-23 Sigma_c*0 4114 0.00000000 + Sigma_c*~0 481 -4114 0.0 2.51848000 4.539394e-23 anti-Sigma_c*0 -4114 0.00000000 + Sigma_c*+ 486 4214 1.0 2.51750000 3.291061e-22 Sigma_c*+ 4214 0.00000000 + Sigma_c*~- 487 -4214 -1.0 2.51750000 3.291061e-22 anti-Sigma_c*- -4214 0.00000000 + Sigma_c*++ 488 4224 2.0 2.51841000 4.453396e-23 Sigma_c*++ 4224 0.00000000 + Sigma_c*~-- 489 -4224 -2.0 2.51841000 4.453396e-23 anti-Sigma_c*-- -4224 0.00000000 + Xi_c0 106 4132 0.0 2.47091000 1.530726e-13 Xi_c0 4132 0.00000000 + Xi_c~0 107 -4132 0.0 2.47091000 1.530726e-13 anti-Xi_c0 -4132 0.00000000 + Xi_c+ 108 4232 1.0 2.46793000 4.420000e-13 Xi_c+ 4232 0.00000000 + Xi_c~- 109 -4232 -1.0 2.46793000 4.420000e-13 anti-Xi_c- -4232 0.00000000 + Xi'_c0 100 4312 0.0 2.57920000 0.000000e+00 Xi'_c0 4312 0.00000000 + Xi'_c~0 101 -4312 0.0 2.57920000 0.000000e+00 anti-Xi'_c0 -4312 0.00000000 + Xi'_c+ 102 4322 1.0 2.57840000 0.000000e+00 Xi'_c+ 4322 0.00000000 + Xi'_c~- 103 -4322 -1.0 2.57840000 0.000000e+00 anti-Xi'_c- -4322 0.00000000 + Xi_c*0 494 4314 0.0 2.64638000 2.800902e-22 Xi_c*0 4314 0.00000000 + Xi_c*~0 495 -4314 0.0 2.64638000 2.800902e-22 anti-Xi_c*0 -4314 0.00000000 + Xi_c*+ 496 4324 1.0 2.64557000 3.075757e-22 Xi_c*+ 4324 0.00000000 + Xi_c*~- 497 -4324 -1.0 2.64557000 3.075757e-22 anti-Xi_c*- -4324 0.00000000 + Xi_c(2790)+ 1051 104324 1.0 2.79240000 7.395640e-23 Xi_c(2790)+ 0 0.00000000 + Xi_c(2790)~- 1052 -104324 -1.0 2.79240000 7.395640e-23 anti-Xi_c(2790)- 0 0.00000000 + Xi_c(2790)0 1053 104314 0.0 2.79410000 6.582120e-23 Xi_c(2790)0 0 0.00000000 + Xi_c(2790)~0 1054 -104314 0.0 2.79410000 6.582120e-23 anti-Xi_c(2790)0 0 0.00000000 + Xi_c(2815)+ 1055 104322 1.0 2.81673000 2.708691e-22 Xi_c(2815)+ 0 0.00000000 + Xi_c(2815)~- 1056 -104322 -1.0 2.81673000 2.708691e-22 anti-Xi_c(2815)- 0 0.00000000 + Xi_c(2815)0 1057 104312 0.0 2.82026000 2.591386e-22 Xi_c(2815)0 0 0.00000000 + Xi_c(2815)~0 1058 -104312 0.0 2.82026000 2.591386e-22 anti-Xi_c(2815)0 0 0.00000000 + Omega_c0 104 4332 0.0 2.69520000 2.680000e-13 Omega_c0 4332 0.00000000 + Omega_c~0 105 -4332 0.0 2.69520000 2.680000e-13 anti-Omega_c0 -4332 0.00000000 + Omega_c*0 498 4334 0.0 2.76590000 0.000000e+00 Omega_c*0 4334 0.00000000 + Omega_c*~0 499 -4334 0.0 2.76590000 0.000000e+00 anti-Omega_c*0 -4334 0.00000000 + Xi_cc+ 502 4412 1.0 3.62140000 0.800000e-13 Xi_cc+ 4412 0.00000000 + Xi_cc~- 503 -4412 -1.0 3.62140000 0.800000e-13 anti-Xi_cc- -4412 0.00000000 + Xi*_cc+ 504 4414 1.0 3.65648000 0.000000e+00 Xi_cc*+ 4414 0.00000000 + Xi*_cc~- 505 -4414 -1.0 3.65648000 0.000000e+00 anti-Xi_cc*- -4414 0.00000000 + Xi_cc++ 506 4422 2.0 3.62140000 2.560000e-13 Xi_cc++ 4422 0.00000000 + Xi_cc~-- 507 -4422 -2.0 3.62140000 2.560000e-13 anti-Xi_cc-- -4422 0.00000000 + Xi*_cc++ 508 4424 2.0 3.65648000 0.000000e+00 Xi_cc*++ 4424 0.00000000 + Xi*_cc~-- 509 -4424 -2.0 3.65648000 0.000000e+00 anti-Xi_cc*-- -4424 0.00000000 + Omega_cc+ 510 4432 1.0 3.73800000 1.600000e-13 Omega_cc+ 4432 0.00000000 + Omega_cc~- 511 -4432 -1.0 3.73800000 1.600000e-13 anti-Omega_cc- -4432 0.00000000 + Omega*_cc+ 512 4434 1.0 3.82466000 0.000000e+00 Omega_cc*+ 4434 0.00000000 + Omega*_cc~- 513 -4434 -1.0 3.82466000 0.000000e+00 anti-Omega_cc*- -4434 0.00000000 + Omega*_ccc++ 514 4444 2.0 4.91594000 0.000000e+00 Omega*_ccc++ 4444 0.00000000 + Omega*_ccc~-- 515 -4444 -2.0 4.91594000 0.000000e+00 anti-Omega*_ccc-- -4444 0.00000000 + Lambda_b0 79 5122 0.0 5.61960000 1.470865e-12 Lambda_b0 5122 0.00000000 + Lambda_b~0 80 -5122 0.0 5.61960000 1.470865e-12 anti-Lambda_b0 -5122 0.00000000 + Lambda_b(5912)0 1065 15122 0.0 5.91220000 1.316000e-21 Lambda_b(5912)0 15122 0.00000000 + Lambda_b(5912)~0 1066 -15122 0.0 5.91220000 1.316000e-21 anti-Lambda_b(5912)0 -15122 0.00000000 + Lambda_b(5920)0 1067 5124 0.0 5.91992000 1.316000e-21 Lambda_b(5920)0 5124 0.00000000 + Lambda_b(5920)~0 1068 -5124 0.0 5.91992000 1.316000e-21 anti-Lambda_b(5920)0 -5124 0.00000000 + Sigma_b- 114 5112 -1.0 5.81564000 1.343290e-22 Sigma_b- 5112 0.00000000 + Sigma_b~+ 115 -5112 1.0 5.81564000 1.343290e-22 anti-Sigma_b+ -5112 0.00000000 + Sigma_b0 112 5212 0.0 5.80780000 1.000000e-19 Sigma_b0 5212 0.00000000 + Sigma_b~0 113 -5212 0.0 5.80780000 1.000000e-19 anti-Sigma_b0 -5212 0.00000000 + Sigma_b+ 110 5222 1.0 5.81056000 1.316424e-22 Sigma_b+ 5222 0.00000000 + Sigma_b~- 111 -5222 -1.0 5.81056000 1.316424e-22 anti-Sigma_b- -5222 0.00000000 + Sigma_b*- 520 5114 -1.0 5.83474000 8.776160e-23 Sigma_b*- 5114 0.00000000 + Sigma_b*~+ 521 -5114 1.0 5.83474000 8.776160e-23 anti-Sigma_b*+ -5114 0.00000000 + Sigma_b*0 528 5214 0.0 5.82900000 0.000000e+00 Sigma_b*0 5214 0.00000000 + Sigma_b*~0 529 -5214 0.0 5.82900000 0.000000e+00 anti-Sigma_b*0 -5214 0.00000000 + Sigma_b*+ 530 5224 1.0 5.83032000 7.002255e-23 Sigma_b*+ 5224 0.00000000 + Sigma_b*~- 531 -5224 -1.0 5.83032000 7.002255e-23 anti-Sigma_b*- -5224 0.00000000 + Xi_b- 122 5132 -1.0 5.79700000 1.570912e-12 Xi_b- 5132 0.00000000 + Xi_b~+ 123 -5132 1.0 5.79700000 1.570912e-12 anti-Xi_b+ -5132 0.00000000 + Xi_b0 124 5232 0.0 5.79190000 1.490000e-12 Xi_b0 5232 0.00000000 + Xi_b~0 125 -5232 0.0 5.79190000 1.490000e-12 anti-Xi_b0 -5232 0.00000000 + Xi'_b- 116 5312 -1.0 5.96000000 1.000000e-19 Xi'_b- 5312 0.00000000 + Xi'_b~+ 117 -5312 1.0 5.96000000 1.000000e-19 anti-Xi'_b+ -5312 0.00000000 + Xi'_b0 118 5322 0.0 5.96000000 1.000000e-19 Xi'_b0 5322 0.00000000 + Xi'_b~0 119 -5322 0.0 5.96000000 1.000000e-19 anti-Xi'_b0 -5322 0.00000000 + Xi_b*- 538 5314 -1.0 5.97000000 0.000000e+00 Xi_b*- 5314 0.00000000 + Xi_b*~+ 539 -5314 1.0 5.97000000 0.000000e+00 anti-Xi_b*+ -5314 0.00000000 + Xi_b*0 540 5324 0.0 5.97000000 0.000000e+00 Xi_b*0 5324 0.00000000 + Xi_b*~0 541 -5324 0.0 5.97000000 0.000000e+00 anti-Xi_b*0 -5324 0.00000000 + Omega_b*- 542 5334 -1.0 6.13000000 0.000000e+00 Omega_b*- 5334 0.00000000 + Omega_b*~+ 543 -5334 1.0 6.13000000 0.000000e+00 anti-Omega_b*+ -5334 0.00000000 + Omega_b- 120 5332 -1.0 6.04610000 1.645530e-12 Omega_b- 5332 0.00000000 + Omega_b~+ 121 -5332 1.0 6.04610000 1.645530e-12 anti-Omega_b+ -5332 0.00000000 + Xi_bc0 522 5142 0.0 6.90000000 0.500000e-12 Xi_bc0 5142 0.00000000 + Xi_bc~0 523 -5142 0.0 6.90000000 0.500000e-12 anti-Xi_bc0 -5142 0.00000000 + Xi_bc+ 532 5242 1.0 6.90000000 0.500000e-12 Xi_bc+ 5242 0.00000000 + Xi_bc~- 533 -5242 -1.0 6.90000000 0.500000e-12 anti-Xi_bc- -5242 0.00000000 + Omega_bc0 544 5342 0.0 7.19099000 0.500000e-12 Omega_bc0 5342 0.00000000 + Omega_bc~0 545 -5342 0.0 7.19099000 0.500000e-12 anti-Omega_bc0 -5342 0.00000000 + Xi'_bc0 550 5412 0.0 7.03724000 0.000000e+00 Xi'_bc0 5412 0.00000000 + Xi'_bc~0 551 -5412 0.0 7.03724000 0.000000e+00 anti-Xi'_bc0 -5412 0.00000000 + Xi*_bc0 552 5414 0.0 7.04850000 0.000000e+00 Xi*_bc0 5414 0.00000000 + Xi*_bc~0 553 -5414 0.0 7.04850000 0.000000e+00 anti-Xi*_bc0 -5414 0.00000000 + Xi'_bc+ 554 5422 1.0 7.03724000 0.000000e+00 Xi'_bc+ 5422 0.00000000 + Xi'_bc~- 555 -5422 -1.0 7.03724000 0.000000e+00 anti-Xi'_bc- -5422 0.00000000 + Xi*_bc+ 556 5424 1.0 7.04850000 0.000000e+00 Xi*_bc+ 5424 0.00000000 + Xi*_bc~- 557 -5424 -1.0 7.04850000 0.000000e+00 anti-Xi*_bc+ -5424 0.00000000 + Omega'_bc0 558 5432 0.0 7.21101000 0.000000e+00 Omega'_bc0 5432 0.00000000 + Omega'_bc~0 559 -5432 0.0 7.21101000 0.000000e+00 anti-Omega'_bc0 -5432 0.00000000 + Omega*_bc0 560 5434 0.0 7.21900000 0.000000e+00 Omega*_bc0 5434 0.00000000 + Omega*_bc~0 561 -5434 0.0 7.21900000 0.000000e+00 anti-Omega*_bc0 -5434 0.00000000 + Omega_bcc+ 562 5442 1.0 8.30945000 1.290893e-12 Omega_bcc+ 5442 0.00000000 + Omega_bcc~- 563 -5442 -1.0 8.30945000 1.290893e-12 anti-Omega_bcc- -5442 0.00000000 + Omega*_bcc+ 564 5444 1.0 8.31325000 0.000000e+00 Omega*_bcc+ 5444 0.00000000 + Omega*_bcc~- 565 -5444 -1.0 8.31325000 0.000000e+00 anti-Omega*_bcc- -5444 0.00000000 + Xi_bb- 568 5512 -1.0 10.42272000 1.290893e-12 Xi_bb- 5512 0.00000000 + Xi_bb~+ 569 -5512 1.0 10.42272000 1.290893e-12 anti-Xi_bb+ -5512 0.00000000 + Xi*_bb- 570 5514 -1.0 10.44144000 0.000000e+00 Xi*_bb- 5514 0.00000000 + Xi*_bb~+ 571 -5514 1.0 10.44144000 0.000000e+00 anti-Xi*_bb+ -5514 0.00000000 + Xi_bb0 572 5522 0.0 10.42272000 1.290893e-12 Xi_bb0 5522 0.00000000 + Xi_bb~0 573 -5522 0.0 10.42272000 1.290893e-12 anti-Xi_bb0 -5522 0.00000000 + Xi*_bb0 574 5524 0.0 10.44144000 0.000000e+00 Xi*_bb0 5524 0.00000000 + Xi*_bb~0 575 -5524 0.0 10.44144000 0.000000e+00 anti-Xi*_bb0 -5524 0.00000000 + Omega_bb- 576 5532 -1.0 10.60209000 1.290893e-12 Omega_bb- 5532 0.00000000 + Omega_bb~+ 577 -5532 1.0 10.60209000 1.290893e-12 anti-Omega_bb+ -5532 0.00000000 + Omega*_bb- 578 5534 -1.0 10.61426000 0.000000e+00 Omega*_bb- 5534 0.00000000 + Omega*_bb~+ 579 -5534 1.0 10.61426000 0.000000e+00 anti-Omega*_bb+ -5534 0.00000000 + Omega_bbc0 580 5542 0.0 11.70767000 1.290893e-12 Omega_bbc0 5542 0.00000000 + Omega_bbc~0 581 -5542 0.0 11.70767000 1.290893e-12 anti-Omega_bbc0 -5542 0.00000000 + Omega*_bbc0 582 5544 0.0 11.71147000 0.000000e+00 Omega*_bbc0 5544 0.00000000 + Omega*_bbc~0 583 -5544 0.0 11.71147000 0.000000e+00 anti-Omega*_bbc0 -5544 0.00000000 + Omega*_bbb- 584 5554 -1.0 15.11061000 0.000000e+00 Omega*_bbb- 5554 0.00000000 + Omega*_bbb~+ 585 -5554 1.0 15.11061000 0.000000e+00 anti-Omega*_bbb+ -5554 0.00000000 + deuteron 45 1000010020 1.0 1.87561300 1.000000e+15 deuteron 0 0.00000000 + triton 46 1000010030 1.0 2.80925000 1.000000e+15 tritium 0 0.00000000 + alpha 47 1000020040 2.0 3.72741700 1.000000e+15 alpha 0 0.00000000 + geantino 48 480000000 0.0 0.00000000 1.000000e+15 geantino 0 0.00000000 + opticalphoton 50 20022 0.0 0.00000000 1.000000e+16 Cerenkov 0 0.00000000 + H_10 87 25 0.0 125.10000000 9.400000e-26 Higgs0 25 0.00000000 + H_20 88 35 0.0 310.00000000 9.400000e-26 Higgs'0 35 0.00000000 + H_30 89 36 0.0 310.00000000 9.400000e-26 A0 36 0.00000000 + H+ 90 37 1.0 310.00000000 9.400000e-26 Higgs+ 37 0.00000000 + H- 91 -37 -1.0 310.00000000 9.400000e-26 Higgs- -37 0.00000000 + d 303 1 -0.3 0.00990000 0.000000e+00 d 1 0.00000000 + anti-d 304 -1 0.3 0.00990000 0.000000e+00 anti-d -1 0.00000000 + u 305 2 0.7 0.00560000 0.000000e+00 u 2 0.00000000 + anti-u 306 -2 -0.7 0.00560000 0.000000e+00 anti-u -2 0.00000000 + s 307 3 -0.3 0.19900000 0.000000e+00 s 3 0.00000000 + anti-s 308 -3 0.3 0.19900000 0.000000e+00 anti-s -3 0.00000000 + c 309 4 0.7 1.35000000 0.000000e+00 c 4 0.00000000 + anti-c 310 -4 -0.7 1.35000000 0.000000e+00 anti-c -4 0.00000000 + b 311 5 -0.3 5.00000000 0.000000e+00 b 5 0.00000000 + anti-b 312 -5 0.3 5.00000000 0.000000e+00 anti-b -5 0.00000000 + t 313 6 0.7 173.50000000 3.291061e-25 t 6 0.00000000 + anti-t 314 -6 -0.7 173.50000000 3.291061e-25 anti-t -6 0.00000000 + b' 315 7 -0.3 400.00000000 0.000000e+00 b' 7 0.00000000 + anti-b' 316 -7 0.3 400.00000000 0.000000e+00 anti-b' -7 0.00000000 + t' 317 8 0.7 500.00000000 0.000000e+00 t' 8 0.00000000 + anti-t' 318 -8 -0.7 500.00000000 0.000000e+00 anti-t' -8 0.00000000 + nu_tau 319 16 0.0 0.00000000 1.000000e+16 nu_tau 16 0.00000000 + nu_tau~ 320 -16 0.0 0.00000000 1.000000e+16 anti-nu_tau -16 0.00000000 + L- 321 17 -1.0 400.00000000 0.000000e+00 L- 17 0.00000000 + L+ 322 -17 1.0 400.00000000 0.000000e+00 L+ -17 0.00000000 + nu_L 323 18 0.0 0.00000000 0.000000e+00 nu_L 18 0.00000000 + anti-nu_L 324 -18 0.0 0.00000000 0.000000e+00 anti-nu_L -18 0.00000000 + g 325 21 0.0 0.00000000 1.000000e+16 g 21 0.00000000 + Z'0 326 32 0.0 500.00000000 0.000000e+00 Z'0 32 0.00000000 + Z''0 327 33 0.0 900.00000000 0.000000e+00 Z''0 33 0.00000000 + W'+ 328 34 1.0 500.00000000 0.000000e+00 W'+ 34 0.00000000 + W'- 329 -34 -1.0 500.00000000 0.000000e+00 W'- -34 0.00000000 + Graviton 330 39 0.0 0.00000000 0.000000e+00 unknown 39 0.00000000 + R0 331 41 0.0 5000.00000000 0.000000e+00 R0 41 0.00000000 + anti-R0 332 -41 0.0 5000.00000000 0.000000e+00 anti-R0 -41 0.00000000 + LQ_ue 333 42 -0.3 200.00000000 0.000000e+00 unknown 42 0.00000000 + LQ_uebar 334 -42 0.3 200.00000000 0.000000e+00 unknown -42 0.00000000 + Xu0 335 43 0.0 1.00000000 0.000000e+00 Xu0 43 0.00000000 + Xu+ 336 44 1.0 1.00000000 0.000000e+00 Xu+ 44 0.00000000 + Xu- 337 -44 -1.0 1.00000000 0.000000e+00 Xu- -44 0.00000000 + specflav 338 81 0.0 0.00000000 0.000000e+00 specflav 81 0.00000000 + rndmflav 339 82 0.0 0.00000000 0.000000e+00 rndmflav 82 0.00000000 + anti-rndmflav 340 -82 0.0 0.00000000 0.000000e+00 anti-rndmflav -82 0.00000000 + phasespa 341 83 0.0 1.00000000 0.000000e+00 phasespa 83 0.00000000 + c-hadron 342 84 0.7 2.00000000 3.335641e-13 c-hadron 84 0.00000000 + anti-c-hadron 343 -84 -0.7 2.00000000 3.335641e-13 anti-c-hadron -84 0.00000000 + b-hadron 344 85 -0.3 5.00000000 1.290893e-12 b-hadron 85 0.00000000 + anti-b-hadron 345 -85 0.3 5.00000000 1.290893e-12 anti-b-hadron -85 0.00000000 + t-hadron 346 86 0.7 175.00000000 0.000000e+00 t-hadron 0 0.00000000 + anti-t-hadron 347 -86 -0.7 175.00000000 0.000000e+00 anti-t-hadron 0 0.00000000 + b'-hadron 348 87 -0.3 400.00000000 0.000000e+00 b'-hadron 0 0.00000000 + anti-b'-hadron 349 -87 0.3 400.00000000 0.000000e+00 anti-b'-hadron 0 0.00000000 + junction 350 88 0.0 0.00000000 0.000000e+00 junction 88 0.00000000 + system 351 90 0.0 0.00000000 0.000000e+00 system 90 0.00000000 + cluster 352 91 0.0 0.00000000 0.000000e+00 cluster 91 0.00000000 + string 353 92 0.0 0.00000000 0.000000e+00 string 92 0.00000000 + indep 354 93 0.0 0.00000000 0.000000e+00 indep 93 0.00000000 + CMshower 355 94 0.0 0.00000000 0.000000e+00 CMshower 94 0.00000000 + SPHEaxis 356 95 0.0 0.00000000 0.000000e+00 SPHEaxis 95 0.00000000 + THRUaxis 357 96 0.0 0.00000000 0.000000e+00 THRUaxis 96 0.00000000 + CLUSjet 358 97 0.0 0.00000000 0.000000e+00 CLUSjet 97 0.00000000 + CELLjet 359 98 0.0 0.00000000 0.000000e+00 CELLjet 98 0.00000000 + table 360 99 0.0 0.00000000 0.000000e+00 table 99 0.00000000 + deuteron~ 390 -1000010020 -1.0 1.87561300 1.000000e+15 anti-deuteron 0 0.00000000 + triton~ 392 -1000010030 -1.0 2.80925000 1.000000e+15 anti-tritium 0 0.00000000 + alpha~ 393 -1000020040 -2.0 3.72741700 1.000000e+15 anti-alpha 0 0.00000000 + dd_1 394 1103 -0.7 0.00000000 0.000000e+00 dd_1 1103 0.00000000 + anti-dd_1 395 -1103 0.7 0.00000000 0.000000e+00 anti-dd_1 -1103 0.00000000 + ud_0 410 2101 0.3 0.00000000 0.000000e+00 ud_0 2101 0.00000000 + anti-ud_0 411 -2101 -0.3 0.00000000 0.000000e+00 anti-ud_0 -2101 0.00000000 + ud_1 412 2103 0.3 0.00000000 0.000000e+00 ud_1 2103 0.00000000 + anti-ud_1 413 -2103 -0.3 0.00000000 0.000000e+00 anti-ud_1 -2103 0.00000000 + uu_1 426 2203 1.3 0.00000000 0.000000e+00 uu_1 2203 0.00000000 + anti-uu_1 427 -2203 -1.3 0.00000000 0.000000e+00 anti-uu_1 -2203 0.00000000 + sd_0 438 3101 -0.7 0.00000000 0.000000e+00 sd_0 3101 0.00000000 + anti-sd_0 439 -3101 0.7 0.00000000 0.000000e+00 anti-sd_0 -3101 0.00000000 + sd_1 440 3103 -0.7 0.00000000 0.000000e+00 sd_1 3103 0.00000000 + anti-sd_1 441 -3103 0.7 0.00000000 0.000000e+00 anti-sd_1 -3103 0.00000000 + su_0 454 3201 0.3 0.00000000 0.000000e+00 su_0 3201 0.00000000 + anti-su_0 455 -3201 -0.3 0.00000000 0.000000e+00 anti-su_0 -3201 0.00000000 + su_1 456 3203 0.3 0.00000000 0.000000e+00 su_1 3203 0.00000000 + anti-su_1 457 -3203 -0.3 0.00000000 0.000000e+00 anti-su_1 -3203 0.00000000 + ss_1 470 3303 -0.7 0.00000000 0.000000e+00 ss_1 3303 0.00000000 + anti-ss_1 471 -3303 0.7 0.00000000 0.000000e+00 anti-ss_1 -3303 0.00000000 + cd_0 476 4101 0.3 0.00000000 0.000000e+00 cd_0 4101 0.00000000 + anti-cd_0 477 -4101 -0.3 0.00000000 0.000000e+00 anti-cd_0 -4101 0.00000000 + cd_1 478 4103 0.3 0.00000000 0.000000e+00 cd_1 4103 0.00000000 + anti-cd_1 479 -4103 -0.3 0.00000000 0.000000e+00 anti-cd_1 -4103 0.00000000 + cu_0 482 4201 1.3 0.00000000 0.000000e+00 cu_0 4201 0.00000000 + anti-cu_0 483 -4201 -1.3 0.00000000 0.000000e+00 anti-cu_0 -4201 0.00000000 + cu_1 484 4203 1.3 0.00000000 0.000000e+00 cu_1 4203 0.00000000 + anti-cu_1 485 -4203 -1.3 0.00000000 0.000000e+00 anti-cu_1 -4203 0.00000000 + cs_0 490 4301 0.3 0.00000000 0.000000e+00 cs_0 4301 0.00000000 + anti-cs_0 491 -4301 -0.3 0.00000000 0.000000e+00 anti-cs_0 -4301 0.00000000 + cs_1 492 4303 0.3 0.00000000 0.000000e+00 cs_1 4303 0.00000000 + anti-cs_1 493 -4303 -0.3 0.00000000 0.000000e+00 anti-cs_1 -4303 0.00000000 + cc_1 500 4403 1.3 0.00000000 0.000000e+00 cc_1 4403 0.00000000 + anti-cc_1 501 -4403 -1.3 0.00000000 0.000000e+00 anti-cc_1 -4403 0.00000000 + bd_0 516 5101 -0.7 0.00000000 0.000000e+00 bd_0 5101 0.00000000 + anti-bd_0 517 -5101 0.7 0.00000000 0.000000e+00 anti-bd_0 -5101 0.00000000 + bd_1 518 5103 -0.7 0.00000000 0.000000e+00 bd_1 5103 0.00000000 + anti-bd_1 519 -5103 0.7 0.00000000 0.000000e+00 anti-bd_1 -5103 0.00000000 + bu_0 524 5201 0.3 0.00000000 0.000000e+00 bu_0 5201 0.00000000 + anti-bu_0 525 -5201 -0.3 0.00000000 0.000000e+00 anti-bu_0 -5201 0.00000000 + bu_1 526 5203 0.3 0.00000000 0.000000e+00 bu_1 5203 0.00000000 + anti-bu_1 527 -5203 -0.3 0.00000000 0.000000e+00 anti-bu_1 -5203 0.00000000 + bs_0 534 5301 -0.7 0.00000000 0.000000e+00 bs_0 5301 0.00000000 + anti-bs_0 535 -5301 0.7 0.00000000 0.000000e+00 anti-bs_0 -5301 0.00000000 + bs_1 536 5303 -0.7 0.00000000 0.000000e+00 bs_1 5303 0.00000000 + anti-bs_1 537 -5303 0.7 0.00000000 0.000000e+00 anti-bs_1 -5303 0.00000000 + bc_0 546 5401 0.3 0.00000000 0.000000e+00 bc_0 5401 0.00000000 + anti-bc_0 547 -5401 -0.3 0.00000000 0.000000e+00 anti-bc_0 -5401 0.00000000 + bc_1 548 5403 0.3 0.00000000 0.000000e+00 bc_1 5403 0.00000000 + anti-bc_1 549 -5403 -0.3 0.00000000 0.000000e+00 anti-bc_1 -5403 0.00000000 + bb_1 566 5503 -0.7 0.00000000 0.000000e+00 bb_1 5503 0.00000000 + anti-bb_1 567 -5503 0.7 0.00000000 0.000000e+00 anti-bb_1 -5503 0.00000000 + vpho 586 10022 0.0 0.00000000 0.000000e+00 vpho 0 0.00000000 + Xsd 751 30343 0.0 1.60000000 0.000000e+00 Xsd 30343 0.00000000 + anti-Xsd 752 -30343 0.0 1.60000000 0.000000e+00 anti-Xsd -30343 0.00000000 + Xsu 753 30353 1.0 1.60000000 0.000000e+00 Xsu 30353 0.00000000 + anti-Xsu 754 -30353 -1.0 1.60000000 0.000000e+00 anti-Xsu -30353 0.00000000 + Xss 755 30363 0.0 1.80000000 0.000000e+00 Xss 30363 0.00000000 + anti-Xss 756 -30363 0.0 1.80000000 0.000000e+00 anti-Xss -30363 0.00000000 + ~d_L 859 1000001 -0.3 500.00000000 0.000000e+00 unknown 1000001 0.00000000 + ~d_Lbar 860 -1000001 0.3 500.00000000 0.000000e+00 unknown -1000001 0.00000000 + ~u_L 861 1000002 0.7 500.00000000 0.000000e+00 unknown 1000002 0.00000000 + ~u_Lbar 862 -1000002 -0.7 500.00000000 0.000000e+00 unknown -1000002 0.00000000 + ~s_L 863 1000003 -0.3 500.00000000 0.000000e+00 unknown 1000003 0.00000000 + ~s_Lbar 864 -1000003 0.3 500.00000000 0.000000e+00 unknown -1000003 0.00000000 + ~c_L 865 1000004 0.7 500.00000000 0.000000e+00 unknown 1000004 0.00000000 + ~c_Lbar 866 -1000004 -0.7 500.00000000 0.000000e+00 unknown -1000004 0.00000000 + ~b_1 867 1000005 -0.3 500.00000000 0.000000e+00 unknown 1000005 0.00000000 + ~b_1bar 868 -1000005 0.3 500.00000000 0.000000e+00 unknown -1000005 0.00000000 + ~t_1 869 1000006 0.7 500.00000000 0.000000e+00 unknown 1000006 0.00000000 + ~t_1bar 870 -1000006 -0.7 500.00000000 0.000000e+00 unknown -1000006 0.00000000 + ~e_L- 871 1000011 -1.0 500.00000000 0.000000e+00 unknown 1000011 0.00000000 + ~e_L+ 872 -1000011 1.0 500.00000000 0.000000e+00 unknown -1000011 0.00000000 + ~nu_eL 873 1000012 0.0 500.00000000 0.000000e+00 unknown 1000012 0.00000000 + ~nu_eLbar 874 -1000012 0.0 500.00000000 0.000000e+00 unknown -1000012 0.00000000 + ~mu_L- 875 1000013 -1.0 500.00000000 0.000000e+00 unknown 1000013 0.00000000 + ~mu_L+ 876 -1000013 1.0 500.00000000 0.000000e+00 unknown -1000013 0.00000000 + ~nu_muL 877 1000014 0.0 500.00000000 0.000000e+00 unknown 1000014 0.00000000 + ~nu_muLbar 878 -1000014 0.0 500.00000000 0.000000e+00 unknown -1000014 0.00000000 + ~tau_1- 879 1000015 -1.0 500.00000000 0.000000e+00 unknown 1000015 0.00000000 + ~tau_1+ 880 -1000015 1.0 500.00000000 0.000000e+00 unknown -1000015 0.00000000 + ~nu_tauL 881 1000016 0.0 500.00000000 0.000000e+00 unknown 1000016 0.00000000 + ~nu_tauLbar 882 -1000016 0.0 500.00000000 0.000000e+00 unknown -1000016 0.00000000 + ~g 883 1000021 0.0 500.00000000 0.000000e+00 unknown 1000021 0.00000000 + ~chi_10 884 1000022 0.0 500.00000000 0.000000e+00 unknown 1000022 0.00000000 + ~chi_20 885 1000023 0.0 500.00000000 0.000000e+00 unknown 1000023 0.00000000 + ~chi_1+ 886 1000024 1.0 500.00000000 0.000000e+00 unknown 1000024 0.00000000 + ~chi_1- 887 -1000024 -1.0 500.00000000 0.000000e+00 unknown -1000024 0.00000000 + ~chi_30 888 1000025 0.0 500.00000000 0.000000e+00 unknown 1000025 0.00000000 + ~chi_40 889 1000035 0.0 500.00000000 0.000000e+00 unknown 1000035 0.00000000 + ~chi_2+ 890 1000037 1.0 500.00000000 0.000000e+00 unknown 1000037 0.00000000 + ~chi_2- 891 -1000037 -1.0 500.00000000 0.000000e+00 unknown -1000037 0.00000000 + ~Gravitino 892 1000039 0.0 500.00000000 0.000000e+00 unknown 1000039 0.00000000 + ~d_R 893 2000001 -0.3 500.00000000 0.000000e+00 unknown 2000001 0.00000000 + ~d_Rbar 894 -2000001 0.3 500.00000000 0.000000e+00 unknown -2000001 0.00000000 + ~u_R 895 2000002 0.7 500.00000000 0.000000e+00 unknown 2000002 0.00000000 + ~u_Rbar 896 -2000002 -0.7 500.00000000 0.000000e+00 unknown -2000002 0.00000000 + ~s_R 897 2000003 -0.3 500.00000000 0.000000e+00 unknown 2000003 0.00000000 + ~s_Rbar 898 -2000003 0.3 500.00000000 0.000000e+00 unknown -2000003 0.00000000 + ~c_R 899 2000004 0.7 500.00000000 0.000000e+00 unknown 2000004 0.00000000 + ~c_Rbar 900 -2000004 -0.7 500.00000000 0.000000e+00 unknown -2000004 0.00000000 + ~b_2 901 2000005 -0.3 500.00000000 0.000000e+00 unknown 2000005 0.00000000 + ~b_2bar 902 -2000005 0.3 500.00000000 0.000000e+00 unknown -2000005 0.00000000 + ~t_2 903 2000006 0.7 500.00000000 0.000000e+00 unknown 2000006 0.00000000 + ~t_2bar 904 -2000006 -0.7 500.00000000 0.000000e+00 unknown -2000006 0.00000000 + ~e_R- 905 2000011 -1.0 500.00000000 0.000000e+00 unknown 2000011 0.00000000 + ~e_R+ 906 -2000011 1.0 500.00000000 0.000000e+00 unknown -2000011 0.00000000 + ~nu_eR 907 2000012 0.0 500.00000000 0.000000e+00 unknown 2000012 0.00000000 + ~nu_eRbar 908 -2000012 0.0 500.00000000 0.000000e+00 unknown -2000012 0.00000000 + ~mu_R- 909 2000013 -1.0 500.00000000 0.000000e+00 unknown 2000013 0.00000000 + ~mu_R+ 910 -2000013 1.0 500.00000000 0.000000e+00 unknown -2000013 0.00000000 + ~nu_muR 911 2000014 0.0 500.00000000 0.000000e+00 unknown 2000014 0.00000000 + ~nu_muRbar 912 -2000014 0.0 500.00000000 0.000000e+00 unknown -2000014 0.00000000 + ~tau_2- 913 2000015 -1.0 500.00000000 0.000000e+00 unknown 2000015 0.00000000 + ~tau_2+ 914 -2000015 1.0 500.00000000 0.000000e+00 unknown -2000015 0.00000000 + ~nu_tauR 915 2000016 0.0 500.00000000 0.000000e+00 unknown 2000016 0.00000000 + ~nu_tauRbar 916 -2000016 0.0 500.00000000 0.000000e+00 unknown -2000016 0.00000000 + pi_tc0 917 3000111 0.0 110.00000000 0.000000e+00 unknown 3000111 0.00000000 + rho_tc0 918 3000113 0.0 210.00000000 0.000000e+00 unknown 3000113 0.00000000 + pi_tc+ 919 3000211 1.0 110.00000000 0.000000e+00 unknown 3000211 0.00000000 + pi_tc- 920 -3000211 -1.0 110.00000000 0.000000e+00 unknown -3000211 0.00000000 + rho_tc+ 921 3000213 1.0 210.00000000 0.000000e+00 unknown 3000213 0.00000000 + rho_tc- 922 -3000213 -1.0 210.00000000 0.000000e+00 unknown -3000213 0.00000000 + pi'_tc0 923 3000221 0.0 110.00000000 0.000000e+00 unknown 3000221 0.00000000 + omega_tc 924 3000223 0.0 210.00000000 0.000000e+00 unknown 3000223 0.00000000 + eta_tc0 925 3000331 0.0 350.00000000 0.000000e+00 unknown 3000331 0.00000000 + V8_tc 926 3100021 0.0 500.00000000 0.000000e+00 unknown 3100021 0.00000000 + pi_22_1_tc 927 3100111 0.0 125.00000000 0.000000e+00 unknown 3100111 0.00000000 + rho_11_tc 928 3100113 0.0 400.00000000 0.000000e+00 unknown 3100113 0.00000000 + pi_22_8_tc 929 3200111 0.0 250.00000000 0.000000e+00 unknown 3200111 0.00000000 + rho_12_tc 930 3200113 0.0 350.00000000 0.000000e+00 unknown 3200113 0.00000000 + rho_21_tc 931 3300113 0.0 350.00000000 0.000000e+00 unknown 3300113 0.00000000 + rho_22_tc 932 3400113 0.0 300.00000000 0.000000e+00 unknown 3400113 0.00000000 + d* 933 4000001 -0.3 400.00000000 0.000000e+00 unknown 4000001 0.00000000 + d*bar 934 -4000001 0.3 400.00000000 0.000000e+00 unknown -4000001 0.00000000 + u* 935 4000002 0.7 400.00000000 0.000000e+00 unknown 4000002 0.00000000 + u*bar 936 -4000002 -0.7 400.00000000 0.000000e+00 unknown -4000002 0.00000000 + e*- 937 4000011 -1.0 400.00000000 0.000000e+00 unknown 4000011 0.00000000 + e*bar+ 938 -4000011 1.0 400.00000000 0.000000e+00 unknown -4000011 0.00000000 + nu*_e0 939 4000012 0.0 400.00000000 0.000000e+00 unknown 4000012 0.00000000 + nu*_ebar0 940 -4000012 0.0 400.00000000 0.000000e+00 unknown -4000012 0.00000000 + gv 4900021 4900021 0.0 0.00000000 0.0000e+00 gv 4900021 0.00000000 + Zv 4900023 4900023 0.0 125.00000000 6.5800e-23 Zv 4900023 0.01000000 + qv 4900101 4900101 0.0 1.00000000 0.0000e+00 qv 4900101 0.00000000 + qvbar -4900101 -4900101 0.0 1.00000000 0.0000e+00 qvbar -4900101 0.00000000 + pivDiag 4900111 4900111 0.0 1.20000000 5.0000e-12 pivDiag 4900111 2.0000e-11 + pivUp 4900211 4900211 0.0 1.20000000 0.0000e+00 pivUp 4900211 0.00000000 + pivDn -4900211 -4900211 0.0 1.20000000 0.0000e+00 pivDn -4900211 0.00000000 + rhovDiag 4900113 4900113 0.0 1.20000000 0.0000e+00 rhovDiag 4900113 0.00000000 + rhovUp 4900213 4900213 0.0 1.20000000 0.0000e+00 rhovUp 4900213 0.00000000 + rhovDn -4900213 -4900213 0.0 1.20000000 0.0000e+00 rhovDn -4900213 0.00000000 + Graviton* 941 5000039 0.0 1000.00000000 0.000000e+00 unknown 5000039 0.00000000 + nu_Re 942 9900012 0.0 500.00000000 0.000000e+00 unknown 9900012 0.00000000 + nu_Rmu 943 9900014 0.0 500.00000000 0.000000e+00 unknown 9900014 0.00000000 + nu_Rtau 944 9900016 0.0 500.00000000 0.000000e+00 unknown 9900016 0.00000000 + Z_R0 945 9900023 0.0 1200.00000000 0.000000e+00 unknown 9900023 0.00000000 + W_R+ 946 9900024 1.0 750.00000000 0.000000e+00 unknown 9900024 0.00000000 + W_R- 947 -9900024 -1.0 750.00000000 0.000000e+00 unknown -9900024 0.00000000 + H_L++ 948 9900041 2.0 200.00000000 0.000000e+00 unknown 9900041 0.00000000 + H_L-- 949 -9900041 -2.0 200.00000000 0.000000e+00 unknown -9900041 0.00000000 + H_R++ 950 9900042 2.0 200.00000000 0.000000e+00 unknown 9900042 0.00000000 + H_R-- 951 -9900042 -2.0 200.00000000 0.000000e+00 unknown -9900042 0.00000000 + He3[0.0] 49 1000020030 2.0 2.80923000 1.000000e+15 He3 0 0.00000000 + He3~[0.0] 391 -1000020030 -2.0 2.80923000 1.000000e+15 anti-He3 0 0.00000000 + Li7[0.0] 988 1000030070 3.0 6.53536500 0.000000e+00 unknown 0 0.00000000 + Be8[0.0] 992 1000040080 4.0 7.45689300 0.000000e+00 unknown 0 0.00000000 + Be9[0.0] 959 1000040090 4.0 8.39479200 0.000000e+00 unknown 0 0.00000000 + Be10[0.0] 993 1000040100 4.0 9.32754500 0.000000e+00 unknown 0 0.00000000 + B10[0.0] 994 1000050100 5.0 9.32698900 0.000000e+00 unknown 0 0.00000000 + B11[0.0] 974 1000050110 5.0 10.25510100 0.000000e+00 unknown 0 0.00000000 + B12[0.0] 975 1000050120 5.0 11.19129500 0.000000e+00 unknown 0 0.00000000 + C12[0.0] 953 1000060120 6.0 11.17490000 0.000000e+00 unknown 0 0.00000000 + C13[0.0] 976 1000060130 6.0 12.11254500 0.000000e+00 unknown 0 0.00000000 + C14[0.0] 977 1000060140 6.0 13.04393400 0.000000e+00 unknown 0 0.00000000 + N14[0.0] 955 1000070140 7.0 13.04378000 0.000000e+00 unknown 0 0.00000000 + N15[0.0] 982 1000070150 7.0 13.04377800 0.000000e+00 unknown 0 0.00000000 + N16[0.0] 995 1000070160 7.0 14.90958500 0.000000e+00 unknown 0 0.00000000 + O16[0.0] 956 1000080160 8.0 14.89510000 0.000000e+00 unknown 0 0.00000000 + O17[0.0] 996 1000080170 8.0 15.83458700 0.000000e+00 unknown 0 0.00000000 + O18[0.0] 967 1000080180 8.0 16.76610800 0.000000e+00 unknown 0 0.00000000 + O19[0.0] 997 1000080190 8.0 17.70171700 0.000000e+00 unknown 0 0.00000000 + F19[0.0] 960 1000090190 9.0 17.69689600 0.000000e+00 unknown 0 0.00000000 + Ne22[0.0] 983 1000100220 10.0 20.48484100 0.000000e+00 unknown 0 0.00000000 + Ne23[0.0] 998 1000100230 10.0 21.41920500 0.000000e+00 unknown 0 0.00000000 + Na24[0.0] 999 1000110240 11.0 22.34743500 0.000000e+00 unknown 0 0.00000000 + Mg24[0.0] 979 1000120240 12.0 22.34192000 0.000000e+00 unknown 0 0.00000000 + Mg25[0.0] 989 1000120250 12.0 23.27415400 0.000000e+00 unknown 0 0.00000000 + Mg26[0.0] 980 1000120260 12.0 24.20262600 0.000000e+00 unknown 0 0.00000000 + Mg27[0.0] 981 1000120270 12.0 25.13574800 0.000000e+00 unknown 0 0.00000000 + Al27[0.0] 952 1000130270 13.0 25.12650000 0.000000e+00 unknown 0 0.00000000 + Al28[0.0] 972 1000130280 13.0 26.06497800 0.000000e+00 unknown 0 0.00000000 + Si28[0.0] 957 1000140280 14.0 26.05320000 0.000000e+00 unknown 0 0.00000000 + Si29[0.0] 964 1000140290 14.0 26.99142700 0.000000e+00 unknown 0 0.00000000 + Si30[0.0] 968 1000140300 14.0 27.92038300 0.000000e+00 unknown 0 0.00000000 + P31[0.0] 1000 1000150310 15.0 28.85186900 0.000000e+00 unknown 0 0.00000000 + Cl39[0.0] 1001 1000170390 17.0 36.29846000 0.000000e+00 unknown 0 0.00000000 + Cl40[0.0] 1002 1000170400 17.0 37.23220100 0.000000e+00 unknown 0 0.00000000 + Ar36[0.0] 1003 1000180360 18.0 33.50354900 0.000000e+00 unknown 0 0.00000000 + Ar40[0.0] 973 1000180400 18.0 37.22471500 0.000000e+00 unknown 0 0.00000000 + Cr50[0.0] 1004 1000240500 24.0 46.52443900 0.000000e+00 unknown 0 0.00000000 + Cr52[0.0] 978 1000240520 24.0 48.37010000 0.000000e+00 unknown 0 0.00000000 + Cr53[0.0] 990 1000240530 24.0 49.31389400 0.000000e+00 unknown 0 0.00000000 + Cr54[0.0] 1005 1000240540 24.0 50.24374100 0.000000e+00 unknown 0 0.00000000 + Mn55[0.0] 991 1000250550 25.0 51.17445700 0.000000e+00 unknown 0 0.00000000 + Fe54[0.0] 966 1000260540 26.0 50.24442100 0.000000e+00 unknown 0 0.00000000 + Fe56[0.0] 961 1000260560 26.0 52.10305600 0.000000e+00 unknown 0 0.00000000 + Fe57[0.0] 969 1000260570 26.0 53.03497500 0.000000e+00 unknown 0 0.00000000 + Fe59[0.0] 1006 1000260590 26.0 54.89748000 0.000000e+00 unknown 0 0.00000000 + Ni58[0.0] 984 1000280580 28.0 53.96642200 0.000000e+00 unknown 0 0.00000000 + Ni60[0.0] 985 1000280600 28.0 55.82516400 0.000000e+00 unknown 0 0.00000000 + Ni61[0.0] 1007 1000280610 28.0 56.75690900 0.000000e+00 unknown 0 0.00000000 + Ni62[0.0] 986 1000280620 28.0 57.68587700 0.000000e+00 unknown 0 0.00000000 + Ni63[0.0] 1008 1000280630 28.0 58.61860500 0.000000e+00 unknown 0 0.00000000 + Ni64[0.0] 987 1000280640 28.0 59.54851200 0.000000e+00 unknown 0 0.00000000 + Cu63[0.0] 954 1000290630 29.0 58.61860000 0.000000e+00 unknown 0 0.00000000 + Cu65[0.0] 958 1000290650 29.0 60.47984200 0.000000e+00 unknown 0 0.00000000 + Mo92[0.0] 1009 1000420920 42.0 85.61063000 0.000000e+00 unknown 0 0.00000000 + Mo95[0.0] 1010 1000420950 42.0 88.40421000 0.000000e+00 unknown 0 0.00000000 + Mo96[0.0] 1011 1000420960 42.0 89.33462100 0.000000e+00 unknown 0 0.00000000 + Mo97[0.0] 1012 1000420970 42.0 90.26736500 0.000000e+00 unknown 0 0.00000000 + Mo98[0.0] 1013 1000420980 42.0 91.19828700 0.000000e+00 unknown 0 0.00000000 + Mo100[0.0] 1014 1000421000 42.0 93.06320300 0.000000e+00 unknown 0 0.00000000 + Pd108[0.0] 1015 1000461080 46.0 100.51181600 0.000000e+00 unknown 0 0.00000000 + Au197[0.0] 1020 1000791970 79.0 183.43336000 0.000000e+00 unknown 0 0.00000000 + Pb207[0.0] 962 1000822070 82.0 192.79676500 0.000000e+00 unknown 0 0.00000000 + Pb208[0.0] 963 1000822080 82.0 193.72896200 0.000000e+00 unknown 0 0.00000000 + Pb206[0.0] 965 1000822060 82.0 191.86393700 0.000000e+00 unknown 0 0.00000000 + Pb204[0.0] 970 1000822040 82.0 189.99962700 0.000000e+00 unknown 0 0.00000000 + Intermediate 971 -99000000 0.0 0.00000000 0.000000e+00 unknown 0 0.00000000 # END PARTICLE diff --git a/GaudiExamples/tests/qmtest/gaudiexamples.qms/particlepropsvc.qmt b/GaudiExamples/tests/qmtest/gaudiexamples.qms/particlepropsvc.qmt index fccc856a592f9e44da76e7d3a2afef39c2a8f32f..87f32038d35bc758bab6eef09195f301e6a78284 100644 --- a/GaudiExamples/tests/qmtest/gaudiexamples.qms/particlepropsvc.qmt +++ b/GaudiExamples/tests/qmtest/gaudiexamples.qms/particlepropsvc.qmt @@ -18,7 +18,11 @@ from Configurables import GaudiExamples__GaudiPPS as GaudiPPS importOptions("Common.opts") -ParticlePropertySvc( ParticlePropertiesFile = "../data/ParticleTable.txt" ) +from pathlib import Path +ParticlePropertiesFilePath = Path("..") / "data" / "ParticleTable.txt" + +ParticlePropertySvc( ParticlePropertiesFile = str(ParticlePropertiesFilePath) ) + ApplicationMgr( EvtMax = 1, EvtSel = 'NONE', diff --git a/GaudiKernel/dict/dictionary.h b/GaudiKernel/dict/dictionary.h index 8157c3d6f27a0602c8d294db05c0c0a21081fd7f..d9778bc142a36f6c49ecf2c0899c575fc9710a42 100644 --- a/GaudiKernel/dict/dictionary.h +++ b/GaudiKernel/dict/dictionary.h @@ -83,7 +83,6 @@ #include "GaudiKernel/INamedInterface.h" #include "GaudiKernel/IOpaqueAddress.h" #include "GaudiKernel/IPartPropSvc.h" -#include "GaudiKernel/IParticlePropertySvc.h" #include "GaudiKernel/IPartitionControl.h" #include "GaudiKernel/IPersistencySvc.h" #include "GaudiKernel/IProperty.h" diff --git a/GaudiKernel/dict/dictionary.xml b/GaudiKernel/dict/dictionary.xml index 52d89fe9309bf0fac6b42bcdf5b76b32e8f82351..174dd44de1c5641e43da991a88cde5c47f21d46a 100644 --- a/GaudiKernel/dict/dictionary.xml +++ b/GaudiKernel/dict/dictionary.xml @@ -89,7 +89,6 @@ <class name="INTupleSvc"/> <!--class name="IObjManager"/--> <class name="IOpaqueAddress"/> - <class name="IParticlePropertySvc"/> <class name="IPartPropSvc"/> <class name="IPartitionControl"/> <class name="IPersistencySvc"/> diff --git a/GaudiKernel/include/Gaudi/cxx/SynchronizedValue.h b/GaudiKernel/include/Gaudi/cxx/SynchronizedValue.h new file mode 100644 index 0000000000000000000000000000000000000000..c96029ddc6b1cf311821a7c714642593b987ed0b --- /dev/null +++ b/GaudiKernel/include/Gaudi/cxx/SynchronizedValue.h @@ -0,0 +1,108 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once +#include <functional> +#include <mutex> +#include <shared_mutex> +#include <tuple> +#include <type_traits> +#include <utility> + +namespace Gaudi::cxx { + + namespace details { + + template <typename Value, typename... Args> + using require_constructible_t = std::enable_if_t<std::is_constructible_v<Value, Args...>>; + + } // namespace details + + // C++20: replace with http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0290r2.html + // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4033.html + + template <typename Value, typename Mutex = std::mutex, + typename ReadLock = std::conditional_t<std::is_same_v<std::shared_mutex, Mutex>, std::shared_lock<Mutex>, + std::lock_guard<Mutex>>, + typename WriteLock = std::lock_guard<Mutex>> + class SynchronizedValue { + static_assert( !std::is_reference_v<Value>, "Value must not be a reference" ); + Value m_obj; + mutable Mutex m_mtx; + + public: + template <typename... Args, typename = details::require_constructible_t<Value, Args...>> + SynchronizedValue( Args&&... args ) : m_obj{ std::forward<Args>( args )... } {} + + SynchronizedValue( const SynchronizedValue& rhs ) { + static_assert( std::is_default_constructible_v<Value> ); // bound to hold, as otherwise we wouldn't get this + // far... so for 'documnentation purpose' really (C++20: + // turn into a `requires` clause )... + static_assert( std::is_copy_assignable_v<Value> ); + auto lock = std::scoped_lock{ rhs.m_mtx, m_mtx }; + m_obj = rhs.m_obj; + } + + SynchronizedValue& operator=( const SynchronizedValue& rhs ) { + static_assert( std::is_copy_assignable_v<Value> ); + if ( this != &rhs ) { + auto lock = std::scoped_lock{ rhs.m_mtx, m_mtx }; + m_obj = rhs.m_obj; + } + return *this; + } + + SynchronizedValue( SynchronizedValue&& rhs ) { + static_assert( std::is_default_constructible_v<Value> ); // bound to hold, as otherwise we wouldn't get this + // far... so for 'documnentation purpose' really (C++20: + // turn into a `requires` clause )... + static_assert( std::is_move_assignable_v<Value> ); + auto lock = std::scoped_lock{ rhs.m_mtx, m_mtx }; + m_obj = std::move( rhs.m_obj ); + } + + SynchronizedValue& operator=( SynchronizedValue&& rhs ) { + static_assert( std::is_move_assignable_v<Value> ); + if ( this != &rhs ) { + auto lock = std::scoped_lock{ rhs.m_mtx, m_mtx }; + m_obj = std::move( rhs.m_obj ); + } + return *this; + } + + template <typename F, typename... Args, + typename = std::enable_if_t<std::is_invocable_v<F, Value&, Args...> && + !std::is_invocable_v<F, const Value&, Args...>>> + decltype( auto ) with_lock( F&& f, Args&&... args ) { + WriteLock _{ m_mtx }; + return std::invoke( std::forward<F>( f ), m_obj, std::forward<Args>( args )... ); + } + + template <typename F, typename... Args, typename = std::enable_if_t<std::is_invocable_v<F, const Value&, Args...>>> + decltype( auto ) with_lock( F&& f, Args&&... args ) const { + ReadLock _{ m_mtx }; + return std::invoke( std::forward<F>( f ), m_obj, std::forward<Args>( args )... ); + } + }; + + // transform an f(T,...) into an f(SynchronizedValue<T>,...) + template <typename Fun> + auto with_lock( Fun&& f ) { + return [f = std::forward<Fun>( f )]( auto& p, auto&&... args ) -> decltype( auto ) { + return p.with_lock( f, std::forward<decltype( args )>( args )... ); + }; + } + // call f(T) for each element in a container of Synced<T> + template <typename ContainerOfSynced, typename Fun> + void for_each( ContainerOfSynced& c, Fun&& f ) { + std::for_each( begin( c ), end( c ), with_lock( std::forward<Fun>( f ) ) ); + } + +} // namespace Gaudi::cxx diff --git a/GaudiKernel/include/GaudiKernel/FindByMassRange.h b/GaudiKernel/include/GaudiKernel/FindByMassRange.h deleted file mode 100644 index ebd621f36e839b769c85b5bf60319b94ad211fc3..0000000000000000000000000000000000000000 --- a/GaudiKernel/include/GaudiKernel/FindByMassRange.h +++ /dev/null @@ -1,51 +0,0 @@ -/***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * -* * -* This software is distributed under the terms of the Apache version 2 licence, * -* copied verbatim in the file "LICENSE". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\***********************************************************************************/ -#ifndef GAUDIKERNEL_FINDBYMASSRANGE_H -#define GAUDIKERNEL_FINDBYMASSRANGE_H - -// Include files -#include "GaudiKernel/IParticlePropertySvc.h" -#include "GaudiKernel/ParticleProperty.h" - -/** @class FindByMassRange FindByMassRange.h GaudiKernel/FindByMassRange.h - IParticlePropertySvc::value_type is a typedef that defines the - internal service storage type that is returned when an iterator - is dereferenced. In this case it corresponds to - pair< std::string, ParticleProperty* > as the ParticlePropertySvc - stores all its data in a map. The string will be the map's key - (usually the particle name) and the pointer is a pointer to the - ParticleProperty object. - - The data is accessed in the following manner: - const IParticlePropertySvc::value_type& pp_ref; - std::string key = pp_ref.first; - ParticleProperty* pp = pp_ref.second; - - @author Ian Last -*/ -class GAUDI_API FindByMassRange { - -public: - /// Constructor - sets the mass range in Gev. - FindByMassRange( double low, double high ) : m_low( low ), m_high( high ) {} - - /** This routine check to see if the mass of a particle lies within the - given mass range and returns true if it does. - */ - bool operator()( const ParticleProperty* pp ) const { return pp && pp->mass() >= m_low && pp->mass() <= m_high; } - -private: - /// Low and high mass range (GeV) - double m_low; - double m_high; -}; - -#endif // GAUDIKERNEL_FINDBYMASSRANGE_H diff --git a/GaudiKernel/include/GaudiKernel/IParticlePropertySvc.h b/GaudiKernel/include/GaudiKernel/IParticlePropertySvc.h deleted file mode 100644 index 6cbc1e7967bd8d348e95b6a7bba31a61926222d4..0000000000000000000000000000000000000000 --- a/GaudiKernel/include/GaudiKernel/IParticlePropertySvc.h +++ /dev/null @@ -1,90 +0,0 @@ -/***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * -* * -* This software is distributed under the terms of the Apache version 2 licence, * -* copied verbatim in the file "LICENSE". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\***********************************************************************************/ -#ifndef GAUDIKERNEL_IPARTICLEPROPERTYSVC_H -#define GAUDIKERNEL_IPARTICLEPROPERTYSVC_H - -// Include Files -#include "GaudiKernel/IService.h" -#include <vector> - -// Forward declarations. -class ParticleProperty; - -/** @class IParticlePropertySvc IParticlePropertySvc.h GaudiKernel/IParticlePropertySvc.h - - This class is an interface to the ParticlePropertySvc. - - @author Iain Last - @author G.Corti -*/ -class GAUDI_API IParticlePropertySvc : virtual public IService { - -public: - /// InterfaceID - DeclareInterfaceID( IParticlePropertySvc, 3, 0 ); - - // Typedefs for container type - typedef std::vector<ParticleProperty*> VectPP; - typedef VectPP::const_iterator const_iterator; - typedef VectPP::iterator iterator; - - /** Create a new particle property - @param particle String name of the particle - @param geantId Geant3 ID of the particle - @param jetsetId Jetset ID of the particle - @param charge Particle charge (/e) - @param mass Particle mass (MeV) - @param tlife Particle lifetime (s) - @param evtName String name of the particle in EvtGen - @param pythiaId ID of particle in Pythia - @return StatusCode - SUCCESS if the particle property was added - */ - virtual StatusCode push_back( const std::string& particle, int geantId, int jetsetId, double charge, double mass, - double tlife, const std::string& evtName, int pythiaId, double maxWidth ) = 0; - - /** Create a new particle property. - @param pp a particle property class - @return StatusCode - SUCCESS if the particle property was added - */ - virtual StatusCode push_back( ParticleProperty* pp ) = 0; - - /// Get a const reference to the begining of the container. - virtual const_iterator begin() const = 0; - - /// Get a const reference to the end of the container. - virtual const_iterator end() const = 0; - - /// Get the container size. - virtual int size() const = 0; - - /// Retrieve an object by geant3 id. - virtual ParticleProperty* find( int geantId ) = 0; - - /// Retrieve an object by StdHep id - virtual ParticleProperty* findByStdHepID( int stdHepID ) = 0; - - /// Retrieve an object by name. - virtual ParticleProperty* find( const std::string& name ) = 0; - - /// Retrieve an object by PythiaID - virtual ParticleProperty* findByPythiaID( int pythiaID ) = 0; - - /// Erase a property by geant3 id. - virtual StatusCode erase( int geantId ) = 0; - - /// Erase a property by particle name. - virtual StatusCode erase( const std::string& name ) = 0; - - /// Erase a property by StdHep id - virtual StatusCode eraseByStdHepID( int stdHepID ) = 0; -}; - -#endif diff --git a/GaudiKernel/include/GaudiKernel/ParticleProperty.h b/GaudiKernel/include/GaudiKernel/ParticleProperty.h deleted file mode 100644 index 5ac2a13c4ea2d7c2c8ed251dc5f77012f922be11..0000000000000000000000000000000000000000 --- a/GaudiKernel/include/GaudiKernel/ParticleProperty.h +++ /dev/null @@ -1,153 +0,0 @@ -/***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * -* * -* This software is distributed under the terms of the Apache version 2 licence, * -* copied verbatim in the file "LICENSE". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\***********************************************************************************/ -#ifndef GAUDIKERNEL_PARTICLEPROPERTY_H -#define GAUDIKERNEL_PARTICLEPROPERTY_H 1 -// ============================================================================ -// Include files -// ============================================================================ -#include <iomanip> -#include <ostream> -#include <string> -// ============================================================================ - -/** @class ParticleProperty ParticleProperty.h GaudiKernel/ParticleProperty.h - * - * A trivial class to hold information about a single particle properties. - * All particle properties are accessible through accessor functions - * - * @author Iain Last,G.Corti - */ -class ParticleProperty final { -public: - /// Constructors - ParticleProperty() = default; - - ParticleProperty( std::string particle, int geantId, int jetsetId, double charge, double mass, double tlife, - std::string evtgenName, int pythiaId, double maxWidth ) - : m_name( std::move( particle ) ) - , m_idgeant( geantId ) - , m_idjetset( jetsetId ) - , m_charge( charge ) - , m_mass( mass ) - , m_tlife( tlife ) - , m_evtgenName( std::move( evtgenName ) ) - , m_pythiaId( pythiaId ) - , m_maxWidth( maxWidth ) {} - - /// Destructor. - ~ParticleProperty() = default; - - /// Get the particle name. - const std::string& particle() const { return m_name; } - - /// Set the particle name. - void setParticle( const std::string& particle ) { m_name = particle; } - - /// Get the GEANT3 ID. - int geantID() const { return m_idgeant; } - - /// Set the GEANT3 ID. - void setGeantID( int id ) { m_idgeant = id; } - - /// Get the PDG (= JETSET) ID - int pdgID() const { return m_idjetset; } - - /// Set the PDG (= JETSET) ID - void setPdgID( int id ) { m_idjetset = id; } - - /// Get the JETSET(StdHep) ID. - int jetsetID() const { return m_idjetset; } - - /// Set the JETSET(StdHep) ID. - void setJetsetID( int id ) { m_idjetset = id; } - - /// Get the particle charge. - double charge() const { return m_charge; } - - /// Set the particle charge. - void setCharge( double q ) { m_charge = q; } - - /// Get the particle mass. - double mass() const { return m_mass; } - - /// Set the particle charge. - void setMass( double m ) { m_mass = m; } - - /// Get the particle lifetime. - double lifetime() const { return m_tlife; } - - /// Set the particle lifetime. - void setLifetime( double t ) { m_tlife = t; } - - /// Get the EvtGen name - const std::string& evtGenName() const { return m_evtgenName; } - - /// Set the EvtGen name - void setEvtGenName( const std::string& name ) { m_evtgenName = name; } - - /// Get the Pythia ID - int pythiaID() const { return m_pythiaId; } - - /// Set the Pythia ID - void setPythiaID( int pId ) { m_pythiaId = pId; } - - /// Get the max width deviation - double maxWidth() const { return m_maxWidth; } - - /// Set the max width deviation - void setMaxWidth( double mW ) { m_maxWidth = mW; } - - /// get the pointer to the antiparticle - const ParticleProperty* antiParticle() const { return m_anti; } - /// set the pointer to the antiparticle - void setAntiParticle( const ParticleProperty* p ) { m_anti = p; } - - friend std::ostream& operator<<( std::ostream& stream, const ParticleProperty& pp ) { - stream << "Name : " << pp.m_name << ", Geant ID : " << pp.m_idgeant << ", JetSet ID : " << pp.m_idjetset - << ", Charge (/e): " << pp.m_charge << ", Mass (MeV): " << pp.m_mass << ", Lifetime (ns): " << pp.m_tlife - << ", EvtGen Name: " << pp.m_evtgenName << ", Pythia ID: " << pp.m_pythiaId - << ", Max width deviation (MeV): " << pp.m_maxWidth; - return stream; - } - -private: - /// The particle name. - std::string m_name; - - /// The GEANT ID. - int m_idgeant; - - /// The Jetset ID. - int m_idjetset; - - /// The charge. - double m_charge; - - /// The mass. - double m_mass; - - /// The lifetime. - double m_tlife; - - /// The EvtGen Name - std::string m_evtgenName; - - /// The Pythia ID - int m_pythiaId; - - /// The maximum width deviation - double m_maxWidth; - - /// the antiparticle - const ParticleProperty* m_anti = nullptr; -}; - -#endif diff --git a/GaudiMP/dict/gaudimp_dict.h b/GaudiMP/dict/gaudimp_dict.h index 0720ab552c7c4beaacaa6d60e424d31f95d74430..6f37abae9b4142480b01025d13573aac64506af1 100644 --- a/GaudiMP/dict/gaudimp_dict.h +++ b/GaudiMP/dict/gaudimp_dict.h @@ -21,7 +21,6 @@ #include "GaudiKernel/Algorithm.h" #include "GaudiKernel/Chrono.h" #include "GaudiKernel/ChronoEntity.h" -#include "GaudiKernel/ParticleProperty.h" #include "GaudiKernel/Range.h" #include "GaudiKernel/SerializeSTL.h" #include "GaudiKernel/Stat.h" diff --git a/GaudiPartProp/CMakeLists.txt b/GaudiPartProp/CMakeLists.txt index 95eda5958f51e8eeb9340cd475e239370ab723ea..3aad2a4c156109d6d8bdadb5176c804ae28291d5 100644 --- a/GaudiPartProp/CMakeLists.txt +++ b/GaudiPartProp/CMakeLists.txt @@ -1,5 +1,5 @@ ##################################################################################### -# (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations # +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # # # # This software is distributed under the terms of the Apache version 2 licence, # # copied verbatim in the file "LICENSE". # @@ -10,7 +10,43 @@ ##################################################################################### # GaudiPartProp subdirectory -gaudi_add_module(GaudiPartProp - SOURCES src/ParticlePropertySvc.cpp - LINK GaudiKernel - Boost::headers) +if(NOT GAUDI_ENABLE_GAUDIPARTPROP) + return() +endif() + +gaudi_add_library(GaudiPartProp + SOURCES + src/CC.cpp + src/Decay.cpp + src/IParticlePropertySvc.cpp + src/NodePIDs.cpp + src/Nodes.cpp + src/ParticleID.cpp + src/ParticleProperty.cpp + src/Symbols.cpp + src/TrackDefaultParticles.cpp + src/iNode.cpp + LINK + PUBLIC + Gaudi::GaudiKernel +) + +gaudi_add_module(GaudiPartPropModule + SOURCES + src/Module/ParticlePropertySvc.cpp + LINK + GaudiPartProp +) + +gaudi_add_dictionary(GaudiPartPropDict + HEADERFILES dict/PartPropDict.h + SELECTION dict/PartProp.xml + LINK + GaudiPartProp +) + +gaudi_install(PYTHON) + +gaudi_install(SCRIPTS) + +gaudi_add_tests(QMTest) diff --git a/GaudiPartProp/dict/PartProp.xml b/GaudiPartProp/dict/PartProp.xml new file mode 100644 index 0000000000000000000000000000000000000000..dac29e7535d6730d6b93d783ef609160d2594838 --- /dev/null +++ b/GaudiPartProp/dict/PartProp.xml @@ -0,0 +1,58 @@ +<!-- + (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations + + This software is distributed under the terms of the Apache version 2 licence, + copied verbatim in the file "LICENSE". + + In applying this licence, CERN does not waive the privileges and immunities + granted to it by virtue of its status as an Intergovernmental Organization + or submit itself to any jurisdiction. +--> +<!-- + * ======================================================================== + * @file + * The seleciton file to build Reflex dictionaries for + * Kernel/PartProp package + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-12-01 + * ======================================================================== +--> + +<lcgdict> + + <class name = "Gaudi::ParticleID" /> + <class name = "Gaudi::ParticleProperty" /> + <class name = "Gaudi::Interfaces::IParticlePropertySvc" /> + <class name = "Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties" /> + <class name = "Gaudi::Interfaces::IParticlePropertySvc::iterator" /> + + <class name = "std::vector<Gaudi::ParticleID>" /> + <class name = "std::vector<const Gaudi::ParticleProperty*>" /> + + + <enum name = "Gaudi::ParticleID::Quark" /> + <enum name = "Gaudi::ParticleID::Location" /> + + <function name = "Gaudi::ParticleProperties::printAsTable" /> + <function name = "Gaudi::ParticleProperties::particle" /> + <function name = "Gaudi::ParticleProperties::particleID" /> + <function name = "Gaudi::ParticleProperties::byPythiaID" /> + <function name = "Gaudi::ParticleProperties::byEvtGenName" /> + <function name = "Gaudi::ParticleProperties::allProperties" /> + <function name = "Gaudi::ParticleProperties::index" /> + + <class name = "Gaudi::Decays::Symbols"/> + + <class name = "Gaudi::Decays::Decay" /> + <class name = "Gaudi::Decays::Decay::Item" /> + <class name = "std::vector<Gaudi::Decays::Decay>" /> + <class name = "std::vector<Gaudi::Decays::Decay::Item>" /> + + <class name = "Gaudi::Decays::iNode" /> + <class name = "Gaudi::Decays::Node" /> + <class pattern = "Gaudi::Decays::Nodes::*" /> + <class name = "Gaudi::Decays::Dict::NodeOps" /> + <class name = "Gaudi::Decays::NodeList" /> + <class name = "std::vector<Gaudi::Decays::Nodes::_Node>" /> + +</lcgdict> diff --git a/GaudiPartProp/dict/PartPropDict.h b/GaudiPartProp/dict/PartPropDict.h new file mode 100644 index 0000000000000000000000000000000000000000..5684e6d0d1f7a2026ed74065adb33065d71fc9a1 --- /dev/null +++ b/GaudiPartProp/dict/PartPropDict.h @@ -0,0 +1,65 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/Decay.h> +#include <Gaudi/Decays/Nodes.h> +#include <Gaudi/Decays/NodesPIDs.h> +#include <Gaudi/Decays/Symbols.h> +#include <Gaudi/Decays/iNode.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleID.h> +#include <Gaudi/ParticleProperty.h> + +namespace Gaudi::Decays { + namespace Dict { + struct NodeOps { + typedef Decays::iNode iNode; + typedef Decays::Node Node; + static bool __call__( const iNode& node, const Gaudi::ParticleID& pid ) { return node( pid ); } + static bool __call__( const iNode& node, const Gaudi::ParticleProperty* pp ) { return node( pp->particleID() ); } + static bool __call__( const iNode& node, const int pid ) { return node( Gaudi::ParticleID( pid ) ); } + static bool __rrshift__( const iNode& node, const Gaudi::ParticleID& pid ) { return node( pid ); } + static bool __rrshift__( const iNode& node, const Gaudi::ParticleProperty* pp ) { + return node( pp->particleID() ); + } + static bool __rrshift__( const iNode& node, const int pid ) { return node( Gaudi::ParticleID( pid ) ); } + static Node __or__( const iNode& n1, const iNode& n2 ) { return n1 || n2; } + static Node __or__( const iNode& n1, const std::string& n2 ) { return n1 || n2; } + static Node __or__( const iNode& n1, const Gaudi::ParticleID& n2 ) { return n1 || n2; } + static Node __or__( const iNode& n1, const Gaudi::ParticleProperty* n2 ) { return n1 || n2; } + static Node __or__( const iNode& n1, const Decays::Decay::Item& n2 ) { return n1 || n2; } + static Node __ror__( const iNode& n1, const std::string& n2 ) { return n1 || n2; } + static Node __ror__( const iNode& n1, const Gaudi::ParticleID& n2 ) { return n1 || n2; } + static Node __ror__( const iNode& n1, const Gaudi::ParticleProperty* n2 ) { return n1 || n2; } + static Node __ror__( const iNode& n1, const Decays::Decay::Item& n2 ) { return n1 || n2; } + static Node __and__( const iNode& n1, const iNode& n2 ) { return n1 && n2; } + static Node __and__( const iNode& n1, const std::string& n2 ) { return n1 && n2; } + static Node __and__( const iNode& n1, const Gaudi::ParticleID& n2 ) { return n1 && n2; } + static Node __and__( const iNode& n1, const Gaudi::ParticleProperty* n2 ) { return n1 && n2; } + static Node __and__( const iNode& n1, const Decays::Decay::Item& n2 ) { return n1 && n2; } + static Node __rand__( const iNode& n1, const std::string& n2 ) { return n1 && n2; } + static Node __rand__( const iNode& n1, const Gaudi::ParticleID& n2 ) { return n1 && n2; } + static Node __rand__( const iNode& n1, const Gaudi::ParticleProperty* n2 ) { return n1 && n2; } + static Node __rand__( const iNode& n1, const Decays::Decay::Item& n2 ) { return n1 && n2; } + static Node __rshift__( const iNode& n1, const iNode& n2 ) { return n1 && n2; } + static Node __invert__( const iNode& n1 ) { return ~n1; } + }; + } // namespace Dict +} // namespace Gaudi::Decays + +namespace { + struct PartProp_Instantiations { + std::vector<Gaudi::ParticleID> m_pidv; + std::vector<const Gaudi::ParticleProperty*> m_ppv; + + std::vector<Gaudi::Decays::Decay> m_vd; + std::vector<Gaudi::Decays::Decay::Item> m_vi; + }; +} // namespace diff --git a/GaudiPartProp/include/Gaudi/Decays/CC.h b/GaudiPartProp/include/Gaudi/Decays/CC.h new file mode 100644 index 0000000000000000000000000000000000000000..2ff5c281b97488b04a01efccda4de42fdbc91391 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Decays/CC.h @@ -0,0 +1,58 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <map> +#include <set> +#include <string> + +namespace Gaudi::Decays { + namespace CC { + /** @struct CmpCC + * a bit specific comparison of strings, useful for + * ordering according to the length as the primary parameter + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + */ + struct CmpCC { + /** the only one essential method + * The most long string is "less", otherwise the + * standard comparison is applicable. + */ + inline bool operator()( const std::string& v1, const std::string& v2 ) const { + const std::string::size_type s1 = v1.size(); + const std::string::size_type s2 = v2.size(); + return s1 < s2 ? false : s2 < s1 ? true : ( v1 < v2 ); + } + }; + /// the actual type of CC-map + typedef std::map<std::string, std::string, CmpCC> MapCC; // CC-MAP + /// the actual type of CC-set + typedef std::set<std::string, CmpCC> SetCC; // CC-SET + + /** simple function to make charge conjugated inside the original string. + * All substrings are subsutututed by their charge conjugates + * @param orig the original sring + * @param map_ the full map of substitutions + * @param pos the starting position + * @return charge-conjugated string + */ + std::string cc( const std::string& decay, const MapCC& map_ ); + + /** simple function to make charge conjugated inside the original string. + * All substrings are subsutututed by their charge conjugates + * @param orig the original sring + * @param map_ the full map of substitutions + * @param pos the starting position + * @return charge-conjugated string + */ + std::string cc( const std::string& decay, const std::map<std::string, std::string>& map_ ); + } // namespace CC +} // namespace Gaudi::Decays diff --git a/GaudiPartProp/include/Gaudi/Decays/Decay.h b/GaudiPartProp/include/Gaudi/Decays/Decay.h new file mode 100644 index 0000000000000000000000000000000000000000..a7f48f82350d03ed968df82f6adc96803cb76823 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Decays/Decay.h @@ -0,0 +1,181 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <Gaudi/ParticleID.h> +#include <GaudiKernel/StatusCode.h> +#include <string> +#include <vector> + +namespace Gaudi { + namespace Interfaces { + class IParticlePropertySvc; + } + class ParticleProperty; +} // namespace Gaudi + +namespace Gaudi::Decays { + /** @class Decay Kernel/Decay.h + * The simple representation of "simple 1-step" decay (there are no trees! + * + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-03-31 + */ + class GAUDI_API Decay final { + public: + /** @class Item + * the helper representation of the item in the decay chain + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-03-31 + */ + class Item final { + public: + /// the constructor from the particle property + Item( const Gaudi::ParticleProperty* pp = 0 ); + /// the constructor from the particle name + Item( const std::string& name ); + /// the constructor from the particle PID + Item( const Gaudi::ParticleID& pid ); + + /// get the particle name + const std::string& name() const { return m_name; } + /// get the particle PID + const Gaudi::ParticleID& pid() const { return m_pid; } + /// get the particle property + const Gaudi::ParticleProperty* pp() const { return m_pp; } + + /// the default printout + std::ostream& fillStream( std::ostream& s ) const; + + /// validate the item using the service + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const; + /// validate the item using the particle property object + StatusCode validate( const Gaudi::ParticleProperty* prop ) const; + + private: + /// the particle name + mutable std::string m_name; + /// the particle PID + mutable Gaudi::ParticleID m_pid; + /// the source of properties + mutable const Gaudi::ParticleProperty* m_pp = nullptr; + }; + + /// the vector of items (the obvious representation of daughter particles) + typedef std::vector<Item> Items; + + public: + Decay() = default; + + /** the constructor from mother and daughters + * @param mother the mother + * @param daughters the daughters + */ + Decay( const Gaudi::ParticleProperty* mother, const std::vector<const Gaudi::ParticleProperty*>& daughters ); + + /** the constructor from mother and daughters + * @param mother the mother + * @param daughters the daughters + */ + + Decay( const std::string& mother, const std::vector<std::string>& daughters ); + /** the constructor from mother and daughters + * @param mother the mother + * @param daughters the daughters + */ + + Decay( const Gaudi::ParticleID& mother, const std::vector<Gaudi::ParticleID>& daughters ); + + /** the constructor from mother and daughters + * @param mother the mother + * @param daughters the daughters + */ + Decay( const Item& mother, const std::vector<Item>& daughters ); + + /// get the mother(head) of the decay + const Item& mother() const { return m_mother; } + /// get all daughters + const Items& daughters() const { return m_daughters; } + /// get all daughters + const Items& children() const { return daughters(); } + /// get the number of daughters + size_t nDaughters() const { return m_daughters.size(); } + /// get the number of daughters + size_t nChildren() const { return m_daughters.size(); } + /** get the component by the number + * @attention index 0 corresponds to the mother particle + * @param index the index (0 corresponds to the mother particle) + * @return the component + */ + const Item& operator()( const unsigned int index ) const; + /** get the component by the number + * @attention index 0 corresponds to th emother particle + * @param index the index (0 corresponds to the mother particle) + * @return the component + */ + const Item& operator[]( const unsigned int index ) const { return ( *this )( index ); } + + /// set the mother + void setMother( const Item& mom ); + /// set the mother + void setMother( const Gaudi::ParticleProperty* mom ); + /// set the mother + void setMother( const std::string& mom ); + /// set the mother + void setMother( const Gaudi::ParticleID& mom ); + /// set the daughters + void setDaughters( const Items& daugs ); + /// set the daughters + void setDaughters( const std::vector<const Gaudi::ParticleProperty*>& daugs ); + /// set the daughters + void setDaughters( const std::vector<std::string>& daugs ); + /// set the daughters + void setDaughters( const std::vector<Gaudi::ParticleID>& daugs ); + /// set the daughters + void setChildren( const Items& daugs ) { setDaughters( daugs ); } + /// set the daughters + void setChildren( const std::vector<const Gaudi::ParticleProperty*>& daugs ) { setDaughters( daugs ); } + /// set the daughters + void setChildren( const std::vector<std::string>& daugs ) { setDaughters( daugs ); } + /// set the daughters + void setChidlren( const std::vector<Gaudi::ParticleID>& daugs ) { setDaughters( daugs ); } + + /// add the child + Decay& operator+=( const std::string& child ); + /// add the child + Decay& operator+=( const Gaudi::ParticleID& child ); + /// add the child + Decay& operator+=( const Gaudi::ParticleProperty* child ); + /// add the child + Decay& operator+=( const Item& child ); + + /// validate the decay using the service + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const; + + /// the default printout + std::ostream& fillStream( std::ostream& s ) const; + /// the conversion to the string + std::string toString() const; + + /// the head of the decay + mutable Item m_mother; // the head of the decay + /// the daughter particles + mutable Items m_daughters; // the daughter particles + }; +} // namespace Gaudi::Decays + +/// the printout operator to the stream +inline std::ostream& operator<<( std::ostream& s, const Gaudi::Decays::Decay& decay ) { return decay.fillStream( s ); } + +/// the printout operator to the stream +inline std::ostream& operator<<( std::ostream& s, const Gaudi::Decays::Decay::Item& item ) { + return item.fillStream( s ); +} diff --git a/GaudiPartProp/include/Gaudi/Decays/Nodes.h b/GaudiPartProp/include/Gaudi/Decays/Nodes.h new file mode 100644 index 0000000000000000000000000000000000000000..713c094b764599e5d11a898e69c7efa4d71cf6a5 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Decays/Nodes.h @@ -0,0 +1,492 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <Gaudi/Decays/Decay.h> +#include <Gaudi/Decays/iNode.h> +#include <Gaudi/ParticleID.h> +#include <GaudiKernel/Kernel.h> +#include <GaudiKernel/SmartIF.h> +#include <GaudiKernel/StatusCode.h> + +/** @file Decays/Nodes.h + * Helper general purpose utilities to deal with decay nodes + * @see Decays::iNode + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ +namespace Gaudi::Decays { + /** check the validness of the trees or nodes + * @param begin begin-iterator for the sequence of trees/nodes + * @param end end-iterator for the sequence of trees/nodes + * @return true of no invalid trees are found + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + template <typename Iterator> + bool valid( Iterator begin, Iterator end ) { + return std::all_of( begin, end, []( const auto& i ) { return i.valid(); } ); + } + template <typename Container> + bool valid( Container const& c ) { + return valid( c.begin(), c.end() ); + } + + /** validate trees/nodes + * @param begin begin-iterator for the sequence of trees/nodes + * @param end end-iterator for the sequence of trees/nodes + * @param svc the Particle Property Service for validation + * @return statuis code + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + template <class Iterator> + StatusCode validate( Iterator begin, Iterator end, const Gaudi::Interfaces::IParticlePropertySvc* svc ) { + for ( ; begin != end; ++begin ) { + StatusCode sc = begin->validate( svc ); + if ( sc.isFailure() ) { return sc; } + } + return StatusCode::SUCCESS; + } + template <class TREE> + StatusCode validate( TREE const& tree, const Gaudi::Interfaces::IParticlePropertySvc* svc ) { + return validate( tree.begin(), tree.end(), svc ); + } + + class NodeList; + + namespace Nodes { + /** @class Invalid + * the most simple node to represent the invalid node + * it matches to all valid the Gaudi::Particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Invalid : public Decays::iNode { + public: + /// MANDATORY: default constructor + Invalid() = default; + /// MANDATORY: clone method ("virtual constructor") + Invalid* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& /* p */ ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + }; + + /** @class _Node + * Helper structure (especially it is light version node-holder + * the default constructor + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API _Node { + public: + /// the default constructor + _Node(); + /// the constructor from iNode + _Node( const iNode& node ) : m_node( node ) {} + /// the constructor from Node + _Node( const Node& node ) : m_node( node ) {} + // default copy constructor + _Node( const _Node& node ) = default; + /// Check the validity + inline bool valid() const { return m_node.node().valid(); } + /// The proper validation of the node + inline StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + return m_node.node().validate( svc ); + } + /// The major method + inline bool operator()( const Gaudi::ParticleID& pid ) const { return m_node.node( pid ); } + + inline bool operator==( const Gaudi::ParticleID& pid ) const { return m_node.node( pid ); } + + inline bool operator!=( const Gaudi::ParticleID& pid ) const { return !m_node.node( pid ); } + + /// pseudo-assignment operator: + _Node& operator=( const Node& right ) { + m_node = right; + return *this; + } + /// pseudo-assignment from arbitrary node + _Node& operator=( const iNode& right ) { + m_node = right; + return *this; + } + /// pseudo-assignment from arbitrary node + _Node& operator=( const _Node& right ) { + m_node = right.m_node; + return *this; + } + + _Node& operator|=( const iNode& right ) { + m_node |= right; + return *this; + } + _Node& operator&=( const iNode& right ) { + m_node &= right; + return *this; + } + + _Node& operator|=( const NodeList& right ) { return op_or( right ); } + _Node& operator&=( const NodeList& right ) { return op_and( right ); } + + _Node& operator|=( const _Node& right ) { + m_node |= right; + return *this; + } + _Node& operator&=( const _Node& right ) { + m_node &= right; + return *this; + } + + /// the accessor to the node + const Decays::iNode& node() const { return m_node.node(); } + /// the cast operator to the actual list of nodes + operator const Decays::iNode&() const { return node(); } + + private: + _Node& op_or( const NodeList& right ); + _Node& op_and( const NodeList& right ); + /// the node holder itself + Decays::Node m_node; + }; + } // namespace Nodes + + class GAUDI_API NodeList { + public: + /// the actual type of the sequence of nodes + typedef std::vector<Decays::Nodes::_Node> Nodes_; + typedef Nodes_::const_iterator const_iterator; + typedef Nodes_::iterator iterator; + typedef Nodes_::value_type value_type; + + /// constructor from the list of Nodes + NodeList( const Nodes_& nodes = Nodes_() ); + + void push_back( const Decays::Nodes::_Node& node ); + void push_back( const Decays::iNode& node ); + void push_back( const Nodes_& nodes ); + void push_back( const NodeList& nodes ); + void clear() { m_nodes.clear(); } + + NodeList& operator=( const Decays::Nodes::_Node& node ); + NodeList& operator=( const Decays::iNode& node ); + + NodeList& operator+=( const Decays::Nodes::_Node& node ) { + push_back( node ); + return *this; + } + NodeList& operator+=( const Decays::iNode& node ) { + push_back( node ); + return *this; + } + NodeList& operator+=( const Nodes_& nodes ) { + push_back( nodes ); + return *this; + } + NodeList& operator+=( const NodeList& nodes ) { + push_back( nodes ); + return *this; + } + + size_t size() const { return m_nodes.size(); } + bool empty() const { return m_nodes.empty(); } + iterator begin() { return m_nodes.begin(); } + iterator end() { return m_nodes.end(); } + const_iterator begin() const { return m_nodes.begin(); } + const_iterator end() const { return m_nodes.end(); } + + operator const Nodes_&() const { return m_nodes; } + + private: + /// the actual list of nodes + Nodes_ m_nodes; + }; + + namespace Nodes { + /** @class Or + * the rather simple (but powerful) node in the decay tree: + * it matches .OR. for sub-nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Or : public Decays::iNode { + public: + /// constructor from two nodes + Or( const Decays::iNode& n1, const Decays::iNode& n2 ); + /// constructor from three nodes + Or( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3 ); + /// constructor from four nodes + Or( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3, const Decays::iNode& n4 ); + /// constructor from list of nodes + Or( const Decays::NodeList& nodes ); + /// MANDATORY: clone method ("virtual constructor") + Or* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + protected: + size_t add( const Decays::iNode& node ); + size_t add( const Decays::NodeList& nodes ); + + public: + Or& operator+=( const Decays::iNode& node ); + Or& operator+=( const Decays::NodeList& node ); + + private: + /// the default constructor is disabled + Or(); // the default constructor is disabled + + /// the sub-nodes + Decays::NodeList m_nodes; + }; + + /** @class And + * the rather simple (but powerful) node in the decay tree: + * it matches .AND. for sub-nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API And : public Decays::iNode { + public: + /// constructor from two nodes + And( const Decays::iNode& n1, const Decays::iNode& n2 ); + /// constructor from three nodes + And( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3 ); + /// constructor from four nodes + And( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3, const Decays::iNode& n4 ); + /// constructor from list of nodes + And( const Decays::NodeList& nodes ); + /// MANDATORY: clone method ("virtual constructor") + And* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& p ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + protected: + size_t add( const Decays::iNode& node ); + size_t add( const Decays::NodeList& nodes ); + + public: + And& operator+=( const Decays::iNode& node ); + And& operator+=( const Decays::NodeList& nodes ); + + private: + /// the sub-nodes + NodeList m_nodes; + }; + + /** @class Not + * Simple node which match "NOT" for the subnode + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Not : public Decays::iNode { + public: + /// constructor from the node + Not( const Decays::iNode& node ); + /// MANDATORY: clone method ("virtual constructor") + Not* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + public: + /// get the underlying node + const Decays::iNode& node() const { return m_node.node(); } + + private: + /// the node itself + Decays::Node m_node; + }; + + /** Create the "NOT" for the node + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + inline Decays::Nodes::Not operator!( const Decays::Nodes::Not& o ) { return Decays::Node( o.node() ); } + + /// output operator + inline std::ostream& operator<<( std::ostream& s, const Decays::Nodes::_Node& n ) { return s << n.node(); } + } // namespace Nodes + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + inline Decays::Nodes::Or operator||( const Decays::iNode& o1, const Decays::iNode& o2 ) { + return Decays::Nodes::Or( o1, o2 ); + } + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + inline Decays::Nodes::Or operator|( const Decays::iNode& o1, const Decays::iNode& o2 ) { + return Decays::Nodes::Or( o1, o2 ); + } + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + inline Decays::Nodes::And operator&&( const Decays::iNode& o1, const Decays::iNode& o2 ) { + return Decays::Nodes::And( o1, o2 ); + } + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + inline Decays::Nodes::And operator&( const Decays::iNode& o1, const Decays::iNode& o2 ) { + return Decays::Nodes::And( o1, o2 ); + } + + /** Create the "NOT" for the node + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + inline Decays::Nodes::Not operator~( const Decays::iNode& o ) { return Decays::Nodes::Not( o ); } + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Decays::iNode& o1, const std::string& o2 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Decays::iNode& o1, const Gaudi::ParticleID& o2 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Decays::iNode& o1, const Decays::Decay::Item& o2 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Decays::iNode& o1, const Gaudi::ParticleProperty* o2 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const std::string& o2, const Decays::iNode& o1 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Gaudi::ParticleID& o2, const Decays::iNode& o1 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Decays::Decay::Item& o2, const Decays::iNode& o1 ); + + /** Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::Or operator||( const Gaudi::ParticleProperty* o2, const Decays::iNode& o1 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Decays::iNode& o1, const std::string& o2 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Decays::iNode& o1, const Gaudi::ParticleID& o2 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Decays::iNode& o1, const Decays::Decay::Item& o2 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Decays::iNode& o1, const Gaudi::ParticleProperty* o2 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const std::string& o2, const Decays::iNode& o1 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Gaudi::ParticleID& o2, const Decays::iNode& o1 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Decays::Decay::Item& o2, const Decays::iNode& o1 ); + + /** Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + GAUDI_API + Decays::Nodes::And operator&&( const Gaudi::ParticleProperty* o2, const Decays::iNode& o1 ); + +} // namespace Gaudi::Decays diff --git a/GaudiPartProp/include/Gaudi/Decays/NodesPIDs.h b/GaudiPartProp/include/Gaudi/Decays/NodesPIDs.h new file mode 100644 index 0000000000000000000000000000000000000000..dd99a2a6763bd5df723fbaf59e2aa3f658b9ecdb --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Decays/NodesPIDs.h @@ -0,0 +1,664 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <Gaudi/Decays/Nodes.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleProperty.h> +#include <Gaudi/cxx/SynchronizedValue.h> +#include <GaudiKernel/MsgStream.h> + +/** @file Kernel/NodePIDs.h + * The actual implementation of various decay nodes + * @see Decays::iNode + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ +namespace Gaudi::Decays { + namespace Nodes { + /** @class Any + * the most simple node in the decay tree: + * it matches to all valid the Gaudi::Particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Any : public Decays::iNode { + public: + /// MANDATORY: clone method ("virtual constructor") + Any* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& /* p */ ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + }; + + /** @class Pid + * The simple node in the decay tree: + * it matches to a certain particle ID + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Pid : public Decays::iNode { + public: + /// constructor from the decay item + Pid( const Decays::Decay::Item& item ); + /// constructor from Particle Property + Pid( const Gaudi::ParticleProperty* item ); + /// constructor from ParticleID + Pid( const Gaudi::ParticleID& item ); + /// constructor from Particle name + Pid( const std::string& item ); + /// MANDATORY: clone method ("virtual constructor") + Pid* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return check( pid ); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + public: + bool check( Gaudi::ParticleID pid ) const { return pid == m_item.pid(); } + + /// get DaVinci Decay item + const Decays::Decay::Item& item() const { return m_item; } + /// cast to DaVinci decay item + operator const Decays::Decay::Item&() const { return item(); } + + private: + /// the decay item itself + Decays::Decay::Item m_item; + }; + + /** @class CC + * The simple node in the decay tree: + * it matches to a certain particle ID or its antiparticle + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API CC : public Pid { + public: + /// constructor from the decay item + CC( const Decays::Decay::Item& item ); + /// constructor from Particle Property + CC( const Gaudi::ParticleProperty* item ); + /// constructor from ParticleID + CC( Gaudi::ParticleID item ); + /// constructor from Particle name + CC( const std::string& item ); + /// constructor from node + CC( const Decays::Nodes::Pid& pid ); + /// MANDATORY: clone method ("virtual constructor") + CC* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.abspid() == item().pid().abspid(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Lepton + * The trivial node : it match the Lepton + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Lepton : public Any { + public: + /// MANDATORY: clone method ("virtual constructor") + Lepton* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.isLepton(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Nu + * The trivial node : it match any neutral lepton + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Nu : public Lepton { + public: + /// MANDATORY: clone method ("virtual constructor") + Nu* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { + return pid.isLepton() && ( 0 == pid.threeCharge() ); + } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Ell + * The trivial node : it match any charged lepton + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Ell : public Lepton { + public: + /// MANDATORY: clone method ("virtual constructor") + Ell* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { + return pid.isLepton() && ( 0 != pid.threeCharge() ); + } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class EllPlus + * The trivial node : it match any positive lepton + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API EllPlus : public Ell { + public: + /// MANDATORY: clone method ("virtual constructor") + EllPlus* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { + return pid.isLepton() && ( 0 < pid.threeCharge() ); + } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + /** @class EllMinus + * The trivial node : it match any negative lepton + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API EllMinus : public Ell { + public: + /// MANDATORY: clone method ("virtual constructor") + EllMinus* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { + return pid.isLepton() && ( 0 > pid.threeCharge() ); + } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Hadron + * The trivial node : it match the Hadron + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Hadron : public Any { + public: + /// MANDATORY: clone method ("virtual constructor") + Hadron* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.isHadron(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Meson + * The trivial node : it match the meson + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Meson : public Hadron { + public: + /// MANDATORY: clone method ("virtual constructor") + Meson* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.isMeson(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Baryon + * The trivial node : it match the Baryon + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Baryon : public Hadron { + public: + /// MANDATORY: clone method ("virtual constructor") + Baryon* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.isBaryon(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Charged + * The trivial node : it match the Charged + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Charged : public Any { + public: + /// MANDATORY: clone method ("virtual constructor") + Charged* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return 0 != pid.threeCharge(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Positive + * The trivial node : it match the positively charged particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Positive : public Charged { + public: + /// MANDATORY: clone method ("virtual constructor") + Positive* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return 0 < pid.threeCharge(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Negative + * The trivial node : it match the negatively charged particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Negative : public Charged { + public: + /// MANDATORY: clone method ("virtual constructor") + Negative* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return 0 > pid.threeCharge(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Neutral + * The trivial node : it match the Neutral + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Neutral : public Charged { + public: + /// MANDATORY: clone method ("virtual constructor") + Neutral* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return 0 == pid.threeCharge(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Nucleus + * The trivial node : it match the Nucleus + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Nucleus : public Any { + public: + /// MANDATORY: clone method ("virtual constructor") + Nucleus* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.isNucleus(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class HasQuark + * The trivial node : it match the quark content + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API HasQuark : public Any { + public: + /// constructor from the quark + HasQuark( Gaudi::ParticleID::Quark quark ); + /// MANDATORY: clone method ("virtual constructor") + HasQuark* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return pid.hasQuark( m_quark ); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + + private: + /// the quark to be tested + Gaudi::ParticleID::Quark m_quark; // the quark to be tested + }; + + /** @class JSpin + * The trivial node : it match the 2J+1 spin + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API JSpin : public Any { + public: + enum { InvalidSpin = 501 }; + + /// constructor from the 2J+1 + JSpin( const int spin ); + /// MANDATORY: clone method ("virtual constructor") + JSpin* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return spin() == pid.jSpin(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + + /// valid only for positive spin-values + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* /* svc */ ) const override; + + int spin() const { return m_spin; } + + private: + /// the j-spin to be tested + int m_spin; + }; + + /** @class SSpin + * The trivial node : it match the 2S+1 spin + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API SSpin : public JSpin { + public: + /// constructor from the 2S+1 + SSpin( const int spin ); + /// MANDATORY: clone method ("virtual constructor") + SSpin* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return spin() == pid.sSpin(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class LSpin + * The trivial node : it match the 2L+1 spin + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API LSpin : public SSpin { + public: + /// constructor from the 2L+1 + LSpin( const int spin ); + /// MANDATORY: clone method ("virtual constructor") + LSpin* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override { return spin() == pid.lSpin(); } + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class CTau + * simple pid-checker for particle lifetime (in c*tau units) + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API CTau : public Decays::iNode { + public: + /// constructor from c-tau range + CTau( const double low, const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc = nullptr ); + /// MANDATORY: clone method ("virtual constructor") + CTau* clone() const override; + + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + const Gaudi::Interfaces::IParticlePropertySvc* ppSvc() const { return m_ppSvc; } + + /// get low edge + double low() const { return m_low; } + /// get high edge + double high() const { return m_high; } + + StatusCode setService( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const; + + protected: + template <typename F, typename = std::is_invocable_r<bool, F, Gaudi::ParticleID>> + bool classify( Gaudi::ParticleID pid, F&& f ) const { + enum struct Classification { Accepted = +1, Rejected = -1, Unknown = 0 }; + auto r = m_pids.with_lock( + []( const auto& pids, Gaudi::ParticleID pid ) { + return std::binary_search( pids.accepted.begin(), pids.accepted.end(), pid ) ? Classification::Accepted + : std::binary_search( pids.rejected.begin(), pids.rejected.end(), pid ) ? Classification::Rejected + : Classification::Unknown; + }, + pid ); + switch ( r ) { + case Classification::Accepted: + return true; + case Classification::Rejected: + return false; + case Classification::Unknown: + return add_( pid, std::invoke( std::forward<F>( f ), pid ) ); + } + __builtin_unreachable(); + } + + private: + bool add_( Gaudi::ParticleID pid, bool acc ) const; + + public: + MsgStream& printAcceptedAsTable( MsgStream& s ) const { + return m_pids.with_lock( + [&]( const KnownPids& pids, MsgStream& s, auto const& ppSvc ) -> decltype( auto ) { + return Gaudi::ParticleProperties::printAsTable( pids.accepted, s, ppSvc ); + }, + s, m_ppSvc ); + } + + private: + typedef SmartIF<Gaudi::Interfaces::IParticlePropertySvc> Service; + /// the service : + mutable Service m_ppSvc; + + public: + struct KnownPids { + std::vector<Gaudi::ParticleID> accepted; + std::vector<Gaudi::ParticleID> rejected; + }; + + private: + mutable Gaudi::cxx::SynchronizedValue<KnownPids> m_pids; + + /// low edge + double m_low; + /// high edge + double m_high; + }; + + /** @class ShortLived_ + * represent simple predicate for short-lived particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API ShortLived_ : public CTau { + public: + /// constructor with high edge and service + ShortLived_( const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// constructor service + ShortLived_( const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + ShortLived_* clone() const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class LongLived_ + * represent simple predicate for Long-lived particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + struct GAUDI_API LongLived_ : CTau { + /// constructor with high edge and service + LongLived_( const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// constructor service + LongLived_( const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + LongLived_* clone() const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Stable + * represent simple predicate for Stable particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API Stable : public LongLived_ { + public: + /// constructor service + Stable( const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + Stable* clone() const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class StableCharged + * represent simple predicate for Stable+Charged particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API StableCharged : public Stable { + public: + /// constructor service + StableCharged( const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + StableCharged* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Mass + * simple pid-checker for particle mass + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API Mass : public CTau { + public: + /// constructor from mass-range + Mass( const double low, const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + Mass* clone() const override; + + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Light + * simple pid-checker for particle mass + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API Light : public Mass { + public: + /// constructor from mass-range + Light( const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + Light* clone() const override; + + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class Heavy + * simple pid-checker for particle mass + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-11 + */ + class GAUDI_API Heavy : public Mass { + public: + /// constructor from mass-range + Heavy( const double low, const Gaudi::Interfaces::IParticlePropertySvc* svc = 0 ); + /// MANDATORY: clone method ("virtual constructor") + Heavy* clone() const override; + + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + }; + + /** @class PosID + * - It matches the particles with positive ID + * - Useful way to separate e.g. charm particle and charm antiparticle + * - Useful mainly in boolean operatios, e.g. <code>Charm & ID+ </code> + * - Charge conjugation could be fragile + * @author Vanya BELYAEV Ivan.Belyaev@iep.ru + * @date 2017-02-24 + */ + class GAUDI_API PosID : public Decays::iNode { + public: + /// MANDATORY: clone method ("virtual constructor") + PosID* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& /* p */ ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + }; + + /** @class NegID + * - It matches the particles with negative ID + * - Useful way to separate e.g. charm particle and charm antiparticle + * - Useful mainly in boolean operations, e.g. <code>Charm & ID- </code> + * - Charge conjugation could be fragile + * @author Vanya BELYAEV Ivan.Belyaev@iep.ru + * @date 2017-02-24 + */ + class GAUDI_API NegID : public Decays::iNode { + public: + /// MANDATORY: clone method ("virtual constructor") + NegID* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& /* p */ ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + }; + + class GAUDI_API Symbol : public Decays::iNode { + public: + /// the constructor from the symbol + Symbol( const std::string& sym ); + /// MANDATORY: clone method ("virtual constructor") + Symbol* clone() const override; + + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& pid ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + private: + /// the actual symbol + Decays::Node m_symbol; + }; + } // namespace Nodes +} // namespace Gaudi::Decays diff --git a/GaudiPartProp/include/Gaudi/Decays/Symbols.h b/GaudiPartProp/include/Gaudi/Decays/Symbols.h new file mode 100644 index 0000000000000000000000000000000000000000..2709c50d300d749385456f4459237e4c87db3c7c --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Decays/Symbols.h @@ -0,0 +1,125 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <Gaudi/Decays/Nodes.h> +#include <GaudiKernel/Kernel.h> +#include <GaudiKernel/VectorMap.h> +#include <map> +#include <string> +#include <vector> + +namespace Gaudi { + class IParticlePropertySvc; +} + +/** @file Kernel/Symbols.h + * Helper file with the definition of symbols, used for particles/nodes/decays + * @see Gaudi::Interfaces::IParticlePropertySvc + * @see Gaudi::ParticleProperty + * @see Gaudi::ParticleID + * Many thanks to Antonio PELLEGRINO for the kind help with regex expressions + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-07 + */ +namespace Gaudi::Decays { + /** @class Symbols + * Helper class to obtain the information about the valid + * symbols for particles, decay descriptors and Nodes. + * + * Many thanks to Antonio PELLEGRINO for the kind help with regex expressions + * + * @see Decays::iNode + * @see Decays::Nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-07 + */ + class GAUDI_API Symbols { + public: + enum { InvalidService = 400, InvalidSymbol, NoParticles, NoSymbols }; + + /// the actual type for the list of names + typedef std::vector<std::string> Names; + typedef std::map<std::string, std::string> CCMap; + + /// get CC-map + const CCMap& cc() const; + + /** valid basic/primitive symbol? + * @param sym the symbol + * @return true if it is vaild special symbol + */ + bool valid( std::string sym ) const; + /** help for the basic primitive special symbol + * @param sym the symbol + * @return the help string + */ + const std::string& symbol( std::string sym ) const; + /** get the node by symbol + * @param (INPUT) sym the symbol name + * @param (OUTPUT) the symbol + * @return status code + */ + StatusCode symbol( std::string sym, Decays::Node& node ) const; + + /** get all known basic primitive special symbols + * @param names (OUTOUT) vector of all known special symbols + * @return size of the vector + */ + size_t symbols( Names& names ) const; + /** get all known particle names + * @param svc (INPUT) particle property service + * @param parts (OUTPUT) vector of particle names + * @return status code + */ + StatusCode particles( const Gaudi::Interfaces::IParticlePropertySvc* svc, Names& parts ) const; + + /** add new symbol to the internal structure + * @param sym the symbol definition + * @param node the actual node + * @param help the help string + * @param ccsym the symbol for charge coonjugation + * @return true if the symbol is added into the storage + */ + bool addSymbol( std::string sym, const Decays::iNode& node, const std::string& help, std::string ccsym = "" ); + + /** add cc-pair to the internal map + * @param sym the symbol + * @param ccsym the symbol for charge conjugation + */ + void addCC( std::string sym, std::string ccsym = "" ); + + /// static accessor to teh singleton + static Symbols& instance(); + + protected: + /// the default constructor is protected: + Symbols(); + /// the destructor is protected + virtual ~Symbols() = default; + + private: + /// copy constructor is private + Symbols( const Symbols& ); + /// assignment operator is private + Symbols& operator=( const Symbols& ); + + typedef GaudiUtils::VectorMap<std::string, Decays::Nodes::_Node> NodeMap; + typedef std::map<std::string, std::string> HelpMap; + + /// the actual map of symbols + NodeMap m_nodes; + /// the actual help-map + HelpMap m_help; + /// the map of cc-symbols + CCMap m_cc; + }; +} // namespace Gaudi::Decays diff --git a/GaudiPartProp/include/Gaudi/Decays/iNode.h b/GaudiPartProp/include/Gaudi/Decays/iNode.h new file mode 100644 index 0000000000000000000000000000000000000000..8952af74096836bb09c53df6204970d154ef0127 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Decays/iNode.h @@ -0,0 +1,172 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <GaudiKernel/Kernel.h> +#include <GaudiKernel/StatusCode.h> +#include <functional> +#include <iosfwd> +#include <memory> + +namespace Gaudi { + namespace Interfaces { + class IParticlePropertySvc; + } + class ParticleID; +} // namespace Gaudi + +namespace Gaudi::Decays { + /** @class iNode Decays/iNode.h + * The abstract class which represents the single "node" of decay tree + * + * The class is imported from LoKi project + * + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API iNode { + public: + /** the basic operation: comparison of the particle PID with the node + * @param pid the particle to be compared + * @return true if the actual PID matched the node descriptor + */ + virtual bool operator()( const Gaudi::ParticleID& pid ) const = 0; + + /// clone method ("virtual constructor") + virtual iNode* clone() const = 0; + + /** printout of the stream + * @param s the reference to the output stream + * @return the reference to the output stream + */ + virtual std::ostream& fillStream( std::ostream& s ) const = 0; + /// check the validity of the node + virtual bool valid() const = 0; + /// invalid node? + virtual bool operator!() const; + + /** validate the decay node + * @param svc pointer to Particle Property Service + * @return StatusCode + */ + virtual StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const = 0; + + /// the string representation of the node + virtual std::string toString() const; + + /// virtual destructor + virtual ~iNode() = default; + }; + + /** @class Node + * The generic class to hold the pointer to other node + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + class GAUDI_API Node : public iNode { + public: + /// constructor from the node + Node( const Decays::iNode& node ); + /// copy constructor + Node( const Decays::Node& right ); + /// MANDATORY: clone method ("virtual constructor") + Node* clone() const override; + /// MANDATORY: the only one essential method + bool operator()( const Gaudi::ParticleID& p ) const override; + /// MANDATORY: the specific printout + std::ostream& fillStream( std::ostream& s ) const override; + /// MANDATORY: check the validity of the node + bool valid() const override; + /// MANDATORY: the proper validation of the node + StatusCode validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const override; + + public: + Node& operator&=( const iNode& right ) { return op_and( right ); } + Node& operator|=( const iNode& right ) { return op_or( right ); } + + // get the underlying node + inline const iNode& node() const { return *m_node; } + + // evaluate the underlying node + inline bool node( const Gaudi::ParticleID& pid ) const { return node()( pid ); } + + /// assignment operator: + Node& operator=( const Node& right ); + /// assignment from arbitrary node + Node& operator=( const iNode& right ); + + private: + Node& op_and( const iNode& right ); + Node& op_or( const iNode& right ); + + /// the node itself: + std::unique_ptr<iNode> m_node; + }; + + /** printout to the output stream + * @param s the output stream + * @param n the node + * @return the output stream (Reference) + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline std::ostream& operator<<( std::ostream& s, const iNode& n ) { return n.fillStream( s ); } + + /** equality + * The node is "equal" to the PID , if the given pid satisfies the node criteria + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline bool operator==( const Decays::iNode& node, const Gaudi::ParticleID& pid ) { return node( pid ); } + + /** "right" equality + * The node is "equal" to the PID , if the given pid satisfies the node criteria + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline bool operator==( const Gaudi::ParticleID& pid, const Decays::iNode& node ) { return node == pid; } + + /** non-equality + * The node is "equal" to the PID , if the given PID satisfies the node criteria + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline bool operator!=( const Decays::iNode& node, const Gaudi::ParticleID& pid ) { return !( node == pid ); } + + /** non-equality + * The node is "equal" to the PID , if the given PID satisfies the node criteria + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline bool operator!=( const Gaudi::ParticleID& pid, const Decays::iNode& node ) { return node != pid; } + + /** "on-flight" validation of the node + * @param n the node + * @param svc particle property service + * @return status code + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline StatusCode operator+( const Decays::iNode& n, const Gaudi::Interfaces::IParticlePropertySvc* svc ) { + return n.validate( svc ); + } + + /** "on-flight" validation of the node + * @param n the node + * @param svc particle property service + * @return status code + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-21 + */ + inline StatusCode operator*( const Decays::iNode& n, const Gaudi::Interfaces::IParticlePropertySvc* svc ) { + return n.validate( svc ); + } +} // namespace Gaudi::Decays diff --git a/GaudiPartProp/include/Gaudi/Interfaces/IParticlePropertySvc.h b/GaudiPartProp/include/Gaudi/Interfaces/IParticlePropertySvc.h new file mode 100644 index 0000000000000000000000000000000000000000..6d1dcaa8fff6feee3ee7df0304c2029c74748b91 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Interfaces/IParticlePropertySvc.h @@ -0,0 +1,498 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <GaudiKernel/IInterface.h> +#include <GaudiKernel/Kernel.h> +#include <vector> + +namespace Gaudi { + class ParticleID; + class ParticleProperty; +} // namespace Gaudi + +namespace Gaudi::Interfaces { + /** @class IParticlePropertySvc Kernel/IParticlePropertySvc.h + * The abstract interface to Particle Property Service + * @author Iain Last + * @author G.Corti + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + */ + class GAUDI_API IParticlePropertySvc : public extend_interfaces<IInterface> { + public: + DeclareInterfaceID( Gaudi::Interfaces::IParticlePropertySvc, 2, 0 ); + + /// the actual type of (ordered) container of particle properties + typedef std::vector<const Gaudi::ParticleProperty*> ParticleProperties; + /// the actual type of iterator over the (ordered) container of properties + typedef ParticleProperties::const_iterator iterator; + + /** get the begin-iterator for the container of particle properties + * It is assumed that the container is properly ordered + * @return begin-iterator for the container of particle properties + */ + virtual iterator begin() const = 0; + /** get the end-iterator for the container of particle properties + * It is assumed that the container is properly ordered + * @return end-iterator for the container of particle properties + */ + virtual iterator end() const = 0; + /// get the container size. + virtual size_t size() const = 0; + /** Retrieve an object by name: + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const std::string& name = ... ; + * + * const Gaudi::ParticleProperty* pp = svc -> find ( name ) ; + * + * @endcode + * @param name the particle name + * @return pointer to particle property object + */ + virtual const ParticleProperty* find( const std::string& name ) const = 0; // find by particle name + /** Retrieve an object by Gaudi::ParticleID: + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleID& pid = ... ; + * + * const Gaudi::ParticleProperty* pp = svc -> find ( pid ) ; + * + * @endcode + * @param pid the particle's Gaudi::ParticleID + * @return pointer to particle property object + */ + virtual const ParticleProperty* find( const Gaudi::ParticleID& pid ) const = 0; // find by Gaudi::ParticleID + + /** get the properties according to some criteria + * + * e.g. get all leptons: + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * ... + * using namespace boost::lambda ; + * ... + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * + * // create the output vector: + * Vector leptons ; + * // use the service + * svc -> get + * ( bind ( &Gaudi::ParticleID::isLepton , + * bind ( &Gaudi::ParticleProperty::particleID , _1 ) ) , + * std::back_inserter ( lepton ) ) ; // output + * + * @endcode + * + * Essentially it is just <c>std::copy_if</c> STL-algorithm + * + * @param cut the predicate + * @param output the output iterator + * @return the updated position of output iterator + */ + template <class PREDICATE, class OUTPUT> + OUTPUT get( const PREDICATE& cut, OUTPUT output ) const; + + /** make the charge conjugation for the string/decay descriptor + * + * @code + * + * std::string decay = "B0 -> pi+ pi-" ; + * + * Gaudi::IParticlePropertySvc* svc = ... ; + * + * std::string cc = svc -> cc ( decay ) ; + * + * @endcode + * + * @param decay the decay descriptor + * @return the charge conjugation for the decay descriptor + */ + virtual std::string cc( const std::string& decay ) const = 0; + }; +} // namespace Gaudi::Interfaces + +namespace Gaudi { + namespace ParticleProperties { + /** helper utility for mapping of Gaudi::ParticleProperty object into + * non-negative integral sequential identifier + * @code + * + * const Gaudi::ParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleProperty* pp = ... ; + * + * size_t index = index ( pp , svc ) ; + * + * if ( !index ) + * { + * // error here: conversion is not possible + * } + * + * @endcode + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing property and/or service + * <c>0</c> is returned. The valid result is always + * satisfy the condition: <c> index <= service->size() </c> + * + * @param property the property to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + size_t index( const Gaudi::ParticleProperty* property, const Gaudi::Interfaces::IParticlePropertySvc* service ); + + /** helper utility for mapping of Gaudi::ParticleID object into + * non-negative integral sequential identifier + * @code + * + * const Gaudi::ParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleID& pid = ... ; + * + * size_t index = index ( pid , svc ) ; + * + * if ( !index ) + * { + * // error here: conversion is not possible + * } + * + * @endcode + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing PID and/or service + * <c>0</c> is returned. The valid result is always + * satisfy the condition: <c> index <= service->size() </c> + * + * @param pid the object to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + size_t index( const Gaudi::ParticleID& pid, const Gaudi::Interfaces::IParticlePropertySvc* service ); + + /** the inverse mapping of the integer sequential number onto + * Gaudi::ParticleID object + * @code + * + * const Gaudi::ParticlePropertySvc* svc = ... ; + * + * const size_t index = ... + * + * const Gaudi::ParticleProperty* pp = particle ( index , svc ) ; + * + * if ( !pp ) + * { + * // error here: conversion is not possible + * } + * + * @endcode + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing PID and/or service + * <c>NULL</c> is returned. + * + * @param pid the object to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + const Gaudi::ParticleProperty* particle( const size_t index, + const Gaudi::Interfaces::IParticlePropertySvc* service ); + + /** the inverse mapping of the integer sequential number onto + * Gaudi::ParticleID object + * @code + * + * const Gaudi::ParticlePropertySvc* svc = ... ; + * + * const size_t index = ... + * + * const Gaudi::ParticleID pid = particleID ( index , svc ) ; + * + * if ( Gaudi::ParticleID() == pid ) + * { + * // error here: conversion is not possible + * } + * + * @endcode + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing index and/or service + * <c>Gaudi::ParticleID()</c> is returned. + * + * @param pid the object to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + const Gaudi::ParticleID particleID( const size_t index, const Gaudi::Interfaces::IParticlePropertySvc* service ); + + /** mapping by pythiaID + * + * @code + * + * const int pythiaID = ... ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleProeprty* pp = byPythiaID( pythiaID , svc ) ; + * + * @endcode + * + * @attention the method is not very efficient and should not be abused + * @see Gaudi::ParticleProperties::particle + * @param pythia pythia identifier + * @param svc pointer to particle property service + * @return the particle property for the given pythia ID + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + const Gaudi::ParticleProperty* byPythiaID( const int pythia, const Gaudi::Interfaces::IParticlePropertySvc* svc ); + + /** mapping by EvtGen-name + * + * @code + * + * const std::string& evtGen + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleProperty* pp = byEvtGenName ( pythiaID , svc ) ; + * + * @endcode + * + * @attention the method is not very efficient and should not be abused + * @see Gaudi::ParticleProperties::particle + * @param evtGen the particle naem in EvtGen-generator + * @param svc pointer to particle property service + * @return the particle property for the given EvtGen-name + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + const Gaudi::ParticleProperty* byEvtGenName( const std::string& evtGen, + const Gaudi::Interfaces::IParticlePropertySvc* svc ); + + /** get all particle properties which satisfy the certain criteria + * + * e.g. select all particles with 'invalid' Pythia ID = 0 : + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * using namespace boost::lambda ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector output ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc->begin() , // begin-sequence + * svc->end () , // end-sequence + * bind ( &Gaudi::ParticleProperty::pythiaID , _1 ) == 0 , // predicate + * std::back_inserter( output ) ) ; // output + * + * @endcode + * + * or select all particles with 'invalid' EvtGen = "unknown" : + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * using namespace boost::lambda ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector output ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc->begin() , // begin-sequence + * svc->end () , // end-sequence + * bind ( &Gaudi::ParticleProperty::evtGen , _1 ) == "unknown" , // predicate + * std::back_inserter( output ) ) ; // output + * + * @endcode + * + * select leptons: + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * ... + * ... + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * using namespace boost::lambda ; + * + * // create the output vector: + * Vector leptons ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc->begin() , // begin-sequence + * svc->end () , // end-sequence + * bind ( &Gaudi::ParticleID::isLepton , bind ( &Gaudi::ParticleProperty::particleID ,_1 ) ) , + * std::back_inserter ( lepton ) ) ; // output + * + * @endcode + * + * Essentially it is just a missing <c>std::copy_if</c> STL-algorithm + * + * @param first begin-iterator of input sequence of particle properties + * @param last end-iterator of input sequence of particle properties + * @param cut the predicate + * @param output the output iterator + * @return the updated position of output iterator + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + template <class INPUT, class PREDICATE, class OUTPUT> + OUTPUT get( INPUT first, INPUT last, const PREDICATE& cut, OUTPUT output ) { + for ( ; first != last; ++first ) { + if ( cut( *first ) ) { + *output = *first; + ++output; + } + } + return output; + } + + /** get all particle properties which satisfy the certain criteria + * + * e.g. select all particles with 'invalid' Pythia ID = 0 : + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * using namespace boost::lambda ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector output ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc , + * bind ( &Gaudi::ParticleProperty::pythiaID , _1 ) == 0 , // predicate + * std::back_inserter( output ) ) ; // output + * + * @endcode + * + * or select all particles with 'invalid' EvtGen = "unknown" : + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * using namespace boost::lambda ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector output ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc , + * bind ( &Gaudi::ParticleProperty::evtGen , _1 ) == "unknown" , // predicate + * std::back_inserter( output ) ) ; // output + * + * @endcode + * + * Select all leptons: + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector ; + * using namespace boost::lambda ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector leptons ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc , + * bind ( &Gaudi::ParticleID::isLepton , + * bind ( &Gaudi::ParticleProperty::particleID , _1 ) ) , + * std::back_inserter ( leptons ) ) ; // output + * + * @endcode + * + * @param first begin-iterator of input sequence of particle properties + * @param end end-iterator of input sequence of particle properties + * @param cut the predicate + * @param output the output iterator + * @return the updated position of output iterator + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + template <class PREDICATE, class OUTPUT> + OUTPUT get( const Gaudi::Interfaces::IParticlePropertySvc* service, const PREDICATE& cut, OUTPUT output ) { + if ( 0 == service ) { return output; } + return service->get( cut, output ); + } + + /** get all the properties at once + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties + allProperties( const Gaudi::Interfaces::IParticlePropertySvc* service ); + } // namespace ParticleProperties + + namespace Interfaces { + // get the properties according to some criteria + template <class PREDICATE, class OUTPUT> + OUTPUT IParticlePropertySvc::get( const PREDICATE& cut, OUTPUT output ) const { + iterator first = this->begin(); + iterator last = this->end(); + return Gaudi::ParticleProperties::get( first, last, cut, output ); + } + } // namespace Interfaces +} // namespace Gaudi diff --git a/GaudiPartProp/include/Gaudi/ParticleID.h b/GaudiPartProp/include/Gaudi/ParticleID.h new file mode 100644 index 0000000000000000000000000000000000000000..7f357ef3672da79efe569ebfd6d9cc15dc6c5736 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/ParticleID.h @@ -0,0 +1,192 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <GaudiKernel/HashMap.h> +#include <GaudiKernel/Kernel.h> +#include <cmath> +#include <cstdint> +#include <iosfwd> +#include <string> +#include <tuple> + +namespace Gaudi { + /** @class ParticleID ParticleID.h + * + * Holds PDG + LHCb extension particle code, following the PDG + * particle numbering scheme + * (pdg.lbl.gov/2017/reviews/rpp2017-rev-monte-carlo-numbering.pdf). Specific + * conventions followed by Pythia 8 for beyond the standard model + * physics and color-octet quarkonia have been introduced. + * + * Nuclei with the PDG 2017 convention (following the 2006 Monte + * Carlo nuclear code scheme) have the numbering +/- 10LZZZAAAI. Where + * AAA is A - the total baryon number, + * ZZZ is Z - the total number of protons, + * L is the total number of strange quarks, and + * I is the isomer number where I = 0 corresponds to the ground state. + * Backwards compatibility with the old heavy ion scheme has also been kept. + * + * @date 19/02/2002 + * @author Gloria Corti + * @date 22/03/2018 + * @author Philip Ilten + */ + class GAUDI_API ParticleID final { + public: + /// PDG ID digits (base 10) are: n nr nl nq1 ne2 nq3 nj. + enum Location { nj = 1, nq3, nq2, nq1, nl, nr, n, n8, n9, n10 }; + /// Quark PDG IDs. + enum Quark { down = 1, up, strange, charm, bottom, top, bottom_prime, top_prime, first = down, last = top_prime }; + + /// Constructor with PDG code. + explicit ParticleID( const int pid = 0 ) { setPid( pid ); } + + /// Retrieve the PDG ID. + int pid() const { return m_pid; } + /// Absolute value of the PDG ID. + constexpr unsigned int abspid() const { return 0 > m_pid ? -m_pid : m_pid; } + /// Update the PDG ID. + void setPid( const int pid ) { m_pid = pid; } + + /// Return if the PID is valid. + bool isValid() const; + /// Return if the PID is from the standard model. + bool isSM() const; + /// Return if the PID is for a meson. + bool isMeson() const; + /// Return if the PID is for a baryon. + bool isBaryon() const; + /// Return if the PID is for a di-quark. + bool isDiQuark() const; + /// Return if the PID is for a hadron. + bool isHadron() const; + /// Return if the PID is for a lepton. + bool isLepton() const; + /// Return if the PID is for a nucleus. + bool isNucleus() const; + /// Return if the PID is for a bare quark. + bool isQuark() const; + + /// Return if the PID is a particle with quarks, but not a nucleus. + bool hasQuarks() const; + /// Return if the PID is a particle containing a specified quark flavor. + bool hasQuark( const Quark& q ) const; + /// Return if the PID is a particle with a down quark. + bool hasDown() const { return hasQuark( down ); } + /// Return if the PID is a particle with an up quark. + bool hasUp() const { return hasQuark( up ); } + /// Return if the PID is a particle with a down quark. + bool hasStrange() const { return hasQuark( strange ); } + /// Return if the PID is a particle with a charm quark. + bool hasCharm() const { return hasQuark( charm ); } + /// Return if the PID is a particle with a bottom quark. + bool hasBottom() const { return hasQuark( bottom ); } + /// Return if the PID is a particle with a top quark. + bool hasTop() const { return hasQuark( top ); } + /// Return if the PID is a particle with a bottom' quark. + bool hasBottomPrime() const { return hasQuark( bottom_prime ); } + /// Return if the PID is a particle with a top' quark. + bool hasTopPrime() const { return hasQuark( top_prime ); } + + /// Return three times the charge, in units of e+, valid for all particles. + int threeCharge() const; + /// Return 2J+1, where J is the total spin, valid for all particles. + int jSpin() const; + /// Return 2S+1, where S is the spin, valid only for mesons. + int sSpin() const; + /// Return 2L+1, where L is the orbital angular momentum, valid only for mesons. + int lSpin() const; + + /// Return the atomic number for a nucleus. + int Z() const; + /// Return the nucleon number for a nucleus. + int A() const; + /// Return the number of strange quarks for a nucleus. + int nLambda() const; + + /** Return the fundamental ID. + * This is 0 for nuclei, mesons, baryons, and di-quarks. + * Otherwise, this is the first two digits of the PDG ID + */ + int fundamentalID() const; + + /// Return everything beyond the 7th PDG ID digit. + int extraBits() const; + /// Return the digit for a given PDG ID digit location. + constexpr unsigned short digit( const Location& loc ) const { + constexpr std::uint32_t pows[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + return ( abspid() / pows[loc - 1] ) % 10; + } + + /// Equality operator. + bool operator==( const ParticleID& o ) const { return m_pid == o.m_pid; } + /// Non-equality operator. + bool operator!=( const ParticleID& o ) const { return m_pid != o.m_pid; } + /// Comparison operator. + bool operator<( const ParticleID& o ) const { + const unsigned int i1( abspid() ), i2( o.abspid() ); + return std::tie( i1, m_pid ) < std::tie( i2, o.m_pid ); + } + + /// Fill a stream with the PID. + std::ostream& fillStream( std::ostream& s ) const; + /// Return the PID stream representation as a string. + std::string toString() const; + /// Fill a stream with the PID digit enumeration. + static std::ostream& printLocation( const long l, std::ostream& s ); + /// Return the PID digit enumeration stream representation as a string. + static std::string printLocation( const long l ); + /// Fill a stream with the PID quark enumeration. + static std::ostream& printQuark( const long q, std::ostream& s ); + /// Return the PID quark enumeration stream representation as a string. + static std::string printQuark( const long q ); + + private: + /// PDG ID. + int m_pid{ 0 }; + }; + + // Inline stream operators. + /// Stream operator for the PID. + inline std::ostream& operator<<( std::ostream& s, const Gaudi::ParticleID& o ) { return o.fillStream( s ); } + /// Stream operator for the PDG digit enumeration. + inline std::ostream& operator<<( std::ostream& s, Gaudi::ParticleID::Location l ) { + return Gaudi::ParticleID::printLocation( l, s ); + } + /// Stream operator for the PDG quark enumeration. + inline std::ostream& operator<<( std::ostream& s, Gaudi::ParticleID::Quark q ) { + return Gaudi::ParticleID::printQuark( q, s ); + } +} // namespace Gaudi + +namespace GaudiUtils { + template <> + struct Hash<Gaudi::ParticleID> { + inline size_t operator()( const Gaudi::ParticleID& s ) const { return (size_t)s.pid(); } + }; + template <> + struct Hash<const Gaudi::ParticleID> { + inline size_t operator()( const Gaudi::ParticleID& s ) const { return (size_t)s.pid(); } + }; + template <> + struct Hash<Gaudi::ParticleID&> { + inline size_t operator()( const Gaudi::ParticleID& s ) const { return (size_t)s.pid(); } + }; + template <> + struct Hash<const Gaudi::ParticleID&> { + inline size_t operator()( const Gaudi::ParticleID& s ) const { return (size_t)s.pid(); } + }; +} // namespace GaudiUtils +namespace std { + /// Return the absolute value for a PID. + inline Gaudi::ParticleID abs( const Gaudi::ParticleID& p ) { return Gaudi::ParticleID( p.abspid() ); } +} // namespace std diff --git a/GaudiPartProp/include/Gaudi/ParticleProperty.h b/GaudiPartProp/include/Gaudi/ParticleProperty.h new file mode 100644 index 0000000000000000000000000000000000000000..a1801afafd19a06f92ed5cb7fc48a1ea0417bfaa --- /dev/null +++ b/GaudiPartProp/include/Gaudi/ParticleProperty.h @@ -0,0 +1,416 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <Gaudi/ParticleID.h> +#include <GaudiKernel/Kernel.h> +#include <GaudiKernel/PhysicalConstants.h> +#include <cmath> +#include <functional> +#include <iosfwd> +#include <limits> +#include <set> +#include <string> +#include <vector> + +namespace Gaudi { + namespace Interfaces { + class IParticlePropertySvc; + } + + /** @class ParticleProperty ParticleProperty.h Gaudi/ParticleProperty.h + * + * A trivial class to hold information about a single particle properties. + * All particle properties are accessible through accessor functions + * + * @author Iain Last,G.Corti + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + */ + class GAUDI_API ParticleProperty final { + public: + /** @struct Compare + * The comparison criteria for particle properties + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-10-14 + */ + struct Compare { + inline bool operator()( const ParticleProperty* p1, const ParticleProperty* p2 ) const { + return p1 == p2 ? false : 0 == p1 ? true : 0 == p2 ? false : ( *p1 < *p2 ); + } + }; + + /** full constructor, from all data (except the antiparticle ) + * @param name the name for the particle + * @param pid the PID for the particle + * @param charge the charge of the particle + * @param mass the nominal mass of the particle + * @param tlife the nominal lifetime of the particle + * @param maxWidth the maximal width of the particle (used in generator) + * @param evtgen the name of particle in EvtGen program + * @param pythia the ID for the particle used in Pythia generator + */ + ParticleProperty( const std::string& name, const Gaudi::ParticleID& pid, const double charge, const double mass, + const double tlife, const double maxWidth, const std::string& evtgen, const int pythia ); + /** a bit simplified constructor, from all data (except the antiparticle ) + * + * - "evtGenName" is set from the regular "name" + * - pythiaID is set from the regular PID + * + * @param name the name for the particle + * @param pid the PID for the particle + * @param charge the charge of the particle + * @param mass the nominal mass of the particle + * @param tlife the nominal lifetime of the particle + * @param maxWidth the maximal width of the particle (used in generator) + */ + ParticleProperty( const std::string& name, const Gaudi::ParticleID& pid, const double charge, const double mass, + const double tlife, const double maxWidth ); + + /// Get the particle name. + const std::string& particle() const { return m_name; } + /// Get the particle name. + const std::string& name() const { return m_name; } + /// get the particle ID + const Gaudi::ParticleID& particleID() const { return m_pid; } + /// get the particle ID + const Gaudi::ParticleID& pdgID() const { return m_pid; } + /// get the particle ID + const Gaudi::ParticleID& pid() const { return m_pid; } + /// Get the particle charge. + double charge() const { return m_charge; } + /// Get the particle mass. + double mass() const { return m_mass; } + /// Get the particle lifetime. + double lifetime() const { return m_tlife; } + /// Get the particle lifetime. + double lifeTime() const { return m_tlife; } + /// Get the particle proper lifetime in c*tau units + double ctau() const { return Gaudi::Units::c_light * lifeTime(); } + /// Get the particle natural width + double width() const { + return std::abs( ctau() ) < std::numeric_limits<double>::epsilon() ? 0.0 : Gaudi::Units::hbarc / ctau(); + } + /// Get the max width deviation + double maxWidth() const { return m_maxWidth; } // max-width + /// get the pointer to the anti-particle + const Gaudi::ParticleProperty* antiParticle() const { return anti(); } + /// get the pointer to the anti-particle + const Gaudi::ParticleProperty* anti() const { return m_anti; } + + /// self-charge conjugated? + bool selfcc() const { return m_anti == this; } + + /// Three times the charge (in positron charge units) + int threeCharge() const { return m_pid.threeCharge(); } + + /** set the pointer to the antiparticle + * @attention it is the only one "setter" + * @param p pointer to anti-particle + */ + void setAntiParticle( const ParticleProperty* p ); + + /// Get the EvtGen name + const std::string& evtGenName() const { return m_evtgen; } + /// Get the EvtGen name + const std::string& evtGen() const { return m_evtgen; } + /// Get the Pythia ID + int pythiaID() const { return m_pythia; } + /// Get the Pythia ID + int pythia() const { return m_pythia; } + + /// comparison/ordering operator ( "strict-less-by-PID&Name" ) + friend bool operator<( const ParticleProperty& lhs, const ParticleProperty& rhs ) { + return std::tie( lhs.m_pid, lhs.m_name ) < std::tie( rhs.m_pid, rhs.m_name ); + } + + /// implicit conversion to ParticleID class + operator const Gaudi::ParticleID&() const { return m_pid; } + + /** the standard (a'la Gaudi) printout of the object + * @param s reference to the output stream + * @return reference to the output stream + */ + std::ostream& fillStream( std::ostream& s ) const; + /// simple method for conversion into the string + std::string toString() const; + + private: + /// the name for the particle + std::string m_name; + /// the PID for the particle + Gaudi::ParticleID m_pid; + /// the charge for the particle + double m_charge; + /// the nominal mass for the particle + double m_mass; + /// the nominal proper lifetime for the particle + double m_tlife; + /// The maximum width deviation + double m_maxWidth; + /// the name of the particle for EvtGen program + std::string m_evtgen; + /// the ID for the particle used in Pythia generator + int m_pythia; + /// the pointer to the anti-particle + const Gaudi::ParticleProperty* m_anti; + }; +} // namespace Gaudi + +/** standard output operator to the stream + * @param stream the stream + * @param pp the particle property object + * @return the stream + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +std::ostream& operator<<( std::ostream& stream, const Gaudi::ParticleProperty& pp ); + +class MsgStream; +namespace Gaudi { + namespace ParticleProperties { + /** print a list of properties in a form of the table + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const std::vector<const Gaudi::ParticleProperty*>& props = ... ; + * + * std::cout << "Properties" << std::endl ; + * Gaudi::ParticleProperties::printAsTable ( props , std::cout , svc ) ; + * + * @endcode + * + * The utility is easy to use in conjunction with + * Gaudi::ParticleProperties:;get utilities: + * e.g. get all leptons from the service and print them as table: + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef std::vector<const Gaudi::IParticleProperty*> Vector ; + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector leptons ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc , + * // create the predicate: + * boost::lambda::bind ( &Gaudi::ParticleID::isLepton , + * boost::lambda::bind ( &Gaudi::ParticleProperty::particleID , boost::lambda::_1 ) ) , + * std::back_inserter ( leptons ) ) ; // output + * + * // print the leptons: + * std::cout << "LEPTONS" << std::endl ; + * Gaudi::ParticleProperties::printAsTable_ ( leptons , std::cout , svc ) ; + * + * @endcode + * + * @see Gaudi::ParticleProperty + * @see Gaudi::Interfaces::IParticlePropertySvc + * @see Gaudi::ParticleProperties::get + * @param particles the list of particle properties + * @param stream the reference to the output stream + * @param service the service to extract global information + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + GAUDI_API + std::ostream& printAsTable_( const std::vector<const Gaudi::ParticleProperty*>& particles, std::ostream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ); + + /** print a list of properties in a form of the table + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const std::vector<const Gaudi::ParticleProperty*>& props = ... ; + * + * std::cout << "Properties" << std::endl << + * Gaudi::ParticleProperties::printAsTable ( props , svc ) << std::endl + * + * @endcode + * + * The utility is easy to use in conjunction with + * Gaudi::ParticleProperties:;get utilities: + * e.g. get all leptons from the service and print them as table: + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef std::vector<const Gaudi::IParticleProperty*> Vector ; + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector leptons ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc , + * // create the predicate: + * boost::lambda::bind ( &Gaudi::ParticleID::isLepton , + * boost::lambda::bind ( &Gaudi::ParticleProperty::particleID , boost::lambda::_1 ) ) , + * std::back_inserter ( leptons ) ) ; // output + * + * // print the leptons: + * std::cout << "LEPTONS" + * << std::endl + * Gaudi::ParticleProperties::printAsTable ( leptons , svc ) + * << std::endl ; + * + * @endcode + * + * @see Gaudi::ParticleProperty + * @see Gaudi::Interfaces::IParticlePropertySvc + * @see Gaudi::ParticleProperties::get + * @param particles the list of particle properties + * @param service the service to extract global information + * @return the string output + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + GAUDI_API + std::string printAsTable( const std::vector<const Gaudi::ParticleProperty*>& particles, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ); + + /** print a list of properties in a form of the table + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const std::vector<const Gaudi::ParticleProperty*>& props = ... ; + * + * MsgStream& log = ... ; + * Gaudi::ParticleProperties::printAsTable ( props , log , svc ) ; + * log << endmsg ; + * + * @endcode + * + * The utility is easy to use in conjunction with + * Gaudi::ParticleProperties:;get utilities: + * e.g. get all leptons from the service and print them as table: + * + * @code + * + * #include "boost/lambda/lambda.hpp" + * #include "boost/lambda/bind.hpp" + * + * typedef std::vector<const Gaudi::IParticleProperty*> Vector ; + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * // create the output vector: + * Vector leptons ; + * // use the function + * Gaudi::ParticleProperties::get + * ( svc , + * // create the predicate: + * boost::lambda::bind ( &Gaudi::ParticleID::isLepton , + * boost::lambda::bind ( &Gaudi::ParticleProperty::particleID , boost::lambda::_1 ) ) , + * std::back_inserter ( leptons ) ) ; // output + * + * // print the leptons: + * MsgStream& log = ... ; + * log << "LEPTONS" << std::endl ; + * Gaudi::ParticleProperties::printAsTable ( leptons , log , svc ) ; + * log << endmsg ; + * + * @endcode + * + * @see Gaudi::ParticleProperty + * @see Gaudi::Interfaces::IParticlePropertySvc + * @see Gaudi::ParticleProperties::get + * @param particles the list of particle properties + * @param stream the reference to the output stream + * @param service the service to extract global information + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + GAUDI_API + MsgStream& printAsTable( const std::vector<const Gaudi::ParticleProperty*>& particles, MsgStream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ); + + /** print properties in a form of the table + * @param particles (INPUT) list of particles + * @param stream (UPDATE) the stream + * @param service (INPUT) pointer to particle property service + * @return the stream + * @author Vanya BELYAEV Ivan.Belyaev@itep.ru + * @date 2010-01-04 + */ + GAUDI_API + std::ostream& printAsTable_( const std::vector<Gaudi::ParticleID>& particles, std::ostream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ); + + template <class C_, class A_> + inline std::ostream& printAsTable_( const std::set<Gaudi::ParticleID, C_, A_>& particles, std::ostream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ) { + return printAsTable_( std::vector<Gaudi::ParticleID>( particles.begin(), particles.end() ), stream, service ); + } + + /** print properties in a form of the table + * @param particles (INPUT) list of particles + * @param service (INPUT) pointer to particle property service + * @return string-representation + * @author Vanya BELYAEV Ivan.Belyaev@itep.ru + * @date 2010-01-04 + */ + GAUDI_API + std::string printAsTable( const std::vector<Gaudi::ParticleID>& particles, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ); + + template <class C_, class A_> + inline std::string printAsTable( const std::set<Gaudi::ParticleID, C_, A_>& particles, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ) { + return printAsTable( std::vector<Gaudi::ParticleID>( particles.begin(), particles.end() ), service ); + } + + /** print properties in a form of the table + * @param particles (INPUT) list of particles + * @param stream (UPDATE) the stream + * @param service (INPUT) pointer to particle property service + * @return the stream + * @author Vanya BELYAEV Ivan.Belyaev@itep.ru + * @date 2010-01-04 + */ + GAUDI_API + MsgStream& printAsTable( const std::vector<Gaudi::ParticleID>& particles, MsgStream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ); + + template <class C_, class A_> + inline MsgStream& printAsTable( const std::set<Gaudi::ParticleID, C_, A_>& particles, MsgStream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service = 0 ) { + return printAsTable( std::vector<Gaudi::ParticleID>( particles.begin(), particles.end() ), stream, service ); + } + } // namespace ParticleProperties +} // namespace Gaudi +namespace Gaudi { + namespace Utils { + /** print a list of particle properties as formatted table + * @see Gaudi::ParticleProperty + * @param particles the list of particle properties + * @param stream the reference to the output stream + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + GAUDI_API + std::ostream& toStream( const std::vector<const Gaudi::ParticleProperty*>& particles, std::ostream& stream ); + } // namespace Utils +} // namespace Gaudi +namespace std { + GAUDI_API + const Gaudi::ParticleProperty* abs( const Gaudi::ParticleProperty* p ); +} // namespace std diff --git a/GaudiPartProp/include/Gaudi/Tr/TrackDefaultParticles.h b/GaudiPartProp/include/Gaudi/Tr/TrackDefaultParticles.h new file mode 100644 index 0000000000000000000000000000000000000000..8e4e49fa3e7e56b3a62da1c5d92f1225d031ae06 --- /dev/null +++ b/GaudiPartProp/include/Gaudi/Tr/TrackDefaultParticles.h @@ -0,0 +1,108 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +#include <GaudiKernel/StatusCode.h> +#include <array> +#include <iomanip> +#include <stdexcept> +#include <stdint.h> + +namespace Gaudi { + namespace Tr { + class PID { + enum class validated_pid_t { Electron = 0, Muon, Pion, Kaon, Proton }; + static constexpr std::array<double, 5> s_mass = { 0.51099891, 105.65837, 139.57018, 493.677, 938.27203 }; + + validated_pid_t m_value; + + static constexpr validated_pid_t validate( int id ) { + switch ( id ) { + case 11: + return validated_pid_t::Electron; + case 13: + return validated_pid_t::Muon; + case 211: + return validated_pid_t::Pion; + case 321: + return validated_pid_t::Kaon; + case 2212: + return validated_pid_t::Proton; + default: + throw std::runtime_error( "invalid PID" ); + } + } + + public: + constexpr explicit PID( const int id ) : m_value( validate( id ) ) {} + + constexpr explicit PID( validated_pid_t pid ) : m_value( pid ) {} + + PID() = default; + // Make the creation of thes PID objects expressive in user code + // by calling Gaudi::Tr::PID::Electron() + static constexpr PID Electron() { return PID{ validated_pid_t::Electron }; } + + static constexpr PID Muon() { return PID{ validated_pid_t::Muon }; } + + static constexpr PID Pion() { return PID{ validated_pid_t::Pion }; } + + static constexpr PID Kaon() { return PID{ validated_pid_t::Kaon }; } + + static constexpr PID Proton() { return PID{ validated_pid_t::Proton }; } + + // Framwork functions allowing the use of PID inside a property + friend const char* toString( PID pid ) { + switch ( pid.m_value ) { + case validated_pid_t::Electron: + return "Electron"; + case validated_pid_t::Muon: + return "Muon"; + case validated_pid_t::Pion: + return "Pion"; + case validated_pid_t::Kaon: + return "Kaon"; + case validated_pid_t::Proton: + return "Proton"; + default: + throw std::runtime_error( "Calling toString on invalid PID" ); + } + } + + friend std::ostream& toStream( const PID& pid, std::ostream& os ) { + return os << std::quoted( toString( pid ), '\'' ); + } + friend std::ostream& operator<<( std::ostream& os, const PID& pid ) { return toStream( pid, os ); } + + friend StatusCode parse( PID& pid, const std::string& in ) { + for ( PID ref : { Electron(), Muon(), Pion(), Kaon(), Proton() } ) { + if ( in != toString( ref ) ) continue; + pid = ref; + return StatusCode::SUCCESS; + } + return StatusCode::FAILURE; + } + //---------------------------------------------------------- + + constexpr double mass() const { return s_mass[static_cast<int>( m_value )]; } + + constexpr bool isElectron() const { return validated_pid_t::Electron == m_value; } + + constexpr bool isMuon() const { return validated_pid_t::Muon == m_value; } + + constexpr bool isPion() const { return validated_pid_t::Pion == m_value; } + + constexpr bool isKaon() const { return validated_pid_t::Kaon == m_value; } + + constexpr bool isProton() const { return validated_pid_t::Proton == m_value; } + }; + } // namespace Tr +} // namespace Gaudi diff --git a/GaudiPartProp/include/GaudiKernel/ParticleProperty.h b/GaudiPartProp/include/GaudiKernel/ParticleProperty.h new file mode 100644 index 0000000000000000000000000000000000000000..82038357626f1eef89bb30fda43af542e32c4d7a --- /dev/null +++ b/GaudiPartProp/include/GaudiKernel/ParticleProperty.h @@ -0,0 +1,17 @@ +/***********************************************************************************\ +* (c) Copyright 2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#pragma once + +// Backward compatibility layer for users of legacy GaudiKernel/ParticleProperty.h + +#include <Gaudi/ParticleProperty.h> + +using Gaudi::ParticleProperty; diff --git a/GaudiPartProp/python/GaudiPartProp/Check.py b/GaudiPartProp/python/GaudiPartProp/Check.py new file mode 100644 index 0000000000000000000000000000000000000000..24bbd0bffdbabe1cf80514f42c480131f270f098 --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/Check.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +# ============================================================================= +## @file GaudiPartProp/Check.py +# the trivial example to inspect the particle data table from the data base +# @author Vanya BELYAEV vanya@nikhef.nl +# @date 2009-03-06 +# ============================================================================= +""" +The trivial example to inspect the particle data table from the data base +""" + +# ============================================================================= +__author__ = "Vanya BELYAEV vanya@nikhef.nl" +__verison__ = " " +# ============================================================================= + +from Configurables import ApplicationMgr, Gaudi__ParticlePropertySvc + +## let application manager to know about the service: +ApplicationMgr().ExtSvc += [Gaudi__ParticlePropertySvc()] + +# The following is misunderstood by flake8 - the import is needed as it +# has necessary side effects +import GaudiPartProp.Service # noqa: F401 +from GaudiKernel.SystemOfUnits import micrometer + +## switch to GaudiPython +from GaudiPython.Bindings import AppMgr + +# instantiate the actual (C++) application manager +gaudi = AppMgr() + +# switch off all algorithms +gaudi.TopAlg = [] + +# initialize everything properly +gaudi.run(1) + +# get the actual (C++) particle properties service +ppsvc = gaudi.gaudiPartProp() + +# finally: play with the service + +# get all a self-conjugated particles +print(" Self-charge conjugated particles ") +selfcc = ppsvc.get(lambda x: x.selfcc()) +print(selfcc) + +# set self-charge conjugated conjugated mesons: +print(" CC-neutral mesons") +mesonscc = ppsvc.get(lambda x: (x.selfcc() and x.isMeson())) +print(mesonscc) + +# set self-charge conjugated conjugated mesons: +print(" CC-neutral beauty mesons") +mesonscc = ppsvc.get(lambda x: (x.isMeson() and x.hasBottom())) +print(mesonscc) + +# get "stable" particles ( lifetime in excess of 1 micrometer +print(" STABLE particles (c*tau> 1 um)") +stable = ppsvc.get(lambda x: (x.ctau() > micrometer)) +print(stable) diff --git a/GaudiPartProp/python/GaudiPartProp/DumpParticleProperties.py b/GaudiPartProp/python/GaudiPartProp/DumpParticleProperties.py new file mode 100644 index 0000000000000000000000000000000000000000..bb8a82dec91d9bc35091993ad97428a381dbef44 --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/DumpParticleProperties.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +# ============================================================================= +## @file DumpParticleProperties.py +# Demo-file for interactive work with new Particle Property Service +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2010-10-22 +# ============================================================================= +"""Trivial script to dump the table of Particle Properties +""" + +# ============================================================================= +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +# ============================================================================= + + +def dump(): + import GaudiPartProp.PartPropAlg + + # The following is misunderstood by flake8 - the import is needed as it + # has necessary side effects + import GaudiPartProp.Service # noqa: F401 + from Configurables import MessageSvc + + MessageSvc(OutputLevel=6) + + from GaudiPython.Bindings import AppMgr + + gaudi = AppMgr() + + gaudi.initialize() + + pps = gaudi.gaudiPartProp() + + print(pps.all()) + + +# ============================================================================= +if "__main__" == __name__: + dump() diff --git a/GaudiPartProp/python/GaudiPartProp/Nodes.py b/GaudiPartProp/python/GaudiPartProp/Nodes.py new file mode 100644 index 0000000000000000000000000000000000000000..b80d2fa953a0331680e22786198b1218b14367e3 --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/Nodes.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file GaudiPartProp/Nodes.py +# Simple "decorator for nodes" +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-03 +# ============================================================================= +""" +Simple 'decorator for nodes' +""" +from __future__ import print_function + +# ============================================================================= +__author__ = "Vanya BELYAEV <Ivan.Belyaev@nikhef.nl>" +__version__ = "" +# ============================================================================= + +# Workaround for ROOT-10769 +import warnings + +with warnings.catch_warnings(): + warnings.simplefilter("ignore") + import cppyy + +import GaudiPython + +# namespaces shortcuts +Decays = cppyy.gbl.Gaudi.Decays +std = cppyy.gbl.std +Gaudi = GaudiPython.gbl.Gaudi + + +# ============================================================================= +## Decorate the nodes +def _decorate(nodes, opers): + """ + Decorate the functions + """ + + ## __call__ + if hasattr(opers, "__call__"): + ## the regular call + def _call_(self, arg): + """ + Evaluate the functor + + >>> fun = ... # get the functor + >>> arg = ... # get the argument + >>> res = fun ( arg ) + """ + result = opers.__call__(self, arg) + return True if result else False + + _call_.__doc__ = opers.__call__.__doc__ + + ## __or__ + if hasattr(opers, "__or__"): + ## the regular call + def _or_(self, arg): + """ + LOGICAL or + + >>> fun1 = ... # get the functor + >>> fun2 = ... # get the functor + >>> fun = fun1 | fun2 + """ + return opers.__or__(self, arg) + + _or_.__doc__ = opers.__or__.__doc__ + + ## __ror__ + if hasattr(opers, "__ror__"): + ## the regular call + def _ror_(self, arg): + """ + LOGICAL or + + >>> fun1 = ... # get the functor + >>> fun2 = ... # get the functor + >>> fun = fun1 | fun2 + """ + return opers.__ror__(self, arg) + + _or_.__doc__ = opers.__or__.__doc__ + + ## __and__ + if hasattr(opers, "__and__"): + ## the regular call + def _and_(self, arg): + """ + LOGICAL and + + >>> fun1 = ... # get the functor + >>> fun2 = ... # get the functor + >>> fun = fun1 & fun2 + """ + return opers.__and__(self, arg) + + _and_.__doc__ = opers.__and__.__doc__ + + ## __rand__ + if hasattr(opers, "__rand__"): + ## the regular call + def _rand_(self, arg): + """ + LOGICAL and + + >>> fun1 = ... # get the functor + >>> fun2 = ... # get the functor + >>> fun = fun1 & fun2 + """ + return opers.__rand__(self, arg) + + _rand_.__doc__ = opers.__rand__.__doc__ + + ## __invert__ + if hasattr(opers, "__invert__"): + ## the regular call + def _invert_(self, *arg): + """ + LOGICAL negation + + >>> fun1 = ... # get the functor + >>> fun = ~fun2 + """ + return opers.__invert__(self, *arg) + + _invert_.__doc__ = opers.__invert__.__doc__ + + ## __rshift__ + if hasattr(opers, "__rshift__"): + ## 'right'-shift + def _rshift_(self, arg): + """ + Streamers + + >>> fun1 = ... # get the functor + >>> fun1 = ... # get the functor + >>> fun = fun1 >> fun2 + """ + return opers.__rshift__(self, arg) + + _rshift_.__doc__ = opers.__rshift__.__doc__ + + ## __rrshift__ + if hasattr(opers, "__rrshift__"): + ## 'right/right'-shift + def _rrshift_(self, arg): + """ + Evaluate the functor as streametr shift + + >>> fun = ... # get the functor + >>> arg = ... # get the argument + >>> res = arg >> fun + """ + result = opers.__rrshift__(self, arg) + return True if result else False + + _rrshift_.__doc__ = opers.__rrshift__.__doc__ + + for node in nodes: + if _call_: + node.__call__ = _call_ + if _or_: + node.__or__ = _or_ + if _ror_: + node.__ror__ = _ror_ + if _and_: + node.__and__ = _and_ + if _rand_: + node.__rand__ = _rand_ + if _rshift_: + node.__rshift__ = _rshift_ + if _rrshift_: + node.__rrshift__ = _rrshift_ + if _invert_: + node.__invert__ = _invert_ + + node.__repr__ = lambda s: s.toString() + node.__str__ = lambda s: s.toString() + + return nodes + + +## decorate the nodes +_decorated = _decorate( + ( + Decays.iNode, + Decays.Node, + # + Decays.Nodes.Any, + Decays.Nodes.Pid, + Decays.Nodes.CC, + # + Decays.Nodes.Lepton, + Decays.Nodes.Nu, + Decays.Nodes.Ell, + Decays.Nodes.EllPlus, + Decays.Nodes.EllMinus, + Decays.Nodes.Hadron, + Decays.Nodes.Meson, + Decays.Nodes.Baryon, + Decays.Nodes.Charged, + Decays.Nodes.Positive, + Decays.Nodes.Negative, + Decays.Nodes.Neutral, + Decays.Nodes.HasQuark, + Decays.Nodes.JSpin, + Decays.Nodes.SSpin, + Decays.Nodes.LSpin, + Decays.Nodes.Nucleus, + Decays.Nodes.CTau, + Decays.Nodes.ShortLived_, + Decays.Nodes.LongLived_, + Decays.Nodes.Stable, + Decays.Nodes.StableCharged, + Decays.Nodes.CTau, + Decays.Nodes.Mass, + Decays.Nodes.Light, + Decays.Nodes.Heavy, + Decays.Nodes.Symbol, + Decays.Nodes.Invalid, + Decays.Nodes._Node, + # + Decays.Nodes.Or, + Decays.Nodes.And, + Decays.Nodes.Not, + ), ## nodes + # operations + opers=Decays.Dict.NodeOps, +) + +## full list of known nodes + +iNode = Decays.iNode +Node = Decays.Node +# +Any = Decays.Nodes.Any() # instance +Pid = Decays.Nodes.Pid # type +CC = Decays.Nodes.CC # type +Lepton = Decays.Nodes.Lepton() # instance +Nu = Decays.Nodes.Nu() # instance +Ell = Decays.Nodes.Ell() # instance +EllPlus = Decays.Nodes.EllPlus() # instance +EllMinus = Decays.Nodes.EllMinus() # instance +Hadron = Decays.Nodes.Hadron() # instance +Meson = Decays.Nodes.Meson() # instance +Baryon = Decays.Nodes.Baryon() # instance +Charged = Decays.Nodes.Charged() # instance +Positive = Decays.Nodes.Positive() # instance +Negative = Decays.Nodes.Negative() # instance +Neutral = Decays.Nodes.Neutral() # instance +HasQuark = Decays.Nodes.HasQuark # type +JSpin = Decays.Nodes.JSpin # type +SSpin = Decays.Nodes.SSpin # type +LSpin = Decays.Nodes.LSpin # type +Nucleus = Decays.Nodes.Nucleus() # instance +Or = Decays.Nodes.Or # type +And = Decays.Nodes.And # type +Not = Decays.Nodes.Not # type +Invalid = Decays.Nodes.Invalid() # instance +_Node = Decays.Nodes._Node # type + +PosId = Decays.Nodes.PosID() # instance +NegId = Decays.Nodes.NegID() # instance + +Up = HasQuark(Gaudi.ParticleID.up) +Down = HasQuark(Gaudi.ParticleID.down) +Strange = HasQuark(Gaudi.ParticleID.strange) +Charm = HasQuark(Gaudi.ParticleID.charm) +Beauty = HasQuark(Gaudi.ParticleID.bottom) +Bottom = HasQuark(Gaudi.ParticleID.bottom) +Top = HasQuark(Gaudi.ParticleID.top) + +Xu = HasQuark(Gaudi.ParticleID.up) +Xd = HasQuark(Gaudi.ParticleID.down) +Xs = HasQuark(Gaudi.ParticleID.strange) +Xc = HasQuark(Gaudi.ParticleID.charm) +Xb = HasQuark(Gaudi.ParticleID.bottom) +Xb = HasQuark(Gaudi.ParticleID.bottom) +Xt = HasQuark(Gaudi.ParticleID.top) + +Scalar = JSpin(1) +Spinor = JSpin(2) +Vector = JSpin(3) +Tensor = JSpin(5) + +OneHalf = JSpin(2) +ThreeHalf = JSpin(4) +FiveHalf = JSpin(6) + +CTau = Decays.Nodes.CTau # type +LongLived_ = Decays.Nodes.LongLived_ # type +LongLived = Decays.Nodes.LongLived_() # instance +ShortLived_ = Decays.Nodes.ShortLived_ # type +ShortLived = Decays.Nodes.ShortLived_() # instance +Stable = Decays.Nodes.Stable() # instance +StableCharged = Decays.Nodes.StableCharged() # instance +Mass = Decays.Nodes.Mass # type +Light = Decays.Nodes.Light # type +Heavy = Decays.Nodes.Heavy # type +Symbol = Decays.Nodes.Symbol # type + +NodeList = Decays.NodeList + +if "__main__" == __name__: + print(" decorated objects: %s " % str(_decorated)) + print(_decorated) + print(dir()) diff --git a/GaudiPartProp/python/GaudiPartProp/PartPropAlg.py b/GaudiPartProp/python/GaudiPartProp/PartPropAlg.py new file mode 100644 index 0000000000000000000000000000000000000000..6415184c0782bad0bd92fcdc9ac57d19a9bc2f78 --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/PartPropAlg.py @@ -0,0 +1,27 @@ +#!/usr/bin/env gaudirun.py +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file +# The configuration file to run QMTest for the package GaudiPartProp +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-02 +# ============================================================================= +""" The configuration file to run QMTest for the package GaudiPartProp +""" +# ============================================================================= +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +# ============================================================================= + +from Configurables import ApplicationMgr +from Configurables import Gaudi__Examples__PartPropAlg as PPA + +ApplicationMgr(TopAlg=[PPA()], EvtSel="NONE", EvtMax=1) diff --git a/GaudiPartProp/python/GaudiPartProp/PartPropSvc.py b/GaudiPartProp/python/GaudiPartProp/PartPropSvc.py new file mode 100644 index 0000000000000000000000000000000000000000..8c9b0325c246e537bcb799c7734978baeb83fbd9 --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/PartPropSvc.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file PartPropSvc.py +# Demo-file for interactive work with new Particle Property Service +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-02 +# ============================================================================= +""" Demo-file for interactive work with new Particle Property Service +""" +# ============================================================================= +from builtins import range + +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +import GaudiPartProp.decorators + +# ============================================================================= +import GaudiPartProp.PartPropAlg + +# The following is misunderstood by flake8 - the import is needed as it +# has necessary side effects +import GaudiPartProp.Service # noqa: F401 + +# ============================================================================= +## test the nodes +from GaudiPartProp.Nodes import ( + CC, + Baryon, + Bottom, + EllMinus, + EllPlus, + FiveHalf, + Hadron, + Lepton, + Meson, + Nu, + Tensor, + ThreeHalf, +) +from GaudiPython.Bindings import AppMgr + +gaudi = AppMgr() +gaudi.initialize() + + +## simple test-function +def test(): + """Simple function for the test""" + pps = gaudi.gaudiPartProp() + + for l in range(1, 6): + # get + lst1 = pps.get(lambda x: l == x.pid().lSpin()) + print(" %s == 2*lSpin+1 " % l) + print(lst1) + + for s in range(0, 2): + # get + lst1 = pps.get(lambda x: s == x.pid().sSpin()) + print(" %s == 2*sSpin+1 " % s) + print(lst1) + + for j in range(0, 7): + # get + lst1 = pps.get(lambda x: j == x.pid().jSpin()) + print(" %s == 2*jSpi+1 " % j) + print(lst1) + + decays = [ + "B0 -> K- pi+", + "B+ -> J/psi(1S) ( K*0 -> K+ pi- ) ", + "D_s+ -> pi+ pi+ pi- ", + "B_s0 -> ( J/psi(1S) -> mu+ mu- ) ( phi(1020) -> K+ K- ) ", + ] + + for decay in decays: + print("Decay&CC: %s : %s " % (decay, pps.cc(decay))) + + Item = pps.Item + Items = pps.Items + Decay = pps.Decay + Decays = pps.Decays + + items = Items() + items.push_back(Item("K+")) + items.push_back(Item("K-")) + + decay = Decay(Item("B0"), items) + + print(decay.validate(pps.svc())) + + decays = Decays() + decays.push_back(decay) + decays.push_back(decay) + decays.push_back(decay) + + print(decay) + print(decays) + + +def test2(): + pps = gaudi.gaudiPartProp() + + nodes = [ + Lepton & ~Meson, + EllPlus | Nu, + Lepton & ~Nu, + EllMinus | CC("B0"), + Hadron & Tensor, + Hadron & ThreeHalf, + Hadron & FiveHalf, + EllPlus | (Bottom & Baryon), + ] + + for node in nodes: + node.validate(pps.svc()) + + lst1 = pps.get(node) + print(' selected by node: "%s" ' % node) + print(lst1) + + +if "__main__" == __name__: + test() + test2() diff --git a/GaudiPartProp/python/GaudiPartProp/Service.py b/GaudiPartProp/python/GaudiPartProp/Service.py new file mode 100644 index 0000000000000000000000000000000000000000..85b1c6317161848e4d0a807d640c430790eb9caf --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/Service.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +# ============================================================================= +## @file GaudiPartProp/Service.py +# Useful decorator for Gaudi::(I)ParticlePropertySvc +# @see Gaudi::Interfaces::IParticlePropertySvc +# @see Gaudi::ParticlePropertySvc +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-01 +# ============================================================================= +""" +Useful decorator for Gaudi::(I)ParticlePropertySvc +""" +# ============================================================================= +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +__version__ = "" +# ============================================================================= +__all__ = ("iParticlePropertySvc",) +# The following is misunderstood by flake8 - the import is needed as it +# has necessary side effects +import GaudiPartProp.decorators # noqa: F401 + +# ============================================================================= +import GaudiPython.Bindings + +cpp = GaudiPython.Bindings.gbl +iService = GaudiPython.Bindings.iService +Helper = GaudiPython.Bindings.Helper +InterfaceCast = GaudiPython.Bindings.InterfaceCast +AppMgr = GaudiPython.Bindings.AppMgr +Gaudi = GaudiPython.gbl.Gaudi + + +# ============================================================================= +## +class iParticlePropertySvc(iService): + """ + Class iParticlePropertySvc: 'python'-twin for C++ class + + Gaudi::Interfaces::IParticlePropertySvc + + """ + + def __init__(self, name, isvc): + """ + Constructor from the name and the service + """ + iService.__init__(self, name, isvc) + self.__dict__["_ipps"] = InterfaceCast(Gaudi.Interfaces.IParticlePropertySvc)( + isvc + ) + + def retrieveInterface(self): + iService.retrieveInterface(self) + iParticlePropertySvc.__init__(self, self._name, self._isvc) + + ## Find the Particle Property by particle name or particle ID + def find(self, what): + """ + Find the Particle Property by particle name or particle ID + + >>> svc = ... # get the service + >>> pp1 = svc.find ( 'pi0' ) # find by name + >>> pp2 = svc.find ( Gaudi.ParticleID( 511 ) ) # find by Particle ID + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.find(what) # return + + ## get the Particle Properties by particle name or particle ID + def get(self, cut, asList=False): + """ + Simple 'get' method for Gaudi::Interfaces::IParticlePropertySvc + service to extract the properties which satisfy some criteria + + >>> svc = ... # get service (Gaudi::Interfaces::IParticlePropertySvc) or vector + >>> leptons = svc.get ( lambda s : s.pid().isLepton() ) # get all leptons + >>> longlived = svc.get ( lambda s : s.ctau() > 0.001 ) # get longlived + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.get(cut, asList) # return + + ## begin-iterator + def begin(self): + """ + Get the begin-iterator for the sequence of particle proeprties + + >>> svc = ... # get the service + >>> begin = svc.begin() + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.begin() # return + + ## end-iterator + def end(self): + """ + Get the end-iterator for the sequence of particle proeprties + + >>> svc = ... # get the service + >>> end = svc.end() + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.end() # return + + ## get all + def all(self, asList=False): + """ + Get all particle properties form the service + + >>> svc = ... # get the service + >>> all = svc.all () # get all properties + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.all(asList) # return + + ## dump the particle property table + def dump(self): + """ + Dump the particle property table + """ + self.Dump = True + + ## CC-conjugation + def cc(self, decay): + """ + Get CC-conjugationfor decay -descriptor + + >>> svc = ... # get the service + >>> cc = svc.cc ( 'B0 -> K- pi+' ) # get CC-conjugation + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.cc(decay) # return + + ## get the C++ service itself + def svc(self): + """ + Get C++ service + + >>> svc = ... # + >>> svccpp = svc.svc () + + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps # return + + ## get the C++ service itself + def service(self): + """ + Get C++ service + + >>> svc = ... # + >>> svccpp = svc.service () + + """ + return self.svc() + + ## validate the node/decay/tree + def validate(self, obj): + """ + Validate the node/decay/tree + + >>> svc = ... # get the service + >>> node = ... # get the node + >>> sc = svc.validate ( node ) + """ + return obj.validate(self.svc()) + + ## make iteration over all known particle properties + def __iter__(self): + """ + Make an iteration over all known particle properties: + + >>> svc = ... # get the service + >>> for pp i svc : # make an iteration + ... print pp + + """ + if not self._ipps: + self.retrieveInterface() + _list = self._ipps.all(False) + _size = len(_list) + _i = 0 + while _i < _size: + yield _list[_i] + _i += 1 + + ## get the size (number of known particle proeprties) + def size(self): + """ + Get the length(size) of known particle properties + """ + if not self._ipps: + self.retrieveInterface() + return self._ipps.size() + + ## get the size (number of known particle proeprties) + def __len__(self): + """ + Get the length(size) of known particle properties + """ + return self.size() + + +# useful types +iParticlePropertySvc.ParticleIDs = Gaudi.Interfaces.IParticlePropertySvc.ParticleIDs +iParticlePropertySvc.Decay = Gaudi.Interfaces.IParticlePropertySvc.Decay +iParticlePropertySvc.Decays = Gaudi.Interfaces.IParticlePropertySvc.Decays +iParticlePropertySvc.Item = Gaudi.Interfaces.IParticlePropertySvc.Item +iParticlePropertySvc.Items = Gaudi.Interfaces.IParticlePropertySvc.Items + + +# ============================================================================= +## accessor to the service +def _ppSvc_(self, name="Gaudi::ParticlePropertySvc"): + """ + Get particle property service form application manager + + >>> gaudi = ... + >>> pps = gaudi.gaudiPartProp() + + """ + svc = Helper.service(self._svcloc, name) + return iParticlePropertySvc(name, svc) + + +AppMgr.gaudiPartProp = _ppSvc_ +AppMgr.gaudiPartProp = _ppSvc_ diff --git a/GaudiPartProp/python/GaudiPartProp/__init__.py b/GaudiPartProp/python/GaudiPartProp/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fb66ba9cfe000aa0ad91d41d85680150d74fe648 --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/__init__.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file GaudiPartProp/__init__.py +# Helper file/module for GaudiPartProp package +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# date 2008-12-01 +# ============================================================================= +""" +Helper file/module for GaudiPartProp package +""" +# ============================================================================= +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +__version__ = "" +# ============================================================================= +# The following is misunderstood by flake8 - the import is needed as it +# defines this for module scripts +from ._default_table import DEFAULT_PARTICLE_PROPERTY_FILE # noqa: F401 diff --git a/GaudiPartProp/python/GaudiPartProp/_default_table.py b/GaudiPartProp/python/GaudiPartProp/_default_table.py new file mode 100644 index 0000000000000000000000000000000000000000..caaf1781358bb921bcaea846fe895ae5ec2da8ca --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/_default_table.py @@ -0,0 +1,13 @@ +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +from pathlib import Path + +DEFAULT_PARTICLE_PROPERTY_FILE = Path(__file__).parent / "default.ParticleTable.txt" diff --git a/GaudiPartProp/python/GaudiPartProp/decorators.py b/GaudiPartProp/python/GaudiPartProp/decorators.py new file mode 100644 index 0000000000000000000000000000000000000000..58502c999dc1f782fc97230cb6e4a5198b8c543d --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/decorators.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +# ============================================================================= +## @file GaudiPartProp/decorators.py +# The set of basic decorator for objects from GaudiPartProp package +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-01 +# ============================================================================= +""" +The set of basic decorators for objects from GaudiPartProp package +""" +# ============================================================================= +__author__ = "Vanya BELYAEV <Ivan.Belyaev@nikhef.nl>" +__version__ = "" +# ============================================================================= + +import GaudiPython + +# namespaces shortcuts +cpp = GaudiPython.gbl +std = GaudiPython.gbl.std +Decays = GaudiPython.gbl.Gaudi.Decays +Gaudi = GaudiPython.gbl.Gaudi + + +## get all particle properties form the service +def _get_all_(self, asList=False): + """ + Get all particle properties from the service + + >>> svc = ... # get the service + >>> all = svc.all () # get all properties + + """ + _all = Gaudi.ParticleProperties.allProperties(self) + if not asList: + return _all + return _all.toList() + + +## decorate service +Gaudi.Interfaces.IParticlePropertySvc.all = _get_all_ + + +## simple "get" method for the service +def _get_pp_(self, cut, asList=False): + """ + Simple 'get' method for Gaudi::Interfaces::IParticlePropertySvc + service to extract the properties which satisfy some criteria + + >>> svc = ... # get service (Gaudi::Interfaces::IParticlePropertySvc) or vector + >>> leptons = svc.get ( lambda s : s.pid().isLepton() ) # get all leptons + >>> longlived = svc.get ( lambda s : s.ctau() > 0.001 ) # get longlived + + """ + _all = self.all() + return _all.get(cut, asList) + + +## simple "get" method for the service +def _get_ppv_(self, cut, asList=False): + """ + Simple 'get' method for Gaudi::Interfaces::IParticlePropertySvc + service to extract the properties which satisfy some criteria + + >>> svc = ... # get service (Gaudi::Interfaces::IParticlePropertySvc) or vector + >>> leptons = svc.get ( lambda s : s.pid().isLepton() ) # get all leptons + >>> longlived = svc.get ( lambda s : s.ctau() > 0.001 ) # get longlived + + """ + result = [] + for pp in self: + if cut(pp): + result.append(pp) + if asList: + return result + vct = Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties() + vct.fromList(result) + return vct + + +# ## decorate service +Gaudi.Interfaces.IParticlePropertySvc.get = _get_pp_ +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.get = _get_ppv_ +Gaudi.Interfaces.IParticlePropertySvc.__len__ = ( + Gaudi.Interfaces.IParticlePropertySvc.size +) + + +# ============================================================================= +## Convert Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties into python list +def _ppv_2_list_(self): + """ + Convert Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties into python list + + >>> ppv = ... # get the vector + >>> lst = ppv.toList () # convert it to the list + + """ + result = [] + size = self.size() + index = 0 + while index < size: + pp = self.at(index) + result.append(pp) + index += 1 + return result + + +# ============================================================================== +## convert python list into Gaudi.IParticlePropertisvc.ParticleProperties +def _ppv_from_lst_(self, lst): + """ + Append the iterable sequence 'lst' to the vector of + particle properties: + + >>> Vct = std.vector('const Gaudi::ParticleProperty*') + >>> lst = [ pp1 , pp2 , pp3 ] + >>> vct = Vct() + >>> vct.fromList ( lst ) + + """ + for item in lst: + self.push_back(item) + + +# ============================================================================= +## Print vector of particle properties in a form of table +def _prnt_as_table_(self, *args): + """ + Print vector of particle properties in a form of table + + >>> print vct.asTable() + + """ + return Gaudi.ParticleProperties.printAsTable(self, *args) + + +# ============================================================================ +# delegate the evaluation of unknown atrributes to Gaudi.ParticleID class +def _get_attr_from_PID_(self, attr): + """ + Delegate the evaluation of unknown atrributes to Gaudi.ParticleID class + + >>> pp = ... + >>> print pp.jSpin() + + """ + _pid = self.pid() + if hasattr(_pid, attr): + return getattr(_pid, attr) + raise AttributeError("Unknown attribute: %s " % attr) + + +## decorate the vector of properties +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.toList = _ppv_2_list_ +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.toLst = _ppv_2_list_ +## decorate the vector of properties +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.fromList = _ppv_from_lst_ +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.fromLst = _ppv_from_lst_ +## decorate the vector of properties +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.__repr__ = ( + lambda s: s.toList().__repr__() +) +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.__str__ = _prnt_as_table_ +Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.__len__ = ( + Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties.size +) + +## decorate the printout for Gaudi::ParticleProperty +Gaudi.ParticleProperty.__str__ = Gaudi.ParticleProperty.toString +Gaudi.ParticleProperty.__repr__ = Gaudi.ParticleProperty.toString + +## decorate the attribute access for Gaudi.ParticleProperty +Gaudi.ParticleProperty.__getattr__ = _get_attr_from_PID_ + +## decorate the printout for Gaudi::ParticleID +Gaudi.ParticleID.__str__ = Gaudi.ParticleID.toString +Gaudi.ParticleID.__repr__ = Gaudi.ParticleID.toString + + +def _pp_cmp_(pp1, pp2): + """Comparison for ParticleProperty objects.""" + if pp1 == pp2: + return 0 + comparator = Gaudi.ParticleProperty.Compare() + return -1 if comparator(pp1, pp2) else 1 + + +def _pp_lt_(pp1, pp2): + """Comparison `<` for ParticleProperty objects.""" + return _pp_cmp_(pp1, pp2) < 0 + + +Gaudi.ParticleProperty.__cmp__ = _pp_cmp_ +Gaudi.ParticleProperty.__lt__ = _pp_lt_ + + +## abs for ParticleID +def _abs_1_(self): + """ + Absolute value for the PID + + >>> p = ... + >>> pa = abs ( p ) + + """ + if 0 <= self.pid(): + return self + return Gaudi.ParticleID(self.abspid()) + + +## abs for ParticleProperty +def _abs_2_(self): + """ + Absolute value for the ParticleProperty + + >>> p = ... + >>> pa = abs ( p ) + + """ + ## + _pid = self.particleID() + if self.selfcc() or 0 <= _pid.pid(): + return self + ## + _anti = self.anti() + if _anti and 0 <= _anti.particleID().pid(): + return _anti + ## + return self + + +Gaudi.ParticleID.__abs__ = _abs_1_ +Gaudi.ParticleProperty.__abs__ = _abs_2_ + +## define the type for std::vector<Gaudi::ParticleID> +Gaudi.ParticleIDs = std.vector(Gaudi.ParticleID) + + +## get particleID objects whcih satisfy some criteria +def _get_pid_(self, cut): + """ + Get particleID objects which satisfy some criteria + + >>> pids = ... # vector of LCHb::ParticleID objects + >>> good = pids.get( lambda s : s.isLepton() ) # get leptons + >>> scalar = pids.get( lambda s : 1 == s.jSpin() ) # get scalars + + """ + size = self.size() + index = 0 + result = [] + while index < size: + pid = self.at(index) + if cut(pid): + result.append(pid) + index += 1 + return result + + +## decorate the vector of properties +Gaudi.ParticleIDs.toList = _ppv_2_list_ +Gaudi.ParticleIDs.toLst = _ppv_2_list_ +## decorate the vector of properties +Gaudi.ParticleIDs.fromList = _ppv_from_lst_ +Gaudi.ParticleIDs.fromLst = _ppv_from_lst_ +## decorate the vector of properties +Gaudi.ParticleIDs.__repr__ = lambda s: s.toList().__repr__() +Gaudi.ParticleIDs.__str__ = lambda s: s.toList().__str__() +## decorate the vector of properties +Gaudi.ParticleIDs.get = _get_pid_ + +Decays.Decay.Item.__str__ = lambda s: s.name() +Decays.Decay.Item.__repr__ = lambda s: s.name() + +Decays.Decay.__str__ = lambda s: s.toString() +Decays.Decay.__repr__ = lambda s: s.toString() + +_items = std.vector(Decays.Decay.Item) +_items.toList = lambda s: [i for i in s] +_items.toLst = lambda s: [i for i in s] +_items.__str__ = lambda s: s.toList().__str__() +_items.__repr__ = lambda s: s.toList().__repr__() +_decays = std.vector(Decays.Decay) +_decays.toList = lambda s: [i for i in s] +_decays.toLst = lambda s: [i for i in s] +_decays.__str__ = lambda s: s.toList().__str__() +_decays.__repr__ = lambda s: s.toList().__repr__() + +Gaudi.Interfaces.IParticlePropertySvc.ParticleIDs = Gaudi.ParticleIDs +Gaudi.Interfaces.IParticlePropertySvc.Decays = _decays +Gaudi.Interfaces.IParticlePropertySvc.Items = _items +Gaudi.Interfaces.IParticlePropertySvc.Decay = Decays.Decay +Gaudi.Interfaces.IParticlePropertySvc.Item = Decays.Decay.Item + + +def _validate_(self, svc): + """ + Validate the vector of items/decays + + >>> vct = ... # get the vector of items/decays + >>> svc = ... # get the service + >>> vcs.vaildate ( svc ) # validate + """ + for o in self: + sc = o.validate(svc) + if sc.isFailure(): + return sc + return cpp.StatusCode(cpp.StatusCode.SUCCESS) + + +_decays.validate = _validate_ +_items.validate = _validate_ + +_old_symbols_ = Decays.Symbols.symbols +_old_particles_ = Decays.Symbols.particles + + +def _symbols_(self): + """ + Get all known predefined symbols: + + >>> syms = ... # get the table of symbols + >>> s = syms.symbols() # get the list of symbols + + """ + strings = std.vector("std::string")() + _old_symbols_(self, strings) + res = [] + for s in strings: + res.append(s) + return res + + +def _sym_iter_(self): + """ + Iteration over all known symbols + + >>> syms = ... # get the table of symbols + >>> for s in syms : + ... print ' help for %s :' % s , syms.symbol ( s ) + """ + _list = self.symbols() + _i = 0 + while _i < len(_list): + yield _list[_i] + _i += 1 + + +Decays.Symbols.symbols = _symbols_ +Decays.Symbols.__iter__ = _sym_iter_ + +## instance: +Symbols = Decays.Symbols.instance() ## instance diff --git a/GaudiPartProp/python/GaudiPartProp/default.ParticleTable.txt b/GaudiPartProp/python/GaudiPartProp/default.ParticleTable.txt new file mode 100644 index 0000000000000000000000000000000000000000..9139665d48612115e8a2c7e91ea7acc49a3f6fdc --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/default.ParticleTable.txt @@ -0,0 +1,987 @@ +# +# ParticleTable.txt file containing particle +# properties for ParticlePropertySvc, EvtGen and Pythia. +# Uses PDG 2014 when available. +# +PARTICLE +# +# GEANTID PDGID CHARGE MASS(GeV) TLIFE(s) EVTGENNAME PYTHIAID MAXWIDTH +# + gamma 1 22 0.0 0.00000000 1.000000e+16 gamma 22 0.00000000 + W+ 53 24 1.0 80.37900000 3.156893e-25 W+ 24 0.00000000 + W- 54 -24 -1.0 80.37900000 3.156893e-25 W- -24 0.00000000 + Z0 55 23 0.0 91.18760000 2.637914e-25 Z0 23 0.00000000 + e+ 2 -11 1.0 0.00051100 1.000000e+16 e+ -11 0.00000000 + e- 3 11 -1.0 0.00051100 1.000000e+16 e- 11 0.00000000 + nu_e 4 12 0.0 0.00000000 1.000000e+16 nu_e 12 0.00000000 + nu_e~ 302 -12 0.0 0.00000000 1.000000e+16 anti-nu_e -12 0.00000000 + mu+ 5 -13 1.0 0.10565837 2.196981e-06 mu+ -13 0.00000000 + mu- 6 13 -1.0 0.10565837 2.196981e-06 mu- 13 0.00000000 + nu_mu 300 14 0.0 0.00000000 1.000000e+16 nu_mu 14 0.00000000 + nu_mu~ 301 -14 0.0 0.00000000 1.000000e+16 anti-nu_mu -14 0.00000000 + tau+ 51 -15 1.0 1.77686000 2.903449e-13 tau+ -15 0.00000000 + tau- 52 15 -1.0 1.77686000 2.903449e-13 tau- 15 0.00000000 + pi0 7 111 0.0 0.13497700 8.520000e-17 pi0 111 0.00000000 + pi+ 8 211 1.0 0.13957061 2.603300e-08 pi+ 211 0.00000000 + pi- 9 -211 -1.0 0.13957061 2.603300e-08 pi- -211 0.00000000 + eta 17 221 0.0 0.54786200 5.063171e-19 eta 221 0.00000000 + rho(770)0 33 113 0.0 0.77526000 4.414569e-24 rho0 113 0.00000000 + rho(770)+ 34 213 1.0 0.77526000 4.414569e-24 rho+ 213 0.00000000 + rho(770)- 35 -213 -1.0 0.77526000 4.414569e-24 rho- -213 0.00000000 + omega(782) 36 223 0.0 0.78265000 7.752794e-23 omega 223 0.00000000 + eta_prime 127 331 0.0 0.95778000 3.358224e-21 eta' 331 0.00000000 + sigma_0 850 9000221 0.0 0.47500000 1.196749e-24 sigma_0 0 0.00000000 + f_0(980) 596 9010221 0.0 0.99000000 1.097020e-23 f_0 10221 0.00000000 + a_0(980)0 132 9000111 0.0 0.98000000 8.776163e-24 a_00 10111 0.00000000 + a_0(980)+ 133 9000211 1.0 0.98000000 8.776163e-24 a_0+ 10211 0.00000000 + a_0(980)- 134 -9000211 -1.0 0.98000000 8.776163e-24 a_0- -10211 0.00000000 + phi(1020) 37 333 0.0 1.01946100 1.549099e-22 phi 333 0.00000000 + h_1(1170) 597 10223 0.0 1.17000000 1.828367e-24 h_1 10223 0.00000000 + b_1(1235)0 588 10113 0.0 1.22950000 4.635297e-24 b_10 10113 0.00000000 + b_1(1235)+ 592 10213 1.0 1.22950000 4.635297e-24 b_1+ 10213 0.00000000 + b_1(1235)- 593 -10213 -1.0 1.22950000 4.635297e-24 b_1- -10213 0.00000000 + a_1(1260)0 135 20113 0.0 1.23000000 1.567172e-24 a_10 20113 0.00000000 + a_1(1260)+ 42 20213 1.0 1.23000000 1.567172e-24 a_1+ 20213 0.00000000 + a_1(1260)- 43 -20213 -1.0 1.23000000 1.567172e-24 a_1- -20213 0.00000000 + f_2(1270) 367 225 0.0 1.27550000 3.555982e-24 f_2 225 0.00000000 + f_1(1285) 687 20223 0.0 1.28190000 2.899612e-23 f_1 20223 0.00000000 + eta(1295) 811 100221 0.0 1.29400000 1.196749e-23 eta(2S) 0 0.00000000 + pi(1300)0 805 100111 0.0 1.30000000 1.645530e-24 pi(2S)0 0 0.00000000 + pi(1300)+ 807 100211 1.0 1.30000000 1.645530e-24 pi(2S)+ 0 0.00000000 + pi(1300)- 808 -100211 -1.0 1.30000000 1.645530e-24 pi(2S)- 0 0.00000000 + a_2(1320)0 136 115 0.0 1.31690000 6.151516e-24 a_20 115 0.00000000 + a_2(1320)+ 137 215 1.0 1.31690000 6.151516e-24 a_2+ 215 0.00000000 + a_2(1320)- 138 -215 -1.0 1.31690000 6.151516e-24 a_2- -215 0.00000000 + f_0(1370) 686 10221 0.0 1.35000000 1.880606e-24 f'_0 10331 0.00000000 + h_1(1380) 604 10333 0.0 1.41600000 7.313467e-24 h'_1 10333 0.00000000 + pi_1(1400)0 1021 9000113 0.0 1.35400000 1.994582e-24 pi_1(1400)0 0 0.00000000 + pi_1(1400)+ 1023 9000213 1.0 1.35400000 1.994582e-24 pi_1(1400)+ 0 0.00000000 + pi_1(1400)- 1024 -9000213 -1.0 1.35400000 1.994582e-24 pi_1(1400)- 0 0.00000000 + eta(1405)0 1025 9020221 0.0 1.40880000 1.313796e-23 eta(1405)0 0 0.00000000 + omega(1420) 812 100223 0.0 1.42500000 3.061452e-24 omega(2S) 0 0.00000000 + f_1(1420) 692 20333 0.0 1.42640000 1.198929e-23 f'_1 20333 0.00000000 + rho(1450)0 806 100113 0.0 1.46500000 1.645530e-24 rho(2S)0 0 0.00000000 + rho(1450)+ 809 100213 1.0 1.46500000 1.645530e-24 rho(2S)+ 0 0.00000000 + rho(1450)- 810 -100213 -1.0 1.46500000 1.645530e-24 rho(2S)- 0 0.00000000 + a_0(1450)0 587 10111 0.0 1.46700000 2.483820e-24 a_0(1450)0 0 0.00000000 + a_0(1450)+ 590 10211 1.0 1.46700000 2.483820e-24 a_0(1450)+ 0 0.00000000 + a_0(1450)- 591 -10211 -1.0 1.46700000 2.483820e-24 a_0(1450)- 0 0.00000000 + eta(1475) 826 100331 0.0 1.47500000 7.743673e-24 eta(1475) 0 0.00000000 + f_0(1500) 855 9030221 0.0 1.50600000 6.038644e-24 f_0(1500) 0 0.00000000 + f'_2(1525) 380 335 0.0 1.52500000 9.016605e-24 f'_2 335 0.00000000 + pi_1(1600)0 1027 9010113 0.0 1.66000000 2.742551e-24 pi_1(1600)0 0 0.00000000 + pi_1(1600)+ 1029 9010213 1.0 1.66000000 2.742551e-24 pi_1(1600)+ 0 0.00000000 + pi_1(1600)- 1030 -9010213 -1.0 1.66000000 2.742551e-24 pi_1(1600)- 0 0.00000000 + eta_2(1645) 598 10225 0.0 1.61700000 3.636531e-24 eta_2(1645) 0 0.00000000 + omega(1650) 746 30223 0.0 1.67000000 2.089563e-24 omega(1650) 0 0.00000000 + pi_2(1670)0 589 10115 0.0 1.67060000 2.551209e-24 pi_2(1670)0 0 0.00000000 + pi_2(1670)+ 594 10215 1.0 1.67060000 2.551209e-24 pi_2(1670)+ 0 0.00000000 + pi_2(1670)- 595 -10215 -1.0 1.67060000 2.551209e-24 pi_2(1670)- 0 0.00000000 + omega_3(1670) 368 227 0.0 1.66700000 3.917930e-24 omega_3(1670) 0 0.00000000 + phi(1680) 827 100333 0.0 1.68000000 4.388081e-24 phi(1680) 0 0.00000000 + rho_3(1690)0 361 117 0.0 1.68880000 4.088274e-24 rho_3(1690)0 0 0.00000000 + rho_3(1690)+ 363 217 1.0 1.68880000 4.088274e-24 rho_3(1690)+ 0 0.00000000 + rho_3(1690)- 364 -217 -1.0 1.68880000 4.088274e-24 rho_3(1690)- 0 0.00000000 + rho(1700)0 743 30113 0.0 1.72000000 2.632849e-24 rho(3S)0 0 0.00000000 + rho(1700)+ 744 30213 1.0 1.72000000 2.632849e-24 rho(3S)+ 0 0.00000000 + rho(1700)- 745 -30213 -1.0 1.72000000 2.632849e-24 rho(3S)- 0 0.00000000 + f_0(1710) 603 10331 0.0 1.70400000 5.351317e-24 f_0(1710) 0 0.00000000 + pi(1800)0 840 9010111 0.0 1.81000000 3.164482e-24 pi(1800)0 0 0.00000000 + pi(1800)+ 841 9010211 1.0 1.81000000 3.164482e-24 pi(1800)+ 0 0.00000000 + pi(1800)- 842 -9010211 -1.0 1.81000000 3.164482e-24 pi(1800)- 0 0.00000000 + phi_3(1850) 381 337 0.0 1.85400000 7.565657e-24 phi_3(1850) 0 0.00000000 + eta_2(1870) 605 10335 0.0 1.85400000 0.000000e+00 eta_2(1870) 0 0.00000000 + f_2(1950) 813 9050225 0.0 1.93600000 1.418560e-24 f_2(1950) 0 0.00000000 + f_2(2010) 828 9060225 0.0 2.01000000 3.291061e-24 f_2(2010) 0 0.00000000 + a_4(2040)0 362 119 0.0 1.96700000 2.581224e-24 a_4(2040)0 0 0.00000000 + a_4(2040)+ 365 219 1.0 1.96700000 2.581224e-24 a_4(2040)+ 0 0.00000000 + a_4(2040)- 366 -219 -1.0 1.96700000 2.581224e-24 a_4(2040)- 0 0.00000000 + f_4(2050) 369 229 0.0 2.01800000 2.777267e-24 f_4(2050) 0 0.00000000 + f_2(2300) 857 9080225 0.0 2.29700000 4.417530e-24 f_2(2300) 0 0.00000000 + f_2(2340) 858 9090225 0.0 2.35000000 2.063361e-24 f_2(2340) 0 0.00000000 + K0 370 311 0.0 0.49761100 0.000000e+00 K0 311 0.00000000 + K~0 371 -311 0.0 0.49761100 0.000000e+00 anti-K0 -311 0.00000000 + KS0 16 310 0.0 0.49761100 8.956400e-11 K_S0 310 0.00000000 + KL0 10 130 0.0 0.49761100 5.116000e-08 K_L0 130 0.00000000 + K+ 11 321 1.0 0.49367700 1.238000e-08 K+ 321 0.00000000 + K- 12 -321 -1.0 0.49367700 1.238000e-08 K- -321 0.00000000 + K*(892)0 40 313 0.0 0.89555000 1.391569e-23 K*0 313 0.00000000 + K*(892)~0 41 -313 0.0 0.89555000 1.391569e-23 anti-K*0 -313 0.00000000 + K*(892)+ 38 323 1.0 0.89166000 1.308573e-23 K*+ 323 0.00000000 + K*(892)- 39 -323 -1.0 0.89166000 1.308573e-23 K*- -323 0.00000000 + K_1(1270)0 141 10313 0.0 1.27200000 7.313469e-24 K_10 10313 0.00000000 + K_1(1270)~0 142 -10313 0.0 1.27200000 7.313469e-24 anti-K_10 -10313 0.00000000 + K_1(1270)+ 139 10323 1.0 1.27200000 7.313469e-24 K_1+ 10323 0.00000000 + K_1(1270)- 140 -10323 -1.0 1.27200000 7.313469e-24 K_1- -10323 0.00000000 + K_1(1400)0 145 20313 0.0 1.40300000 3.782829e-24 K'_10 20313 0.00000000 + K_1(1400)~0 146 -20313 0.0 1.40300000 3.782829e-24 anti-K'_10 -20313 0.00000000 + K_1(1400)+ 143 20323 1.0 1.40300000 3.782829e-24 K'_1+ 20323 0.00000000 + K_1(1400)- 144 -20323 -1.0 1.40300000 3.782829e-24 K'_1- -20323 0.00000000 + K*(1410)0 816 100313 0.0 1.42100000 2.837122e-24 K'*0 0 0.00000000 + K*(1410)~0 817 -100313 0.0 1.42100000 2.837122e-24 anti-K'*0 0 0.00000000 + K*(1410)+ 822 100323 1.0 1.42100000 2.837122e-24 K'*+ 0 0.00000000 + K*(1410)- 823 -100323 -1.0 1.42100000 2.837122e-24 K'*- 0 0.00000000 + K*_0(1430)0 149 10311 0.0 1.43000000 2.437823e-24 K_0*0 10311 0.00000000 + K*_0(1430)~0 150 -10311 0.0 1.43000000 2.437823e-24 anti-K_0*0 -10311 0.00000000 + K*_0(1430)+ 147 10321 1.0 1.43000000 2.437823e-24 K_0*+ 10321 0.00000000 + K*_0(1430)- 148 -10321 -1.0 1.43000000 2.437823e-24 K_0*- -10321 0.00000000 + K*_2(1430)0 153 315 0.0 1.43240000 6.038644e-24 K_2*0 315 0.00000000 + K*_2(1430)~0 154 -315 0.0 1.43240000 6.038644e-24 anti-K_2*0 -315 0.00000000 + K*_2(1430)+ 151 325 1.0 1.42560000 6.682357e-24 K_2*+ 325 0.00000000 + K*_2(1430)- 152 -325 -1.0 1.42560000 6.682357e-24 K_2*- -325 0.00000000 + K(1460)0 814 100311 0.0 1.43240000 0.000000e+00 K(1460)0 0 0.00000000 + K(1460)~0 815 -100311 0.0 1.43240000 0.000000e+00 anti-K(1460)0 0 0.00000000 + K(1460)+ 820 100321 1.0 1.43240000 0.000000e+00 K(1460)+ 0 0.00000000 + K(1460)- 821 -100321 -1.0 1.43240000 0.000000e+00 K(1460)- 0 0.00000000 + K*(1680)0 747 30313 0.0 1.71800000 2.056913e-24 K''*0 0 0.00000000 + K*(1680)~0 748 -30313 0.0 1.71800000 2.056913e-24 anti-K''*0 0 0.00000000 + K*(1680)+ 749 30323 1.0 1.71800000 2.056913e-24 K''*+ 0 0.00000000 + K*(1680)- 750 -30323 -1.0 1.71800000 2.056913e-24 K''*- 0 0.00000000 + K_2(1770)0 599 10315 0.0 1.77300000 3.538775e-24 K_2(1770)0 0 0.00000000 + K_2(1770)~0 600 -10315 0.0 1.77300000 3.538775e-24 anti-K_2(1770)0 0 0.00000000 + K_2(1770)+ 601 10325 1.0 1.77300000 3.538775e-24 K_2(1770)+ 0 0.00000000 + K_2(1770)- 602 -10325 -1.0 1.77300000 3.538775e-24 K_2(1770)- 0 0.00000000 + K*_3(1780)0 372 317 0.0 1.77600000 4.139699e-24 K_3*0 0 0.00000000 + K*_3(1780)~0 373 -317 0.0 1.77600000 4.139699e-24 anti-K_3*0 0 0.00000000 + K*_3(1780)+ 376 327 1.0 1.77600000 4.139699e-24 K_3*+ 0 0.00000000 + K*_3(1780)- 377 -327 -1.0 1.77600000 4.139699e-24 K_3*- 0 0.00000000 + K_2(1820)0 688 20315 0.0 1.81900000 2.493227e-24 K_2(1820)0 0 0.00000000 + K_2(1820)~0 689 -20315 0.0 1.81900000 2.493227e-24 anti-K_2(1820)0 0 0.00000000 + K_2(1820)+ 690 20325 1.0 1.81900000 2.493227e-24 K_2(1820)+ 0 0.00000000 + K_2(1820)- 691 -20325 -1.0 1.81900000 2.493227e-24 K_2(1820)- 0 0.00000000 + K*_2(1980)0 818 100315 0.0 1.97300000 0.000000e+00 K*_2(1980)0 0 0.00000000 + K*_2(1980)~0 819 -100315 0.0 1.97300000 0.000000e+00 anti-K*_2(1980)0 0 0.00000000 + K*_2(1980)+ 824 100325 1.0 1.97300000 0.000000e+00 K*_2(1980)+ 0 0.00000000 + K*_2(1980)- 825 -100325 -1.0 1.97300000 0.000000e+00 K*_2(1980)- 0 0.00000000 + K*_4(2045)0 374 319 0.0 2.04500000 3.324304e-24 K_4*0 0 0.00000000 + K*_4(2045)~0 375 -319 0.0 2.04500000 3.324304e-24 anti-K_4*0 0 0.00000000 + K*_4(2045)+ 378 329 1.0 2.04500000 3.324304e-24 K_4*+ 0 0.00000000 + K*_4(2045)- 379 -329 -1.0 2.04500000 3.324304e-24 K_4*- 0 0.00000000 + D0 58 421 0.0 1.86483000 4.101000e-13 D0 421 0.00000000 + D~0 59 -421 0.0 1.86483000 4.101000e-13 anti-D0 -421 0.00000000 + D+ 56 411 1.0 1.86965000 1.040000e-12 D+ 411 0.00000000 + D- 57 -411 -1.0 1.86965000 1.040000e-12 D- -411 0.00000000 + D*(2007)0 67 423 0.0 2.00685000 1.000003e-19 D*0 423 0.00000000 + D*(2007)~0 68 -423 0.0 2.00685000 1.000003e-19 anti-D*0 -423 0.00000000 + D*(2010)+ 65 413 1.0 2.01026000 7.892230e-21 D*+ 413 0.00000000 + D*(2010)- 66 -413 -1.0 2.01026000 7.892230e-21 D*- -413 0.00000000 + D*_0+ 155 10411 1.0 2.34900000 2.978335e-24 D_0*+ 10411 0.00000000 + D*_0- 159 -10411 -1.0 2.34900000 2.978335e-24 D_0*- -10411 0.00000000 + D*_00 163 10421 0.0 2.30000000 2.402234e-24 D_0*0 10421 0.00000000 + D*_0~0 167 -10421 0.0 2.30000000 2.402234e-24 anti-D_0*0 -10421 0.00000000 + D_1(H)0 164 20423 0.0 2.44500000 2.630000e-24 D'_10 20423 0.00000000 + D_1(H)~0 168 -20423 0.0 2.44500000 2.630000e-24 anti-D'_10 -20423 0.00000000 + D_1(H)+ 156 20413 1.0 2.44500000 2.630000e-24 D'_1+ 20413 0.00000000 + D_1(H)- 160 -20413 -1.0 2.44500000 2.630000e-24 D'_1- -20413 0.00000000 + D_1(2420)0 165 10423 0.0 2.42080000 2.428827e-23 D_10 10423 0.00000000 + D_1(2420)~0 169 -10423 0.0 2.42080000 2.428827e-23 anti-D_10 -10423 0.00000000 + D_1(2420)+ 157 10413 1.0 2.42300000 3.290000e-23 D_1+ 10413 0.00000000 + D_1(2420)- 161 -10413 -1.0 2.42300000 3.290000e-23 D_1- -10413 0.00000000 + D*_2(2460)0 170 425 0.0 2.46070000 1.385709e-23 D_2*0 425 0.00000000 + D*_2(2460)~0 166 -425 0.0 2.46070000 1.385709e-23 anti-D_2*0 -425 0.00000000 + D*_2(2460)+ 162 415 1.0 2.46540000 1.778952e-23 D_2*+ 415 0.00000000 + D*_2(2460)- 158 -415 -1.0 2.46540000 1.778952e-23 D_2*- -415 0.00000000 + D(2S)0 761 100421 0.0 2.58000000 0.000000e+00 D(2S)0 0 0.00000000 + D(2S)~0 762 -100421 0.0 2.58000000 0.000000e+00 anti-D(2S)0 0 0.00000000 + D(2S)+ 757 100411 1.0 2.58000000 0.000000e+00 D(2S)+ 0 0.00000000 + D(2S)- 758 -100411 -1.0 2.58000000 0.000000e+00 D(2S)- 0 0.00000000 + D*(2640)0 763 100423 0.0 2.64000000 0.000000e+00 D*(2S)0 0 0.00000000 + D*(2640)~0 764 -100423 0.0 2.64000000 0.000000e+00 anti-D*(2S)0 0 0.00000000 + D*(2640)+ 759 100413 1.0 2.64000000 0.000000e+00 D*(2S)+ 0 0.00000000 + D*(2640)- 760 -100413 -1.0 2.64000000 0.000000e+00 D*(2S)- 0 0.00000000 + D_s+ 60 431 1.0 1.96834000 5.043770e-13 D_s+ 431 0.00000000 + D_s- 61 -431 -1.0 1.96834000 5.043770e-13 D_s- -431 0.00000000 + D*_s+ 69 433 1.0 2.11220000 1.000003e-19 D_s*+ 433 0.00000000 + D*_s- 70 -433 -1.0 2.11220000 1.000003e-19 D_s*- -433 0.00000000 + D*_s0+ 171 10431 1.0 2.31780000 6.582100e-22 D_s0*+ 10431 0.00000000 + D*_s0- 175 -10431 -1.0 2.31780000 6.582100e-22 D_s0*- -10431 0.00000000 + D_s1(2460)+ 172 20433 1.0 2.45950000 6.582100e-22 D_s1+ 20433 0.00000000 + D_s1(2460)- 176 -20433 -1.0 2.45950000 6.582100e-22 D_s1- -20433 0.00000000 + D_s1(2536)+ 173 10433 1.0 2.53511000 7.154480e-22 D'_s1+ 10433 0.00000000 + D_s1(2536)- 177 -10433 -1.0 2.53511000 7.154480e-22 D'_s1- -10433 0.00000000 + D*_s2+ 174 435 1.0 2.56910000 3.894746e-23 D_s2*+ 435 0.00000000 + D*_s2- 178 -435 -1.0 2.56910000 3.894746e-23 D_s2*- -435 0.00000000 + B0 73 511 0.0 5.27964000 1.520120e-12 B0 511 0.00000000 + B~0 74 -511 0.0 5.27964000 1.520120e-12 anti-B0 -511 0.00000000 + B0H 99998 510 0.0 5.27958000 1.519000e-12 B0H 0 0.00000000 + B0L 99999 150 0.0 5.27958000 1.519000e-12 B0L 0 0.00000000 + B+ 71 521 1.0 5.27933000 1.638158e-12 B+ 521 0.00000000 + B- 72 -521 -1.0 5.27933000 1.638158e-12 B- -521 0.00000000 + B*0 189 513 0.0 5.32470000 1.000019e-19 B*0 513 0.00000000 + B*~0 190 -513 0.0 5.32470000 1.000019e-19 anti-B*0 -513 0.00000000 + B*- 187 -523 -1.0 5.32470000 1.000019e-19 B*- -523 0.00000000 + B*+ 188 523 1.0 5.32470000 1.000019e-19 B*+ 523 0.00000000 + B*_00 201 10511 0.0 5.73800000 4.390000e-24 B_0*0 10511 0.00000000 + B*_0~0 205 -10511 0.0 5.73800000 4.390000e-24 anti-B_0*0 -10511 0.00000000 + B*_0+ 193 10521 1.0 5.73800000 4.390000e-24 B_0*+ 10521 0.00000000 + B*_0- 197 -10521 -1.0 5.73800000 4.390000e-24 B_0*- -10521 0.00000000 + B_1(H)0 202 20513 0.0 5.75700000 2.630000e-24 B'_10 20513 0.00000000 + B_1(H)~0 206 -20513 0.0 5.75700000 2.630000e-24 anti-B'_10 -20513 0.00000000 + B_1(H)+ 194 20523 1.0 5.75700000 2.630000e-24 B'_1+ 20523 0.00000000 + B_1(H)- 198 -20523 -1.0 5.75700000 2.630000e-24 B'_1- -20523 0.00000000 + B_1(L)0 203 10513 0.0 5.72610000 3.134000e-23 B_10 10513 0.00000000 + B_1(L)~0 207 -10513 0.0 5.72610000 3.134000e-23 anti-B_10 -10513 0.00000000 + B_1(L)+ 195 10523 1.0 5.72590000 3.134000e-23 B_1+ 10523 0.00000000 + B_1(L)- 199 -10523 -1.0 5.72590000 3.134000e-23 B_1- -10523 0.00000000 + B*_20 204 515 0.0 5.73950000 2.861792e-23 B_2*0 515 0.00000000 + B*_2~0 208 -515 0.0 5.73950000 2.861792e-23 anti-B_2*0 -515 0.00000000 + B*_2+ 196 525 1.0 5.73720000 3.291060e-23 B_2*+ 525 0.00000000 + B*_2- 200 -525 -1.0 5.73720000 3.291060e-23 B_2*- -525 0.00000000 + B_s0 75 531 0.0 5.36688000 1.512000e-12 B_s0 531 0.00000000 + B_s~0 76 -531 0.0 5.36688000 1.512000e-12 anti-B_s0 -531 0.00000000 + B_s0H 99996 530 0.0 5.36677000 1.661000e-12 B_s0H 0 0.00000000 + B_s0L 99997 350 0.0 5.36677000 1.405000e-12 B_s0L 0 0.00000000 + B*_s0 191 533 0.0 5.41540000 1.000000e-19 B_s*0 533 0.00000000 + B*_s~0 192 -533 0.0 5.41540000 1.000000e-19 anti-B_s*0 -533 0.00000000 + B*_s00 209 10531 0.0 5.84100000 4.390000e-24 B_s0*0 10531 0.00000000 + B*_s0~0 213 -10531 0.0 5.84100000 4.390000e-24 anti-B_s0*0 -10531 0.00000000 + B_s1(H)0 210 20533 0.0 5.85900000 2.630000e-24 B'_s10 20533 0.00000000 + B_s1(H)~0 214 -20533 0.0 5.85900000 2.630000e-24 anti-B'_s10 -20533 0.00000000 + B_s1(L)0 211 10533 0.0 5.82870000 1.316424e-21 B_s10 10533 0.00000000 + B_s1(L)~0 215 -10533 0.0 5.82870000 1.316424e-21 anti-B_s10 -10533 0.00000000 + B*_s20 212 535 0.0 5.83985000 4.477633e-22 B_s2*0 535 0.00000000 + B*_s2~0 216 -535 0.0 5.83985000 4.477633e-22 anti-B_s2*0 -535 0.00000000 + B_c+ 77 541 1.0 6.27447000 5.070971e-13 B_c+ 541 0.00000000 + B_c- 78 -541 -1.0 6.27447000 5.070971e-13 B_c- -541 0.00000000 + B_c*+ 382 543 1.0 6.33330000 0.000000e+00 B_c*+ 543 0.00000000 + B_c*- 383 -543 -1.0 6.33330000 0.000000e+00 B_c*- -543 0.00000000 + B_c0*+ 607 10541 1.0 6.70600000 0.000000e+00 B_c0*+ 10541 0.00000000 + B_c0*- 608 -10541 -1.0 6.70600000 0.000000e+00 B_c0*- -10541 0.00000000 + B_c1(L)+ 609 10543 1.0 6.74100000 0.000000e+00 B_c1+ 10543 0.00000000 + B_c1(L)- 610 -10543 -1.0 6.74100000 0.000000e+00 B_c1- -10543 0.00000000 + B_c1(H)+ 693 20543 1.0 6.75000000 0.000000e+00 B'_c1+ 20543 0.00000000 + B_c1(H)- 694 -20543 -1.0 6.75000000 0.000000e+00 B'_c1- -20543 0.00000000 + B_c2*+ 384 545 1.0 6.76800000 0.000000e+00 B_c2*+ 545 0.00000000 + B_c2*- 385 -545 -1.0 6.76800000 0.000000e+00 B_c2*- -545 0.00000000 + B_c(2S)+ 100541 100541 1.0 6.87210000 0.000000e+00 B_c(2S)+ 100541 0.00000000 + B_c(2S)- 100542 -100541 -1.0 6.87210000 0.000000e+00 B_c(2S)- -100541 0.00000000 + B_c*(2S)+ 100543 100543 1.0 6.90000000 0.000000e+00 B_c*(2S)+ 100543 0.00000000 + B_c*(2S)- 100544 -100543 -1.0 6.90000000 0.000000e+00 B_c*(2S)- -100543 0.00000000 + eta_c(1S) 128 441 0.0 2.98390000 2.216203e-23 eta_c 441 0.00000000 + J/psi(1S) 64 443 0.0 3.09690000 7.085169e-21 J/psi 443 0.00000000 + chi_c0(1P) 129 10441 0.0 3.41471000 6.328963e-23 chi_c0 10441 0.00000000 + chi_c1(1P) 130 20443 0.0 3.51067000 7.835857e-22 chi_c1 20443 0.00000000 + h_c(1P) 606 10443 0.0 3.52538000 9.403029e-22 h_c 10443 0.00000000 + chi_c2(1P) 131 445 0.0 3.55617000 3.410425e-22 chi_c2 445 0.00000000 + eta_c(2S) 829 100441 0.0 3.63750000 6.582122e-23 eta_c(2S) 100441 0.00000000 + psi(2S) 126 100443 0.0 3.68609700 2.238816e-21 psi(2S) 100443 0.00000000 + psi(3770) 765 30443 0.0 3.77313000 2.419898e-23 psi(3770) 30443 0.00000000 + chi_c2(2P) 1031 100445 0.0 3.92720000 2.742551e-23 chi_c2(2P) 0 0.00000000 + psi(4040) 851 9000443 0.0 4.03900000 8.227652e-24 psi(4040) 0 0.00000000 + psi(4160) 853 9010443 0.0 4.19100000 9.403029e-24 psi(4160) 0 0.00000000 + psi(4415) 856 9020443 0.0 4.42100000 1.061633e-23 psi(4415) 0 0.00000000 + X_1(3872) 1016 9920443 0.0 3.87169000 2.076340e-21 X_1(3872) 9920443 0.00000000 + X_2(3872) 1017 9910445 0.0 3.87169000 2.076340e-21 X_2(3872) 9910445 0.00000000 + Z(4430)+ 1018 9042413 1.0 4.47800000 3.630504e-24 Z(4430)+ 9042413 0.00000000 + Z(4430)- 1019 -9042413 -1.0 4.47800000 3.630504e-24 Z(4430)- -9042413 0.00000000 + eta_b(1S) 386 551 0.0 9.39870000 6.582120e-23 eta_b 551 0.00000000 + eta_b(2S) 830 100551 0.0 9.99700000 0.000000e+00 eta_b(2S) 0 0.00000000 + eta_b(3S) 843 200551 0.0 10.33500000 0.000000e+00 eta_b(3S) 0 0.00000000 + eta_b2(1D) 613 10555 0.0 10.15700000 0.000000e+00 eta_b2(1D) 10555 0.00000000 + eta_b2(2D) 836 110555 0.0 10.44100000 0.000000e+00 eta_b2(2D) 110555 0.00000000 + Upsilon(1S) 387 553 0.0 9.46030000 1.218911e-20 Upsilon 553 0.00000000 + Upsilon(2S) 831 100553 0.0 10.02326000 2.058199e-20 Upsilon(2S) 100553 0.00000000 + Upsilon(3S) 844 200553 0.0 10.35520000 3.242425e-20 Upsilon(3S) 200553 0.00000000 + Upsilon_1(1D) 766 30553 0.0 10.16370000 0.000000e+00 Upsilon_1(1D) 30553 0.00000000 + Upsilon_1(2D) 839 130553 0.0 10.43490000 0.000000e+00 Upsilon_1(2D) 130553 0.00000000 + Upsilon_2(1D) 696 20555 0.0 10.15620000 0.000000e+00 Upsilon_2(1D) 20555 0.00000000 + Upsilon_2(2D) 838 120555 0.0 10.44060000 0.000000e+00 Upsilon_2(2D) 120555 0.00000000 + Upsilon_3(1D) 389 557 0.0 10.15990000 0.000000e+00 Upsilon_3(1D) 557 0.00000000 + Upsilon_3(2D) 833 100557 0.0 10.44430000 0.000000e+00 Upsilon_3(2D) 100557 0.00000000 + Upsilon(4S) 849 300553 0.0 10.57940000 3.210791e-23 Upsilon(4S) 300553 0.00000000 + Upsilon(10860) 852 9000553 0.0 10.88990000 1.290612e-23 Upsilon(5S) 0 0.00000000 + Upsilon(11020) 854 9010553 0.0 10.99290000 1.343290e-23 Upsilon(11020) 0 0.00000000 + chi_b0(1P) 611 10551 0.0 9.85940000 0.000000e+00 chi_b0 10551 0.00000000 + chi_b0(2P) 834 110551 0.0 10.23250000 0.000000e+00 chi_b0(2P) 110551 0.00000000 + chi_b0(3P) 846 210551 0.0 10.50040000 0.000000e+00 chi_b0(3P) 210551 0.00000000 + chi_b1(3P) 848 220553 0.0 10.51210000 0.000000e+00 chi_b1(3P) 220553 0.00000000 + chi_b1(1P) 695 20553 0.0 9.89287800 0.000000e+00 chi_b1 20553 0.00000000 + chi_b1(2P) 837 120553 0.0 10.25546000 0.000000e+00 chi_b1(2P) 120553 0.00000000 + chi_b2(1P) 388 555 0.0 9.91221000 0.000000e+00 chi_b2 555 0.00000000 + chi_b2(2P) 832 100555 0.0 10.26865000 0.000000e+00 chi_b2(2P) 100555 0.00000000 + chi_b2(3P) 845 200555 0.0 10.52620000 0.000000e+00 chi_b2(3P) 200555 0.00000000 + h_b(1P) 612 10553 0.0 9.89930000 0.000000e+00 h_b 10553 0.00000000 + h_b(2P) 835 110553 0.0 10.25500000 0.000000e+00 h_b(2P) 110553 0.00000000 + h_b(3P) 847 210553 0.0 10.51600000 0.000000e+00 h_b(3P) 210553 0.00000000 + n0 13 2112 0.0 0.93956541 8.803000e+02 n0 2112 0.00000000 + n~0 25 -2112 0.0 0.93956541 8.803000e+02 anti-n0 -2112 0.00000000 + p+ 14 2212 1.0 0.93827208 1.000000e+16 p+ 2212 0.00000000 + p~- 15 -2212 -1.0 0.93827208 1.000000e+16 anti-p- -2212 0.00000000 + N(1440)0 624 12112 0.0 1.44000000 2.194041e-24 N(1440)0 0 0.00000000 + N(1440)~0 625 -12112 0.0 1.44000000 2.194041e-24 anti-N(1440)0 0 0.00000000 + N(1440)+ 636 12212 1.0 1.44000000 2.194041e-24 N(1440)+ 0 0.00000000 + N(1440)~- 637 -12212 -1.0 1.44000000 2.194041e-24 anti-N(1440)- 0 0.00000000 + N(1520)0 404 1214 0.0 1.51500000 5.983745e-24 N(1520)0 0 0.00000000 + N(1520)~0 405 -1214 0.0 1.51500000 5.983745e-24 anti-N(1520)0 0 0.00000000 + N(1520)+ 420 2124 1.0 1.51500000 5.983745e-24 N(1520)+ 0 0.00000000 + N(1520)~- 421 -2124 -1.0 1.51500000 5.983745e-24 anti-N(1520)- 0 0.00000000 + N(1535)0 705 22112 0.0 1.53000000 4.388081e-24 N(1535)0 0 0.00000000 + N(1535)~0 706 -22112 0.0 1.53000000 4.388081e-24 anti-N(1535)0 0 0.00000000 + N(1535)+ 713 22212 1.0 1.53000000 4.388081e-24 N(1535)+ 0 0.00000000 + N(1535)~- 714 -22212 -1.0 1.53000000 4.388081e-24 anti-N(1535)- 0 0.00000000 + N(1650)0 771 32112 0.0 1.65000000 5.265696e-24 N(1650)0 0 0.00000000 + N(1650)~0 772 -32112 0.0 1.65000000 5.265696e-24 anti-N(1650)0 0 0.00000000 + N(1650)+ 777 32212 1.0 1.65000000 5.265696e-24 N(1650)+ 0 0.00000000 + N(1650)~- 778 -32212 -1.0 1.65000000 5.265696e-24 anti-N(1650)- 0 0.00000000 + N(1675)0 414 2116 0.0 1.67500000 4.539393e-24 N(1675)0 0 0.00000000 + N(1675)~0 415 -2116 0.0 1.67500000 4.539393e-24 anti-N(1675)0 0 0.00000000 + N(1675)+ 428 2216 1.0 1.67500000 4.539393e-24 N(1675)+ 0 0.00000000 + N(1675)~- 429 -2216 -1.0 1.67500000 4.539393e-24 anti-N(1675)- 0 0.00000000 + N(1680)0 628 12116 0.0 1.68500000 5.485100e-24 N(1680)0 0 0.00000000 + N(1680)~0 629 -12116 0.0 1.68500000 5.485100e-24 anti-N(1680)0 0 0.00000000 + N(1680)+ 640 12216 1.0 1.68500000 5.485100e-24 N(1680)+ 0 0.00000000 + N(1680)~- 641 -12216 -1.0 1.68500000 5.485100e-24 anti-N(1680)- 0 0.00000000 + N(1700)+ 711 22124 1.0 1.72000000 4.388081e-24 N(1700)+ 0 0.00000000 + N(1700)~- 712 -22124 -1.0 1.72000000 4.388081e-24 anti-N(1700)- 0 0.00000000 + N(1700)0 703 21214 0.0 1.72000000 4.388081e-24 N(1700)0 0 0.00000000 + N(1700)~0 704 -21214 0.0 1.72000000 4.388081e-24 anti-N(1700)0 0 0.00000000 + N(1710)0 791 42112 0.0 1.71000000 6.582122e-24 N(1710)0 0 0.00000000 + N(1710)~0 792 -42112 0.0 1.71000000 6.582122e-24 anti-N(1710)0 0 0.00000000 + N(1710)+ 795 42212 1.0 1.71000000 6.582122e-24 N(1710)+ 0 0.00000000 + N(1710)~- 796 -42212 -1.0 1.71000000 6.582122e-24 anti-N(1710)- 0 0.00000000 + N(1720)0 769 31214 0.0 1.72000000 2.632849e-24 N(1720)0 0 0.00000000 + N(1720)~0 770 -31214 0.0 1.72000000 2.632849e-24 anti-N(1720)0 0 0.00000000 + N(1720)+ 775 32124 1.0 1.72000000 2.632849e-24 N(1720)+ 0 0.00000000 + N(1720)~- 776 -32124 -1.0 1.72000000 2.632849e-24 anti-N(1720)- 0 0.00000000 + N(1900)0 789 41214 0.0 1.89500000 5.476011e-24 N(1900)0 0 0.00000000 + N(1900)~0 790 -41214 0.0 1.89500000 5.476011e-24 anti-N(1900)0 0 0.00000000 + N(1900)+ 793 42124 1.0 1.89500000 5.476011e-24 N(1900)+ 0 0.00000000 + N(1900)~- 794 -42124 -1.0 1.89500000 5.476011e-24 anti-N(1900)- 0 0.00000000 + N(1990)0 630 12118 0.0 1.95000000 0.000000e+00 N(1990)0 0 0.00000000 + N(1990)~0 631 -12118 0.0 1.95000000 0.000000e+00 anti-N(1990)0 0 0.00000000 + N(1990)+ 642 12218 1.0 1.95000000 0.000000e+00 N(1990)+ 0 0.00000000 + N(1990)~- 643 -12218 -1.0 1.95000000 0.000000e+00 anti-N(1990)- 0 0.00000000 + N(2090)0 799 52114 0.0 2.00000000 0.000000e+00 N(2090)0 0 0.00000000 + N(2090)~0 800 -52114 0.0 2.00000000 0.000000e+00 anti-N(2090)0 0 0.00000000 + N(2090)+ 801 52214 1.0 2.00000000 0.000000e+00 N(2090)+ 0 0.00000000 + N(2090)~- 802 -52214 -1.0 2.00000000 0.000000e+00 anti-N(2090)- 0 0.00000000 + N(2190)0 408 1218 0.0 2.18000000 1.645530e-24 N(2190)0 0 0.00000000 + N(2190)~0 409 -1218 0.0 2.18000000 1.645530e-24 anti-N(2190)0 0 0.00000000 + N(2190)+ 424 2128 1.0 2.18000000 1.645530e-24 N(2190)+ 0 0.00000000 + N(2190)~- 425 -2128 -1.0 2.18000000 1.645530e-24 anti-N(2190)- 0 0.00000000 + Delta- 182 1114 -1.0 1.23200000 5.625745e-24 Delta- 1114 0.00000000 + Delta~+ 186 -1114 1.0 1.23200000 5.625745e-24 anti-Delta+ -1114 0.00000000 + Delta0 181 2114 0.0 1.23200000 5.625745e-24 Delta0 2114 0.00000000 + Delta~0 185 -2114 0.0 1.23200000 5.625745e-24 anti-Delta0 -2114 0.00000000 + Delta+ 180 2214 1.0 1.23200000 5.625745e-24 Delta+ 2214 0.00000000 + Delta~- 184 -2214 -1.0 1.23200000 5.625745e-24 anti-Delta- -2214 0.00000000 + Delta++ 179 2224 2.0 1.23200000 5.625745e-24 Delta++ 2224 0.00000000 + Delta~-- 183 -2224 -2.0 1.23200000 5.625745e-24 anti-Delta-- -2224 0.00000000 + Delta(1600)- 767 31114 -1.0 1.57000000 2.632848e-24 Delta(1600)- 0 0.00000000 + Delta(1600)~+ 768 -31114 1.0 1.57000000 2.632848e-24 anti-Delta(1600)+ 0 0.00000000 + Delta(1600)0 773 32114 0.0 1.57000000 2.632848e-24 Delta(1600)0 0 0.00000000 + Delta(1600)~0 774 -32114 0.0 1.57000000 2.632848e-24 anti-Delta(1600)0 0 0.00000000 + Delta(1600)+ 779 32214 1.0 1.57000000 2.632848e-24 Delta(1600)+ 0 0.00000000 + Delta(1600)~- 780 -32214 -1.0 1.57000000 2.632848e-24 anti-Delta(1600)- 0 0.00000000 + Delta(1600)++ 781 32224 2.0 1.57000000 2.632848e-24 Delta(1600)++ 0 0.00000000 + Delta(1600)~-- 782 -32224 -2.0 1.57000000 2.632848e-24 anti-Delta(1600)-- 0 0.00000000 + Delta(1620)- 396 1112 -1.0 1.61000000 5.063169e-24 Delta(1620)- 0 0.00000000 + Delta(1620)~+ 397 -1112 1.0 1.61000000 5.063169e-24 anti-Delta(1620)+ 0 0.00000000 + Delta(1620)0 402 1212 0.0 1.61000000 5.063169e-24 Delta(1620)0 0 0.00000000 + Delta(1620)~0 403 -1212 0.0 1.61000000 5.063169e-24 anti-Delta(1620)0 0 0.00000000 + Delta(1620)+ 418 2122 1.0 1.61000000 5.063169e-24 Delta(1620)+ 0 0.00000000 + Delta(1620)~- 419 -2122 -1.0 1.61000000 5.063169e-24 anti-Delta(1620)- 0 0.00000000 + Delta(1620)++ 432 2222 2.0 1.61000000 5.063169e-24 Delta(1620)++ 0 0.00000000 + Delta(1620)~-- 433 -2222 -2.0 1.61000000 5.063169e-24 anti-Delta(1620)-- 0 0.00000000 + Delta(1700)- 616 11114 -1.0 1.71000000 2.194041e-24 Delta(1700)- 0 0.00000000 + Delta(1700)~+ 617 -11114 1.0 1.71000000 2.194041e-24 anti-Delta(1700)+ 0 0.00000000 + Delta(1700)0 626 12114 0.0 1.71000000 2.194041e-24 Delta(1700)0 0 0.00000000 + Delta(1700)~0 627 -12114 0.0 1.71000000 2.194041e-24 anti-Delta(1700)0 0 0.00000000 + Delta(1700)+ 638 12214 1.0 1.71000000 2.194041e-24 Delta(1700)+ 0 0.00000000 + Delta(1700)~- 639 -12214 -1.0 1.71000000 2.194041e-24 anti-Delta(1700)- 0 0.00000000 + Delta(1700)++ 646 12224 2.0 1.71000000 2.194041e-24 Delta(1700)++ 0 0.00000000 + Delta(1700)~-- 647 -12224 -2.0 1.71000000 2.194041e-24 anti-Delta(1700)-- 0 0.00000000 + Delta(1900)- 614 11112 -1.0 1.86000000 2.632848e-24 Delta(1900)- 0 0.00000000 + Delta(1900)~+ 615 -11112 1.0 1.86000000 2.632848e-24 anti-Delta(1900)+ 0 0.00000000 + Delta(1900)0 620 11212 0.0 1.86000000 2.632848e-24 Delta(1900)0 0 0.00000000 + Delta(1900)~0 621 -11212 0.0 1.86000000 2.632848e-24 anti-Delta(1900)0 0 0.00000000 + Delta(1900)+ 632 12122 1.0 1.86000000 2.632848e-24 Delta(1900)+ 0 0.00000000 + Delta(1900)~- 633 -12122 -1.0 1.86000000 2.632848e-24 anti-Delta(1900)- 0 0.00000000 + Delta(1900)++ 644 12222 2.0 1.86000000 2.632848e-24 Delta(1900)++ 0 0.00000000 + Delta(1900)~-- 645 -12222 -2.0 1.86000000 2.632848e-24 anti-Delta(1900)-- 0 0.00000000 + Delta(1905)- 398 1116 -1.0 1.88000000 1.994582e-24 Delta(1905)- 0 0.00000000 + Delta(1905)~+ 399 -1116 1.0 1.88000000 1.994582e-24 anti-Delta(1905)+ 0 0.00000000 + Delta(1905)0 406 1216 0.0 1.88000000 1.994582e-24 Delta(1905)0 0 0.00000000 + Delta(1905)~0 407 -1216 0.0 1.88000000 1.994582e-24 anti-Delta(1905)0 0 0.00000000 + Delta(1905)+ 422 2126 1.0 1.88000000 1.994582e-24 Delta(1905)+ 0 0.00000000 + Delta(1905)~- 423 -2126 -1.0 1.88000000 1.994582e-24 anti-Delta(1905)- 0 0.00000000 + Delta(1905)++ 434 2226 2.0 1.88000000 1.994582e-24 Delta(1905)++ 0 0.00000000 + Delta(1905)~-- 435 -2226 -2.0 1.88000000 1.994582e-24 anti-Delta(1905)-- 0 0.00000000 + Delta(1910)- 697 21112 -1.0 1.90000000 2.350758e-24 Delta(1910)- 0 0.00000000 + Delta(1910)~+ 698 -21112 1.0 1.90000000 2.350758e-24 anti-Delta(1910)+ 0 0.00000000 + Delta(1910)0 701 21212 0.0 1.90000000 2.350758e-24 Delta(1910)0 0 0.00000000 + Delta(1910)~0 702 -21212 0.0 1.90000000 2.350758e-24 anti-Delta(1910)0 0 0.00000000 + Delta(1910)+ 709 22122 1.0 1.90000000 2.350758e-24 Delta(1910)+ 0 0.00000000 + Delta(1910)~- 710 -22122 -1.0 1.90000000 2.350758e-24 anti-Delta(1910)- 0 0.00000000 + Delta(1910)++ 717 22222 2.0 1.90000000 2.350758e-24 Delta(1910)++ 0 0.00000000 + Delta(1910)~-- 718 -22222 -2.0 1.90000000 2.350758e-24 anti-Delta(1910)-- 0 0.00000000 + Delta(1920)- 699 21114 -1.0 1.92000000 2.531585e-24 Delta(1920)- 0 0.00000000 + Delta(1920)~+ 700 -21114 1.0 1.92000000 2.531585e-24 anti-Delta(1920)+ 0 0.00000000 + Delta(1920)0 707 22114 0.0 1.92000000 2.531585e-24 Delta(1920)0 0 0.00000000 + Delta(1920)~0 708 -22114 0.0 1.92000000 2.531585e-24 anti-Delta(1920)0 0 0.00000000 + Delta(1920)+ 715 22214 1.0 1.92000000 2.531585e-24 Delta(1920)+ 0 0.00000000 + Delta(1920)~- 716 -22214 -1.0 1.92000000 2.531585e-24 anti-Delta(1920)- 0 0.00000000 + Delta(1920)++ 719 22224 2.0 1.92000000 2.531585e-24 Delta(1920)++ 0 0.00000000 + Delta(1920)~-- 720 -22224 -2.0 1.92000000 2.531585e-24 anti-Delta(1920)-- 0 0.00000000 + Delta(1930)- 618 11116 -1.0 1.95000000 2.194040e-24 Delta(1930)- 0 0.00000000 + Delta(1930)~+ 619 -11116 1.0 1.95000000 2.194040e-24 anti-Delta(1930)+ 0 0.00000000 + Delta(1930)0 622 11216 0.0 1.95000000 2.194040e-24 Delta(1930)0 0 0.00000000 + Delta(1930)~0 623 -11216 0.0 1.95000000 2.194040e-24 anti-Delta(1930)0 0 0.00000000 + Delta(1930)+ 634 12126 1.0 1.95000000 2.194040e-24 Delta(1930)+ 0 0.00000000 + Delta(1930)~- 635 -12126 -1.0 1.95000000 2.194040e-24 anti-Delta(1930)- 0 0.00000000 + Delta(1930)++ 648 12226 2.0 1.95000000 2.194040e-24 Delta(1930)++ 0 0.00000000 + Delta(1930)~-- 649 -12226 -2.0 1.95000000 2.194040e-24 anti-Delta(1930)-- 0 0.00000000 + Delta(1950)- 400 1118 -1.0 1.93000000 2.350758e-24 Delta(1950)- 0 0.00000000 + Delta(1950)~+ 401 -1118 1.0 1.93000000 2.350758e-24 anti-Delta(1950)+ 0 0.00000000 + Delta(1950)0 416 2118 0.0 1.93000000 2.350758e-24 Delta(1950)0 0 0.00000000 + Delta(1950)~0 417 -2118 0.0 1.93000000 2.350758e-24 anti-Delta(1950)0 0 0.00000000 + Delta(1950)+ 430 2218 1.0 1.93000000 2.350758e-24 Delta(1950)+ 0 0.00000000 + Delta(1950)~- 431 -2218 -1.0 1.93000000 2.350758e-24 anti-Delta(1950)- 0 0.00000000 + Delta(1950)++ 436 2228 2.0 1.93000000 2.350758e-24 Delta(1950)++ 0 0.00000000 + Delta(1950)~-- 437 -2228 -2.0 1.93000000 2.350758e-24 anti-Delta(1950)-- 0 0.00000000 + Lambda0 18 3122 0.0 1.11568300 2.632000e-10 Lambda0 3122 0.00000000 + Lambda~0 26 -3122 0.0 1.11568300 2.632000e-10 anti-Lambda0 -3122 0.00000000 + Lambda(1405)0 656 13122 0.0 1.40510000 1.316424e-23 Lambda(1405)0 0 0.00000000 + Lambda(1405)~0 657 -13122 0.0 1.40510000 1.316424e-23 anti-Lambda(1405)0 0 0.00000000 + Lambda(1520)0 448 3124 0.0 1.51950000 4.219309e-23 Lambda(1520)0 0 0.00000000 + Lambda(1520)~0 449 -3124 0.0 1.51950000 4.219309e-23 anti-Lambda(1520)0 0 0.00000000 + Lambda(1600)0 725 23122 0.0 1.60000000 4.388081e-24 Lambda(1600)0 0 0.00000000 + Lambda(1600)~0 726 -23122 0.0 1.60000000 4.388081e-24 anti-Lambda(1600)0 0 0.00000000 + Lambda(1670)0 783 33122 0.0 1.67000000 1.880606e-23 Lambda(1670)0 0 0.00000000 + Lambda(1670)~0 784 -33122 0.0 1.67000000 1.880606e-23 anti-Lambda(1670)0 0 0.00000000 + Lambda(1690)0 658 13124 0.0 1.69000000 1.097020e-23 Lambda(1690)0 0 0.00000000 + Lambda(1690)~0 659 -13124 0.0 1.69000000 1.097020e-23 anti-Lambda(1690)0 0 0.00000000 + Lambda(1800)0 797 43122 0.0 1.80000000 2.194041e-24 Lambda(1800)0 0 0.00000000 + Lambda(1800)~0 798 -43122 0.0 1.80000000 2.194041e-24 anti-Lambda(1800)0 0 0.00000000 + Lambda(1810)0 803 53122 0.0 1.81000000 4.388081e-24 Lambda(1810)0 0 0.00000000 + Lambda(1810)~0 804 -53122 0.0 1.81000000 4.388081e-24 anti-Lambda(1810)0 0 0.00000000 + Lambda(1820)0 450 3126 0.0 1.82000000 8.227652e-24 Lambda(1820)0 0 0.00000000 + Lambda(1820)~0 451 -3126 0.0 1.82000000 8.227652e-24 anti-Lambda(1820)0 0 0.00000000 + Lambda(1830)0 660 13126 0.0 1.83000000 6.928549e-24 Lambda(1830)0 0 0.00000000 + Lambda(1830)~0 661 -13126 0.0 1.83000000 6.928549e-24 anti-Lambda(1830)0 0 0.00000000 + Lambda(1890)0 727 23124 0.0 1.89000000 6.582122e-24 Lambda(1890)0 0 0.00000000 + Lambda(1890)~0 728 -23124 0.0 1.89000000 6.582122e-24 anti-Lambda(1890)0 0 0.00000000 + Lambda(2100)0 452 3128 0.0 2.10000000 3.291061e-24 Lambda(2100)0 0 0.00000000 + Lambda(2100)~0 453 -3128 0.0 2.10000000 3.291061e-24 anti-Lambda(2100)0 0 0.00000000 + Lambda(2110)0 729 23126 0.0 2.11000000 3.291061e-24 Lambda(2110)0 0 0.00000000 + Lambda(2110)~0 730 -23126 0.0 2.11000000 3.291061e-24 anti-Lambda(2110)0 0 0.00000000 + Sigma- 21 3112 -1.0 1.19744900 1.479128e-10 Sigma- 3112 0.00000000 + Sigma~+ 29 -3112 1.0 1.19744900 1.479128e-10 anti-Sigma+ -3112 0.00000000 + Sigma0 20 3212 0.0 1.19264200 7.400000e-20 Sigma0 3212 0.00000000 + Sigma~0 28 -3212 0.0 1.19264200 7.400000e-20 anti-Sigma0 -3212 0.00000000 + Sigma+ 19 3222 1.0 1.18937000 8.018175e-11 Sigma+ 3222 0.00000000 + Sigma~- 27 -3222 -1.0 1.18937000 8.018175e-11 anti-Sigma- -3222 0.00000000 + Sigma*- 442 3114 -1.0 1.38720000 1.670589e-23 Sigma*- 3114 0.00000000 + Sigma*~+ 443 -3114 1.0 1.38720000 1.670589e-23 anti-Sigma*+ -3114 0.00000000 + Sigma*0 458 3214 0.0 1.38370000 1.828367e-23 Sigma*0 3214 0.00000000 + Sigma*~0 459 -3214 0.0 1.38370000 1.828367e-23 anti-Sigma*0 -3214 0.00000000 + Sigma*+ 464 3224 1.0 1.38280000 1.828367e-23 Sigma*+ 3224 0.00000000 + Sigma*~- 465 -3224 -1.0 1.38280000 1.828367e-23 anti-Sigma*- -3224 0.00000000 + Sigma(1660)- 650 13112 -1.0 1.66000000 6.582122e-24 Sigma(1660)- 0 0.00000000 + Sigma(1660)~+ 651 -13112 1.0 1.66000000 6.582122e-24 anti-Sigma(1660)+ 0 0.00000000 + Sigma(1660)0 662 13212 0.0 1.66000000 6.582122e-24 Sigma(1660)0 0 0.00000000 + Sigma(1660)~0 663 -13212 0.0 1.66000000 6.582122e-24 anti-Sigma(1660)0 0 0.00000000 + Sigma(1660)+ 668 13222 1.0 1.66000000 6.582122e-24 Sigma(1660)+ 0 0.00000000 + Sigma(1660)~- 669 -13222 -1.0 1.66000000 6.582122e-24 anti-Sigma(1660)- 0 0.00000000 + Sigma(1670)- 652 13114 -1.0 1.67000000 1.097020e-23 Sigma(1670)- 0 0.00000000 + Sigma(1670)~+ 653 -13114 1.0 1.67000000 1.097020e-23 anti-Sigma(1670)+ 0 0.00000000 + Sigma(1670)0 664 13214 0.0 1.67000000 1.097020e-23 Sigma(1670)0 0 0.00000000 + Sigma(1670)~0 665 -13214 0.0 1.67000000 1.097020e-23 anti-Sigma(1670)0 0 0.00000000 + Sigma(1670)+ 670 13224 1.0 1.67000000 1.097020e-23 Sigma(1670)+ 0 0.00000000 + Sigma(1670)~- 671 -13224 -1.0 1.67000000 1.097020e-23 anti-Sigma(1670)- 0 0.00000000 + Sigma(1750)- 721 23112 -1.0 1.75000000 7.313469e-24 Sigma(1750)- 0 0.00000000 + Sigma(1750)~+ 722 -23112 1.0 1.75000000 7.313469e-24 anti-Sigma(1750)+ 0 0.00000000 + Sigma(1750)0 731 23212 0.0 1.75000000 7.313469e-24 Sigma(1750)0 0 0.00000000 + Sigma(1750)~0 732 -23212 0.0 1.75000000 7.313469e-24 anti-Sigma(1750)0 0 0.00000000 + Sigma(1750)+ 735 23222 1.0 1.75000000 7.313469e-24 Sigma(1750)+ 0 0.00000000 + Sigma(1750)~- 736 -23222 -1.0 1.75000000 7.313469e-24 anti-Sigma(1750)- 0 0.00000000 + Sigma(1775)- 444 3116 -1.0 1.77500000 5.485102e-24 Sigma(1775)- 0 0.00000000 + Sigma(1775)~+ 445 -3116 1.0 1.77500000 5.485102e-24 anti-Sigma(1775)+ 0 0.00000000 + Sigma(1775)0 460 3216 0.0 1.77500000 5.485102e-24 Sigma(1775)0 0 0.00000000 + Sigma(1775)~0 461 -3216 0.0 1.77500000 5.485102e-24 anti-Sigma(1775)0 0 0.00000000 + Sigma(1775)+ 466 3226 1.0 1.77500000 5.485102e-24 Sigma(1775)+ 0 0.00000000 + Sigma(1775)~- 467 -3226 -1.0 1.77500000 5.485102e-24 anti-Sigma(1775)- 0 0.00000000 + Sigma(1915)- 654 13116 -1.0 1.91500000 5.485102e-24 Sigma(1915)- 0 0.00000000 + Sigma(1915)~+ 655 -13116 1.0 1.91500000 5.485102e-24 anti-Sigma(1915)+ 0 0.00000000 + Sigma(1915)0 666 13216 0.0 1.91500000 5.485102e-24 Sigma(1915)0 0 0.00000000 + Sigma(1915)~0 667 -13216 0.0 1.91500000 5.485102e-24 anti-Sigma(1915)0 0 0.00000000 + Sigma(1915)+ 672 13226 1.0 1.91500000 5.485102e-24 Sigma(1915)+ 0 0.00000000 + Sigma(1915)~- 673 -13226 -1.0 1.91500000 5.485102e-24 anti-Sigma(1915)- 0 0.00000000 + Sigma(1940)- 723 23114 -1.0 1.94000000 2.991874e-24 Sigma(1940)- 0 0.00000000 + Sigma(1940)~+ 724 -23114 1.0 1.94000000 2.991874e-24 anti-Sigma(1940)+ 0 0.00000000 + Sigma(1940)0 733 23214 0.0 1.94000000 2.991874e-24 Sigma(1940)0 0 0.00000000 + Sigma(1940)~0 734 -23214 0.0 1.94000000 2.991874e-24 anti-Sigma(1940)0 0 0.00000000 + Sigma(1940)+ 737 23224 1.0 1.94000000 2.991874e-24 Sigma(1940)+ 0 0.00000000 + Sigma(1940)~- 738 -23224 -1.0 1.94000000 2.991874e-24 anti-Sigma(1940)- 0 0.00000000 + Sigma(2030)0 462 3218 0.0 2.03000000 3.656734e-24 Sigma(2030)0 0 0.00000000 + Sigma(2030)~0 463 -3218 0.0 2.03000000 3.656734e-24 anti-Sigma(2030)0 0 0.00000000 + Sigma(2030)+ 468 3228 1.0 2.03000000 3.656734e-24 Sigma(2030)+ 0 0.00000000 + Sigma(2030)~- 469 -3228 -1.0 2.03000000 3.656734e-24 anti-Sigma(2030)- 0 0.00000000 + Sigma(2030)- 446 3118 -1.0 2.03000000 3.656734e-24 Sigma(2030)- 0 0.00000000 + Sigma(2030)~+ 447 -3118 1.0 2.03000000 3.656734e-24 anti-Sigma(2030)+ 0 0.00000000 + Sigma(2250)0 1059 103212 0.0 2.25000000 6.580000e-24 Sigma(2250)0 0 0.00000000 + Sigma(2250)~0 1060 -103212 0.0 2.25000000 6.580000e-24 anti-Sigma(2250)0 0 0.00000000 + Sigma(2250)+ 1061 103222 1.0 2.25000000 6.580000e-24 Sigma(2250)+ 0 0.00000000 + Sigma(2250)~- 1062 -103222 -1.0 2.25000000 6.580000e-24 anti-Sigma(2250)- 0 0.00000000 + Sigma(2250)- 1063 103112 -1.0 2.25000000 6.580000e-24 Sigma(2250)- 0 0.00000000 + Sigma(2250)~+ 1064 -103112 1.0 2.25000000 6.580000e-24 anti-Sigma(2250)+ 0 0.00000000 + Xi- 23 3312 -1.0 1.32171000 1.639000e-10 Xi- 3312 0.00000000 + Xi~+ 31 -3312 1.0 1.32171000 1.639000e-10 anti-Xi+ -3312 0.00000000 + Xi0 22 3322 0.0 1.31486000 2.900000e-10 Xi0 3322 0.00000000 + Xi~0 30 -3322 0.0 1.31486000 2.900000e-10 anti-Xi0 -3322 0.00000000 + Xi*- 472 3314 -1.0 1.53500000 6.648608e-23 Xi*- 3314 0.00000000 + Xi*~+ 473 -3314 1.0 1.53500000 6.648608e-23 anti-Xi*+ -3314 0.00000000 + Xi*0 474 3324 0.0 1.53180000 7.233101e-23 Xi*0 3324 0.00000000 + Xi*~0 475 -3324 0.0 1.53180000 7.233101e-23 anti-Xi*0 -3324 0.00000000 + Xi(1690)- 1033 203312 -1.0 1.69000000 0.000000e+00 Xi(1690)- 0 0.00000000 + Xi(1690)~+ 1034 -203312 1.0 1.69000000 0.000000e+00 anti-Xi(1690)+ 0 0.00000000 + Xi(1690)0 1035 203322 0.0 1.69000000 0.000000e+00 Xi(1690)0 0 0.00000000 + Xi(1690)~0 1036 -203322 0.0 1.69000000 0.000000e+00 anti-Xi(1690)0 0 0.00000000 + Xi(1820)- 674 13314 -1.0 1.82300000 2.742551e-23 Xi(1820)- 0 0.00000000 + Xi(1820)~+ 675 -13314 1.0 1.82300000 2.742551e-23 anti-Xi(1820)+ 0 0.00000000 + Xi(1820)0 678 13324 0.0 1.82300000 2.742551e-23 Xi(1820)0 0 0.00000000 + Xi(1820)~0 679 -13324 0.0 1.82300000 2.742551e-23 anti-Xi(1820)0 0 0.00000000 + Xi(1950)- 1037 103316 -1.0 1.95000000 1.097020e-23 Xi(1950)- 0 0.00000000 + Xi(1950)~+ 1038 -103316 1.0 1.95000000 1.097020e-23 anti-Xi(1950)+ 0 0.00000000 + Xi(1950)0 1039 103326 0.0 1.95000000 1.097020e-23 Xi(1950)0 0 0.00000000 + Xi(1950)~0 1040 -103326 0.0 1.95000000 1.097020e-23 anti-Xi(1950)0 0 0.00000000 + Xi(2030)- 1041 203316 -1.0 2.02500000 3.291061e-23 Xi(2030)- 0 0.00000000 + Xi(2030)~+ 1042 -203316 1.0 2.02500000 3.291061e-23 anti-Xi(2030)+ 0 0.00000000 + Xi(2030)0 1043 203326 0.0 2.02500000 3.291061e-23 Xi(2030)0 0 0.00000000 + Xi(2030)~0 1044 -203326 0.0 2.02500000 3.291061e-23 anti-Xi(2030)0 0 0.00000000 + Omega- 24 3334 -1.0 1.67245000 8.210000e-11 Omega- 3334 0.00000000 + Omega~+ 32 -3334 1.0 1.67245000 8.210000e-11 anti-Omega+ -3334 0.00000000 + Omega(2250)- 1045 203338 -1.0 2.25200000 1.196749e-23 Omega(2250)- 0 0.00000000 + Omega(2250)~+ 1046 -203338 1.0 2.25200000 1.196749e-23 anti-Omega(2250)+ 0 0.00000000 + Lambda_c+ 62 4122 1.0 2.28646000 2.000000e-13 Lambda_c+ 4122 0.00000000 + Lambda_c~- 63 -4122 -1.0 2.28646000 2.000000e-13 anti-Lambda_c- -4122 0.00000000 + Lambda_c(2595)+ 682 14122 1.0 2.59225000 2.531585e-22 Lambda_c(2593)+ 0 0.00000000 + Lambda_c(2595)~- 683 -14122 -1.0 2.59225000 2.531585e-22 anti-Lambda_c(2593)- 0 0.00000000 + Lambda_c(2625)+ 1047 104124 1.0 2.62811000 0.000000e+00 Lambda_c(2625)+ 0 0.00000000 + Lambda_c(2625)~- 1048 -104124 -1.0 2.62811000 0.000000e+00 anti-Lambda_c(2625)- 0 0.00000000 + Lambda_c(2880)+ 1049 204126 1.0 2.88163000 1.175379e-22 Lambda_c(2880)+ 0 0.00000000 + Lambda_c(2880)~- 1050 -204126 -1.0 2.88163000 1.175379e-22 anti-Lambda_c(2880)- 0 0.00000000 + Sigma_c0 81 4112 0.0 2.45375000 3.596787e-22 Sigma_c0 4112 0.00000000 + Sigma_c~0 82 -4112 0.0 2.45375000 3.596787e-22 anti-Sigma_c0 -4112 0.00000000 + Sigma_c+ 83 4212 1.0 2.45290000 3.999999e-22 Sigma_c+ 4212 0.00000000 + Sigma_c~- 84 -4212 -1.0 2.45290000 3.999999e-22 anti-Sigma_c- -4212 0.00000000 + Sigma_c++ 85 4222 2.0 2.45397000 3.482603e-22 Sigma_c++ 4222 0.00000000 + Sigma_c~-- 86 -4222 -2.0 2.45397000 3.482603e-22 anti-Sigma_c-- -4222 0.00000000 + Sigma_c*0 480 4114 0.0 2.51848000 4.539394e-23 Sigma_c*0 4114 0.00000000 + Sigma_c*~0 481 -4114 0.0 2.51848000 4.539394e-23 anti-Sigma_c*0 -4114 0.00000000 + Sigma_c*+ 486 4214 1.0 2.51750000 3.291061e-22 Sigma_c*+ 4214 0.00000000 + Sigma_c*~- 487 -4214 -1.0 2.51750000 3.291061e-22 anti-Sigma_c*- -4214 0.00000000 + Sigma_c*++ 488 4224 2.0 2.51841000 4.453396e-23 Sigma_c*++ 4224 0.00000000 + Sigma_c*~-- 489 -4224 -2.0 2.51841000 4.453396e-23 anti-Sigma_c*-- -4224 0.00000000 + Xi_c0 106 4132 0.0 2.47091000 1.530726e-13 Xi_c0 4132 0.00000000 + Xi_c~0 107 -4132 0.0 2.47091000 1.530726e-13 anti-Xi_c0 -4132 0.00000000 + Xi_c+ 108 4232 1.0 2.46793000 4.420000e-13 Xi_c+ 4232 0.00000000 + Xi_c~- 109 -4232 -1.0 2.46793000 4.420000e-13 anti-Xi_c- -4232 0.00000000 + Xi'_c0 100 4312 0.0 2.57920000 0.000000e+00 Xi'_c0 4312 0.00000000 + Xi'_c~0 101 -4312 0.0 2.57920000 0.000000e+00 anti-Xi'_c0 -4312 0.00000000 + Xi'_c+ 102 4322 1.0 2.57840000 0.000000e+00 Xi'_c+ 4322 0.00000000 + Xi'_c~- 103 -4322 -1.0 2.57840000 0.000000e+00 anti-Xi'_c- -4322 0.00000000 + Xi_c*0 494 4314 0.0 2.64638000 2.800902e-22 Xi_c*0 4314 0.00000000 + Xi_c*~0 495 -4314 0.0 2.64638000 2.800902e-22 anti-Xi_c*0 -4314 0.00000000 + Xi_c*+ 496 4324 1.0 2.64557000 3.075757e-22 Xi_c*+ 4324 0.00000000 + Xi_c*~- 497 -4324 -1.0 2.64557000 3.075757e-22 anti-Xi_c*- -4324 0.00000000 + Xi_c(2790)+ 1051 104324 1.0 2.79240000 7.395640e-23 Xi_c(2790)+ 0 0.00000000 + Xi_c(2790)~- 1052 -104324 -1.0 2.79240000 7.395640e-23 anti-Xi_c(2790)- 0 0.00000000 + Xi_c(2790)0 1053 104314 0.0 2.79410000 6.582120e-23 Xi_c(2790)0 0 0.00000000 + Xi_c(2790)~0 1054 -104314 0.0 2.79410000 6.582120e-23 anti-Xi_c(2790)0 0 0.00000000 + Xi_c(2815)+ 1055 104322 1.0 2.81673000 2.708691e-22 Xi_c(2815)+ 0 0.00000000 + Xi_c(2815)~- 1056 -104322 -1.0 2.81673000 2.708691e-22 anti-Xi_c(2815)- 0 0.00000000 + Xi_c(2815)0 1057 104312 0.0 2.82026000 2.591386e-22 Xi_c(2815)0 0 0.00000000 + Xi_c(2815)~0 1058 -104312 0.0 2.82026000 2.591386e-22 anti-Xi_c(2815)0 0 0.00000000 + Omega_c0 104 4332 0.0 2.69520000 2.680000e-13 Omega_c0 4332 0.00000000 + Omega_c~0 105 -4332 0.0 2.69520000 2.680000e-13 anti-Omega_c0 -4332 0.00000000 + Omega_c*0 498 4334 0.0 2.76590000 0.000000e+00 Omega_c*0 4334 0.00000000 + Omega_c*~0 499 -4334 0.0 2.76590000 0.000000e+00 anti-Omega_c*0 -4334 0.00000000 + Xi_cc+ 502 4412 1.0 3.62140000 0.800000e-13 Xi_cc+ 4412 0.00000000 + Xi_cc~- 503 -4412 -1.0 3.62140000 0.800000e-13 anti-Xi_cc- -4412 0.00000000 + Xi*_cc+ 504 4414 1.0 3.65648000 0.000000e+00 Xi_cc*+ 4414 0.00000000 + Xi*_cc~- 505 -4414 -1.0 3.65648000 0.000000e+00 anti-Xi_cc*- -4414 0.00000000 + Xi_cc++ 506 4422 2.0 3.62140000 2.560000e-13 Xi_cc++ 4422 0.00000000 + Xi_cc~-- 507 -4422 -2.0 3.62140000 2.560000e-13 anti-Xi_cc-- -4422 0.00000000 + Xi*_cc++ 508 4424 2.0 3.65648000 0.000000e+00 Xi_cc*++ 4424 0.00000000 + Xi*_cc~-- 509 -4424 -2.0 3.65648000 0.000000e+00 anti-Xi_cc*-- -4424 0.00000000 + Omega_cc+ 510 4432 1.0 3.73800000 1.600000e-13 Omega_cc+ 4432 0.00000000 + Omega_cc~- 511 -4432 -1.0 3.73800000 1.600000e-13 anti-Omega_cc- -4432 0.00000000 + Omega*_cc+ 512 4434 1.0 3.82466000 0.000000e+00 Omega_cc*+ 4434 0.00000000 + Omega*_cc~- 513 -4434 -1.0 3.82466000 0.000000e+00 anti-Omega_cc*- -4434 0.00000000 + Omega*_ccc++ 514 4444 2.0 4.91594000 0.000000e+00 Omega*_ccc++ 4444 0.00000000 + Omega*_ccc~-- 515 -4444 -2.0 4.91594000 0.000000e+00 anti-Omega*_ccc-- -4444 0.00000000 + Lambda_b0 79 5122 0.0 5.61960000 1.470865e-12 Lambda_b0 5122 0.00000000 + Lambda_b~0 80 -5122 0.0 5.61960000 1.470865e-12 anti-Lambda_b0 -5122 0.00000000 + Lambda_b(5912)0 1065 15122 0.0 5.91220000 1.316000e-21 Lambda_b(5912)0 15122 0.00000000 + Lambda_b(5912)~0 1066 -15122 0.0 5.91220000 1.316000e-21 anti-Lambda_b(5912)0 -15122 0.00000000 + Lambda_b(5920)0 1067 5124 0.0 5.91992000 1.316000e-21 Lambda_b(5920)0 5124 0.00000000 + Lambda_b(5920)~0 1068 -5124 0.0 5.91992000 1.316000e-21 anti-Lambda_b(5920)0 -5124 0.00000000 + Sigma_b- 114 5112 -1.0 5.81564000 1.343290e-22 Sigma_b- 5112 0.00000000 + Sigma_b~+ 115 -5112 1.0 5.81564000 1.343290e-22 anti-Sigma_b+ -5112 0.00000000 + Sigma_b0 112 5212 0.0 5.80780000 1.000000e-19 Sigma_b0 5212 0.00000000 + Sigma_b~0 113 -5212 0.0 5.80780000 1.000000e-19 anti-Sigma_b0 -5212 0.00000000 + Sigma_b+ 110 5222 1.0 5.81056000 1.316424e-22 Sigma_b+ 5222 0.00000000 + Sigma_b~- 111 -5222 -1.0 5.81056000 1.316424e-22 anti-Sigma_b- -5222 0.00000000 + Sigma_b*- 520 5114 -1.0 5.83474000 8.776160e-23 Sigma_b*- 5114 0.00000000 + Sigma_b*~+ 521 -5114 1.0 5.83474000 8.776160e-23 anti-Sigma_b*+ -5114 0.00000000 + Sigma_b*0 528 5214 0.0 5.82900000 0.000000e+00 Sigma_b*0 5214 0.00000000 + Sigma_b*~0 529 -5214 0.0 5.82900000 0.000000e+00 anti-Sigma_b*0 -5214 0.00000000 + Sigma_b*+ 530 5224 1.0 5.83032000 7.002255e-23 Sigma_b*+ 5224 0.00000000 + Sigma_b*~- 531 -5224 -1.0 5.83032000 7.002255e-23 anti-Sigma_b*- -5224 0.00000000 + Xi_b- 122 5132 -1.0 5.79700000 1.570912e-12 Xi_b- 5132 0.00000000 + Xi_b~+ 123 -5132 1.0 5.79700000 1.570912e-12 anti-Xi_b+ -5132 0.00000000 + Xi_b0 124 5232 0.0 5.79190000 1.490000e-12 Xi_b0 5232 0.00000000 + Xi_b~0 125 -5232 0.0 5.79190000 1.490000e-12 anti-Xi_b0 -5232 0.00000000 + Xi'_b- 116 5312 -1.0 5.96000000 1.000000e-19 Xi'_b- 5312 0.00000000 + Xi'_b~+ 117 -5312 1.0 5.96000000 1.000000e-19 anti-Xi'_b+ -5312 0.00000000 + Xi'_b0 118 5322 0.0 5.96000000 1.000000e-19 Xi'_b0 5322 0.00000000 + Xi'_b~0 119 -5322 0.0 5.96000000 1.000000e-19 anti-Xi'_b0 -5322 0.00000000 + Xi_b*- 538 5314 -1.0 5.97000000 0.000000e+00 Xi_b*- 5314 0.00000000 + Xi_b*~+ 539 -5314 1.0 5.97000000 0.000000e+00 anti-Xi_b*+ -5314 0.00000000 + Xi_b*0 540 5324 0.0 5.97000000 0.000000e+00 Xi_b*0 5324 0.00000000 + Xi_b*~0 541 -5324 0.0 5.97000000 0.000000e+00 anti-Xi_b*0 -5324 0.00000000 + Omega_b*- 542 5334 -1.0 6.13000000 0.000000e+00 Omega_b*- 5334 0.00000000 + Omega_b*~+ 543 -5334 1.0 6.13000000 0.000000e+00 anti-Omega_b*+ -5334 0.00000000 + Omega_b- 120 5332 -1.0 6.04610000 1.645530e-12 Omega_b- 5332 0.00000000 + Omega_b~+ 121 -5332 1.0 6.04610000 1.645530e-12 anti-Omega_b+ -5332 0.00000000 + Xi_bc0 522 5142 0.0 6.90000000 0.500000e-12 Xi_bc0 5142 0.00000000 + Xi_bc~0 523 -5142 0.0 6.90000000 0.500000e-12 anti-Xi_bc0 -5142 0.00000000 + Xi_bc+ 532 5242 1.0 6.90000000 0.500000e-12 Xi_bc+ 5242 0.00000000 + Xi_bc~- 533 -5242 -1.0 6.90000000 0.500000e-12 anti-Xi_bc- -5242 0.00000000 + Omega_bc0 544 5342 0.0 7.19099000 0.500000e-12 Omega_bc0 5342 0.00000000 + Omega_bc~0 545 -5342 0.0 7.19099000 0.500000e-12 anti-Omega_bc0 -5342 0.00000000 + Xi'_bc0 550 5412 0.0 7.03724000 0.000000e+00 Xi'_bc0 5412 0.00000000 + Xi'_bc~0 551 -5412 0.0 7.03724000 0.000000e+00 anti-Xi'_bc0 -5412 0.00000000 + Xi*_bc0 552 5414 0.0 7.04850000 0.000000e+00 Xi*_bc0 5414 0.00000000 + Xi*_bc~0 553 -5414 0.0 7.04850000 0.000000e+00 anti-Xi*_bc0 -5414 0.00000000 + Xi'_bc+ 554 5422 1.0 7.03724000 0.000000e+00 Xi'_bc+ 5422 0.00000000 + Xi'_bc~- 555 -5422 -1.0 7.03724000 0.000000e+00 anti-Xi'_bc- -5422 0.00000000 + Xi*_bc+ 556 5424 1.0 7.04850000 0.000000e+00 Xi*_bc+ 5424 0.00000000 + Xi*_bc~- 557 -5424 -1.0 7.04850000 0.000000e+00 anti-Xi*_bc+ -5424 0.00000000 + Omega'_bc0 558 5432 0.0 7.21101000 0.000000e+00 Omega'_bc0 5432 0.00000000 + Omega'_bc~0 559 -5432 0.0 7.21101000 0.000000e+00 anti-Omega'_bc0 -5432 0.00000000 + Omega*_bc0 560 5434 0.0 7.21900000 0.000000e+00 Omega*_bc0 5434 0.00000000 + Omega*_bc~0 561 -5434 0.0 7.21900000 0.000000e+00 anti-Omega*_bc0 -5434 0.00000000 + Omega_bcc+ 562 5442 1.0 8.30945000 1.290893e-12 Omega_bcc+ 5442 0.00000000 + Omega_bcc~- 563 -5442 -1.0 8.30945000 1.290893e-12 anti-Omega_bcc- -5442 0.00000000 + Omega*_bcc+ 564 5444 1.0 8.31325000 0.000000e+00 Omega*_bcc+ 5444 0.00000000 + Omega*_bcc~- 565 -5444 -1.0 8.31325000 0.000000e+00 anti-Omega*_bcc- -5444 0.00000000 + Xi_bb- 568 5512 -1.0 10.42272000 1.290893e-12 Xi_bb- 5512 0.00000000 + Xi_bb~+ 569 -5512 1.0 10.42272000 1.290893e-12 anti-Xi_bb+ -5512 0.00000000 + Xi*_bb- 570 5514 -1.0 10.44144000 0.000000e+00 Xi*_bb- 5514 0.00000000 + Xi*_bb~+ 571 -5514 1.0 10.44144000 0.000000e+00 anti-Xi*_bb+ -5514 0.00000000 + Xi_bb0 572 5522 0.0 10.42272000 1.290893e-12 Xi_bb0 5522 0.00000000 + Xi_bb~0 573 -5522 0.0 10.42272000 1.290893e-12 anti-Xi_bb0 -5522 0.00000000 + Xi*_bb0 574 5524 0.0 10.44144000 0.000000e+00 Xi*_bb0 5524 0.00000000 + Xi*_bb~0 575 -5524 0.0 10.44144000 0.000000e+00 anti-Xi*_bb0 -5524 0.00000000 + Omega_bb- 576 5532 -1.0 10.60209000 1.290893e-12 Omega_bb- 5532 0.00000000 + Omega_bb~+ 577 -5532 1.0 10.60209000 1.290893e-12 anti-Omega_bb+ -5532 0.00000000 + Omega*_bb- 578 5534 -1.0 10.61426000 0.000000e+00 Omega*_bb- 5534 0.00000000 + Omega*_bb~+ 579 -5534 1.0 10.61426000 0.000000e+00 anti-Omega*_bb+ -5534 0.00000000 + Omega_bbc0 580 5542 0.0 11.70767000 1.290893e-12 Omega_bbc0 5542 0.00000000 + Omega_bbc~0 581 -5542 0.0 11.70767000 1.290893e-12 anti-Omega_bbc0 -5542 0.00000000 + Omega*_bbc0 582 5544 0.0 11.71147000 0.000000e+00 Omega*_bbc0 5544 0.00000000 + Omega*_bbc~0 583 -5544 0.0 11.71147000 0.000000e+00 anti-Omega*_bbc0 -5544 0.00000000 + Omega*_bbb- 584 5554 -1.0 15.11061000 0.000000e+00 Omega*_bbb- 5554 0.00000000 + Omega*_bbb~+ 585 -5554 1.0 15.11061000 0.000000e+00 anti-Omega*_bbb+ -5554 0.00000000 + deuteron 45 1000010020 1.0 1.87561300 1.000000e+15 deuteron 0 0.00000000 + triton 46 1000010030 1.0 2.80925000 1.000000e+15 tritium 0 0.00000000 + alpha 47 1000020040 2.0 3.72741700 1.000000e+15 alpha 0 0.00000000 + geantino 48 480000000 0.0 0.00000000 1.000000e+15 geantino 0 0.00000000 + opticalphoton 50 20022 0.0 0.00000000 1.000000e+16 Cerenkov 0 0.00000000 + H_10 87 25 0.0 125.10000000 9.400000e-26 Higgs0 25 0.00000000 + H_20 88 35 0.0 310.00000000 9.400000e-26 Higgs'0 35 0.00000000 + H_30 89 36 0.0 310.00000000 9.400000e-26 A0 36 0.00000000 + H+ 90 37 1.0 310.00000000 9.400000e-26 Higgs+ 37 0.00000000 + H- 91 -37 -1.0 310.00000000 9.400000e-26 Higgs- -37 0.00000000 + d 303 1 -0.3 0.00990000 0.000000e+00 d 1 0.00000000 + anti-d 304 -1 0.3 0.00990000 0.000000e+00 anti-d -1 0.00000000 + u 305 2 0.7 0.00560000 0.000000e+00 u 2 0.00000000 + anti-u 306 -2 -0.7 0.00560000 0.000000e+00 anti-u -2 0.00000000 + s 307 3 -0.3 0.19900000 0.000000e+00 s 3 0.00000000 + anti-s 308 -3 0.3 0.19900000 0.000000e+00 anti-s -3 0.00000000 + c 309 4 0.7 1.35000000 0.000000e+00 c 4 0.00000000 + anti-c 310 -4 -0.7 1.35000000 0.000000e+00 anti-c -4 0.00000000 + b 311 5 -0.3 5.00000000 0.000000e+00 b 5 0.00000000 + anti-b 312 -5 0.3 5.00000000 0.000000e+00 anti-b -5 0.00000000 + t 313 6 0.7 173.50000000 3.291061e-25 t 6 0.00000000 + anti-t 314 -6 -0.7 173.50000000 3.291061e-25 anti-t -6 0.00000000 + b' 315 7 -0.3 400.00000000 0.000000e+00 b' 7 0.00000000 + anti-b' 316 -7 0.3 400.00000000 0.000000e+00 anti-b' -7 0.00000000 + t' 317 8 0.7 500.00000000 0.000000e+00 t' 8 0.00000000 + anti-t' 318 -8 -0.7 500.00000000 0.000000e+00 anti-t' -8 0.00000000 + nu_tau 319 16 0.0 0.00000000 1.000000e+16 nu_tau 16 0.00000000 + nu_tau~ 320 -16 0.0 0.00000000 1.000000e+16 anti-nu_tau -16 0.00000000 + L- 321 17 -1.0 400.00000000 0.000000e+00 L- 17 0.00000000 + L+ 322 -17 1.0 400.00000000 0.000000e+00 L+ -17 0.00000000 + nu_L 323 18 0.0 0.00000000 0.000000e+00 nu_L 18 0.00000000 + anti-nu_L 324 -18 0.0 0.00000000 0.000000e+00 anti-nu_L -18 0.00000000 + g 325 21 0.0 0.00000000 1.000000e+16 g 21 0.00000000 + Z'0 326 32 0.0 500.00000000 0.000000e+00 Z'0 32 0.00000000 + Z''0 327 33 0.0 900.00000000 0.000000e+00 Z''0 33 0.00000000 + W'+ 328 34 1.0 500.00000000 0.000000e+00 W'+ 34 0.00000000 + W'- 329 -34 -1.0 500.00000000 0.000000e+00 W'- -34 0.00000000 + Graviton 330 39 0.0 0.00000000 0.000000e+00 unknown 39 0.00000000 + R0 331 41 0.0 5000.00000000 0.000000e+00 R0 41 0.00000000 + anti-R0 332 -41 0.0 5000.00000000 0.000000e+00 anti-R0 -41 0.00000000 + LQ_ue 333 42 -0.3 200.00000000 0.000000e+00 unknown 42 0.00000000 + LQ_uebar 334 -42 0.3 200.00000000 0.000000e+00 unknown -42 0.00000000 + Xu0 335 43 0.0 1.00000000 0.000000e+00 Xu0 43 0.00000000 + Xu+ 336 44 1.0 1.00000000 0.000000e+00 Xu+ 44 0.00000000 + Xu- 337 -44 -1.0 1.00000000 0.000000e+00 Xu- -44 0.00000000 + specflav 338 81 0.0 0.00000000 0.000000e+00 specflav 81 0.00000000 + rndmflav 339 82 0.0 0.00000000 0.000000e+00 rndmflav 82 0.00000000 + anti-rndmflav 340 -82 0.0 0.00000000 0.000000e+00 anti-rndmflav -82 0.00000000 + phasespa 341 83 0.0 1.00000000 0.000000e+00 phasespa 83 0.00000000 + c-hadron 342 84 0.7 2.00000000 3.335641e-13 c-hadron 84 0.00000000 + anti-c-hadron 343 -84 -0.7 2.00000000 3.335641e-13 anti-c-hadron -84 0.00000000 + b-hadron 344 85 -0.3 5.00000000 1.290893e-12 b-hadron 85 0.00000000 + anti-b-hadron 345 -85 0.3 5.00000000 1.290893e-12 anti-b-hadron -85 0.00000000 + t-hadron 346 86 0.7 175.00000000 0.000000e+00 t-hadron 0 0.00000000 + anti-t-hadron 347 -86 -0.7 175.00000000 0.000000e+00 anti-t-hadron 0 0.00000000 + b'-hadron 348 87 -0.3 400.00000000 0.000000e+00 b'-hadron 0 0.00000000 + anti-b'-hadron 349 -87 0.3 400.00000000 0.000000e+00 anti-b'-hadron 0 0.00000000 + junction 350 88 0.0 0.00000000 0.000000e+00 junction 88 0.00000000 + system 351 90 0.0 0.00000000 0.000000e+00 system 90 0.00000000 + cluster 352 91 0.0 0.00000000 0.000000e+00 cluster 91 0.00000000 + string 353 92 0.0 0.00000000 0.000000e+00 string 92 0.00000000 + indep 354 93 0.0 0.00000000 0.000000e+00 indep 93 0.00000000 + CMshower 355 94 0.0 0.00000000 0.000000e+00 CMshower 94 0.00000000 + SPHEaxis 356 95 0.0 0.00000000 0.000000e+00 SPHEaxis 95 0.00000000 + THRUaxis 357 96 0.0 0.00000000 0.000000e+00 THRUaxis 96 0.00000000 + CLUSjet 358 97 0.0 0.00000000 0.000000e+00 CLUSjet 97 0.00000000 + CELLjet 359 98 0.0 0.00000000 0.000000e+00 CELLjet 98 0.00000000 + table 360 99 0.0 0.00000000 0.000000e+00 table 99 0.00000000 + deuteron~ 390 -1000010020 -1.0 1.87561300 1.000000e+15 anti-deuteron 0 0.00000000 + triton~ 392 -1000010030 -1.0 2.80925000 1.000000e+15 anti-tritium 0 0.00000000 + alpha~ 393 -1000020040 -2.0 3.72741700 1.000000e+15 anti-alpha 0 0.00000000 + dd_1 394 1103 -0.7 0.00000000 0.000000e+00 dd_1 1103 0.00000000 + anti-dd_1 395 -1103 0.7 0.00000000 0.000000e+00 anti-dd_1 -1103 0.00000000 + ud_0 410 2101 0.3 0.00000000 0.000000e+00 ud_0 2101 0.00000000 + anti-ud_0 411 -2101 -0.3 0.00000000 0.000000e+00 anti-ud_0 -2101 0.00000000 + ud_1 412 2103 0.3 0.00000000 0.000000e+00 ud_1 2103 0.00000000 + anti-ud_1 413 -2103 -0.3 0.00000000 0.000000e+00 anti-ud_1 -2103 0.00000000 + uu_1 426 2203 1.3 0.00000000 0.000000e+00 uu_1 2203 0.00000000 + anti-uu_1 427 -2203 -1.3 0.00000000 0.000000e+00 anti-uu_1 -2203 0.00000000 + sd_0 438 3101 -0.7 0.00000000 0.000000e+00 sd_0 3101 0.00000000 + anti-sd_0 439 -3101 0.7 0.00000000 0.000000e+00 anti-sd_0 -3101 0.00000000 + sd_1 440 3103 -0.7 0.00000000 0.000000e+00 sd_1 3103 0.00000000 + anti-sd_1 441 -3103 0.7 0.00000000 0.000000e+00 anti-sd_1 -3103 0.00000000 + su_0 454 3201 0.3 0.00000000 0.000000e+00 su_0 3201 0.00000000 + anti-su_0 455 -3201 -0.3 0.00000000 0.000000e+00 anti-su_0 -3201 0.00000000 + su_1 456 3203 0.3 0.00000000 0.000000e+00 su_1 3203 0.00000000 + anti-su_1 457 -3203 -0.3 0.00000000 0.000000e+00 anti-su_1 -3203 0.00000000 + ss_1 470 3303 -0.7 0.00000000 0.000000e+00 ss_1 3303 0.00000000 + anti-ss_1 471 -3303 0.7 0.00000000 0.000000e+00 anti-ss_1 -3303 0.00000000 + cd_0 476 4101 0.3 0.00000000 0.000000e+00 cd_0 4101 0.00000000 + anti-cd_0 477 -4101 -0.3 0.00000000 0.000000e+00 anti-cd_0 -4101 0.00000000 + cd_1 478 4103 0.3 0.00000000 0.000000e+00 cd_1 4103 0.00000000 + anti-cd_1 479 -4103 -0.3 0.00000000 0.000000e+00 anti-cd_1 -4103 0.00000000 + cu_0 482 4201 1.3 0.00000000 0.000000e+00 cu_0 4201 0.00000000 + anti-cu_0 483 -4201 -1.3 0.00000000 0.000000e+00 anti-cu_0 -4201 0.00000000 + cu_1 484 4203 1.3 0.00000000 0.000000e+00 cu_1 4203 0.00000000 + anti-cu_1 485 -4203 -1.3 0.00000000 0.000000e+00 anti-cu_1 -4203 0.00000000 + cs_0 490 4301 0.3 0.00000000 0.000000e+00 cs_0 4301 0.00000000 + anti-cs_0 491 -4301 -0.3 0.00000000 0.000000e+00 anti-cs_0 -4301 0.00000000 + cs_1 492 4303 0.3 0.00000000 0.000000e+00 cs_1 4303 0.00000000 + anti-cs_1 493 -4303 -0.3 0.00000000 0.000000e+00 anti-cs_1 -4303 0.00000000 + cc_1 500 4403 1.3 0.00000000 0.000000e+00 cc_1 4403 0.00000000 + anti-cc_1 501 -4403 -1.3 0.00000000 0.000000e+00 anti-cc_1 -4403 0.00000000 + bd_0 516 5101 -0.7 0.00000000 0.000000e+00 bd_0 5101 0.00000000 + anti-bd_0 517 -5101 0.7 0.00000000 0.000000e+00 anti-bd_0 -5101 0.00000000 + bd_1 518 5103 -0.7 0.00000000 0.000000e+00 bd_1 5103 0.00000000 + anti-bd_1 519 -5103 0.7 0.00000000 0.000000e+00 anti-bd_1 -5103 0.00000000 + bu_0 524 5201 0.3 0.00000000 0.000000e+00 bu_0 5201 0.00000000 + anti-bu_0 525 -5201 -0.3 0.00000000 0.000000e+00 anti-bu_0 -5201 0.00000000 + bu_1 526 5203 0.3 0.00000000 0.000000e+00 bu_1 5203 0.00000000 + anti-bu_1 527 -5203 -0.3 0.00000000 0.000000e+00 anti-bu_1 -5203 0.00000000 + bs_0 534 5301 -0.7 0.00000000 0.000000e+00 bs_0 5301 0.00000000 + anti-bs_0 535 -5301 0.7 0.00000000 0.000000e+00 anti-bs_0 -5301 0.00000000 + bs_1 536 5303 -0.7 0.00000000 0.000000e+00 bs_1 5303 0.00000000 + anti-bs_1 537 -5303 0.7 0.00000000 0.000000e+00 anti-bs_1 -5303 0.00000000 + bc_0 546 5401 0.3 0.00000000 0.000000e+00 bc_0 5401 0.00000000 + anti-bc_0 547 -5401 -0.3 0.00000000 0.000000e+00 anti-bc_0 -5401 0.00000000 + bc_1 548 5403 0.3 0.00000000 0.000000e+00 bc_1 5403 0.00000000 + anti-bc_1 549 -5403 -0.3 0.00000000 0.000000e+00 anti-bc_1 -5403 0.00000000 + bb_1 566 5503 -0.7 0.00000000 0.000000e+00 bb_1 5503 0.00000000 + anti-bb_1 567 -5503 0.7 0.00000000 0.000000e+00 anti-bb_1 -5503 0.00000000 + vpho 586 10022 0.0 0.00000000 0.000000e+00 vpho 0 0.00000000 + Xsd 751 30343 0.0 1.60000000 0.000000e+00 Xsd 30343 0.00000000 + anti-Xsd 752 -30343 0.0 1.60000000 0.000000e+00 anti-Xsd -30343 0.00000000 + Xsu 753 30353 1.0 1.60000000 0.000000e+00 Xsu 30353 0.00000000 + anti-Xsu 754 -30353 -1.0 1.60000000 0.000000e+00 anti-Xsu -30353 0.00000000 + Xss 755 30363 0.0 1.80000000 0.000000e+00 Xss 30363 0.00000000 + anti-Xss 756 -30363 0.0 1.80000000 0.000000e+00 anti-Xss -30363 0.00000000 + ~d_L 859 1000001 -0.3 500.00000000 0.000000e+00 unknown 1000001 0.00000000 + ~d_Lbar 860 -1000001 0.3 500.00000000 0.000000e+00 unknown -1000001 0.00000000 + ~u_L 861 1000002 0.7 500.00000000 0.000000e+00 unknown 1000002 0.00000000 + ~u_Lbar 862 -1000002 -0.7 500.00000000 0.000000e+00 unknown -1000002 0.00000000 + ~s_L 863 1000003 -0.3 500.00000000 0.000000e+00 unknown 1000003 0.00000000 + ~s_Lbar 864 -1000003 0.3 500.00000000 0.000000e+00 unknown -1000003 0.00000000 + ~c_L 865 1000004 0.7 500.00000000 0.000000e+00 unknown 1000004 0.00000000 + ~c_Lbar 866 -1000004 -0.7 500.00000000 0.000000e+00 unknown -1000004 0.00000000 + ~b_1 867 1000005 -0.3 500.00000000 0.000000e+00 unknown 1000005 0.00000000 + ~b_1bar 868 -1000005 0.3 500.00000000 0.000000e+00 unknown -1000005 0.00000000 + ~t_1 869 1000006 0.7 500.00000000 0.000000e+00 unknown 1000006 0.00000000 + ~t_1bar 870 -1000006 -0.7 500.00000000 0.000000e+00 unknown -1000006 0.00000000 + ~e_L- 871 1000011 -1.0 500.00000000 0.000000e+00 unknown 1000011 0.00000000 + ~e_L+ 872 -1000011 1.0 500.00000000 0.000000e+00 unknown -1000011 0.00000000 + ~nu_eL 873 1000012 0.0 500.00000000 0.000000e+00 unknown 1000012 0.00000000 + ~nu_eLbar 874 -1000012 0.0 500.00000000 0.000000e+00 unknown -1000012 0.00000000 + ~mu_L- 875 1000013 -1.0 500.00000000 0.000000e+00 unknown 1000013 0.00000000 + ~mu_L+ 876 -1000013 1.0 500.00000000 0.000000e+00 unknown -1000013 0.00000000 + ~nu_muL 877 1000014 0.0 500.00000000 0.000000e+00 unknown 1000014 0.00000000 + ~nu_muLbar 878 -1000014 0.0 500.00000000 0.000000e+00 unknown -1000014 0.00000000 + ~tau_1- 879 1000015 -1.0 500.00000000 0.000000e+00 unknown 1000015 0.00000000 + ~tau_1+ 880 -1000015 1.0 500.00000000 0.000000e+00 unknown -1000015 0.00000000 + ~nu_tauL 881 1000016 0.0 500.00000000 0.000000e+00 unknown 1000016 0.00000000 + ~nu_tauLbar 882 -1000016 0.0 500.00000000 0.000000e+00 unknown -1000016 0.00000000 + ~g 883 1000021 0.0 500.00000000 0.000000e+00 unknown 1000021 0.00000000 + ~chi_10 884 1000022 0.0 500.00000000 0.000000e+00 unknown 1000022 0.00000000 + ~chi_20 885 1000023 0.0 500.00000000 0.000000e+00 unknown 1000023 0.00000000 + ~chi_1+ 886 1000024 1.0 500.00000000 0.000000e+00 unknown 1000024 0.00000000 + ~chi_1- 887 -1000024 -1.0 500.00000000 0.000000e+00 unknown -1000024 0.00000000 + ~chi_30 888 1000025 0.0 500.00000000 0.000000e+00 unknown 1000025 0.00000000 + ~chi_40 889 1000035 0.0 500.00000000 0.000000e+00 unknown 1000035 0.00000000 + ~chi_2+ 890 1000037 1.0 500.00000000 0.000000e+00 unknown 1000037 0.00000000 + ~chi_2- 891 -1000037 -1.0 500.00000000 0.000000e+00 unknown -1000037 0.00000000 + ~Gravitino 892 1000039 0.0 500.00000000 0.000000e+00 unknown 1000039 0.00000000 + ~d_R 893 2000001 -0.3 500.00000000 0.000000e+00 unknown 2000001 0.00000000 + ~d_Rbar 894 -2000001 0.3 500.00000000 0.000000e+00 unknown -2000001 0.00000000 + ~u_R 895 2000002 0.7 500.00000000 0.000000e+00 unknown 2000002 0.00000000 + ~u_Rbar 896 -2000002 -0.7 500.00000000 0.000000e+00 unknown -2000002 0.00000000 + ~s_R 897 2000003 -0.3 500.00000000 0.000000e+00 unknown 2000003 0.00000000 + ~s_Rbar 898 -2000003 0.3 500.00000000 0.000000e+00 unknown -2000003 0.00000000 + ~c_R 899 2000004 0.7 500.00000000 0.000000e+00 unknown 2000004 0.00000000 + ~c_Rbar 900 -2000004 -0.7 500.00000000 0.000000e+00 unknown -2000004 0.00000000 + ~b_2 901 2000005 -0.3 500.00000000 0.000000e+00 unknown 2000005 0.00000000 + ~b_2bar 902 -2000005 0.3 500.00000000 0.000000e+00 unknown -2000005 0.00000000 + ~t_2 903 2000006 0.7 500.00000000 0.000000e+00 unknown 2000006 0.00000000 + ~t_2bar 904 -2000006 -0.7 500.00000000 0.000000e+00 unknown -2000006 0.00000000 + ~e_R- 905 2000011 -1.0 500.00000000 0.000000e+00 unknown 2000011 0.00000000 + ~e_R+ 906 -2000011 1.0 500.00000000 0.000000e+00 unknown -2000011 0.00000000 + ~nu_eR 907 2000012 0.0 500.00000000 0.000000e+00 unknown 2000012 0.00000000 + ~nu_eRbar 908 -2000012 0.0 500.00000000 0.000000e+00 unknown -2000012 0.00000000 + ~mu_R- 909 2000013 -1.0 500.00000000 0.000000e+00 unknown 2000013 0.00000000 + ~mu_R+ 910 -2000013 1.0 500.00000000 0.000000e+00 unknown -2000013 0.00000000 + ~nu_muR 911 2000014 0.0 500.00000000 0.000000e+00 unknown 2000014 0.00000000 + ~nu_muRbar 912 -2000014 0.0 500.00000000 0.000000e+00 unknown -2000014 0.00000000 + ~tau_2- 913 2000015 -1.0 500.00000000 0.000000e+00 unknown 2000015 0.00000000 + ~tau_2+ 914 -2000015 1.0 500.00000000 0.000000e+00 unknown -2000015 0.00000000 + ~nu_tauR 915 2000016 0.0 500.00000000 0.000000e+00 unknown 2000016 0.00000000 + ~nu_tauRbar 916 -2000016 0.0 500.00000000 0.000000e+00 unknown -2000016 0.00000000 + pi_tc0 917 3000111 0.0 110.00000000 0.000000e+00 unknown 3000111 0.00000000 + rho_tc0 918 3000113 0.0 210.00000000 0.000000e+00 unknown 3000113 0.00000000 + pi_tc+ 919 3000211 1.0 110.00000000 0.000000e+00 unknown 3000211 0.00000000 + pi_tc- 920 -3000211 -1.0 110.00000000 0.000000e+00 unknown -3000211 0.00000000 + rho_tc+ 921 3000213 1.0 210.00000000 0.000000e+00 unknown 3000213 0.00000000 + rho_tc- 922 -3000213 -1.0 210.00000000 0.000000e+00 unknown -3000213 0.00000000 + pi'_tc0 923 3000221 0.0 110.00000000 0.000000e+00 unknown 3000221 0.00000000 + omega_tc 924 3000223 0.0 210.00000000 0.000000e+00 unknown 3000223 0.00000000 + eta_tc0 925 3000331 0.0 350.00000000 0.000000e+00 unknown 3000331 0.00000000 + V8_tc 926 3100021 0.0 500.00000000 0.000000e+00 unknown 3100021 0.00000000 + pi_22_1_tc 927 3100111 0.0 125.00000000 0.000000e+00 unknown 3100111 0.00000000 + rho_11_tc 928 3100113 0.0 400.00000000 0.000000e+00 unknown 3100113 0.00000000 + pi_22_8_tc 929 3200111 0.0 250.00000000 0.000000e+00 unknown 3200111 0.00000000 + rho_12_tc 930 3200113 0.0 350.00000000 0.000000e+00 unknown 3200113 0.00000000 + rho_21_tc 931 3300113 0.0 350.00000000 0.000000e+00 unknown 3300113 0.00000000 + rho_22_tc 932 3400113 0.0 300.00000000 0.000000e+00 unknown 3400113 0.00000000 + d* 933 4000001 -0.3 400.00000000 0.000000e+00 unknown 4000001 0.00000000 + d*bar 934 -4000001 0.3 400.00000000 0.000000e+00 unknown -4000001 0.00000000 + u* 935 4000002 0.7 400.00000000 0.000000e+00 unknown 4000002 0.00000000 + u*bar 936 -4000002 -0.7 400.00000000 0.000000e+00 unknown -4000002 0.00000000 + e*- 937 4000011 -1.0 400.00000000 0.000000e+00 unknown 4000011 0.00000000 + e*bar+ 938 -4000011 1.0 400.00000000 0.000000e+00 unknown -4000011 0.00000000 + nu*_e0 939 4000012 0.0 400.00000000 0.000000e+00 unknown 4000012 0.00000000 + nu*_ebar0 940 -4000012 0.0 400.00000000 0.000000e+00 unknown -4000012 0.00000000 + gv 4900021 4900021 0.0 0.00000000 0.0000e+00 gv 4900021 0.00000000 + Zv 4900023 4900023 0.0 125.00000000 6.5800e-23 Zv 4900023 0.01000000 + qv 4900101 4900101 0.0 1.00000000 0.0000e+00 qv 4900101 0.00000000 + qvbar -4900101 -4900101 0.0 1.00000000 0.0000e+00 qvbar -4900101 0.00000000 + pivDiag 4900111 4900111 0.0 1.20000000 5.0000e-12 pivDiag 4900111 2.0000e-11 + pivUp 4900211 4900211 0.0 1.20000000 0.0000e+00 pivUp 4900211 0.00000000 + pivDn -4900211 -4900211 0.0 1.20000000 0.0000e+00 pivDn -4900211 0.00000000 + rhovDiag 4900113 4900113 0.0 1.20000000 0.0000e+00 rhovDiag 4900113 0.00000000 + rhovUp 4900213 4900213 0.0 1.20000000 0.0000e+00 rhovUp 4900213 0.00000000 + rhovDn -4900213 -4900213 0.0 1.20000000 0.0000e+00 rhovDn -4900213 0.00000000 + Graviton* 941 5000039 0.0 1000.00000000 0.000000e+00 unknown 5000039 0.00000000 + nu_Re 942 9900012 0.0 500.00000000 0.000000e+00 unknown 9900012 0.00000000 + nu_Rmu 943 9900014 0.0 500.00000000 0.000000e+00 unknown 9900014 0.00000000 + nu_Rtau 944 9900016 0.0 500.00000000 0.000000e+00 unknown 9900016 0.00000000 + Z_R0 945 9900023 0.0 1200.00000000 0.000000e+00 unknown 9900023 0.00000000 + W_R+ 946 9900024 1.0 750.00000000 0.000000e+00 unknown 9900024 0.00000000 + W_R- 947 -9900024 -1.0 750.00000000 0.000000e+00 unknown -9900024 0.00000000 + H_L++ 948 9900041 2.0 200.00000000 0.000000e+00 unknown 9900041 0.00000000 + H_L-- 949 -9900041 -2.0 200.00000000 0.000000e+00 unknown -9900041 0.00000000 + H_R++ 950 9900042 2.0 200.00000000 0.000000e+00 unknown 9900042 0.00000000 + H_R-- 951 -9900042 -2.0 200.00000000 0.000000e+00 unknown -9900042 0.00000000 + He3[0.0] 49 1000020030 2.0 2.80923000 1.000000e+15 He3 0 0.00000000 + He3~[0.0] 391 -1000020030 -2.0 2.80923000 1.000000e+15 anti-He3 0 0.00000000 + Li7[0.0] 988 1000030070 3.0 6.53536500 0.000000e+00 unknown 0 0.00000000 + Be8[0.0] 992 1000040080 4.0 7.45689300 0.000000e+00 unknown 0 0.00000000 + Be9[0.0] 959 1000040090 4.0 8.39479200 0.000000e+00 unknown 0 0.00000000 + Be10[0.0] 993 1000040100 4.0 9.32754500 0.000000e+00 unknown 0 0.00000000 + B10[0.0] 994 1000050100 5.0 9.32698900 0.000000e+00 unknown 0 0.00000000 + B11[0.0] 974 1000050110 5.0 10.25510100 0.000000e+00 unknown 0 0.00000000 + B12[0.0] 975 1000050120 5.0 11.19129500 0.000000e+00 unknown 0 0.00000000 + C12[0.0] 953 1000060120 6.0 11.17490000 0.000000e+00 unknown 0 0.00000000 + C13[0.0] 976 1000060130 6.0 12.11254500 0.000000e+00 unknown 0 0.00000000 + C14[0.0] 977 1000060140 6.0 13.04393400 0.000000e+00 unknown 0 0.00000000 + N14[0.0] 955 1000070140 7.0 13.04378000 0.000000e+00 unknown 0 0.00000000 + N15[0.0] 982 1000070150 7.0 13.04377800 0.000000e+00 unknown 0 0.00000000 + N16[0.0] 995 1000070160 7.0 14.90958500 0.000000e+00 unknown 0 0.00000000 + O16[0.0] 956 1000080160 8.0 14.89510000 0.000000e+00 unknown 0 0.00000000 + O17[0.0] 996 1000080170 8.0 15.83458700 0.000000e+00 unknown 0 0.00000000 + O18[0.0] 967 1000080180 8.0 16.76610800 0.000000e+00 unknown 0 0.00000000 + O19[0.0] 997 1000080190 8.0 17.70171700 0.000000e+00 unknown 0 0.00000000 + F19[0.0] 960 1000090190 9.0 17.69689600 0.000000e+00 unknown 0 0.00000000 + Ne22[0.0] 983 1000100220 10.0 20.48484100 0.000000e+00 unknown 0 0.00000000 + Ne23[0.0] 998 1000100230 10.0 21.41920500 0.000000e+00 unknown 0 0.00000000 + Na24[0.0] 999 1000110240 11.0 22.34743500 0.000000e+00 unknown 0 0.00000000 + Mg24[0.0] 979 1000120240 12.0 22.34192000 0.000000e+00 unknown 0 0.00000000 + Mg25[0.0] 989 1000120250 12.0 23.27415400 0.000000e+00 unknown 0 0.00000000 + Mg26[0.0] 980 1000120260 12.0 24.20262600 0.000000e+00 unknown 0 0.00000000 + Mg27[0.0] 981 1000120270 12.0 25.13574800 0.000000e+00 unknown 0 0.00000000 + Al27[0.0] 952 1000130270 13.0 25.12650000 0.000000e+00 unknown 0 0.00000000 + Al28[0.0] 972 1000130280 13.0 26.06497800 0.000000e+00 unknown 0 0.00000000 + Si28[0.0] 957 1000140280 14.0 26.05320000 0.000000e+00 unknown 0 0.00000000 + Si29[0.0] 964 1000140290 14.0 26.99142700 0.000000e+00 unknown 0 0.00000000 + Si30[0.0] 968 1000140300 14.0 27.92038300 0.000000e+00 unknown 0 0.00000000 + P31[0.0] 1000 1000150310 15.0 28.85186900 0.000000e+00 unknown 0 0.00000000 + Cl39[0.0] 1001 1000170390 17.0 36.29846000 0.000000e+00 unknown 0 0.00000000 + Cl40[0.0] 1002 1000170400 17.0 37.23220100 0.000000e+00 unknown 0 0.00000000 + Ar36[0.0] 1003 1000180360 18.0 33.50354900 0.000000e+00 unknown 0 0.00000000 + Ar40[0.0] 973 1000180400 18.0 37.22471500 0.000000e+00 unknown 0 0.00000000 + Cr50[0.0] 1004 1000240500 24.0 46.52443900 0.000000e+00 unknown 0 0.00000000 + Cr52[0.0] 978 1000240520 24.0 48.37010000 0.000000e+00 unknown 0 0.00000000 + Cr53[0.0] 990 1000240530 24.0 49.31389400 0.000000e+00 unknown 0 0.00000000 + Cr54[0.0] 1005 1000240540 24.0 50.24374100 0.000000e+00 unknown 0 0.00000000 + Mn55[0.0] 991 1000250550 25.0 51.17445700 0.000000e+00 unknown 0 0.00000000 + Fe54[0.0] 966 1000260540 26.0 50.24442100 0.000000e+00 unknown 0 0.00000000 + Fe56[0.0] 961 1000260560 26.0 52.10305600 0.000000e+00 unknown 0 0.00000000 + Fe57[0.0] 969 1000260570 26.0 53.03497500 0.000000e+00 unknown 0 0.00000000 + Fe59[0.0] 1006 1000260590 26.0 54.89748000 0.000000e+00 unknown 0 0.00000000 + Ni58[0.0] 984 1000280580 28.0 53.96642200 0.000000e+00 unknown 0 0.00000000 + Ni60[0.0] 985 1000280600 28.0 55.82516400 0.000000e+00 unknown 0 0.00000000 + Ni61[0.0] 1007 1000280610 28.0 56.75690900 0.000000e+00 unknown 0 0.00000000 + Ni62[0.0] 986 1000280620 28.0 57.68587700 0.000000e+00 unknown 0 0.00000000 + Ni63[0.0] 1008 1000280630 28.0 58.61860500 0.000000e+00 unknown 0 0.00000000 + Ni64[0.0] 987 1000280640 28.0 59.54851200 0.000000e+00 unknown 0 0.00000000 + Cu63[0.0] 954 1000290630 29.0 58.61860000 0.000000e+00 unknown 0 0.00000000 + Cu65[0.0] 958 1000290650 29.0 60.47984200 0.000000e+00 unknown 0 0.00000000 + Mo92[0.0] 1009 1000420920 42.0 85.61063000 0.000000e+00 unknown 0 0.00000000 + Mo95[0.0] 1010 1000420950 42.0 88.40421000 0.000000e+00 unknown 0 0.00000000 + Mo96[0.0] 1011 1000420960 42.0 89.33462100 0.000000e+00 unknown 0 0.00000000 + Mo97[0.0] 1012 1000420970 42.0 90.26736500 0.000000e+00 unknown 0 0.00000000 + Mo98[0.0] 1013 1000420980 42.0 91.19828700 0.000000e+00 unknown 0 0.00000000 + Mo100[0.0] 1014 1000421000 42.0 93.06320300 0.000000e+00 unknown 0 0.00000000 + Pd108[0.0] 1015 1000461080 46.0 100.51181600 0.000000e+00 unknown 0 0.00000000 + Au197[0.0] 1020 1000791970 79.0 183.43336000 0.000000e+00 unknown 0 0.00000000 + Pb207[0.0] 962 1000822070 82.0 192.79676500 0.000000e+00 unknown 0 0.00000000 + Pb208[0.0] 963 1000822080 82.0 193.72896200 0.000000e+00 unknown 0 0.00000000 + Pb206[0.0] 965 1000822060 82.0 191.86393700 0.000000e+00 unknown 0 0.00000000 + Pb204[0.0] 970 1000822040 82.0 189.99962700 0.000000e+00 unknown 0 0.00000000 + Intermediate 971 -99000000 0.0 0.00000000 0.000000e+00 unknown 0 0.00000000 +# +END PARTICLE diff --git a/GaudiPartProp/python/GaudiPartProp/tests.py b/GaudiPartProp/python/GaudiPartProp/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..1697d56bf93296256493c69733e46013ad638f9b --- /dev/null +++ b/GaudiPartProp/python/GaudiPartProp/tests.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +# ============================================================================= +## @file GaudiPartProp/tests.py +# The set of basic tests for objects from GaudiPartProp package +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-01 +# ============================================================================= +""" +The set of basic decorators for objects from GaudiPartProp package +""" + +# ============================================================================= +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +__version__ = "" +# ============================================================================= + +from GaudiPartProp.decorators import Gaudi + +pp1 = Gaudi.ParticleProperty("NAME1", Gaudi.ParticleID(121), 1.0, 501.0, 0.1, 0.001) +pp2 = Gaudi.ParticleProperty("NAME2", Gaudi.ParticleID(122), -1, 502.0, 0.1, 0.001) +pp3 = Gaudi.ParticleProperty("NAME3", Gaudi.ParticleID(123), 0, 503.0, 0.1, 0.001) + +pp1.setAntiParticle(pp2) +pp2.setAntiParticle(pp1) + +lst = [pp3, pp2, pp1] + +v1 = Gaudi.Interfaces.IParticlePropertySvc.ParticleProperties() + +v1.fromLst(lst) + +for pp in v1: + print(pp) + +print(v1) + +lst.sort() +v1.clear() +v1.fromLst(lst) +print(v1) + +pid1 = Gaudi.ParticleID(121) +pid2 = Gaudi.ParticleID(122) +pid3 = Gaudi.ParticleID(123) + +lst2 = [pid3, pid2, pid1] + +v2 = Gaudi.ParticleIDs() +v2.fromLst(lst2) +print(v2) + +lst2.sort() + +v2 = Gaudi.ParticleIDs() +v2.fromLst(lst2) +print(v2) + +for pid in lst2: + print(pid, pid.pid()) + + +def checkPID(pid): + print(pid) + print(" isValid ", pid.isValid()) + print(" isMeson ", pid.isMeson()) + print(" isBaryon ", pid.isBaryon()) + print(" isDiQuark ", pid.isDiQuark()) + print(" isHadron ", pid.isHadron()) + print(" isLepton ", pid.isLepton()) + print(" isNucleus ", pid.isNucleus()) + print(" hasUp ", pid.hasUp()) + print(" hasDown ", pid.hasDown()) + print(" hasStrange ", pid.hasStrange()) + print(" hasCharm ", pid.hasCharm()) + print(" hasBottom ", pid.hasBottom()) + print(" hasTop ", pid.hasTop()) + print(" hasQuarks ", pid.hasQuarks()) + print(" isQuark ", pid.isQuark()) + print(" threeCharge ", pid.threeCharge()) + print(" jSpin ", pid.jSpin()) + print(" sSpin ", pid.sSpin()) + print(" lSpin ", pid.lSpin()) + print(" fundamental ", pid.fundamentalID()) + print(" extra ", pid.extraBits()) + print(" A ", pid.A()) + print(" Z ", pid.Z()) + print(" nLambda ", pid.nLambda()) + + +lb = Gaudi.ParticleID(5122) + +checkPID(lb) + +c = Gaudi.ParticleID(Gaudi.ParticleID.charm) + +checkPID(c) + +nuc = [2212, 1000020040, 1000822080, 450000000] +for i in nuc: + id = Gaudi.ParticleID(i) + checkPID(id) + +# ============================================================================= +# The END +# ============================================================================= diff --git a/GaudiPartProp/scripts/ParticleID.py b/GaudiPartProp/scripts/ParticleID.py new file mode 100644 index 0000000000000000000000000000000000000000..02e7bc059052e96dce44900937cb051ed9fb26b8 --- /dev/null +++ b/GaudiPartProp/scripts/ParticleID.py @@ -0,0 +1,70 @@ +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# @date 21/03/2018 +# @author Philip Ilten +# Return the property dictionary for a given Gaudi::ParticleID. +def properties(pid): + from GaudiPartProp.decorators import Gaudi + + pid = Gaudi.ParticleID(pid) + return { + "isSM": pid.isSM(), + "isValid": pid.isValid(), + "isMeson": pid.isMeson(), + "isBaryon": pid.isBaryon(), + "isDiQuark": pid.isDiQuark(), + "isHadron": pid.isHadron(), + "isLepton": pid.isLepton(), + "isNucleus": pid.isNucleus(), + "hasUp": pid.hasUp(), + "hasDown": pid.hasDown(), + "hasStrange": pid.hasStrange(), + "hasCharm": pid.hasCharm(), + "hasBottom": pid.hasBottom(), + "hasTop": pid.hasTop(), + "hasBottomPrime": pid.hasBottomPrime(), + "hasTopPrime": pid.hasTopPrime(), + "isQuark": pid.isQuark(), + "hasQuarks": pid.hasQuarks(), + "Z": pid.Z(), + "A": pid.A(), + "nLambda": pid.nLambda(), + "threeCharge": pid.threeCharge(), + "jSpin": pid.jSpin(), + "sSpin": pid.sSpin(), + "lSpin": pid.lSpin(), + } + + +# Generate the PID dictionary and optionally archive. +def generate(dat=None): + import ParticleProperty + import PythiaID + + pids = PythiaID.pids + pids.update(ParticleProperty.pids) + + # Loop over the particles and update entries. + for pid in pids: + pids[pid] = properties(pid) + + # Archive if requested. + if dat: + with open(dat, "w") as dat: + dat.write(repr(pids)) + return pids + + +# Load the PID dictionary. +try: + pids = eval(open("ParticleID.dat").read()) +except FileNotFoundError: + pids = generate("ParticleID.dat") diff --git a/GaudiPartProp/scripts/ParticleProperty.py b/GaudiPartProp/scripts/ParticleProperty.py new file mode 100644 index 0000000000000000000000000000000000000000..aca09e83db11573ceaca1186a4cfa3741ce5efe0 --- /dev/null +++ b/GaudiPartProp/scripts/ParticleProperty.py @@ -0,0 +1,48 @@ +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# @date 21/03/2018 +# @author Philip Ilten +# Return the property dictionary for a given Gaudi::ParticleProperty. +def properties(pid): + return { + "name": pid.name(), + "threeCharge": int(round(pid.charge() * 3)), + "hasAnti": pid.selfcc(), + } + + +# Generate the PID dictionary and optionally archive. +def generate(dat=None): + # The following is misunderstood by flake8 - the import is needed as it + # has necessary side effects + import GaudiPartProp.PartPropSvc # noqa: F401 + from GaudiPython.Bindings import AppMgr + + gaudi = AppMgr() + ppsvc = gaudi.gaudiPartProp() + + # Loop over the particles and add entries. + pids = {} + for pid in ppsvc: + pids[pid.pid().pid()] = properties(pid) + + # Archive if requested. + if dat: + with open(dat, "w") as dat: + dat.write(repr(pids)) + return pids + + +# Load the PID dictionary. +try: + pids = eval(open("ParticleProperty.dat").read()) +except FileNotFoundError: + pids = generate("ParticleProperty.dat") diff --git a/GaudiPartProp/scripts/PythiaID.py b/GaudiPartProp/scripts/PythiaID.py new file mode 100644 index 0000000000000000000000000000000000000000..75e8f616d9f454792ec799e4ac753b80338cea51 --- /dev/null +++ b/GaudiPartProp/scripts/PythiaID.py @@ -0,0 +1,54 @@ +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# @date 21/03/2018 +# @author Philip Ilten +# Return the property dictionary for a given Pythia8::ParticleDataEntry. +def properties(pid, sgn=1): + return { + "name": pid.name(sgn), + "threeCharge": pid.chargeType(sgn), + "hasAnti": pid.hasAnti(), + "isLepton": pid.isLepton(), + "isQuark": pid.isQuark(), + "isDiQuark": pid.isDiquark(), + "isHadron": pid.isHadron(), + "isMeson": pid.isMeson(), + "isBaryon": pid.isBaryon(), + "jSpin": pid.spinType(), + } + + +# Generate the PID dictionary and optionally archive. +def generate(dat=None): + import pythia8 + + pythia = pythia8.Pythia("", False) + + # Loop over the particles. + pid, pids = 1, {} + while pid != 0: + pids[pid] = properties(pythia.particleData.particleDataEntryPtr(pid)) + if pids[pid]["hasAnti"]: + pids[-pid] = properties(pythia.particleData.particleDataEntryPtr(pid), -1) + pid = pythia.particleData.nextId(abs(pid)) + + # Archive if requested. + if dat: + with open(dat, "w") as dat: + dat.write(repr(pids)) + return pids + + +# Load the Pythia dictionary. +try: + pids = eval(open("PythiaID.dat").read()) +except FileNotFoundError: + pids = generate("PythiaID.dat") diff --git a/GaudiPartProp/scripts/check_ParticleID.py b/GaudiPartProp/scripts/check_ParticleID.py new file mode 100755 index 0000000000000000000000000000000000000000..adf4cc249edc9b5045f3a25c7ce450df6843e774 --- /dev/null +++ b/GaudiPartProp/scripts/check_ParticleID.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# @date 21/03/2018 +# @author Philip Ilten +# Compare the properties from the current ParticleID, archived +# ParticleID, the Pythia particle database, and the particle property +# service. +import ParticleID +import ParticleProperty +import PythiaID + +props = [prop for prop in ParticleID.properties(1)] +mthds = ["NEW", "OLD", "PY", "PP"] +for pid in sorted(ParticleID.pids): + base = ParticleID.properties(pid) + if not base["isSM"]: + continue + comps = {"NEW": base, "OLD": ParticleID.pids[pid], "PY": {}, "PP": {}} + if pid in PythiaID.pids: + comps["PY"] = PythiaID.pids[pid] + if pid in ParticleProperty.pids: + comps["PP"] = ParticleProperty.pids[pid] + difs = [False] * len(props) + for idx, prop in enumerate(props): + for mthd, comp in comps.iteritems(): + if mthd in mthds and prop in comp and base[prop] != comp[prop]: + difs[idx] = True + if True in difs: + print("------------------------------------") + if "name" in comps["PY"]: + print("PYTHIA: " + comps["PY"]["name"]) + if "name" in comps["PP"]: + print("LHCB: " + comps["PP"]["name"]) + print("%15s" * (len(mthds) + 1) % tuple([str(pid)] + mthds)) + for prop, dif in zip(props, difs): + if not dif: + continue + vals = [prop] + for mthd in mthds: + if mthd in comps and prop in comps[mthd]: + vals += [str(comps[mthd][prop])] + else: + vals += [""] + print("%15s" * (len(vals)) % tuple(vals)) diff --git a/GaudiPartProp/scripts/dump_ParticleProperties.py b/GaudiPartProp/scripts/dump_ParticleProperties.py new file mode 100755 index 0000000000000000000000000000000000000000..7aeca93255ccd4a8f9a6ac77722e0112c93e5651 --- /dev/null +++ b/GaudiPartProp/scripts/dump_ParticleProperties.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +# ============================================================================= +## @file dump_ParticleProperties +# +# Trivial script to dump the particle properties +# +# @date 2010-10-22 +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# +# Last modification $Date: 2010-09-10 14:04:49 $ +# by $Author: ibelyaev $ +# ============================================================================= +import sys + +from GaudiPartProp.DumpParticleProperties import dump + +dump([a for a in sys.argv[1:] if "--" != a]) diff --git a/GaudiPartProp/src/CC.cpp b/GaudiPartProp/src/CC.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b996bb0e528d31864f1535a949b7c7067193d9b6 --- /dev/null +++ b/GaudiPartProp/src/CC.cpp @@ -0,0 +1,71 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/CC.h> + +namespace Decays = Gaudi::Decays; + +/** @file + * Implementation file for namespace Decays::CC + * @date 2008-12-13 + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + */ +namespace { + /** simple function to make charge conjugated inside the original string. + * All substrings are substituted by their charge conjugates + * @param decay the original string + * @param map_ the full map of substitutions + * @param pos the starting position + * @return charge-conjugated string + */ + inline std::string cc_( const std::string& decay, const Decays::CC::MapCC& map_, + const std::string::size_type pos = 0 ) { + // check the validity of position + if ( pos >= decay.size() ) { return decay; } + // find the match: + auto _p = std::string::npos; + Decays::CC::MapCC::const_iterator _i = map_.end(); + // look for the "nearest" and "longest" match + for ( auto ic = map_.begin(); map_.end() != ic; ++ic ) { + // find the particle + std::string::size_type p = decay.find( ic->first, pos ); + // match? + if ( std::string::npos == p ) { continue; } + // find the nearest match + if ( p < _p ) { + _p = p; + _i = ic; + } + } + // no match at all. + if ( std::string::npos == _p || map_.end() == _i ) { return decay; } + + // replace + std::string aux = decay; + aux.replace( _p, _i->first.size(), _i->second ); + + // advance the position + _p += _i->second.size(); + // ... and start the recursion here + return _p < aux.size() ? cc_( aux, map_, _p ) : aux; + } +} // namespace +/* simple function to make charge conjugated inside the original string. + * All substrings are substituted by their charge conjugates + * @param decay the original string + * @param map_ the full map of substitutions + * @return charge-conjugated string + */ + +std::string Decays::CC::cc( const std::string& decay, const Decays::CC::MapCC& map_ ) { return cc_( decay, map_ ); } + +std::string Decays::CC::cc( const std::string& decay, const std::map<std::string, std::string>& map_ ) { + return cc_( decay, { map_.begin(), map_.end() } ); +} diff --git a/GaudiPartProp/src/Decay.cpp b/GaudiPartProp/src/Decay.cpp new file mode 100644 index 0000000000000000000000000000000000000000..68a2f972611b1d68cc2c55af797c8af081989514 --- /dev/null +++ b/GaudiPartProp/src/Decay.cpp @@ -0,0 +1,177 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/Decay.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleID.h> +#include <Gaudi/ParticleProperty.h> +#include <sstream> + +namespace Decays = Gaudi::Decays; + +/** @file + * Implementation file for class Decays::Decay + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-03-31 + */ +Decays::Decay::Item::Item( const Gaudi::ParticleProperty* pp ) : m_pp( pp ) { + if ( m_pp ) { + m_name = m_pp->particle(); + m_pid = m_pp->particleID(); + } +} + +Decays::Decay::Item::Item( const std::string& name ) : m_name( name ) {} + +Decays::Decay::Item::Item( const Gaudi::ParticleID& pid ) : m_pid( pid ) {} + +StatusCode Decays::Decay::Item::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + if ( m_pp ) { + m_name = m_pp->particle(); + m_pid = m_pp->particleID(); + return StatusCode::SUCCESS; + } + // it not possible to validate it! + if ( 0 == svc ) { return StatusCode::FAILURE; } + // check by name + if ( !m_name.empty() ) { + m_pp = svc->find( m_name ); + if ( !m_pp ) { return StatusCode::FAILURE; } + m_pid = m_pp->particleID(); + return StatusCode::SUCCESS; + } + // check by PID + if ( Gaudi::ParticleID() != m_pid ) { + m_pp = svc->find( m_pid ); + if ( !m_pp ) { return StatusCode::FAILURE; } + m_name = m_pp->particle(); + return StatusCode::SUCCESS; + } + return StatusCode::FAILURE; +} + +StatusCode Decays::Decay::Item::validate( const Gaudi::ParticleProperty* pp ) const { + if ( m_pp && !pp ) { + m_name = m_pp->particle(); + m_pid = m_pp->particleID(); + return StatusCode::SUCCESS; + } else if ( pp ) { + m_pp = pp; + m_name = m_pp->particle(); + m_pid = m_pp->particleID(); + return StatusCode::SUCCESS; + } + return StatusCode::FAILURE; +} + +Decays::Decay::Decay( const Gaudi::ParticleProperty* mother, + const std::vector<const Gaudi::ParticleProperty*>& daughters ) + : m_mother( mother ) { + setDaughters( daughters ); +} + +Decays::Decay::Decay( const std::string& mother, const std::vector<std::string>& daughters ) : m_mother( mother ) { + setDaughters( daughters ); +} + +Decays::Decay::Decay( const Gaudi::ParticleID& mother, const std::vector<Gaudi::ParticleID>& daughters ) + : m_mother( mother ) { + setDaughters( daughters ); +} + +Decays::Decay::Decay( const Decays::Decay::Item& mother, const std::vector<Decays::Decay::Item>& daughters ) + : m_mother( mother ), m_daughters( daughters ) {} + +StatusCode Decays::Decay::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + // validate the mother + StatusCode sc = m_mother.validate( svc ); + if ( sc.isFailure() ) { return sc; } + if ( m_daughters.empty() ) { return StatusCode::FAILURE; } + // loop over daughters + for ( auto idau = m_daughters.begin(); m_daughters.end() != idau; ++idau ) { + sc = idau->validate( svc ); + if ( sc.isFailure() ) { return sc; } + } + return sc; +} + +std::ostream& Decays::Decay::fillStream( std::ostream& s ) const { + m_mother.fillStream( s ); + if ( m_daughters.empty() ) { return s; } + s << "->"; + // loop over daughters + for ( const auto& dau : m_daughters ) { dau.fillStream( s ); } + return s; +} + +std::ostream& Decays::Decay::Item::fillStream( std::ostream& s ) const { + if ( m_name.empty() ) { + if ( m_pp ) { + m_name = m_pp->particle(); + } else if ( Gaudi::ParticleID() != m_pid ) { + return s << ' ' << m_pid.pid() << ' '; + } else { + return s << " ? "; + } + } + return s << ' ' << m_name << ' '; +} + +std::string Decays::Decay::toString() const { + std::ostringstream s; + fillStream( s ); + return s.str(); +} + +void Decays::Decay::setDaughters( const std::vector<const Gaudi::ParticleProperty*>& daugs ) { + m_daughters.clear(); + for ( const auto& pp : daugs ) *this += pp; +} + +void Decays::Decay::setDaughters( const std::vector<std::string>& daugs ) { + m_daughters.clear(); + for ( const auto& pp : daugs ) *this += pp; +} + +void Decays::Decay::setDaughters( const std::vector<Gaudi::ParticleID>& daugs ) { + m_daughters.clear(); + for ( const auto& pp : daugs ) *this += pp; +} + +void Decays::Decay::setDaughters( const Decays::Decay::Items& daugs ) { m_daughters = daugs; } + +Decays::Decay& Decays::Decay::operator+=( const std::string& child ) { return ( *this ) += Item( child ); } + +Decays::Decay& Decays::Decay::operator+=( const Gaudi::ParticleID& child ) { return ( *this ) += Item( child ); } + +Decays::Decay& Decays::Decay::operator+=( const Gaudi::ParticleProperty* child ) { return ( *this ) += Item( child ); } + +Decays::Decay& Decays::Decay::operator+=( const Decays::Decay::Item& child ) { + m_daughters.push_back( child ); + return *this; +} + +/* get the component by the number + * @attention index 0 corresponds to the mother particle + * @param index the index (0 corresponds to the mother particle) + * @return the component + */ +const Decays::Decay::Item& Decays::Decay::operator()( const unsigned int index ) const { + if ( 0 == index ) { return m_mother; } + return m_daughters[index - 1]; +} + +void Decays::Decay::setMother( const Decays::Decay::Item& mom ) { m_mother = mom; } + +void Decays::Decay::setMother( const Gaudi::ParticleProperty* mom ) { setMother( Item( mom ) ); } + +void Decays::Decay::setMother( const Gaudi::ParticleID& mom ) { setMother( Item( mom ) ); } + +void Decays::Decay::setMother( const std::string& mom ) { setMother( Item( mom ) ); } diff --git a/GaudiPartProp/src/IParticlePropertySvc.cpp b/GaudiPartProp/src/IParticlePropertySvc.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b876f04e53794519268f0898650cdfdebbbee939 --- /dev/null +++ b/GaudiPartProp/src/IParticlePropertySvc.cpp @@ -0,0 +1,204 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleID.h> +#include <Gaudi/ParticleProperty.h> +#include <algorithm> + +/** @file + * Implementation file for class Gaudi::Interfaces::IParticlePropertySvc + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + +/* helper utility for mapping of Gaudi::ParticleProperty object into + * non-negative integral sequential identifier + * + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing property and/or service + * <c>0</c> is returned. The valid result is always + * satisfy the condition: <c> index <= service->size() </c> + * + * @param property the property to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + +size_t Gaudi::ParticleProperties::index( const Gaudi::ParticleProperty* property, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + if ( !property || !service ) { return 0; } + + auto first = service->begin(); + auto last = service->end(); + // start the binary_search + static constexpr auto cmp = Gaudi::ParticleProperty::Compare(); + auto ifind = std::lower_bound( first, last, property, cmp ); + return last != ifind && !cmp( *ifind, property ) ? ( ifind - first + 1 ) : 0; +} + +/* helper utility for mapping of Gaudi::ParticleID object into + * non-negative integral sequential identifier + * + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing PID and/or service + * <c>0</c> is returned. The valid result is always + * satisfy the condition: <c> index <= service->size() </c> + * + * @param pid the object to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +size_t Gaudi::ParticleProperties::index( const Gaudi::ParticleID& pid, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + if ( !service ) { return 0; } + const Gaudi::ParticleProperty* pp = service->find( pid ); + return pp ? Gaudi::ParticleProperties::index( pp, service ) : 0; +} + +/* the inverse mapping of the integer sequential number onto + * Gaudi::ParticleID object + * + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing PID and/or service + * <c>NULL</c> is returned. + * + * @param pid the object to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +const Gaudi::ParticleProperty* +Gaudi::ParticleProperties::particle( const size_t index, const Gaudi::Interfaces::IParticlePropertySvc* service ) { + if ( 0 == index || !service ) { return nullptr; } + // get the iterators from the service + auto first = service->begin(); + auto last = service->end(); + if ( index > (size_t)std::distance( first, last ) ) { return 0; } + std::advance( first, index - 1 ); + return *first; +} + +/* the inverse mapping of the integer sequential number onto + * Gaudi::ParticleID object + * + * This appears to be useful operation, but since it is + * "pure technical" it does not appear as interface method. + * + * For invalid/missing index and/or service + * <c>Gaudi::ParticleID()</c> is returned. + * + * @param pid the object to be mapped + * @param service the service + * @return the sequential non-negative index + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ + +const Gaudi::ParticleID +Gaudi::ParticleProperties::particleID( const size_t index, const Gaudi::Interfaces::IParticlePropertySvc* service ) { + if ( 0 == index || !service ) { return Gaudi::ParticleID(); } + const Gaudi::ParticleProperty* pp = Gaudi::ParticleProperties::particle( index, service ); + return pp ? pp->particleID() : Gaudi::ParticleID(); +} + +/* mapping by pythiaID + * + * @code + * + * const int pythiaID = ... ; + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleProeprty* pp = byPythiaID( pythiaID , svc ) ; + * + * @endcode + * + * @attention the method is not very efficient and should not be abused + * @see Gaudi::ParticleProperties::particle + * @param pythia pythia identifier + * @param svc pointer to particle property service + * @return the particle property for the given pythia ID + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +const Gaudi::ParticleProperty* +Gaudi::ParticleProperties::byPythiaID( const int pythia, const Gaudi::Interfaces::IParticlePropertySvc* svc ) { + if ( !svc ) { return nullptr; } + // to be efficient + // 1) try to use PDG-ID (fast, logarithmic search) + const Gaudi::ParticleProperty* pp = svc->find( Gaudi::ParticleID( pythia ) ); + // 2) check the proper pythia ID + if ( pp && pythia == pp->pythiaID() ) { return pp; } + // 3) use the regular (linear search) + auto begin = svc->begin(); + auto end = svc->end(); + auto found = + std::find_if( begin, end, [&]( const Gaudi::ParticleProperty* pp ) { return pp->pythiaID() == pythia; } ); + return found != end ? *found : nullptr; +} + +/* mapping by EvtGen-name + * + * @code + * + * const std::string& evtGen = ... + * + * const Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleProperty* pp = byEvtGenName ( evtGen , svc ) ; + * + * @endcode + * + * @attention the method is not very efficient and should not be abused + * @see Gaudi::ParticleProperties::particle + * @param evtGen the particle naem in EvtGen-generator + * @param svc pointer to particle property service + * @return the particle property for the given EvtGen-name + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +const Gaudi::ParticleProperty* +Gaudi::ParticleProperties::byEvtGenName( const std::string& evtGen, + const Gaudi::Interfaces::IParticlePropertySvc* svc ) { + if ( !svc ) { return nullptr; } + // to be more efficient: + // 1) try to use the regular name (fast, logarithmic search) + const Gaudi::ParticleProperty* pp = svc->find( evtGen ); + // 2) check the proper evtgen name + if ( pp && evtGen == pp->evtGen() ) { return pp; } + // 3) use the regular (linear search) + auto begin = svc->begin(); + auto end = svc->end(); + auto found = std::find_if( begin, end, [&]( const Gaudi::ParticleProperty* pp ) { return pp->evtGen() == evtGen; } ); + // + return found != end ? *found : nullptr; +} + +/* get all the properties at once + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties +Gaudi::ParticleProperties::allProperties( const Gaudi::Interfaces::IParticlePropertySvc* service ) { + return service ? Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties( service->begin(), service->end() ) + : Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties(); +} diff --git a/GaudiPartProp/src/Module/ParticlePropertySvc.cpp b/GaudiPartProp/src/Module/ParticlePropertySvc.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ed53689e3e2b312892e590d0d81d20a76a709acd --- /dev/null +++ b/GaudiPartProp/src/Module/ParticlePropertySvc.cpp @@ -0,0 +1,671 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/CC.h> +#include <Gaudi/Decays/Symbols.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleID.h> +#include <Gaudi/ParticleProperty.h> +#include <GaudiKernel/IFileAccess.h> +#include <GaudiKernel/ISvcLocator.h> +#include <GaudiKernel/MsgStream.h> +#include <GaudiKernel/PhysicalConstants.h> +#include <GaudiKernel/Service.h> +#include <GaudiKernel/VectorMap.h> +#include <algorithm> +#include <boost/algorithm/string.hpp> +#include <cstdlib> +#include <fstream> +#include <functional> +#include <iostream> +#include <set> + +/** @file + * Simple implementation of class Gaudi::ParticlePropertySvc + * @author : I. Last + * - Modified by G.Corti 09/11/1999 to read file from LHCBDBASE and + * introduce find/eraseByStdHepID methods + * - Modifies by Vanya BELYAEV to allow readig of additional files to + * add/replace/modify the existing particle properties + */ +namespace { + std::string defaultFilename() { // the main file with particle properties + auto* root = getenv( "PARAMFILESROOT" ); + return root ? std::string{ root } + "/data/ParticleTable.txt" : std::string{ "./ParticleTable.txt" }; + } +} // namespace +namespace Gaudi { + /** @class ParticlePropertySvc ParticlePropertySvc.cpp + * + * This service provides access to particle properties. + * The settable property of this service is the + * ParticlePropertiesFile, an ASCII file containing the + * list of properties for the particles. + * The default file is: + * "$PARAMFILESROOT/data/ParticleTable.txt" + * or if $PARAMFILESROOT is not defined + * "ParticleTable.txt" + * + * @author Iain Last + * @author Gloria Corti + * @author Vanya BELYAEV + * @date 2006-09-22 + * + * 1) Modified to add possibility to redefine properties of existing + * particles and to read addiitonal files. + * New propeety "OtherFiles" (default is empty vector) is introduces. + * Service parsed additional files after the main one. + * + * @code + * + * // read the additional files with particle properties + * ParticlePropertySvc.OtherFiles += { + * "$SOMELOCATION1/file1.txt" , + * "$SOMELOCATION2/file2.txt" + * } ; + * + * @endcode + * + * 2) Add possibility to modify only certain partiles through the + * new property "Particles" (default is enpty list), + * Each line is interpreted as a line in particle data table, e.g. + * + * @code + * + * // redefine the properties of H_20 and H_30 particles: + * ParticlePropertySvc.Particles = { + * "H_20 88 35 0.0 120.0 9.4e-26 Higgs'0 35 0.0e+00" , + * "H_30 89 36 0.0 40.0 1.0e-12 A0 36 0.0e+00" + * } ; + * + * @endcode + * + * The replaces/modified particles are reported. + */ + struct ParticlePropertySvc final : public extends<Service, Gaudi::Interfaces::IParticlePropertySvc> { + /** get the begin-iterator for the container of particle properties + * It is assumed that the container is properly ordered + * @return begin-iterator for the container of particle properties + */ + iterator begin() const override { return m_vector.begin(); } + /** get the end-iterator for the container of particle properties + * It is assumed that the container is properly ordered + * @return end-iterator for the container of particle properties + */ + iterator end() const override { return m_vector.end(); } + /// get the container size. + size_t size() const override { return m_vector.size(); } + /** Retrieve an object by name: + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const std::string& name = ... ; + * + * const Gaudi::ParticleProperty* pp = svc -> find ( name ) ; + * + * @endcode + * @param name the particle name + * @return pointer to particle property object + */ + const Gaudi::ParticleProperty* find( const std::string& name ) const override { return m_nameMap( name ); } + /** Retrieve an object by PID: + * + * @code + * + * Gaudi::Interfaces::IParticlePropertySvc* svc = ... ; + * + * const Gaudi::ParticleID& pid = ... ; + * + * const Gaudi::ParticleProperty* pp = svc -> find ( pid ) ; + * + * @endcode + * @param name the particle name + * @return pointer to particle property object + */ + const Gaudi::ParticleProperty* find( const Gaudi::ParticleID& pid ) const override { return m_pidMap( pid ); } + + /** make the charge conjugation for the string/decay descriptor + * + * @code + * + * std::string decay = "B0 -> pi+ pi-" ; + * + * Gaudi::IParticleProeprtySvc* svc = ... ; + * + * std::string cc = svc -> cc ( decay ) ; + * + * @endcode + * + * @param decay the decay descriptor + * @return the charge conjugation for the decay descriptor + */ + std::string cc( const std::string& decay ) const override; + + /// Initialize the service. + StatusCode initialize() override; + + /** Standard Constructor. + * @param name service instance name + * @param pSvc pointer to service locator ` + */ + ParticlePropertySvc( const std::string& name, // the service instance name + ISvcLocator* pSvc ) // the Service Locator + : base_class( name, pSvc ) {} + + /** the action in the case of interactive manipulation with properties: + * - no action if the internal data is not yet build + * - else rebuild the internal data + * Such action will allow more flexible interactive configuration + * of the service + * @param p the updated property + */ + void updateHandler( Gaudi::Details::PropertyBase& p ); + + /** the action in the case of interactive manipulation with properties: + * of the service + * @param p the updated property + */ + void updateDump( Gaudi::Details::PropertyBase& p ); + /** the action in the case of interactive manipulation with properties: + * of the service + * @param p the updated property + */ + void updateCC( Gaudi::Details::PropertyBase& p ); + /// dump the table of particle properties + void dump(); + + /** rebuild the Particle Property Data + * - clear existing containers + * - parse main file + * - parse additional files + * - parse the specific options + * - set particle<->antiparticle links + * @return status code + */ + StatusCode rebuild(); + + /** parse the file + * @param file the file name to be parsed + * @return status code + */ + StatusCode parse( const std::string& file ); + /** parse the line + * @param line the line to be parsed + * @return status code + */ + StatusCode parseLine( const std::string& line ); + + /** add new particle (or redefine the existing one) + * @param pname the particle name + * @param pid the particle ID + * @param charge the particle charge + * @param mass the particle mass + * @param tlife the particle tlife + * @param maxWidth the particle max-width + * @param evtgen the name for EvtGen + * @param pythia the ID for pythia generator + */ + StatusCode addParticle( const std::string& pname, const Gaudi::ParticleID& pid, const double charge, + const double mass, const double tlife, const double maxWidth, const std::string& evtgen, + const int pythia ); + + /** set properly particle<-->antiparticle relations + * @return status code + */ + StatusCode setAntiParticles(); + + /// check the difference of two properties and fill corresponding sets + bool diff( const Gaudi::ParticleProperty& n, const Gaudi::ParticleProperty& o ); + + /// the actual storage of all properties + typedef std::set<std::unique_ptr<Gaudi::ParticleProperty>> Set; + /// the actual type of map: { "name" : "property" } + typedef GaudiUtils::VectorMap<std::string, const Gaudi::ParticleProperty*> NameMap; + /// the actual type of map: { "pid" : "property" } + typedef GaudiUtils::VectorMap<Gaudi::ParticleID, const Gaudi::ParticleProperty*> PidMap; + typedef Gaudi::Interfaces::IParticlePropertySvc::ParticleProperties Vector; + /// the actual storage of all particle properties + Set m_set; + /// "visible" data (the ordered container) + Vector m_vector; + /// Map: { "name" : "property" } + NameMap m_nameMap; + /// Map: { "pid" : "property" } + PidMap m_pidMap; + /// dump the table? + Gaudi::Property<bool> m_dump{ this, "Dump", false, &Gaudi::ParticlePropertySvc::updateDump, + "Dump all properties in a table format" }; + + /// the actual type for the list of files + typedef std::vector<std::string> Files; + /// the actual type for the list of particle properties (strings) + typedef std::vector<std::string> Particles; + /// the main file with particle properties + Gaudi::Property<std::string> m_filename{ this, "ParticlePropertiesFile", defaultFilename(), + &Gaudi::ParticlePropertySvc::updateHandler, + "The name of 'main' particle properties file" }; + /// additional files + Gaudi::Property<Files> m_other{ this, + "OtherFiles", + {}, + &Gaudi::ParticlePropertySvc::updateHandler, + "The (optional) list of additional files with the particle data" }; + /// properties to be redefined explicitly + Gaudi::Property<Particles> m_particles{ this, + "Particles", + {}, + &Gaudi::ParticlePropertySvc::updateHandler, + "The (optional) list of special particle properties" }; + + /// the CC-map + mutable Decays::CC::MapCC m_ccMap; + /// CC-map for properties + Gaudi::Property<std::map<std::string, std::string>> m_ccmap_{ + this, "ChargeConjugations", Decays::Symbols::instance().cc(), &Gaudi::ParticlePropertySvc::updateCC, + "The map of charge-conjugation & protected symbols" }; + + typedef std::set<std::string> NameSet; + typedef std::set<Gaudi::ParticleID> PidSet; + + NameSet m_by_charge; + NameSet m_by_mass; + NameSet m_by_tlife; + NameSet m_by_width; + NameSet m_by_evtgen; + NameSet m_by_pythia; + + NameSet m_replaced_names; + PidSet m_replaced_pids; + NameSet m_no_anti; + + Vector m_modified; + }; +} // namespace Gaudi + +StatusCode Gaudi::ParticlePropertySvc::initialize() { + // 1) initialize the base + StatusCode sc = Service::initialize(); + if ( sc.isFailure() ) { return sc; } + // 2) create the log + MsgStream log( msgSvc(), name() ); + // 3) rebuild everything + sc = rebuild(); + log << MSG::INFO << "Initialising Gaudi ParticlePropertySvc" << endmsg; + if ( sc.isFailure() ) { + log << MSG::ERROR << " Unable to initialize the internal structures " << endmsg; + return sc; + } + + m_by_charge.clear(); + m_by_mass.clear(); + m_by_tlife.clear(); + m_by_width.clear(); + m_by_evtgen.clear(); + m_by_pythia.clear(); + m_replaced_names.clear(); + m_replaced_pids.clear(); + m_no_anti.clear(); + + m_ccMap.clear(); + + if ( m_dump.value() || msgLevel( MSG::DEBUG ) ) { dump(); } + + return StatusCode::SUCCESS; +} + +/* rebuild the Particle Property Data + * - clear existing containers + * - parse main file + * - parse additional files + * - parse the specific options + * - set particle<->antiparticle links + * @return status code + */ +StatusCode Gaudi::ParticlePropertySvc::rebuild() { + // clear all existing containers + m_nameMap.clear(); + m_pidMap.clear(); + m_vector.clear(); + m_ccMap.clear(); + + // parse the main file + StatusCode sc = parse( m_filename.value() ); + if ( sc.isFailure() ) { return sc; } + // parse the additional files + for ( const auto& file : m_other.value() ) { + if ( sc = parse( file ); sc.isFailure() ) { return sc; } + } + // parse the options/lines + m_modified.clear(); + for ( const auto& line : m_particles.value() ) { + if ( sc = parseLine( line ); sc.isFailure() ) { return sc; } + } + // sort the vector + std::stable_sort( m_vector.begin(), m_vector.end(), Gaudi::ParticleProperty::Compare() ); + // set particle<-->antiparticle links + sc = setAntiParticles(); + if ( sc.isFailure() ) { return sc; } + // some debug printout + if ( msgLevel( MSG::DEBUG ) ) { + debug() << " All: " << m_vector.size() << " By Name: " << m_nameMap.size() << " By PID: " << m_pidMap.size() + << " Total: " << m_set.size() << endmsg; + } + + if ( !m_modified.empty() ) { + auto& log = always(); + log << " New/updated particles (from \"Particles\" property)" << std::endl; + Gaudi::ParticleProperties::printAsTable( m_modified, log, this ); + log << endmsg; + m_modified.clear(); + } + + if ( !m_by_charge.empty() ) { + info() << " Charge has beed redefined for " << Gaudi::Utils::toString( m_by_charge ) << endmsg; + } + if ( !m_by_mass.empty() ) { + info() << " Mass has beed redefined for " << Gaudi::Utils::toString( m_by_mass ) << endmsg; + } + if ( !m_by_tlife.empty() ) { + info() << " Lifetime has beed redefined for " << Gaudi::Utils::toString( m_by_tlife ) << endmsg; + } + if ( !m_by_width.empty() ) { + info() << " MaxWidth has beed redefined for " << Gaudi::Utils::toString( m_by_width ) << endmsg; + } + if ( !m_by_evtgen.empty() ) { + info() << " EvtGenID has beed redefined for " << Gaudi::Utils::toString( m_by_evtgen ) << endmsg; + } + if ( !m_by_pythia.empty() ) { + info() << " PythiaID has beed redefined for " << Gaudi::Utils::toString( m_by_pythia ) << endmsg; + } + if ( !m_replaced_names.empty() ) { + info() << " Replaced names : " << Gaudi::Utils::toString( m_replaced_names ) << endmsg; + } + if ( !m_replaced_pids.empty() ) { + info() << " Replaced PIDs : " << Gaudi::Utils::toString( m_replaced_pids ) << endmsg; + } + if ( !m_no_anti.empty() ) { info() << " No anti particle : " << Gaudi::Utils::toString( m_no_anti ) << endmsg; } + + return StatusCode::SUCCESS; +} + +/* the action in the case of interactive manipulation with properties: + * - no action if the internal data is not yet build + * - else rebuild the internal data + * Such action will allow more flexible interactive configuration + * of the service + */ +void Gaudi::ParticlePropertySvc::updateHandler( Gaudi::Details::PropertyBase& p ) { + if ( FSMState() < Gaudi::StateMachine::INITIALIZED ) { return; } + + info() << "Property triggers the update of internal Particle Property Data : " << p << endmsg; + // rebuild the internal data + StatusCode sc = rebuild(); + if ( sc.isFailure() ) { + throw GaudiException( "Can't rebuild Particle Properties Data", "*ParticlePropertySvc*", sc ); + } + // clear CC-map + m_ccMap.clear(); +} + +// the action in the case of redefinition of "ChargeConjugates" +void Gaudi::ParticlePropertySvc::updateCC( Gaudi::Details::PropertyBase& ) { m_ccMap.clear(); } + +/* the action in the case of interactive manipulation with properties: + * of the service + * @param p the updated property + */ +void Gaudi::ParticlePropertySvc::updateDump( Gaudi::Details::PropertyBase& ) { + if ( FSMState() < Gaudi::StateMachine::INITIALIZED ) { return; } + dump(); +} + +StatusCode Gaudi::ParticlePropertySvc::parse( const std::string& file ) { + auto fileAccess = service<IFileAccess>( "VFSSvc" ); + if ( !fileAccess ) { + error() << "Unable to locate IFileAccess('VFSSvc') service" << endmsg; + return StatusCode::FAILURE; + } + // "open" the file + auto infile = fileAccess->open( file ); + if ( !infile.get() ) { + error() << "Unable to open file '" << file << "'" << endmsg; + return StatusCode::FAILURE; + } + info() << "Opened particle properties file : " << file << endmsg; + bool active = false; + // read the file line-by-line + while ( *infile ) { + std::string line; + std::getline( *infile, line ); + // comment lines start with '#' + if ( line[0] == '#' ) { continue; } + // skip empty lines: + if ( line.empty() ) { continue; } + // + if ( !active ) { + if ( "PARTICLE" == boost::to_upper_copy( boost::trim_copy( line ) ) ) { + active = true; + continue; + } + } else { + if ( "END PARTICLE" == boost::to_upper_copy( boost::trim_copy( line ) ) ) { + active = false; + continue; + } + } + + if ( !active ) { continue; } // skip the lines if not active + // parse the line + if ( auto sc = parseLine( line ); sc.isFailure() ) { + error() << "Unable to parse the file '" << file << "'" << endmsg; + return sc; + } + } + + return StatusCode::SUCCESS; +} + +/* parse the line + * the format of the line is defined by old SICB CDF + * @param line the line to be parsed + * @return status code + */ +StatusCode Gaudi::ParticlePropertySvc::parseLine( const std::string& line ) { + // get the input stream from the line : + std::istringstream input( line ); + // get the name + std::string p_name; + int p_geant; // obsolete, to be ignored + int p_pdg; + double p_charge; + double p_mass; + double p_ltime; + std::string p_evtgen; + int p_pythia; + double p_maxwid; + // parse the line + if ( input >> p_name >> p_geant >> p_pdg >> p_charge >> p_mass >> p_ltime >> p_evtgen >> p_pythia >> p_maxwid ) { + // Negative lifetime means the width in GeV-units + if ( 0 > p_ltime ) { + p_ltime = Gaudi::Units::hbar_Planck / std::abs( p_ltime * Gaudi::Units::GeV ) / Gaudi::Units::s; + } + + StatusCode sc = addParticle( p_name, Gaudi::ParticleID( p_pdg ), p_charge, + p_mass * Gaudi::Units::GeV, // rescale from CDF units + p_ltime * Gaudi::Units::s, // rescale from CDF units + p_maxwid * Gaudi::Units::GeV, // rescale from CDF units + p_evtgen, p_pythia ); + if ( sc.isFailure() ) { return sc; } + } else { + MsgStream log( msgSvc(), name() ); + log << MSG::ERROR << " could not parse the line: '" << line << "'" << endmsg; + return StatusCode::FAILURE; + } + + return StatusCode::SUCCESS; +} + +StatusCode Gaudi::ParticlePropertySvc::addParticle( const std::string& pname, const Gaudi::ParticleID& pid, + const double charge, const double mass, const double tlife, + const double maxWidth, const std::string& evtgen, + const int pythia ) { + // create the local object + const Gaudi::ParticleProperty pp( pname, pid, charge, mass, tlife, maxWidth, evtgen, pythia ); + + // 1) find the object with same name & pid in set: + auto it = std::find_if( m_set.begin(), m_set.end(), [&]( const std::unique_ptr<Gaudi::ParticleProperty>& s ) { + return s->name() == pp.name() && s->pid() == pp.pid(); + } ); + // 2) object is found, redefine it! + Gaudi::ParticleProperty* newp = nullptr; + if ( m_set.end() != it ) { newp = it->get(); } + // new property ? + if ( !newp ) { + it = m_set.insert( std::make_unique<Gaudi::ParticleProperty>( pp ) ).first; + newp = it->get(); + } else if ( diff( *newp, pp ) ) { + *newp = pp; // NB: redefine the properties + } + + // insert into name map + { + auto i1 = m_nameMap.find( newp->name() ); + if ( m_nameMap.end() != i1 && i1->second != newp ) { m_replaced_names.insert( newp->name() ); } + m_nameMap.update( newp->name(), newp ); + } + // insert into PID map + { + auto i2 = m_pidMap.find( newp->pid() ); + if ( m_pidMap.end() != i2 && i2->second != newp ) { m_replaced_pids.insert( newp->pid() ); } + m_pidMap.update( newp->pid(), newp ); + } + // insert into vector + if ( m_vector.end() == std::find( m_vector.begin(), m_vector.end(), newp ) ) { m_vector.push_back( newp ); } + + m_modified.push_back( newp ); + + return StatusCode::SUCCESS; +} + +StatusCode Gaudi::ParticlePropertySvc::setAntiParticles() { + for ( const Gaudi::ParticleProperty* _pp : m_vector ) { + Gaudi::ParticleProperty* pp = const_cast<Gaudi::ParticleProperty*>( _pp ); + pp->setAntiParticle( nullptr ); + // get the ID for antiParticle + Gaudi::ParticleID panti( -pp->particleID().pid() ); + // + const Gaudi::ParticleProperty* anti = m_pidMap( panti ); + // + if ( !anti && 0 < pp->particleID().pid() && !pp->particleID().isNucleus() ) { anti = _pp; } + // + pp->setAntiParticle( anti ); + if ( pp && pp->antiParticle() ) { + if ( msgLevel( MSG::VERBOSE ) ) + verbose() << "Antiparticle for \n" << ( *pp ) << " is set to be \n" << ( *( pp->antiParticle() ) ) << endmsg; + } + if ( ( !pp->antiParticle() ) && ( 0 == pp->pid().extraBits() ) ) { m_no_anti.insert( pp->name() ); } + } + return StatusCode::SUCCESS; +} + +namespace { + inline bool different( const double a, const double b, const double p = 1.e-8 ) { + return std::abs( a - b ) > ( std::abs( a ) + std::abs( b ) ) * std::abs( p ); + } + inline bool different( const std::string& a, const std::string& b ) { return a != b; } +} // namespace + +bool Gaudi::ParticlePropertySvc::diff( const Gaudi::ParticleProperty& n, const Gaudi::ParticleProperty& o ) { + bool d = false; + + if ( different( n.charge(), o.charge() ) ) { + m_by_charge.insert( n.name() ); + d = true; + } + if ( different( n.mass(), o.mass() ) ) { + m_by_mass.insert( n.name() ); + d = true; + } + if ( different( n.lifetime(), o.lifetime() ) ) { + m_by_tlife.insert( n.name() ); + d = true; + } + if ( different( n.maxWidth(), o.maxWidth() ) ) { + m_by_width.insert( n.name() ); + d = true; + } + if ( different( n.evtGen(), o.evtGen() ) ) { + m_by_evtgen.insert( n.name() ); + d = true; + } + if ( different( n.pythia(), o.pythia() ) ) { + m_by_pythia.insert( n.name() ); + d = true; + } + + if ( d ) { + MsgStream log( msgSvc(), name() ); + if ( log.level() <= MSG::DEBUG ) + log << MSG::DEBUG << " Change the properties of '" << n.name() << "'/" << n.pid().pid() << std::endl + << " New: " << n << std::endl + << " Old: " << o << endmsg; + } + return d; +} + +void Gaudi::ParticlePropertySvc::dump() { + auto& log = always(); + log << " The Table of Particle Properties " << std::endl; + Gaudi::ParticleProperties::printAsTable( m_vector, log, this ); + log << endmsg; +} + +/* make the charge conjugation for the string/decay descriptor + * + * @code + * + * std::string decay = "B0 -> pi+ pi-" ; + * + * Gaudi::IParticlePropertySvc* svc = ... ; + * + * std::string cc = svc -> cc ( decay ) ; + * + * @endcode + * + * @param decay the decay descriptor + * @return the charge conjugation for the decay descriptor + */ +std::string Gaudi::ParticlePropertySvc::cc( const std::string& decay ) const { + // build the map if not done yet + if ( m_ccMap.empty() ) { + // get the particles from the service + for ( const auto& pp : m_vector ) { + if ( !pp ) { continue; } + const Gaudi::ParticleProperty* anti = pp->antiParticle(); + if ( !anti ) { continue; } + m_ccMap[pp->particle()] = anti->particle(); + } + // get the particles from the options + for ( const auto& ic : m_ccmap_.value() ) { + m_ccMap[ic.first] = ic.second; + m_ccMap[ic.second] = ic.first; + } + if ( msgLevel( MSG::DEBUG ) ) { + Gaudi::Utils::toStream( m_ccMap, ( debug() << " CC-map is \n" ).stream() ); + debug() << endmsg; + } + } + // use the map + return Decays::CC::cc( decay, m_ccMap ); +} + +DECLARE_COMPONENT( Gaudi::ParticlePropertySvc ) diff --git a/GaudiPartProp/src/NodePIDs.cpp b/GaudiPartProp/src/NodePIDs.cpp new file mode 100644 index 0000000000000000000000000000000000000000..72549e8c9128e30b9ddd183cffda833bfa9a8ce4 --- /dev/null +++ b/GaudiPartProp/src/NodePIDs.cpp @@ -0,0 +1,472 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/NodesPIDs.h> +#include <Gaudi/Decays/Symbols.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleID.h> +#include <Gaudi/ParticleProperty.h> +#include <GaudiKernel/SmartIF.h> +#include <GaudiKernel/SystemOfUnits.h> +#include <algorithm> +#include <climits> +#include <functional> + +namespace Decays = Gaudi::Decays; + +/** @file + * The implementation file for various decay nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ +namespace { + /** @var s_SHORTLIVED + * The default high-edge for c*tau for particle to be considered + * as "short-lived" particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + constexpr double s_SHORTLIVED = 0.1 * Gaudi::Units::micrometer; + /** @var s_LONGLIVED + * The default low-edge for c*tau for particle to be considered + * as "long-lived" particles + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + constexpr double s_LONGLIVED = s_SHORTLIVED; + /** @var s_STABLE + * The default low-edge for c*tau for particle to be considered + * as "stable" particle + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + constexpr double s_STABLE = 1 * Gaudi::Units::meter; + /** @var s_INFINITY + * The default low-edge for c*tau for particle to be considered + * as "stable" particle + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + constexpr double s_INFINITY = 0.5 * std::numeric_limits<double>::max(); +} // namespace +namespace Gaudi::Decays { + /* Create the "OR" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + Decays::Nodes::Or operator||( const Decays::iNode& o1, const std::string& o2 ) { + return o1 || Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::Or operator||( const Decays::iNode& o1, const Gaudi::ParticleID& o2 ) { + return o1 || Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::Or operator||( const Decays::iNode& o1, const Decays::Decay::Item& o2 ) { + return o1 || Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::Or operator||( const Decays::iNode& o1, const Gaudi::ParticleProperty* o2 ) { + return o1 || Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::Or operator||( const std::string& o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) || o1; + } + Decays::Nodes::Or operator||( const Gaudi::ParticleID& o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) || o1; + } + Decays::Nodes::Or operator||( const Decays::Decay::Item& o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) || o1; + } + Decays::Nodes::Or operator||( const Gaudi::ParticleProperty* o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) || o1; + } + /* Create the "AND" of two nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + Decays::Nodes::And operator&&( const Decays::iNode& o1, const std::string& o2 ) { + return o1 && Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::And operator&&( const Decays::iNode& o1, const Gaudi::ParticleID& o2 ) { + return o1 && Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::And operator&&( const Decays::iNode& o1, const Decays::Decay::Item& o2 ) { + return o1 && Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::And operator&&( const Decays::iNode& o1, const Gaudi::ParticleProperty* o2 ) { + return o1 && Decays::Nodes::Pid( o2 ); + } + Decays::Nodes::And operator&&( const std::string& o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) && o1; + } + Decays::Nodes::And operator&&( const Gaudi::ParticleID& o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) && o1; + } + Decays::Nodes::And operator&&( const Decays::Decay::Item& o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) && o1; + } + Decays::Nodes::And operator&&( const Gaudi::ParticleProperty* o2, const Decays::iNode& o1 ) { + return Decays::Nodes::Pid( o2 ) && o1; + } +} // namespace Gaudi::Decays +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Any* Decays::Nodes::Any::clone() const { return new Any( *this ); } +// MANDATORY: check the validity +bool Decays::Nodes::Any::valid() const { return true; } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::Any::validate( const Gaudi::Interfaces::IParticlePropertySvc* /*svc */ ) const { + return StatusCode::SUCCESS; +} +// MANDATORY: the only one essential method +bool Decays::Nodes::Any::operator()( const Gaudi::ParticleID& /* p */ ) const { return true; } + +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Pid* Decays::Nodes::Pid::clone() const { return new Pid( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::CC* Decays::Nodes::CC::clone() const { return new CC( *this ); } + +// xSpin: valid only for reasonable spin +bool Decays::Nodes::JSpin::valid() const { return 0 < spin(); } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::JSpin::validate( const Gaudi::Interfaces::IParticlePropertySvc* /*svc */ ) const { + return valid() ? StatusCode::SUCCESS : StatusCode{ InvalidSpin }; +} + +// constructor from the decay item +Decays::Nodes::Pid::Pid( const Decays::Decay::Item& item ) : Decays::iNode(), m_item( item ) {} +// constructor from Particle Property +Decays::Nodes::Pid::Pid( const Gaudi::ParticleProperty* item ) : Decays::iNode(), m_item( item ) {} +// constructor from ParticleID +Decays::Nodes::Pid::Pid( const Gaudi::ParticleID& item ) : Decays::iNode(), m_item( item ) {} +// constructor from Particle name +Decays::Nodes::Pid::Pid( const std::string& item ) : Decays::iNode(), m_item( item ) {} +// MANDATORY: check the validity +bool Decays::Nodes::Pid::valid() const { return 0 != m_item.pp(); } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::Pid::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + return m_item.validate( svc ); +} + +// constructor from the decay item +Decays::Nodes::CC::CC( const Decays::Decay::Item& item ) : Decays::Nodes::Pid( item ) {} +// constructor from Particle Property +Decays::Nodes::CC::CC( const Gaudi::ParticleProperty* item ) : Decays::Nodes::Pid( item ) {} +// constructor from ParticleID +Decays::Nodes::CC::CC( Gaudi::ParticleID item ) : Decays::Nodes::Pid( item ) {} +// constructor from Particle name +Decays::Nodes::CC::CC( const std::string& item ) : Decays::Nodes::Pid( item ) {} +// constructor from Pid +Decays::Nodes::CC::CC( const Decays::Nodes::Pid& item ) : Decays::Nodes::Pid( item ) {} + +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Meson* Decays::Nodes::Meson::clone() const { return new Meson( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Lepton* Decays::Nodes::Lepton::clone() const { return new Lepton( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Nu* Decays::Nodes::Nu::clone() const { return new Nu( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Ell* Decays::Nodes::Ell::clone() const { return new Ell( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::EllPlus* Decays::Nodes::EllPlus::clone() const { return new EllPlus( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::EllMinus* Decays::Nodes::EllMinus::clone() const { return new EllMinus( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Baryon* Decays::Nodes::Baryon::clone() const { return new Baryon( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Hadron* Decays::Nodes::Hadron::clone() const { return new Hadron( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Charged* Decays::Nodes::Charged::clone() const { return new Charged( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Positive* Decays::Nodes::Positive::clone() const { return new Positive( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Negative* Decays::Nodes::Negative::clone() const { return new Negative( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Neutral* Decays::Nodes::Neutral::clone() const { return new Neutral( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Nucleus* Decays::Nodes::Nucleus::clone() const { return new Nucleus( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::HasQuark* Decays::Nodes::HasQuark::clone() const { return new HasQuark( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::JSpin* Decays::Nodes::JSpin::clone() const { return new JSpin( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::SSpin* Decays::Nodes::SSpin::clone() const { return new SSpin( *this ); } +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::LSpin* Decays::Nodes::LSpin::clone() const { return new LSpin( *this ); } + +// constructor from the quark +Decays::Nodes::HasQuark::HasQuark( Gaudi::ParticleID::Quark quark ) : Decays::Nodes::Any(), m_quark( quark ) {} +// constructor from the 2J+1 +Decays::Nodes::JSpin::JSpin( const int spin ) : Decays::Nodes::Any(), m_spin( spin ) {} +// constructor from the 2S+1 +Decays::Nodes::SSpin::SSpin( const int spin ) : Decays::Nodes::JSpin( spin ) {} +// constructor from the 2L+1 +Decays::Nodes::LSpin::LSpin( const int spin ) : Decays::Nodes::SSpin( spin ) {} + +std::ostream& Decays::Nodes::Any::fillStream( std::ostream& s ) const { return s << " X "; } +std::ostream& Decays::Nodes::Pid::fillStream( std::ostream& s ) const { return s << " " << m_item.name() << " "; } +std::ostream& Decays::Nodes::CC::fillStream( std::ostream& s ) const { return s << " [" << item().name() << "]cc "; } +std::ostream& Decays::Nodes::Meson::fillStream( std::ostream& s ) const { return s << " Meson "; } +std::ostream& Decays::Nodes::Hadron::fillStream( std::ostream& s ) const { return s << " Hadron "; } +std::ostream& Decays::Nodes::Baryon::fillStream( std::ostream& s ) const { return s << " Baryon "; } +std::ostream& Decays::Nodes::Lepton::fillStream( std::ostream& s ) const { return s << " Lepton "; } +std::ostream& Decays::Nodes::Neutral::fillStream( std::ostream& s ) const { return s << " X0 "; } +std::ostream& Decays::Nodes::Charged::fillStream( std::ostream& s ) const { return s << " Xq "; } +std::ostream& Decays::Nodes::Positive::fillStream( std::ostream& s ) const { return s << " X+ "; } +std::ostream& Decays::Nodes::Negative::fillStream( std::ostream& s ) const { return s << " X- "; } +std::ostream& Decays::Nodes::Nu::fillStream( std::ostream& s ) const { return s << " Nu "; } +std::ostream& Decays::Nodes::Ell::fillStream( std::ostream& s ) const { return s << " l "; } +std::ostream& Decays::Nodes::EllPlus::fillStream( std::ostream& s ) const { return s << " l+ "; } +std::ostream& Decays::Nodes::EllMinus::fillStream( std::ostream& s ) const { return s << " l- "; } +std::ostream& Decays::Nodes::Nucleus::fillStream( std::ostream& s ) const { return s << " Nucleus "; } +std::ostream& Decays::Nodes::HasQuark::fillStream( std::ostream& s ) const { + switch ( m_quark ) { + case Gaudi::ParticleID::down: + return s << " Xd "; + case Gaudi::ParticleID::up: + return s << " Xu "; + case Gaudi::ParticleID::strange: + return s << " Xs "; + case Gaudi::ParticleID::charm: + return s << " Xc "; + case Gaudi::ParticleID::bottom: + return s << " Xb "; + case Gaudi::ParticleID::top: + return s << " Xt "; + default:; + } + return s << " HasQuark(" << (int)m_quark << ") "; +} +std::ostream& Decays::Nodes::JSpin::fillStream( std::ostream& s ) const { + switch ( spin() ) { + case 1: + return s << " Scalar "; + case 2: + return s << " Spinor "; + case 3: + return s << " Vector "; + case 4: + return s << " ThreeHalf "; + case 5: + return s << " Tensor "; + case 6: + return s << " FiveHalf "; + default:; + } + return s << " JSpin(" << m_spin << ") "; +} +std::ostream& Decays::Nodes::SSpin::fillStream( std::ostream& s ) const { return s << " SSpin(" << spin() << ") "; } +std::ostream& Decays::Nodes::LSpin::fillStream( std::ostream& s ) const { return s << " LSpin(" << spin() << ") "; } + +// constructor from c-tau range & Service +Decays::Nodes::CTau::CTau( const double low, const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : m_low( low ), m_high( high ) { + if ( svc ) { m_ppSvc = const_cast<Gaudi::Interfaces::IParticlePropertySvc*>( svc ); } +} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::CTau* Decays::Nodes::CTau::clone() const { return new CTau( *this ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::CTau::fillStream( std::ostream& s ) const { + return s << " CTau(" << low() << "," << high() << ") "; +} +// MANDATORY: check the validity +bool Decays::Nodes::CTau::valid() const { return m_ppSvc.isValid(); } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::CTau::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + return setService( svc ); +} +// MANDATORY: the only one essential method +bool Decays::Nodes::CTau::operator()( const Gaudi::ParticleID& pid ) const { + return classify( pid, [&]( Gaudi::ParticleID id ) { + // invalid node + if ( !ppSvc() ) { return false; } // REJECT for invalid service + // use the service + const Gaudi::ParticleProperty* pp = ppSvc()->find( id ); + if ( !pp ) { return false; } // REJECT for invalid dparticle + // final decision: check ctau range + const auto ctau = pp->ctau(); + return low() <= ctau && ctau <= high(); + } ); +} +bool Decays::Nodes::CTau::add_( Gaudi::ParticleID pid, bool acc ) const { + return m_pids.with_lock( + []( KnownPids& pids, Gaudi::ParticleID pid, bool acc ) { + auto& c = ( acc ? pids.accepted : pids.rejected ); + auto ifind = std::lower_bound( c.begin(), c.end(), pid ); + if ( c.end() == ifind || pid < ( *ifind ) ) { c.insert( ifind, pid ); } + return acc; + }, + pid, acc ); +} +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::CTau::setService( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + // if service is substituted, clear the cache + if ( m_ppSvc != svc ) { + m_pids.with_lock( []( KnownPids& pids ) { + pids.accepted.clear(); + pids.rejected.clear(); + } ); + } + // + if ( svc ) { + m_ppSvc = const_cast<Gaudi::Interfaces::IParticlePropertySvc*>( svc ); + } else { + m_ppSvc = nullptr; + } + // + return m_ppSvc.isValid() ? StatusCode::SUCCESS : StatusCode::FAILURE; +} +// constructor from c-tau range & Service +Decays::Nodes::Mass::Mass( const double low, const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::CTau( low, high, svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Mass* Decays::Nodes::Mass::clone() const { return new Mass( *this ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::Mass::fillStream( std::ostream& s ) const { + return s << " Mass(" << low() << "," << high() << ") "; +} +// MANDATORY: the only one essential method +bool Decays::Nodes::Mass::operator()( const Gaudi::ParticleID& pid ) const { + return classify( pid, [&]( Gaudi::ParticleID pid ) { + // invalid node + if ( !ppSvc() ) { return false; } // REJECT for invaild service + // use the service + const Gaudi::ParticleProperty* pp = ppSvc()->find( pid ); + if ( !pp ) { return false; } // REJECT for invalid particle + // final decision: check mass range + const auto mass = pp->mass(); + return low() <= mass && mass <= high(); + } ); +} + +namespace { + // idea coming from The art of computer programming by Knuth + constexpr bool essentiallyEqual( double const a, double const b ) { + return std::abs( a - b ) <= std::min( std::abs( a ), std::abs( b ) ) * std::numeric_limits<double>::epsilon(); + } +} // namespace + +// constructor with high edge and service +Decays::Nodes::ShortLived_::ShortLived_( const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::CTau( -1 * Gaudi::Units::km, high, svc ) {} +// constructor with high edge and service +Decays::Nodes::ShortLived_::ShortLived_( const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::CTau( -1 * Gaudi::Units::km, s_SHORTLIVED, svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::ShortLived_* Decays::Nodes::ShortLived_::clone() const { + return new Decays::Nodes::ShortLived_( *this ); +} +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::ShortLived_::fillStream( std::ostream& s ) const { + if ( essentiallyEqual( high(), s_SHORTLIVED ) ) { return s << " ShortLived "; } + return s << " ShortLived_( " << high() << ") "; +} + +// constructor with high edge and service +Decays::Nodes::LongLived_::LongLived_( const double low, const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::CTau( low, s_INFINITY, svc ) {} +// constructor with high edge and service +Decays::Nodes::LongLived_::LongLived_( const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::CTau( s_LONGLIVED, s_INFINITY, svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::LongLived_* Decays::Nodes::LongLived_::clone() const { return new Decays::Nodes::LongLived_( *this ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::LongLived_::fillStream( std::ostream& s ) const { + if ( essentiallyEqual( low(), s_LONGLIVED ) ) { return s << " LongLived "; } + return s << " LongLived_( " << low() << ") "; +} + +// constructor with the service +Decays::Nodes::Stable::Stable( const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::LongLived_( s_STABLE, svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Stable* Decays::Nodes::Stable::clone() const { return new Decays::Nodes::Stable( *this ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::Stable::fillStream( std::ostream& s ) const { return s << " Stable "; } + +// constructor with the service +Decays::Nodes::StableCharged::StableCharged( const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::Stable( svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::StableCharged* Decays::Nodes::StableCharged::clone() const { + return new Decays::Nodes::StableCharged( *this ); +} +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::StableCharged::fillStream( std::ostream& s ) const { return s << " StableCharged "; } +// MANDATORY: the only one essential method +bool Decays::Nodes::StableCharged::operator()( const Gaudi::ParticleID& pid ) const { + return classify( pid, [&]( Gaudi::ParticleID id ) { + // invalid node + if ( !ppSvc() ) { return false; } // REJECT for invalid service + // use the service + const Gaudi::ParticleProperty* pp = ppSvc()->find( id ); + if ( !pp ) { return false; } // REJECT for invalid dparticle + // final decision: check ctau range + return low() <= pp->ctau() && 0 != id.threeCharge(); + } ); +} + +// constructor with high edge and service +Decays::Nodes::Light::Light( const double high, const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::Mass( -1 * Gaudi::Units::TeV, high, svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Light* Decays::Nodes::Light::clone() const { return new Decays::Nodes::Light( *this ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::Light::fillStream( std::ostream& s ) const { return s << " Light( " << high() << ") "; } + +// constructor with high edge and service +Decays::Nodes::Heavy::Heavy( const double low, const Gaudi::Interfaces::IParticlePropertySvc* svc ) + : Decays::Nodes::Mass( low, s_INFINITY, svc ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Heavy* Decays::Nodes::Heavy::clone() const { return new Decays::Nodes::Heavy( *this ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::Heavy::fillStream( std::ostream& s ) const { return s << " Heavy( " << high() << ") "; } + +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::PosID* Decays::Nodes::PosID::clone() const { return new PosID( *this ); } +// MANDATORY: check the validity +bool Decays::Nodes::PosID::valid() const { return true; } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::PosID::validate( const Gaudi::Interfaces::IParticlePropertySvc* /*svc */ ) const { + return StatusCode::SUCCESS; +} +// MANDATORY: the only one essential method +bool Decays::Nodes::PosID::operator()( const Gaudi::ParticleID& p ) const { return 0 < p.pid(); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::PosID::fillStream( std::ostream& s ) const { return s << " ID+ "; } + +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::NegID* Decays::Nodes::NegID::clone() const { return new NegID( *this ); } +// MANDATORY: check the validity +bool Decays::Nodes::NegID::valid() const { return true; } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::NegID::validate( const Gaudi::Interfaces::IParticlePropertySvc* /*svc */ ) const { + return StatusCode::SUCCESS; +} +// MANDATORY: the only one essential method +bool Decays::Nodes::NegID::operator()( const Gaudi::ParticleID& p ) const { return 0 > p.pid(); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::NegID::fillStream( std::ostream& s ) const { return s << " ID- "; } + +// constructor from the symbol +Decays::Nodes::Symbol::Symbol( const std::string& s ) : Decays::iNode(), m_symbol( Decays::Nodes::Invalid() ) { + const Decays::Symbols& sym = Decays::Symbols::instance(); + StatusCode sc = sym.symbol( s, m_symbol ); + sc.ignore(); +} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Symbol* Decays::Nodes::Symbol::clone() const { return new Decays::Nodes::Symbol( *this ); } +// MANDATORY: the only one essential method +bool Decays::Nodes::Symbol::operator()( const Gaudi::ParticleID& pid ) const { return m_symbol.node( pid ); } +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::Symbol::fillStream( std::ostream& s ) const { return s << m_symbol.node(); } +// MANDATORY: check the validity +bool Decays::Nodes::Symbol::valid() const { return m_symbol.valid(); } +// MANDATORY: validate +StatusCode Decays::Nodes::Symbol::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + return m_symbol.validate( svc ); +} diff --git a/GaudiPartProp/src/Nodes.cpp b/GaudiPartProp/src/Nodes.cpp new file mode 100644 index 0000000000000000000000000000000000000000..51c3ed80fc88899f919788a7e66e24ad6e36f04b --- /dev/null +++ b/GaudiPartProp/src/Nodes.cpp @@ -0,0 +1,214 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/Nodes.h> +#include <Gaudi/ParticleID.h> +#include <GaudiKernel/SerializeSTL.h> +#include <algorithm> +#include <functional> + +namespace Decays = Gaudi::Decays; + +/** @file + * The implementation file for various decay nodes + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-04-12 + */ + +Decays::NodeList::NodeList( const Decays::NodeList::Nodes_& nodes ) : m_nodes( nodes ) {} +void Decays::NodeList::push_back( const Decays::Nodes::_Node& node ) { m_nodes.push_back( node ); } +void Decays::NodeList::push_back( const Decays::iNode& node ) { m_nodes.push_back( node ); } +void Decays::NodeList::push_back( const Decays::NodeList::Nodes_& nodes ) { + m_nodes.insert( m_nodes.end(), nodes.begin(), nodes.end() ); +} +void Decays::NodeList::push_back( const NodeList& nodes ) { push_back( nodes.m_nodes ); } +Decays::NodeList& Decays::NodeList::operator=( const Decays::Nodes::_Node& node ) { + m_nodes.clear(); + push_back( node ); + return *this; +} +Decays::NodeList& Decays::NodeList::operator=( const Decays::iNode& node ) { + m_nodes.clear(); + push_back( node ); + return *this; +} + +Decays::Nodes::_Node& Decays::Nodes::_Node::op_or( const Decays::NodeList& right ) { + if ( !right.empty() ) { m_node |= Decays::Nodes::Or( right ); } + return *this; +} +Decays::Nodes::_Node& Decays::Nodes::_Node::op_and( const Decays::NodeList& right ) { + if ( !right.empty() ) { m_node &= Decays::Nodes::And( right ); } + return *this; +} + +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Invalid* Decays::Nodes::Invalid::clone() const { return new Invalid( *this ); } +// MANDATORY: check the validity +bool Decays::Nodes::Invalid::valid() const { return false; } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::Invalid::validate( const Gaudi::Interfaces::IParticlePropertySvc* /*svc */ ) const { + return StatusCode::FAILURE; +} +// MANDATORY: the only one essential method +bool Decays::Nodes::Invalid::operator()( const Gaudi::ParticleID& /* p */ ) const { return false; } +std::ostream& Decays::Nodes::Invalid::fillStream( std::ostream& s ) const { return s << " <INVALID> "; } + +// the default constructor +Decays::Nodes::_Node::_Node() : m_node( Decays::Nodes::Invalid() ) {} + +// constructor from two nodes +Decays::Nodes::Or::Or( const Decays::iNode& n1, const Decays::iNode& n2 ) { + add( n1 ); + add( n2 ); +} +// constructor from three nodes +Decays::Nodes::Or::Or( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3 ) { + add( n1 ); + add( n2 ); + add( n3 ); +} +// constructor from four nodes +Decays::Nodes::Or::Or( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3, + const Decays::iNode& n4 ) { + add( n1 ); + add( n2 ); + add( n3 ); + add( n4 ); +} +// constructor from list of nodes +Decays::Nodes::Or::Or( const Decays::NodeList& nodes ) { add( nodes ); } +// add the node +size_t Decays::Nodes::Or::add( const Decays::iNode& node ) { + const Decays::iNode* right = &node; + const Or* _or = dynamic_cast<const Or*>( right ); + if ( 0 != _or ) { return add( _or->m_nodes ); } // RETURN + // holder ? + const Node* _no = dynamic_cast<const Node*>( right ); + if ( 0 != _no ) { return add( _no->node() ); } // RETURN + // just add the node + m_nodes.push_back( node ); + return m_nodes.size(); +} +// add the list of nodes +size_t Decays::Nodes::Or::add( const Decays::NodeList& nodes ) { + for ( const auto& n : nodes ) add( n ); + return m_nodes.size(); +} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Or* Decays::Nodes::Or::clone() const { return new Or( *this ); } +// MANDATORY: the only one essential method +bool Decays::Nodes::Or::operator()( const Gaudi::ParticleID& pid ) const { + return m_nodes.end() != std::find_if( m_nodes.begin(), m_nodes.end(), + [&]( const Decays::Nodes::_Node& node ) { return node( pid ); } ); +} +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::Or::fillStream( std::ostream& s ) const { + s << " ("; + for ( Decays::NodeList::const_iterator node = m_nodes.begin(); m_nodes.end() != node; ++node ) { + if ( m_nodes.begin() != node ) { s << "|"; } + s << *node; + } + return s << ") "; +} +// MANDATORY: check the validity +bool Decays::Nodes::Or::valid() const { return !m_nodes.empty() && Decays::valid( m_nodes.begin(), m_nodes.end() ); } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::Or::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + if ( m_nodes.empty() ) { return StatusCode::FAILURE; } + return Decays::validate( m_nodes.begin(), m_nodes.end(), svc ); +} + +// constructor from two nodes +Decays::Nodes::And::And( const Decays::iNode& n1, const Decays::iNode& n2 ) { + add( n1 ); + add( n2 ); +} +// constructor from three nodes +Decays::Nodes::And::And( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3 ) { + add( n1 ); + add( n2 ); + add( n3 ); +} +// constructor from four nodes +Decays::Nodes::And::And( const Decays::iNode& n1, const Decays::iNode& n2, const Decays::iNode& n3, + const Decays::iNode& n4 ) { + add( n1 ); + add( n2 ); + add( n3 ); + add( n4 ); +} +// constructor form list of nodes +Decays::Nodes::And::And( const Decays::NodeList& nodes ) { add( nodes ); } +// add the node +size_t Decays::Nodes::And::add( const Decays::iNode& node ) { + const Decays::iNode* right = &node; + const And* _and = dynamic_cast<const And*>( right ); + if ( 0 != _and ) { return add( _and->m_nodes ); } // RETURN + // holder ? + const Node* _no = dynamic_cast<const Node*>( right ); + if ( 0 != _no ) { return add( _no->node() ); } // RETURN + // just add the node + m_nodes.push_back( node ); + return m_nodes.size(); +} +// add the list of nodes +size_t Decays::Nodes::And::add( const Decays::NodeList& nodes ) { + for ( const auto& n : nodes ) add( n ); + return m_nodes.size(); +} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::And* Decays::Nodes::And::clone() const { return new And( *this ); } +// MANDATORY: the only one essential method +bool Decays::Nodes::And::operator()( const Gaudi::ParticleID& pid ) const { + if ( m_nodes.empty() ) { return false; } + return std::all_of( m_nodes.begin(), m_nodes.end(), [&]( const Decays::Nodes::_Node& n ) { return n == pid; } ); +} +// MANDATORY: the specific printout +std::ostream& Decays::Nodes::And::fillStream( std::ostream& s ) const { + return GaudiUtils::details::ostream_joiner( s << " (", m_nodes, "&" ) << ") "; +} +// MANDATORY: check the validity +bool Decays::Nodes::And::valid() const { return !m_nodes.empty() && Decays::valid( m_nodes.begin(), m_nodes.end() ); } +// MANDATORY: the proper validation of the node +StatusCode Decays::Nodes::And::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + if ( m_nodes.empty() ) { return StatusCode::FAILURE; } + return Decays::validate( m_nodes.begin(), m_nodes.end(), svc ); +} + +// constructor from the node +Decays::Nodes::Not::Not( const Decays::iNode& node ) : Decays::iNode(), m_node( node ) {} +// MANDATORY: clone method ("virtual constructor") +Decays::Nodes::Not* Decays::Nodes::Not::clone() const { return new Not( *this ); } +// valid ? +bool Decays::Nodes::Not::valid() const { return m_node.valid(); } +bool Decays::Nodes::Not::operator()( const Gaudi::ParticleID& pid ) const { return !m_node.node( pid ); } +StatusCode Decays::Nodes::Not::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + return m_node.validate( svc ); +} + +std::ostream& Decays::Nodes::Not::fillStream( std::ostream& s ) const { return s << " ~(" << m_node << ") "; } + +Decays::Nodes::Or& Decays::Nodes::Or::operator+=( const Decays::iNode& node ) { + add( node ); + return *this; +} +Decays::Nodes::And& Decays::Nodes::And::operator+=( const Decays::iNode& node ) { + add( node ); + return *this; +} +Decays::Nodes::Or& Decays::Nodes::Or::operator+=( const Decays::NodeList& nodes ) { + add( nodes ); + return *this; +} +Decays::Nodes::And& Decays::Nodes::And::operator+=( const Decays::NodeList& nodes ) { + add( nodes ); + return *this; +} diff --git a/GaudiPartProp/src/ParticleID.cpp b/GaudiPartProp/src/ParticleID.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4a460a3cb48a1e7744f911a8ef32bc2262fb0e94 --- /dev/null +++ b/GaudiPartProp/src/ParticleID.cpp @@ -0,0 +1,506 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/ParticleID.h> +#include <array> +#include <iostream> +#include <sstream> + +/** @file ParticleID.cpp + * Implementation file for class ParticleID. + * @date 19/02/2002 + * @author Gloria Corti + * @date 22/03/2018 + * @author Philip Ilten + */ + +namespace { + typedef std::array<unsigned int, 8> DATA; + inline DATA decode( const Gaudi::ParticleID& pid ) { + unsigned int m_extra = pid.abspid() / 10000000; + unsigned int m_n = pid.digit( Gaudi::ParticleID::n ); + unsigned int m_nr = pid.digit( Gaudi::ParticleID::nr ); + unsigned int m_nl = pid.digit( Gaudi::ParticleID::nl ); + unsigned int m_nq1 = pid.digit( Gaudi::ParticleID::nq1 ); + unsigned int m_nq2 = pid.digit( Gaudi::ParticleID::nq2 ); + unsigned int m_nq3 = pid.digit( Gaudi::ParticleID::nq3 ); + unsigned int m_nj = pid.digit( Gaudi::ParticleID::nj ); + unsigned int aid = pid.abspid(); + + // Switch gluons to 0. + if ( m_nq1 == 9 ) m_nq1 = 0; + // Special particles with 99 code. + if ( m_n == 9 && m_nr == 9 ) { + // Translate the color-octet quarkonia numbering scheme from Pythia. + if ( m_nl > 3 ) { + std::swap( m_nl, m_nq3 ); + m_nj = m_nq1 % 2 ? 1 : 3; + m_nq1 = 0; + m_nq2 = m_nq3; + } + // Handle the X(3872) states. + else if ( m_nl != 0 ) { + m_nr = 0; + } + // Map left-right symmetry for double charged Higgses from Pythia. + else if ( !m_nq2 && m_nq3 > 2 ) { + m_nq3 = 0; + m_nj = 9; + } + } + // The PDG hidden valley scheme. + else if ( m_n == 4 && m_nr == 9 && m_nq2 ) { + m_nq3 = m_nq2; + } + // The K0S/L and B0L/H. + else if ( aid == 130 || aid == 310 || aid == 150 || aid == 510 ) { + m_nl = 1; + m_nj = 1; + } + // Technical photons. + else if ( aid == 10022 || aid == 20022 ) { + m_nl = 0; + } + // Old heavy ion convention for hydrogen-2 nucleus. + else if ( m_extra == 45 ) { + m_extra = 100; + m_n = 0; + m_nr = 0; + m_nl = 1; + m_nq1 = 0; + m_nq2 = 0; + m_nq3 = 2; + m_nj = 0; + } + // Old heavy ion convention for hydrogen-3 nucleus. + else if ( m_extra == 46 ) { + m_extra = 100; + m_n = 0; + m_nr = 0; + m_nl = 1; + m_nq1 = 0; + m_nq2 = 0; + m_nq3 = 3; + m_nj = 0; + } + // Old heavy ion convention for helium-4 nucleus. + else if ( m_extra == 47 ) { + m_extra = 100; + m_n = 0; + m_nr = 0; + m_nl = 2; + m_nq1 = 0; + m_nq2 = 0; + m_nq3 = 4; + m_nj = 0; + } + // Old heavy ion convention for helium-3 nucleus. + else if ( m_extra == 49 ) { + m_extra = 100; + m_n = 0; + m_nr = 0; + m_nl = 2; + m_nq1 = 0; + m_nq2 = 0; + m_nq3 = 3; + m_nj = 0; + } + // The EvtGen particles Xsd (30343), Xsu (30353), and Xss (30363) + // which break the PDG conventions. + else if ( aid == 30343 ) { + m_nq1 = 2; + m_nq2 = 3; + m_nq3 = 1; + } else if ( aid == 30353 ) { + m_nq1 = 2; + m_nq2 = 3; + m_nq3 = 2; + } else if ( aid == 30363 ) { + m_nq1 = 2; + m_nq2 = 3; + m_nq3 = 3; + } + // Specific BSM particles. + else if ( aid == 1009002 ) { + m_nq1 = 0; + m_nq3 = 2; + m_nj = 1; + } else if ( aid == 1000542 ) { + m_nq1 = 5; + m_nq2 = 5; + m_nq3 = 5; + } else if ( aid == 1000522 ) { + m_nq1 = 1; + m_nq2 = 1; + m_nq3 = 1; + } else if ( aid == 1000039 ) { + m_n = 9; + m_nr = 9; + m_nq3 = 1; + m_nj = 0; + } else if ( aid == 3100021 ) { + m_nq1 = 1; + m_nq2 = 1; + m_nq3 = 2; + } + // + return { m_extra, m_nj, m_nq3, m_nq2, m_nq1, m_nl, m_nr, m_n }; + } +} // namespace +// Return everything beyond the 7th PDG ID digit. +int Gaudi::ParticleID::extraBits() const { + const unsigned int m_extra = abspid() / 10000000; + return 45 == m_extra ? 100u : 46 == m_extra ? 100u : 47 == m_extra ? 100u : 49 == m_extra ? 100u : m_extra; +} +/* Return the fundamental ID. + * This is 0 for nuclie, mesons, baryons, and di-quarks. + * Otherwise, this is the first two digits of the PDG ID + */ +int Gaudi::ParticleID::fundamentalID() const { + // + DATA data = decode( *this ); + const unsigned int m_extra = data[0]; + const unsigned int m_nl = data[Gaudi::ParticleID::nl]; + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + return !m_extra && !( m_nl + m_nq1 + m_nq2 ) ? 10 * m_nq3 + m_nj : 0; +} +// Return if the PID is valid. +bool Gaudi::ParticleID::isValid() const { + // Nuclei, geantino, and intermediate. + if ( extraBits() ) { + return m_pid == 480000000 || m_pid == -990000000 || isNucleus(); + } + // Standard model particles. + else if ( abspid() < 100 || isHadron() || isDiQuark() ) { + return true; + } + // Beyond the standard model particles. + else { + return !isSM(); + } +} +// Return if the PID is from the standard model. +bool Gaudi::ParticleID::isSM() const { + DATA data = decode( *this ); + const unsigned int m_n = data[Gaudi::ParticleID::n]; + const unsigned int m_nr = data[Gaudi::ParticleID::nr]; + // + return m_n < 1 || ( m_n == 9 && m_nr != 9 ); +} +// Return if the PID is for a meson. +bool Gaudi::ParticleID::isMeson() const { + // + if ( !isSM() ) { return false; } + // + DATA data = decode( *this ); + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + return m_nq1 == 0 && m_nq2 != 0 && m_nq3 != 0 && m_nj != 0 && !( pid() < 0 && m_nq2 == m_nq3 ); +} +// Return if the PID is for a baryon. +bool Gaudi::ParticleID::isBaryon() const { + // + if ( !isSM() ) { return false; } + // + DATA data = decode( *this ); + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + return m_nq1 != 0 && m_nq2 != 0 && m_nq3 != 0 && m_nj != 0; +} +// Return if the PID is for a di-quark. +bool Gaudi::ParticleID::isDiQuark() const { + // + if ( !isSM() ) { return false; } + // + DATA data = decode( *this ); + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + return m_nq1 != 0 && m_nq2 != 0 && m_nq3 == 0 && m_nj != 0 && !( m_nj == 1 && m_nq1 == m_nq2 ); +} +// Return if the PID is for a hadron. +bool Gaudi::ParticleID::isHadron() const { return isMeson() || isBaryon(); } +// Return if the PID is for a lepton. +bool Gaudi::ParticleID::isLepton() const { + const unsigned int apid = abspid(); + return 11 <= apid && apid <= 18; +} +// Return if the PID is for a nucleus. +bool Gaudi::ParticleID::isNucleus() const { return 100 <= extraBits() && Z() <= A(); } +// Return if the PID is for a bare quark. +bool Gaudi::ParticleID::isQuark() const { + const unsigned int apid = abspid(); + return Gaudi::ParticleID::Quark::first <= apid && apid <= Gaudi::ParticleID::Quark::last; +} +// Return if the PID is a particle with quarks, but not a nucleus. +bool Gaudi::ParticleID::hasQuarks() const { return !extraBits() && !fundamentalID(); } +// Return if the PID is a particle containing a specified quark flavor. +bool Gaudi::ParticleID::hasQuark( const Quark& q ) const { + if ( abspid() == q ) { return true; } + if ( !hasQuarks() ) { return false; } + // + DATA data = decode( *this ); + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + // + return q == m_nq3 || q == m_nq2 || q == m_nq1; +} +// Return three times the charge, in units of e+, valid for all particles. +int Gaudi::ParticleID::threeCharge() const { + // Lookup table for charges. The Xu+ (43) and Xu0 (44) break the PDG + // conventions and are EvtGen specific. The c-hadron (84), b-hadron + // (85), t-hadron (86), b'-hadron (87), are LHCb specific but within + // the acceptable 81 - 100 range. A double charged Higgs is inserted + // as 9 and a gravintino as 10. + static const int q[101] = { 0, -1, 2, -1, 2, -1, 2, -1, 2, 6, 0, // 1 - 10. + -3, 0, -3, 0, -3, 0, -3, 0, 0, 0, // 11 - 20. + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, // 21 - 30. + 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, // 31 - 40. + 0, -1, 0, 3, 0, 0, 0, 0, 0, 0, // 41 - 50. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 51 - 60. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 61 - 70. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 71 - 80. + 0, 0, 0, 2, -1, 2, -1, 0, 0, 0, // 81 - 90. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 91 - 100. + const unsigned int fid = fundamentalID(); + int charge = 0; + // + DATA data = decode( *this ); + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + + // Nuclei. + if ( isNucleus() ) { + charge = 3 * Z(); + } + // Fundamental particles from the charge table. + else if ( fid ) { + charge = q[fid]; + } + // Mesons. + else if ( !m_nq1 ) { + charge = abs( q[m_nq2] - q[m_nq3] ); + } + // Everything else. + else { + charge = q[m_nq3] + q[m_nq2] + q[m_nq1]; + } + + return ( pid() < 0 ? -1 : 1 ) * charge; +} +// Return 2J+1, where J is the total spin, valid for all particles. +int Gaudi::ParticleID::jSpin() const { + // Lookup table for spins. The Xu+ (43) and Xu0 (44) break the PDG + // conventions and are EvtGen specific. The c-hadron (84), b-hadron + // (85), t-hadron (86), b'-hadron (87), are LHCb specific but within + // the acceptable 81 - 100 range. A double charged Higgs is inserted + // as 9 and a gravintino is inserted as 10. + static const unsigned int j[101] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 4, // 1 - 10. + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, // 11 - 20. + 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, // 21 - 30. + 0, 3, 3, 3, 1, 1, 1, 1, 5, 0, // 31 - 40. + 3, 1, 0, 0, 1, 1, 0, 0, 0, 0, // 41 - 50. + 1, 2, 3, 1, 3, 1, 1, 1, 1, 1, // 51 - 60. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 61 - 70. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 71 - 80. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 81 - 90. + 0, 0, 3, 0, 0, 0, 0, 0, 0, 0 }; // 91 - 100. + const unsigned int fid = fundamentalID(); + int spin = 0; + // + DATA data = decode( *this ); + const unsigned int m_n = data[Gaudi::ParticleID::n]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + // Fundamental particles from the spin table. + if ( fid ) { + // Supersymmetric particles. + if ( m_n == 1 || m_n == 2 || m_n == 3 ) { + spin = j[fid] % 2 + 1; + } + // Standard particles. + else { + spin = j[fid]; + } + } + // Nuclei. + else if ( isNucleus() ) { + spin = m_nq3 % 2 + 1; + } + // Everything else. + else { + spin = m_nj; + } + // + return spin; +} + +// Return 2S+1, where S is the spin, valid only for mesons. +int Gaudi::ParticleID::sSpin() const { + // + if ( !isMeson() ) { return 0; } + // + DATA data = decode( *this ); + const unsigned int m_n = data[Gaudi::ParticleID::n]; + const unsigned int m_nl = data[Gaudi::ParticleID::nl]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + if ( m_n == 9 ) { + return 0; + } else if ( m_nj == 1 ) { + return m_nl; + } else if ( m_nl == 1 ) { + return 0; + } else { + return 1; + } +} + +// Return 2L+1, where L is the orbital angular momentum, valid only for mesons. +int Gaudi::ParticleID::lSpin() const { + // + if ( !isMeson() ) { return 0; } + // + DATA data = decode( *this ); + const unsigned int m_n = data[Gaudi::ParticleID::n]; + const unsigned int m_nl = data[Gaudi::ParticleID::nl]; + const unsigned int m_nj = data[Gaudi::ParticleID::nj]; + // + if ( m_n == 9 ) { + return 0; + } else if ( m_nj == 1 ) { + return m_nl; + } else if ( m_nl == 0 ) { + return ( m_nj - 3 ) / 2; + } else if ( m_nl == 3 ) { + return ( m_nj + 1 ) / 2; + } else { + return ( m_nj - 1 ) / 2; + } +} +// Return the atomic number for a nucleus. +int Gaudi::ParticleID::Z() const { + if ( extraBits() < 100 ) { return 0; } + // + DATA data = decode( *this ); + // + const unsigned int m_n = data[Gaudi::ParticleID::n]; + const unsigned int m_nr = data[Gaudi::ParticleID::nr]; + const unsigned int m_nl = data[Gaudi::ParticleID::nl]; + // + return m_n * 100 + m_nr * 10 + m_nl; +} +// Return the nucleon number for a nucleus. +int Gaudi::ParticleID::A() const { + if ( extraBits() < 100 ) { return 0; } + // + DATA data = decode( *this ); + const unsigned int m_nq1 = data[Gaudi::ParticleID::nq1]; + const unsigned int m_nq2 = data[Gaudi::ParticleID::nq2]; + const unsigned int m_nq3 = data[Gaudi::ParticleID::nq3]; + // + return m_nq1 * 100 + m_nq2 * 10 + m_nq3; +} +// Return the number of strange quarks for a nucleus. +int Gaudi::ParticleID::nLambda() const { + const unsigned int m_extra = extraBits(); + return 100 <= m_extra ? m_extra - 100 : 0; +} +// Fill a stream with the PID. +std::ostream& Gaudi::ParticleID::fillStream( std::ostream& s ) const { + return s << "Gaudi.ParticleID(" << m_pid << ")"; +} +// Return the PID stream representation as a string. +std::string Gaudi::ParticleID::toString() const { + std::ostringstream s; + fillStream( s ); + return s.str(); +} + +// Fill a stream with the PID digit enumeration. +std::ostream& Gaudi::ParticleID::printLocation( const long l, std::ostream& s ) { + switch ( l ) { + case Gaudi::ParticleID::nj: + return s << "Gaudi.ParticleID.nj"; + case Gaudi::ParticleID::nq3: + return s << "Gaudi.ParticleID.nq3"; + case Gaudi::ParticleID::nq2: + return s << "Gaudi.ParticleID.nq2"; + case Gaudi::ParticleID::nq1: + return s << "Gaudi.ParticleID.nq1"; + case Gaudi::ParticleID::nl: + return s << "Gaudi.ParticleID.nl"; + case Gaudi::ParticleID::nr: + return s << "Gaudi.ParticleID.nr"; + case Gaudi::ParticleID::n: + return s << "Gaudi.ParticleID.n"; + case Gaudi::ParticleID::n8: + return s << "Gaudi.ParticleID.n8"; + case Gaudi::ParticleID::n9: + return s << "Gaudi.ParticleID.n9"; + case Gaudi::ParticleID::n10: + return s << "Gaudi.ParticleID.n10"; + default:; + } + return s << "Gaudi.ParticleID.Location(" << l << ")"; +} + +// Return the PID digit enumeration stream representation as a string. +std::string Gaudi::ParticleID::printLocation( const long l ) { + std::ostringstream s; + printLocation( l, s ); + return s.str(); +} + +// Fill a stream with the PID quark enumeration. +std::ostream& Gaudi::ParticleID::printQuark( const long q, std::ostream& s ) { + switch ( q ) { + case Gaudi::ParticleID::down: + return s << "Gaudi.ParticleID.down"; + case Gaudi::ParticleID::up: + return s << "Gaudi.ParticleID.up"; + case Gaudi::ParticleID::strange: + return s << "Gaudi.ParticleID.strange"; + case Gaudi::ParticleID::charm: + return s << "Gaudi.ParticleID.charm"; + case Gaudi::ParticleID::bottom: + return s << "Gaudi.ParticleID.bottom"; + case Gaudi::ParticleID::top: + return s << "Gaudi.ParticleID.top"; + case Gaudi::ParticleID::bottom_prime: + return s << "Gaudi.ParticleID.bottom_prime"; + case Gaudi::ParticleID::top_prime: + return s << "Gaudi.ParticleID.top_prime"; + default:; + } + return s << "Gaudi.ParticleID.Quark(" << q << ")"; +} + +// Return the PID quark enumeration stream representation as a string. +std::string Gaudi::ParticleID::printQuark( const long q ) { + std::ostringstream s; + printQuark( q, s ); + return s.str(); +} diff --git a/GaudiPartProp/src/ParticleProperty.cpp b/GaudiPartProp/src/ParticleProperty.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7ccd9b28c1a416d11a6c806ae9467a42e0ce127f --- /dev/null +++ b/GaudiPartProp/src/ParticleProperty.cpp @@ -0,0 +1,408 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleID.h> +#include <Gaudi/ParticleProperty.h> +#include <GaudiKernel/MsgStream.h> +#include <GaudiKernel/SystemOfUnits.h> +#include <GaudiKernel/ToStream.h> +#include <boost/format.hpp> +#include <ostream> + +/** @file + * Implementation file for class Gaudi:::ParticleProperty + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +/* standard output operator to the stream + * @param stream the stream + * @param pp the particle property object + * @return the stream + */ +std::ostream& operator<<( std::ostream& stream, const Gaudi::ParticleProperty& pp ) { return pp.fillStream( stream ); } +/* full constructor, from all data (except the antiparticle ) + * @param name the name for the particle + * @param pid the PID for the particle + * @param charge the charge of the particle + * @param mass the nominal mass of the particle + * @param tlife the nominal lifetime of the particle + * @param evtGen the name of particle in EvtGen program + * @param pythia the ID for the particle used in Pythia generator + * @param maxWidth the maximal width of the particle (used in generator) + */ +Gaudi::ParticleProperty::ParticleProperty( const std::string& name, const Gaudi::ParticleID& pid, const double charge, + const double mass, const double tlife, const double maxWidth, + const std::string& evtgen, const int pythia ) + : m_name( name ) + , m_pid( pid ) + , m_charge( charge ) + , m_mass( mass ) + , m_tlife( tlife ) + , m_maxWidth( maxWidth ) + , m_evtgen( evtgen ) + , m_pythia( pythia ) + , m_anti( 0 ) {} +/* A bit simplified constructor, from all data (except the antiparticle ) + * + * - "evtgen" is set from the regular "name" + * - "pythia" is set from the regular PID + * + * @param name the name for the particle + * @param pid the PID for the particle + * @param charge the charge of the particle + * @param mass the nominal mass of the particle + * @param tlife the nominal lifetime of the particle + * @param maxWidth the maximal width of the particle (used in generator) + */ +Gaudi::ParticleProperty::ParticleProperty( const std::string& name, const Gaudi::ParticleID& pid, const double charge, + const double mass, const double tlife, const double maxWidth ) + : m_name( name ) + , m_pid( pid ) + , m_charge( charge ) + , m_mass( mass ) + , m_tlife( tlife ) + , m_maxWidth( maxWidth ) + , m_evtgen( name ) + , m_pythia( pid.pid() ) + , m_anti( 0 ) {} +/* the standard (a'la Gaudi) printout of the object + * @param s reference to the output stream + * @return reference to the output stream + */ +std::ostream& Gaudi::ParticleProperty::fillStream( std::ostream& s ) const { + // + typedef boost::format BF; + // + // name & code + s << BF( "%1$-14s %|16t| PDG:%2$9d," ) % name() % particleID().pid(); +#ifdef __INTEL_COMPILER // Disable ICC remark +# pragma warning( disable : 1572 ) // Floating-point equality and inequality comparisons are unreliable +# pragma warning( push ) +#endif + // charge + if ( 0 == charge() ) { + s << " Q: 0"; + } else if ( 1.0 == charge() ) { + s << " Q: +1"; + } else if ( -1.0 == charge() ) { + s << " Q: -1"; + } else if ( 2.0 == charge() ) { + s << " Q: +2"; + } else if ( -2.0 == charge() ) { + s << " Q: -2"; + } else if ( 0.3 == charge() ) { + s << " Q:+1/3"; + } else if ( -0.3 == charge() ) { + s << " Q:-1/3"; + } else if ( 0.7 == charge() ) { + s << " Q:+2/3"; + } else if ( -0.7 == charge() ) { + s << " Q:-2/3"; + } else { + s << BF( " Q:%|+3.1f|," ) % float( charge() ); + } +#ifdef __INTEL_COMPILER // Re-enable ICC remark +# pragma warning( pop ) +#endif + // mass + if ( mass() < 1 * Gaudi::Units::MeV ) { + s << BF( ", mass:%|9.6g| keV" ) % ( mass() / Gaudi::Units::keV ); + } else if ( mass() < 1 * Gaudi::Units::GeV ) { + s << BF( ", mass:%|9.6g| MeV" ) % ( mass() / Gaudi::Units::MeV ); + } else { + s << BF( ", mass:%|9.6g| GeV" ) % ( mass() / Gaudi::Units::GeV ); + } + // lifetime + if ( 1 * Gaudi::Units::km < ctau() ) { + s << ", lifetime: infinity "; + } else if ( 0 == lifeTime() ) { + } // ATTENTION!! + else if ( 1 * Gaudi::Units::meter < ctau() ) { + s << BF( ", ctau:%|12.6g| m" ) % ( ctau() / Gaudi::Units::meter ); + } else if ( 1 * Gaudi::Units::cm < ctau() ) { + s << BF( ", ctau:%|11.6g| cm" ) % ( ctau() / Gaudi::Units::cm ); + } else if ( 0.5 * Gaudi::Units::mm < ctau() ) { + s << BF( ", ctau:%|11.6g| mm" ) % ( ctau() / Gaudi::Units::mm ); + } else if ( 0.1 * Gaudi::Units::micrometer < ctau() ) { + s << BF( ", ctau:%|11.6g| um" ) % ( ctau() / Gaudi::Units::micrometer ); + } else if ( 1 * Gaudi::Units::GeV <= width() ) { + s << BF( ", width:%|10.6g| GeV" ) % ( width() / Gaudi::Units::GeV ); + } else if ( 1 * Gaudi::Units::MeV <= width() ) { + s << BF( ", width:%|10.6g| MeV" ) % ( width() / Gaudi::Units::MeV ); + } else if ( 1 * Gaudi::Units::keV <= width() ) { + s << BF( ", width:%|10.6g| keV" ) % ( width() / Gaudi::Units::keV ); + } else if ( 1 * Gaudi::Units::eV <= width() ) { + s << BF( ", width:%|10.6g| eV" ) % ( width() / Gaudi::Units::eV ); + } else { + s << BF( ", ltime:%|12.6g| ns" ) % ( lifetime() / Gaudi::Units::ns ); + } + // Evt Gen name + if ( evtGen() != name() ) { s << BF( ", EvtGen: %|-10s|" ) % evtGen(); } + // pythia ID + if ( m_pid.pid() != pythia() ) { s << BF( ", Pythia: %|-9d|" ) % pythia(); } + return s; +} +// simple method for conversion into string +std::string Gaudi::ParticleProperty::toString() const { + std::ostringstream s; + fillStream( s ); + return s.str(); +} +/* set the pointer to the antipartice + * @attention it is the only one "setter" + * @param p pointer to anti-particle + */ +void Gaudi::ParticleProperty::setAntiParticle( const ParticleProperty* p ) { m_anti = p; } + +/* print a list of properties in a form of the table + * @see Gaudi::ParticleProperty + * @param particles the list of particle properties + * @param stream the reference to the output stream + * @param service the service to extract global information + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +std::ostream& Gaudi::ParticleProperties::printAsTable_( const std::vector<const Gaudi::ParticleProperty*>& particles, + std::ostream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + std::string fmt, hdr; + // + if ( 0 != service ) { + fmt += " | %|-4.4s| "; // index + hdr += " | %|-4.4s| "; // index + } + // + fmt += "| %|-18.18s|"; // the name + fmt += "| %|12d| "; // PDGID + fmt += "| %|=4s| "; // charge + fmt += "| %|13.8g|"; // mass + fmt += " %|-3s| "; // unit + fmt += "| %|13.8g|"; // lifetime/gamma/ctau + fmt += " %|-3s| "; // unit + fmt += "| %|=10.4g| "; // maxwidth + fmt += "| %|=20.20s|"; // evtgen name + fmt += " | %|=10d| |"; // pythia ID + fmt += " %|=20.20d| |"; // antiparticle + // + hdr += "| %|=18.18s|"; // the name + hdr += "| %|=12.12s| "; // PDGID + hdr += "| %|=4.4s| "; // charge + hdr += "| %|=18.18s|"; // mass + // hdr += "%|=5.5s|" ; // unit + hdr += "| %|=18.18s|"; // lifetime/gamma/ctau + // hdr += "%|=5.5s|" ; // unit + hdr += "| %|=10.10g| "; // maxwidth + hdr += "| %|=20.20s|"; // evtgen name + hdr += " | %|=10.10s| |"; // pythia ID + hdr += " %|=20.20d| |"; // antiparticle + + boost::format header( hdr ); + header.exceptions( boost::io::all_error_bits ^ ( boost::io::too_many_args_bit | boost::io::too_few_args_bit ) ); + + if ( service ) { header % "#"; } + header % "Name" % "PdgID" % "Q" % "Mass" % "(c*)Tau/Gamma" % "MaxWidth" % "EvtGen" % "PythiaID" % "Antiparticle"; + + const std::string hdrLine = header.str(); + const std::string dashes = " " + std::string( hdrLine.size() - 1, '-' ); + stream << dashes << std::endl << hdrLine << std::endl << dashes << std::endl; + + for ( auto ip = particles.begin(); particles.end() != ip; ++ip ) { + const Gaudi::ParticleProperty* pp = *ip; + if ( 0 == pp ) { continue; } + boost::format line( fmt ); + line.exceptions( boost::io::all_error_bits ^ ( boost::io::too_many_args_bit | boost::io::too_few_args_bit ) ); + // + if ( 0 != service ) { + size_t index = Gaudi::ParticleProperties::index( pp, service ); + if ( 0 == index ) { + line % "?"; + } else { + line % index; + } + } + // + line % pp->name() // name + % pp->particleID().pid(); // PDG-ID + // +#ifdef __INTEL_COMPILER // Disable ICC remark +# pragma warning( disable : 1572 ) // Floating-point equality and inequality comparisons are unreliable +# pragma warning( push ) +#endif + if ( 0 == pp->charge() ) { + line % "0"; + } else if ( 0.3 == pp->charge() ) { + line % "+1/3"; + } else if ( -0.3 == pp->charge() ) { + line % "-1/3"; + } else if ( 0.7 == pp->charge() ) { + line % "+2/3"; + } else if ( -0.7 == pp->charge() ) { + line % "-2/3"; + } else { + line % pp->charge(); + } +#ifdef __INTEL_COMPILER // Re-enable ICC remark +# pragma warning( pop ) +#endif + // + // mass + if ( pp->mass() < 1 * Gaudi::Units::keV ) { + line % ( pp->mass() / Gaudi::Units::eV ) % "eV"; + } else if ( pp->mass() < 1 * Gaudi::Units::MeV ) { + line % ( pp->mass() / Gaudi::Units::keV ) % "keV"; + } else if ( pp->mass() < 1 * Gaudi::Units::GeV ) { + line % ( pp->mass() / Gaudi::Units::MeV ) % "MeV"; + } else if ( pp->mass() < 1 * Gaudi::Units::TeV ) { + line % ( pp->mass() / Gaudi::Units::GeV ) % "GeV"; + } else { + line % ( pp->mass() / Gaudi::Units::TeV ) % "TeV"; + } + // lifetime/width/ctau + const double ctau = pp->ctau(); + const double width = pp->width(); + const double ltime = pp->lifetime(); + if ( 3600 * Gaudi::Units::second < ltime ) { + line % "stable" % ""; + } else if ( 1 * Gaudi::Units::second < ltime ) { + line % ( ltime / Gaudi::Units::second ) % "s"; + } else if ( 1 * Gaudi::Units::meter < ctau ) { + line % ( ctau / Gaudi::Units::meter ) % "m"; + } else if ( 1 * Gaudi::Units::cm < ctau ) { + line % ( ctau / Gaudi::Units::cm ) % "cm"; + } else if ( 0.5 * Gaudi::Units::mm < ctau ) { + line % ( ctau / Gaudi::Units::mm ) % "mm"; + } else if ( 0.1 * Gaudi::Units::micrometer < ctau ) { + line % ( ctau / Gaudi::Units::micrometer ) % "um"; + } else if ( 1 * Gaudi::Units::GeV < width ) { + line % ( width / Gaudi::Units::GeV ) % "GeV"; + } else if ( 1 * Gaudi::Units::MeV < width ) { + line % ( width / Gaudi::Units::MeV ) % "MeV"; + } else if ( 1 * Gaudi::Units::keV < width ) { + line % ( width / Gaudi::Units::keV ) % "keV"; + } else if ( 1 * Gaudi::Units::eV < width ) { + line % ( width / Gaudi::Units::eV ) % "eV"; + } else { + line % ( ltime / Gaudi::Units::ns ) % "ns"; + } + // + line % pp->maxWidth() % pp->evtGen() % pp->pythia(); + // + const Gaudi::ParticleProperty* const anti = pp->antiParticle(); + // + if ( 0 == anti ) { + line % "-"; + } else if ( anti == pp ) { + line % "self-cc"; + } else { + line % anti->name(); + } + // + stream << line << std::endl; + } + return stream << dashes << std::endl; +} +/* print a list of properties in a form of the table + * @see Gaudi::ParticleProperty + * @param particles the list of particle properties + * @param service the service to extract global information + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +std::string Gaudi::ParticleProperties::printAsTable( const std::vector<const Gaudi::ParticleProperty*>& particles, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + std::ostringstream s; + printAsTable_( particles, s, service ); + return s.str(); +} +/* print a list of properties in a form of the table + * @see Gaudi::ParticleProperty + * @param particles the list of particle properties + * @param stream the reference to the output stream + * @param service the service to extract global information + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +MsgStream& Gaudi::ParticleProperties::printAsTable( const std::vector<const Gaudi::ParticleProperty*>& particles, + MsgStream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + if ( stream.isActive() ) { printAsTable_( particles, stream.stream(), service ); } + return stream; +} +/* print a list of particle properties as formatted table + * @see Gaudi::ParticleProperty + * @param particles the list of particle properties + * @param stream the reference to the output stream + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2008-08-03 + */ +std::ostream& Gaudi::Utils::toStream( const std::vector<const Gaudi::ParticleProperty*>& particles, + std::ostream& stream ) { + return Gaudi::ParticleProperties::printAsTable_( particles, stream ); +} +/* print properties in a form of the table + * @param particles (INPUT) list of particles + * @param stream (UPDATE) the stream + * @param service (INPUT) pointer to particle property service + * @return the stream + * @author Vanya BELYAEV Ivan.Belyaev@itep.ru + * @date 2010-01-04 + */ +std::ostream& Gaudi::ParticleProperties::printAsTable_( const std::vector<Gaudi::ParticleID>& particles, + std::ostream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + // + if ( 0 == service ) { return Gaudi::Utils::toStream( particles, stream ); } + + // convert list of ParticleIDs to list fo Particle properties: + std::vector<const Gaudi::ParticleProperty*> props; + for ( std::vector<Gaudi::ParticleID>::const_iterator ipid = particles.begin(); particles.end() != ipid; ++ipid ) { + const Gaudi::ParticleProperty* pp = service->find( *ipid ); + if ( 0 == pp ) { continue; } + props.push_back( pp ); + } + return printAsTable_( props, stream, service ); +} +/* print properties in a form of the table + * @param particles (INPUT) list of particles + * @param stream (UPDATE) the stream + * @param service (INPUT) pointer to particle property service + * @return the stream + * @author Vanya BELYAEV Ivan.Belyaev@itep.ru + * @date 2010-01-04 + */ +MsgStream& Gaudi::ParticleProperties::printAsTable( const std::vector<Gaudi::ParticleID>& particles, MsgStream& stream, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + if ( stream.isActive() ) { printAsTable_( particles, stream.stream(), service ); } + return stream; +} +/* print properties in a form of the table + * @param particles (INPUT) list of particles + * @param service (INPUT) pointer to particle property service + * @return string-representation + * @author Vanya BELYAEV Ivan.Belyaev@itep.ru + * @date 2010-01-04 + */ +std::string Gaudi::ParticleProperties::printAsTable( const std::vector<Gaudi::ParticleID>& particles, + const Gaudi::Interfaces::IParticlePropertySvc* service ) { + std::ostringstream s; + printAsTable_( particles, s, service ); + return s.str(); +} +const Gaudi::ParticleProperty* std::abs( const Gaudi::ParticleProperty* p ) { + if ( 0 == p ) { return 0; } + // + if ( p->selfcc() || 0 <= p->particleID().pid() ) { return p; } + // + const Gaudi::ParticleProperty* a = p->anti(); + if ( 0 != a && 0 <= a->particleID().pid() ) { return a; } + // + return p; // should it be 0 ? +} diff --git a/GaudiPartProp/src/ParticlePropertySvc.cpp b/GaudiPartProp/src/ParticlePropertySvc.cpp deleted file mode 100644 index c9fab16ada03276ddc7d4fe5089755a78869aa71..0000000000000000000000000000000000000000 --- a/GaudiPartProp/src/ParticlePropertySvc.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * -* * -* This software is distributed under the terms of the Apache version 2 licence, * -* copied verbatim in the file "LICENSE". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\***********************************************************************************/ -#include "boost/algorithm/string/classification.hpp" -#include "boost/algorithm/string/split.hpp" -#include "boost/algorithm/string/trim.hpp" -#include <cctype> -#include <fstream> -namespace ba = boost::algorithm; - -#include "GaudiKernel/IFileAccess.h" -#include "GaudiKernel/ISvcLocator.h" -#include "GaudiKernel/MsgStream.h" -#include "GaudiKernel/ParticleProperty.h" -#include "GaudiKernel/PhysicalConstants.h" -#include "GaudiKernel/System.h" - -#include "ParticlePropertySvc.h" - -namespace { - // idea coming from The art of computer programming by Knuth - constexpr bool essentiallyEqual( double const a, double const b ) { - return std::abs( a - b ) <= std::min( std::abs( a ), std::abs( b ) ) * std::numeric_limits<double>::epsilon(); - } -} // namespace - -namespace Gaudi { - /** Instantiation of a static factory class used by clients to create - * instances of this service - */ - DECLARE_COMPONENT( ParticlePropertySvc ) - // ============================================================================ - /** @file - * - * class ParticlePropertySvc Class - * - * Implement a ParticlePropertySvc - * @author : I. Last - * Modify by : G.Corti 09/11/1999 to read file from LHCBDBASE and - * introduce find/eraseByStdHepID methods - * Modified by Vanya BELYAEV to allow reading of additional files - * to add/replace/modify the existing particle properties - */ - // ============================================================================ - ParticlePropertySvc::ParticlePropertySvc( const std::string& name, ISvcLocator* svc ) : base_class( name, svc ) { - /// @todo: remove reference to LHCb-specific environment variable - // Redefine the default name: - if ( System::getEnv( "PARAMFILESROOT", m_filename.value() ) ) { m_filename.value() += "/data/ParticleTable.txt"; } - } - // ============================================================================ - /// initialize the service and setProperties - // ============================================================================ - StatusCode ParticlePropertySvc::initialize() { - StatusCode sc = Service::initialize(); - if ( sc.isFailure() ) { return sc; } - - m_fileAccess = service( "VFSSvc" ); - if ( !m_fileAccess ) { - error() << " Cannot retrieve the VFS service " << endmsg; - return StatusCode::FAILURE; - } - - sc = parse(); - if ( sc.isFailure() ) { - error() << " Could not parse the file " << endmsg; - return sc; - } - if ( !m_particles.empty() ) { - sc = addParticles(); - if ( sc.isFailure() ) { - error() << " Could not treat particles! " << endmsg; - return sc; - } - } - debug() << "ParticleProperties parsed successfully" << endmsg; - - debug() << "Access properties" << endmsg; - // For debugging purposes print out the size of the internal maps - // particle name as key: all particles in database are present here - debug() << "NameMap size =" << m_namemap.size() << endmsg; - // Geant3 ID as key: all particles in database are present here - debug() << "GeantID Map size =" << m_idmap.size() << endmsg; - // StdHep ID as key: some particles have no valid StdHep ID - debug() << "StdHepID Map size =" << m_stdhepidmap.size() << endmsg; - // Pythia ID as key: some particles are not defined in Pythia - debug() << "PythiaID Map size =" << m_pythiaidmap.size() << endmsg; - - if ( !m_replaced.empty() ) { - info() << "Properties have been redefined for " << m_replaced.size() - << " particles : " << Gaudi::Utils::toString( m_replaced ) << endmsg; - } - - return StatusCode::SUCCESS; - } - // ============================================================================= - /// finalize - // ============================================================================= - StatusCode ParticlePropertySvc::finalize() { - if ( !m_other.empty() ) { - info() << "Additional Properties have been read from files: " << Gaudi::Utils::toString( m_other ) << endmsg; - } - - if ( !m_replaced.empty() ) { - always() << "Properties have been redefined for " << m_replaced.size() - << " particles : " << Gaudi::Utils::toString( m_replaced ) << endmsg; - } - - m_fileAccess.reset(); - - /// finalize the base class - return Service::finalize(); - } - // ============================================================================= - /// Create a particle property and insert it in the maps - // ============================================================================= - StatusCode ParticlePropertySvc::push_back( const std::string& particle, int geantId, int jetsetId, double charge, - double mass, double tlife, const std::string& evtName, int pythiaId, - double maxWidth ) { - // - auto& pp = m_owned.emplace_back( particle, geantId, jetsetId, charge, mass, tlife, evtName, pythiaId, maxWidth ); - return push_back( &pp ); - } - // ============================================================================= - /// Add a particle property. - // ============================================================================= - StatusCode ParticlePropertySvc::push_back( ParticleProperty* pp ) { - if ( !pp ) { return StatusCode::FAILURE; } - // - { // try to add into Geant(3)ID map - const int ID = pp->geantID(); - // is this already in the map? - auto ifind = m_idmap.find( ID ); - if ( m_idmap.end() != ifind && 0 != m_idmap[ID] ) { - diff( ifind->second, pp ); - m_replaced.insert( m_idmap[ID]->particle() ); - } - // put it into the map - m_idmap[ID] = pp; - } - // - { // try to add into Name map - const std::string& particle = pp->particle(); - // is this already in the map? - auto ifind = m_namemap.find( particle ); - if ( ifind != m_namemap.end() && ifind->second ) { - diff( ifind->second, pp ); - m_replaced.insert( ifind->second->particle() ); - } - // put it into the map - m_namemap[particle] = pp; - } - // - // add to StdHep map only if StdHep ID different from zero and if - // not Cerenkov (StdHep ID = gamma) - if ( 0 != pp->jetsetID() && "Tcherenkov" != pp->particle() ) { // try to add into StdHepID map - const int ID = pp->jetsetID(); - // is this already in the map? - auto ifind = m_stdhepidmap.find( ID ); - if ( m_stdhepidmap.end() != ifind && ifind->second ) { - diff( ifind->second, pp ); - m_replaced.insert( ifind->second->particle() ); - } - // put it into the map - m_stdhepidmap[ID] = pp; - } - // - // add to Pythia map only if Pythia ID is different from - // zero ( StdHep id is always different from zero in this case ) - if ( 0 != pp->pythiaID() && 0 != pp->jetsetID() && "Tcherenkov" != pp->particle() ) { // try to add into PythiaID - // map - const int ID = pp->pythiaID(); - // is this already in the map? - auto ifind = m_pythiaidmap.find( ID ); - if ( m_pythiaidmap.end() != ifind && ifind->second ) { - diff( ifind->second, pp ); - m_replaced.insert( ifind->second->particle() ); - } - // put it into the map - m_pythiaidmap[ID] = pp; - } - // - return rebuild(); - } - // ============================================================================= - /// Erase a property from all maps - // ============================================================================= - namespace { - template <class MAP> - void _remove_( MAP& m, const ParticleProperty* pp ) { - auto i = std::find_if( m.begin(), m.end(), [&]( typename MAP::const_reference i ) { return i.second == pp; } ); - if ( i != m.end() ) { m.erase( i ); } - } - } // namespace - // ============================================================================ - StatusCode ParticlePropertySvc::erase( const ParticleProperty* pp ) { - if ( !pp ) { return StatusCode::FAILURE; } - - _remove_( m_idmap, pp ); - _remove_( m_namemap, pp ); - _remove_( m_stdhepidmap, pp ); - _remove_( m_pythiaidmap, pp ); - // - return rebuild(); - } - // ============================================================================ - /// Parses the file and fill all the maps - // ============================================================================ - StatusCode ParticlePropertySvc::parse() { - - // parse "the main" file - StatusCode sc = parse( m_filename ); - if ( sc.isFailure() ) { return sc; } - - // parse "other" files - for ( auto& file : m_other ) { - sc = parse( file ); - if ( sc.isFailure() ) { return sc; } - } - - // Now check that the file format was consistent with what parser - // expected - if ( m_namemap.empty() ) { - error() << "Format of input file inconsistent with what expected" - << " - Check you are using ParticleData.txt" << endmsg; - return StatusCode::FAILURE; - } - - return sc; - } - // ============================================================================ - StatusCode ParticlePropertySvc::parse( const std::string& file ) { - auto infile = ( m_fileAccess ? m_fileAccess->open( file ) : nullptr ); - if ( !infile ) { - error() << "Unable to open properties file : " << file << endmsg; - return StatusCode::FAILURE; - } - - StatusCode sc = StatusCode::SUCCESS; - info() << "Opened particle properties file : " << file << endmsg; - - std::vector<std::string> tokens; - tokens.reserve( 9 ); - std::string line; - while ( std::getline( *infile, line ) ) { - // parse each line of the file (comment lines begin with # in the cdf - // file, - if ( line.front() == '#' ) continue; - - tokens.clear(); - ba::trim_left_if( line, ba::is_space() ); - ba::split( tokens, line, ba::is_space(), boost::token_compress_on ); - if ( tokens.size() != 9 ) continue; - - auto gid = std::stoi( tokens[1] ); - auto jid = std::stoi( tokens[2] ); - // Change the particles that do not correspond to a pdg number - if ( jid == 0 ) jid = 10000000 * gid; - - // add a particle property - sc = push_back( tokens[0], gid, jid, std::stod( tokens[3] ), std::stod( tokens[4] ) * Gaudi::Units::GeV, - std::stod( tokens[5] ) * Gaudi::Units::s, tokens[6], std::stoi( tokens[7] ), - std::stod( tokens[8] ) * Gaudi::Units::GeV ); - - if ( sc.isFailure() ) { - error() << "Error from ParticlePropertySvc::push_back for particle='" << tokens[0] << "'" << endmsg; - } - } - return StatusCode::SUCCESS; - } - // ============================================================================ - /** Helper (protected) function to find an antiparticle for the given - * particle ID (StdHepID) - * @param pp pointer to particle property - * @return pointer to antiparticle - */ - // ============================================================================ - const ParticleProperty* ParticlePropertySvc::anti( const ParticleProperty* pp ) const { - if ( !pp ) { return nullptr; } - const int ID = pp->pdgID(); - const int antiID = -1 * ID; - for ( const auto& ap : m_vectpp ) { - if ( ap && antiID == ap->pdgID() ) { return ap; } // RETURN - }; - // - return pp; // RETURN - } - // ============================================================================ - /** helper (protected) function to set the valid - * particle<-->antiparticle relations - * @return status code - */ - // ============================================================================ - StatusCode ParticlePropertySvc::setAntiParticles() { - // initialize particle<-->antiParticle relations - for ( auto& pp : m_vectpp ) { - if ( !pp ) { continue; } // CONTINUE - const ParticleProperty* ap = anti( pp ); - if ( ap ) { pp->setAntiParticle( ap ); } - } - return StatusCode::SUCCESS; - } - // ============================================================================ - /// rebuild "the linear container" from the map - // ============================================================================ - namespace { - /// load mapped values from maps into set - template <typename MAP, typename SET> - void _load_( MAP& m, SET& result ) { - for ( auto i = m.begin(); m.end() != i; ++i ) { result.insert( i->second ); } - } - } // namespace - // ============================================================================ - StatusCode ParticlePropertySvc::rebuild() { - std::set<mapped_type> local; - m_vectpp.clear(); - m_vectpp.reserve( m_idmap.size() + 100 ); - // load information from maps into the set - _load_( m_idmap, local ); - _load_( m_namemap, local ); - _load_( m_stdhepidmap, local ); - _load_( m_pythiaidmap, local ); - // load information from set to the linear container vector - std::copy( std::begin( local ), std::end( local ), std::back_inserter( m_vectpp ) ); - return setAntiParticles(); - } - // ============================================================================ - // treat additional particles - // ============================================================================ - StatusCode ParticlePropertySvc::addParticles() { - // loop over all "explicit" particles - for ( const auto& item : m_particles ) { - std::istringstream input( item ); - // get the name - std::string p_name; - int p_geant; - int p_jetset; - double p_charge; - double p_mass; - double p_ltime; - std::string p_evtgen; - int p_pythia; - double p_maxwid; - if ( input >> p_name >> p_geant >> p_jetset >> p_charge >> p_mass >> p_ltime >> p_evtgen >> p_pythia >> - p_maxwid ) { - always() << " Add/Modify the particle: " - << " name='" << p_name << "'" - << " geant=" << p_geant << " jetset=" << p_jetset << " charge=" << p_charge << " mass=" << p_mass - << " ltime=" << p_ltime << " evtgen='" << p_evtgen << "'" - << " pythia=" << p_pythia << " maxwid=" << p_maxwid << endmsg; - // - StatusCode sc = push_back( p_name, p_geant, p_jetset, p_charge, p_mass * Gaudi::Units::GeV, - p_ltime * Gaudi::Units::s, p_evtgen, p_pythia, p_maxwid * Gaudi::Units::GeV ); - if ( sc.isFailure() ) { return sc; } // RETURN - } else { - error() << " could not parse '" << item << "'" << endmsg; - return StatusCode::FAILURE; // RETURN - } - } - // - return StatusCode::SUCCESS; - } - // ============================================================================ - bool ParticlePropertySvc::diff( const ParticleProperty* o, const ParticleProperty* n, const MSG::Level l ) const { - // - if ( o == n ) { return false; } - // - auto& log = msgStream(); - log << l; - if ( !o || !n ) { - log << MSG::WARNING << " ParticleProperty* point to NULL" << endmsg; - return true; // RETURN - } - // - bool result = false; - if ( o->particle() != n->particle() ) { - result = true; - log << " Name:'" << o->particle() << "'/'" << n->particle() << "'"; - } - if ( o->geantID() != n->geantID() ) { - result = true; - log << " G3ID:" << o->geantID() << "/" << n->geantID() << "'"; - } - if ( o->pdgID() != n->pdgID() ) { - result = true; - log << " PDGID:" << o->pdgID() << "/" << n->pdgID() << "'"; - } - if ( o->pythiaID() != n->pythiaID() ) { - result = true; - log << " PYID:" << o->pythiaID() << "/" << n->pythiaID() << "'"; - } - if ( essentiallyEqual( o->charge(), n->charge() ) ) { - result = true; - log << " Q:" << o->charge() << "/" << n->charge() << "'"; - } - if ( essentiallyEqual( o->mass(), n->mass() ) ) { - result = true; - log << " M:" << o->mass() << "/" << n->mass() << "'"; - } - if ( essentiallyEqual( o->lifetime(), n->lifetime() ) ) { - result = true; - log << " T:" << o->lifetime() << "/" << n->lifetime() << "'"; - } - if ( o->evtGenName() != n->evtGenName() ) { - result = true; - log << " EvtGen:" << o->evtGenName() << "/" << n->evtGenName() << "'"; - } - if ( essentiallyEqual( o->maxWidth(), n->maxWidth() ) ) { - result = true; - log << " WMAX:" << o->maxWidth() << "/" << n->maxWidth() << "'"; - } - if ( result ) { log << endmsg; } - // - return result; - } -} // namespace Gaudi -// ============================================================================ -// The END -// ============================================================================ diff --git a/GaudiPartProp/src/ParticlePropertySvc.h b/GaudiPartProp/src/ParticlePropertySvc.h deleted file mode 100644 index a32f70b06e0ef2cf61a4f8446c063123e10cf9dd..0000000000000000000000000000000000000000 --- a/GaudiPartProp/src/ParticlePropertySvc.h +++ /dev/null @@ -1,193 +0,0 @@ -/***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * -* * -* This software is distributed under the terms of the Apache version 2 licence, * -* copied verbatim in the file "LICENSE". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\***********************************************************************************/ -#ifndef PARTICLEPROPERTYSVC_PARTICLEPROPERTYSVC_H -#define PARTICLEPROPERTYSVC_PARTICLEPROPERTYSVC_H -// ============================================================================ -// Include Files -// ============================================================================ -// STD&STL -// ============================================================================ -#include <deque> -#include <map> -#include <set> -// ============================================================================ -// GaudiKernel -// ============================================================================ -#include "GaudiKernel/IParticlePropertySvc.h" -#include "GaudiKernel/Service.h" - -class IFileAccess; - -namespace Gaudi { - // ============================================================================ - /** @class ParticlePropertySvc ParticlePropertySvc.h - * - * This service provides access to particle properties. - * The settable property of this service is the - * ParticlePropertiesFile, an ASCII file containing the - * list of properties for the particles. - * The default file is: - * "$PARAMFILESROOT/data/ParticleTable.txt" - * or if $PARAMFILESROOT is not defined - * "ParticleTable.txt" - * - * @author Iain Last - * @author Gloria Corti - * 8/11/1999 change default file from - * $CDF/particle.cdf to $LHCBDBASE/cdf/particle.cdf on Unix - * and use environment variable also on WinNT - * Also introduce finding of particle by StdHepID - * - * @author Vanya BELYAEV - * @date 2006-09-22 - * 1) Modified to add possibility to redefine properties of existing - * particles and to read additional files. - * New property "OtherFiles" (default is empty vector) is introduces. - * Service parsed additional files after the main one. - * - * @code - * - * // read additional properties - * ParticlePropertySvc.OtherFiles = { - * "$SOMELOCATION1/file1.txt" , - * "$SOMELOCATION2/file2.txt" - * } ; - * - * @endcode - * - * 2) Add possibility to modify only certain particles through the - * new property "Particles" (default is empty list), - * Each line is interpreted as a line in particle data table, e.g. - * - * @code - * - * // redefine the properties of H_20 and H_30 particles: - * ParticlePropertySvc.Particles = { - * "H_20 88 35 0.0 120.0 9.4e-26 Higgs'0 35 0.0e+00" , - * "H_30 89 36 0.0 40.0 1.0e-12 A0 36 0.0e+00" - * } ; - * - * @endcode - * - * The replaces/modified particles are reported. - */ - class ParticlePropertySvc : public extends<Service, IParticlePropertySvc> { - public: - // typedefs for container type - typedef ParticleProperty* mapped_type; - typedef std::map<int, mapped_type> MapID; - typedef std::map<std::string, mapped_type> MapName; - typedef std::map<int, mapped_type> MapStdHepID; - typedef std::map<int, mapped_type> MapPythiaID; - using IParticlePropertySvc::const_iterator; - using IParticlePropertySvc::iterator; - using IParticlePropertySvc::VectPP; - // Inherited Service overrides: - - /// Initialise the service. - StatusCode initialize() override; - /// Finalise the service. - StatusCode finalize() override; - /** Create a new particle property. - * @attention ParticlePropertySvc *IS* the owner if this property! - * @paramparticle String name of the particle. - * @param geantId Geant3 ID of the particle. - * @param jetsetId Jetset ID of the particle. - * @param charge Particle charge (/e). - * @param mass Particle mass (GeV). - * @param tlife Particle lifetime (s). - * @param evtName String name of the particle in EvtGen. - * @param pythiaId Pythia ID of the particle. - * @return StatusCode - SUCCESS if the particle property was added. - */ - StatusCode push_back( const std::string& particle, int geantId, int jetsetId, double charge, double mass, - double tlife, const std::string& evtName, int pythiaId, double maxWidth ) override; - /** Add a new particle property. - * @attention ParticlePropertySvc is not the owner of this property! - * @param pp, a particle property class. - * @return StatusCode - SUCCESS if the particle property was added. - */ - StatusCode push_back( ParticleProperty* pp ) override; - /// Get a const reference to the beginning of the container. - const_iterator begin() const override { return m_vectpp.begin(); } - /// Get a const reference to the end of the container. - const_iterator end() const override { return m_vectpp.end(); } - /// Get the container size. - int size() const override { return m_vectpp.size(); }; - /// Retrieve a property by geant3 id. - ParticleProperty* find( int geantId ) override { return m_idmap[geantId]; } - /// Retrieve a property by particle name. - ParticleProperty* find( const std::string& name ) override { return m_namemap[name]; } - /// Retrieve a property by StdHep id - ParticleProperty* findByStdHepID( int stdHepId ) override { return m_stdhepidmap[stdHepId]; } - /// Retrieve a property by Pythia id - ParticleProperty* findByPythiaID( int pythiaID ) override { return m_pythiaidmap[pythiaID]; } - /// Erase a property by geant3 id. - StatusCode erase( int geantId ) override { return erase( find( geantId ) ); } - /// Erase a property by particle name. - StatusCode erase( const std::string& name ) override { return erase( find( name ) ); } - /// Erase a property by StdHep id ??? - StatusCode eraseByStdHepID( int stdHepId ) override { return erase( findByStdHepID( stdHepId ) ); } - /** Standard Constructor. - * @param name String with service name - * @param svc Pointer to service locator interface - */ - ParticlePropertySvc( const std::string& name, ISvcLocator* svc ); - - protected: - /** helper (protected) function to - * find an antiparticle for the given particle ID (StdHepID) - * @param pp pointer to particle property - * @return pointer to antiparticle - */ - const ParticleProperty* anti( const ParticleProperty* pp ) const; - /** helper (protected) function to set the valid - * particle<-->antiparticle relations - * @return status code - */ - StatusCode setAntiParticles(); - /// rebuild "the linear container" from the map - StatusCode rebuild(); - /// remove particle property from all maps - StatusCode erase( const ParticleProperty* pp ); - /// parse the file - StatusCode parse( const std::string& file ); - // Text file parsing routine. - StatusCode parse(); - // treat additional particles - StatusCode addParticles(); - // compare 2 entries - bool diff( const ParticleProperty* o, const ParticleProperty* n, const MSG::Level l = MSG::DEBUG ) const; - - private: - Gaudi::Property<std::string> m_filename{ this, "ParticlePropertiesFile", "ParticleTable.txt", - "Filename of the particle properties file" }; - Gaudi::Property<std::vector<std::string>> m_other{ this, "OtherFiles", {}, "additional file names" }; - Gaudi::Property<std::vector<std::string>> m_particles{ - this, "Particles", {}, "properties to be redefined explicitly" }; - - VectPP m_vectpp; ///< Vector of all particle properties - MapID m_idmap; ///< Map for geant IDs - MapName m_namemap; ///< Map for particle names - MapStdHepID m_stdhepidmap; ///< Map for StdHep Ids - MapPythiaID m_pythiaidmap; ///< Map for Pythia Ids - - // local storage of ALL properties - std::deque<ParticleProperty> m_owned; - std::set<std::string> m_replaced; - - SmartIF<IFileAccess> m_fileAccess; - }; -} // namespace Gaudi -// ============================================================================= -// The END -// ============================================================================= -#endif diff --git a/GaudiPartProp/src/Symbols.cpp b/GaudiPartProp/src/Symbols.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c7cad46f885c86973d3b51cd8800f17428721721 --- /dev/null +++ b/GaudiPartProp/src/Symbols.cpp @@ -0,0 +1,220 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/CC.h> +#include <Gaudi/Decays/NodesPIDs.h> +#include <Gaudi/Decays/Symbols.h> +#include <Gaudi/Interfaces/IParticlePropertySvc.h> +#include <Gaudi/ParticleProperty.h> +#include <GaudiKernel/StatusCode.h> +#include <boost/algorithm/string.hpp> +#include <iostream> +#include <map> + +namespace Decays = Gaudi::Decays; + +/** @file + * Implementation file for functions form the file Decays/Symbols.h + * + * Many thanks to Antonio PELLEGRINO for the kind help with regex expressions + * + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-07 + */ +namespace { + /** @var s_EMPTY + * invalid empty string + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + * @date 2009-05-07 + */ + const std::string s_EMPTY = ""; +} // namespace +Decays::Symbols& Decays::Symbols::instance() { + static Decays::Symbols s_symbols; + return s_symbols; +} +// constructor +Decays::Symbols::Symbols() { + addSymbol( "X", Decays::Nodes::Any(), "Any particle" ); + // + addSymbol( "Hadron", Decays::Nodes::Hadron(), "Any hadron" ); + addSymbol( "Meson", Decays::Nodes::Meson(), "Any meson" ); + addSymbol( "Baryon", Decays::Nodes::Baryon(), "Any baryon" ); + addSymbol( "Nucleus", Decays::Nodes::Nucleus(), "Any nucleus" ); + addSymbol( "Lepton", Decays::Nodes::Lepton(), "Any lepton" ); + addSymbol( "l", Decays::Nodes::Ell(), "Any charged lepton" ); + addSymbol( "l+", Decays::Nodes::EllPlus(), "Any positive lepton", "l-" ); + addSymbol( "l-", Decays::Nodes::EllMinus(), "Any negative lepton", "l+" ); + addSymbol( "Nu", Decays::Nodes::Nu(), "Any neutral lepton" ); + addSymbol( "Neutrino", Decays::Nodes::Nu(), "Any neutral lepton" ); + // + addSymbol( "X0", Decays::Nodes::Neutral(), "Any neutral particle" ); + addSymbol( "Xq", Decays::Nodes::Charged(), "Any charged particle" ); + addSymbol( "X+", Decays::Nodes::Positive(), "Any positive particle", "X-" ); + addSymbol( "X-", Decays::Nodes::Negative(), "Any negative particle", "X+" ); + // + addSymbol( "ID+", Decays::Nodes::PosID(), "Any particle with positive ID", "ID-" ); + addSymbol( "ID-", Decays::Nodes::NegID(), "Any particle with negative ID", "ID+" ); + // + addSymbol( "Xd", Decays::Nodes::HasQuark( Gaudi::ParticleID::down ), "Any particle with d-quark" ); + addSymbol( "Xu", Decays::Nodes::HasQuark( Gaudi::ParticleID::up ), "Any particle with u-quark" ); + addSymbol( "Xs", Decays::Nodes::HasQuark( Gaudi::ParticleID::strange ), "Any particle with s-quark" ); + addSymbol( "Xc", Decays::Nodes::HasQuark( Gaudi::ParticleID::charm ), "Any particle with c-quark" ); + addSymbol( "Xb", Decays::Nodes::HasQuark( Gaudi::ParticleID::bottom ), "Any particle with b-quark" ); + addSymbol( "Xt", Decays::Nodes::HasQuark( Gaudi::ParticleID::top ), "Any particle with t-quark" ); + // + addSymbol( "Down", Decays::Nodes::HasQuark( Gaudi::ParticleID::down ), "Any particle with d-quark" ); + addSymbol( "Up", Decays::Nodes::HasQuark( Gaudi::ParticleID::up ), "Any particle with u-quark" ); + addSymbol( "Strange", Decays::Nodes::HasQuark( Gaudi::ParticleID::strange ), "Any particle with s-quark" ); + addSymbol( "Charm", Decays::Nodes::HasQuark( Gaudi::ParticleID::charm ), "Any particle with c-quark" ); + addSymbol( "Bottom", Decays::Nodes::HasQuark( Gaudi::ParticleID::bottom ), "Any particle with b-quark" ); + addSymbol( "Beauty", Decays::Nodes::HasQuark( Gaudi::ParticleID::bottom ), "Any particle with b-quark" ); + addSymbol( "Top", Decays::Nodes::HasQuark( Gaudi::ParticleID::top ), "Any particle with t-quark" ); + // + addSymbol( "Scalar", Decays::Nodes::JSpin( 1 ), "Any scalar particle j=0" ); + addSymbol( "Spinor", Decays::Nodes::JSpin( 2 ), "Any spinor particle j=1/2" ); + addSymbol( "OneHalf", Decays::Nodes::JSpin( 2 ), "Any spinor particle j=1/2" ); + addSymbol( "Vector", Decays::Nodes::JSpin( 3 ), "Any vector particle j=1" ); + addSymbol( "ThreeHalf", Decays::Nodes::JSpin( 4 ), "Any particle with spin j=3/2" ); + addSymbol( "Tensor", Decays::Nodes::JSpin( 5 ), "Any tensor particle j=2" ); + addSymbol( "FiveHalf", Decays::Nodes::JSpin( 6 ), "Any particle with spin j=5/2" ); + // + addSymbol( "ShortLived", Decays::Nodes::ShortLived_(), "Any short-ilved particle" ); + addSymbol( "LongLived", Decays::Nodes::LongLived_(), "Any long-lived particle" ); + addSymbol( "Stable", Decays::Nodes::Stable(), "Any 'stable' particle" ); + addSymbol( "StableCharged", Decays::Nodes::StableCharged(), "Any 'trackable' particle: stable & charged" ); + // special CC-symbols, protect them... + addCC( "cc" ); + addCC( "CC" ); + addCC( "os" ); + addCC( "nos" ); + addCC( "HasQuark" ); + addCC( "JSpin" ); + addCC( "LSpin" ); + addCC( "SSpin" ); + addCC( "ShortLived" ); + addCC( "LongLived" ); + addCC( "ShortLived_" ); + addCC( "LongLived_" ); + addCC( "Stable" ); + addCC( "Light" ); + addCC( "Heavy" ); + addCC( "CTau" ); + addCC( "Mass" ); + addCC( "up" ); + addCC( "down" ); + addCC( "strange" ); + addCC( "charm" ); + addCC( "beauty" ); + addCC( "bottom" ); + addCC( "top" ); +} + +// get CC-map +const Decays::Symbols::CCMap& Decays::Symbols::cc() const { return m_cc; } +/* add new symbol to the internal structure + * @param symbol the symbol definition + * @param node the actual node + * @param help the help string + * @param ccsym the symbol for charge coonjugation + * @return true if the symbol is added into the storage + */ +bool Decays::Symbols::addSymbol( std::string sym, const Decays::iNode& node, const std::string& help, + std::string ccsym ) { + // trim the arguments + boost::trim( sym ); + auto ifind = m_nodes.find( sym ); + if ( m_nodes.end() != ifind ) { return false; } + // add the node into the map + bool inserted = m_nodes.insert( sym, node ).second; + if ( !inserted ) { return false; } + // add the help-string + m_help[sym] = help; + // add cc-symbols + addCC( sym, ccsym ); + return true; +} +/* add cc-pair to the internal map + * @param sym the symbol + * @param ccsym the symbol for charge conjugation + */ +void Decays::Symbols::addCC( std::string sym, std::string ccsym ) { + // trim the arguments + boost::trim( sym ); + boost::trim( ccsym ); + if ( ccsym.empty() ) { ccsym = sym; } + m_cc[sym] = ccsym; + if ( ccsym != sym ) { m_cc[ccsym] = sym; } +} +// valid symbol? +bool Decays::Symbols::valid( std::string sym ) const { + // trim the argument + boost::trim( sym ); + return m_nodes.end() != m_nodes.find( sym ); +} +// help for the symbol +const std::string& Decays::Symbols::symbol( std::string sym ) const { + // trim the argument + boost::trim( sym ); + NodeMap::const_iterator ifind = m_nodes.find( sym ); + if ( m_nodes.end() == ifind ) { return s_EMPTY; } + HelpMap::const_iterator ihelp = m_help.find( sym ); + if ( m_help.end() == ihelp ) { return s_EMPTY; } + return ihelp->second; +} +/* get the node by symbol + * @param (INPUT) sym the symbol name + * @param (OUTPUT) the symbol + * @return status code + */ +StatusCode Decays::Symbols::symbol( std::string sym, Decays::Node& node ) const { + // trim the argument + boost::trim( sym ); + auto ifind = m_nodes.find( sym ); + if ( m_nodes.end() != ifind ) { + node = ifind->second; + return StatusCode::SUCCESS; + } + node = Decays::Nodes::Invalid(); + return StatusCode( InvalidSymbol ); +} +// get all known symbols +size_t Decays::Symbols::symbols( Decays::Symbols::Names& names ) const { + // clear names ; + names.clear(); + for ( auto inode = m_nodes.begin(); m_nodes.end() != inode; ++inode ) { names.push_back( inode->first ); } + // sort it according to CC-criteria ATTENTION! + std::stable_sort( names.begin(), names.end(), Decays::CC::CmpCC() ); + return names.size(); +} +/* get all known particle names + * @param service (INPUT) particle property service + * @param parts (OUTPUT) vector of particle names + * @return status code + */ +StatusCode Decays::Symbols::particles( const Gaudi::Interfaces::IParticlePropertySvc* service, + Decays::Symbols::Names& parts ) const { + // clear the output + parts.clear(); + // check the service + if ( 0 == service ) { return StatusCode( InvalidService ); } + + auto begin = service->begin(); + auto end = service->end(); + for ( ; end != begin; ++begin ) { + const Gaudi::ParticleProperty* pp = *begin; + if ( !pp ) { continue; } + parts.push_back( pp->particle() ); + } + // sort it according to CC-criteria ATTENTION! + std::stable_sort( parts.begin(), parts.end(), Decays::CC::CmpCC() ); + + return StatusCode::SUCCESS; +} diff --git a/GaudiExamples/src/PartProp/GaudiPPS.h b/GaudiPartProp/src/TrackDefaultParticles.cpp similarity index 55% rename from GaudiExamples/src/PartProp/GaudiPPS.h rename to GaudiPartProp/src/TrackDefaultParticles.cpp index b11e0ebec0dc746870dbb2ba8d7cfaa46e385353..1c505b7d5f95db5500c8740d6a442bed513aec87 100644 --- a/GaudiExamples/src/PartProp/GaudiPPS.h +++ b/GaudiPartProp/src/TrackDefaultParticles.cpp @@ -1,5 +1,5 @@ /***********************************************************************************\ -* (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations * +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * * * * This software is distributed under the terms of the Apache version 2 licence, * * copied verbatim in the file "LICENSE". * @@ -8,26 +8,6 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \***********************************************************************************/ -#ifndef PARTPROP_GAUDIPPS_H -#define PARTPROP_GAUDIPPS_H 1 +#include <Gaudi/Tr/TrackDefaultParticles.h> -// Include files -// from Gaudi -#include "GaudiKernel/Algorithm.h" - -namespace GaudiExamples { - /** Small algorithm using Gaudi::ParticlePropertySvc. - * - * @author Marco CLEMENCIC - * @date 2008-05-23 - */ - class GaudiPPS : public Algorithm { - public: - /// Standard constructor - using Algorithm::Algorithm; - - StatusCode initialize() override; ///< Algorithm initialization - StatusCode execute() override; ///< Algorithm execution - }; -} // namespace GaudiExamples -#endif // PARTPROP_GAUDIPPS_H +constexpr std::array<double, 5> Gaudi::Tr::PID::s_mass; diff --git a/GaudiPartProp/src/iNode.cpp b/GaudiPartProp/src/iNode.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cc08d738be82c70b378593af000d7a503a45312c --- /dev/null +++ b/GaudiPartProp/src/iNode.cpp @@ -0,0 +1,76 @@ +/***********************************************************************************\ +* (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations * +* * +* This software is distributed under the terms of the Apache version 2 licence, * +* copied verbatim in the file "LICENSE". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\***********************************************************************************/ +#include <Gaudi/Decays/Nodes.h> +#include <Gaudi/Decays/iNode.h> +#include <GaudiKernel/StatusCode.h> +#include <sstream> +#include <typeinfo> + +namespace Decays = Gaudi::Decays; + +/** @file + * Implementation file for class Decays::iNode + * @date 2008-05-04 + * @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl + */ +std::string Decays::iNode::toString() const { + std::ostringstream s; + fillStream( s ); + return s.str(); +} + +bool Decays::iNode::operator!() const { return !( this->valid() ); } + +Decays::Node::Node( const Decays::iNode& node ) { + if ( typeid( Decays::Node ) == typeid( node ) ) { + const Node& _node = dynamic_cast<const Node&>( node ); + m_node.reset( _node.m_node->clone() ); + } else { + m_node.reset( node.clone() ); + } +} + +Decays::Node::Node( const Decays::Node& right ) : Decays::iNode( right ), m_node( right.m_node->clone() ) {} + +bool Decays::Node::operator()( const Gaudi::ParticleID& pid ) const { return node( pid ); } + +std::ostream& Decays::Node::fillStream( std::ostream& s ) const { return m_node->fillStream( s ); } + +bool Decays::Node::valid() const { return m_node->valid(); } + +StatusCode Decays::Node::validate( const Gaudi::Interfaces::IParticlePropertySvc* svc ) const { + return m_node->validate( svc ); +} + +Decays::Node& Decays::Node::operator=( const Decays::Node& right ) { + if ( &right == this ) { return *this; } + m_node.reset( right.m_node->clone() ); + return *this; +} + +Decays::Node& Decays::Node::operator=( const Decays::iNode& right ) { + if ( &right == this ) { return *this; } + Decays::iNode* node = nullptr; + if ( typeid( Decays::Node ) == typeid( right ) ) { + const Node& _node = dynamic_cast<const Node&>( right ); + node = _node.m_node->clone(); + } else { + node = right.clone(); + } + m_node.reset( node ); + return *this; +} + +Decays::Node* Decays::Node::clone() const { return new Decays::Node( *this ); } + +Decays::Node& Decays::Node::op_and( const Decays::iNode& right ) { return ( *this = ( *m_node && right ) ); } + +Decays::Node& Decays::Node::op_or( const Decays::iNode& right ) { return ( *this = ( *m_node || right ) ); } diff --git a/GaudiPartProp/tests/options/PartPropAlg.py b/GaudiPartProp/tests/options/PartPropAlg.py new file mode 100644 index 0000000000000000000000000000000000000000..7635f5dcc053d4e7e0f9c8c1887009f4ee7cce0f --- /dev/null +++ b/GaudiPartProp/tests/options/PartPropAlg.py @@ -0,0 +1,25 @@ +#!/usr/bin/env gaudirun.py +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file +# The configuration file to run QMTest for the package GaudiPartProp +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-02 +# ============================================================================= +""" +The configuration file to run QMTest for the package GaudiPartProp +""" + +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +__version__ = "" + +import GaudiPartProp.PartPropAlg diff --git a/GaudiPartProp/tests/qmtest/partprop.qms/newparts.qmt b/GaudiPartProp/tests/qmtest/partprop.qms/newparts.qmt new file mode 100644 index 0000000000000000000000000000000000000000..4a71c8c2ce5045a648fa6936552f751daf8e030b --- /dev/null +++ b/GaudiPartProp/tests/qmtest/partprop.qms/newparts.qmt @@ -0,0 +1,37 @@ +<?xml version="1.0" ?> +<!-- + (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations + + This software is distributed under the terms of the Apache version 2 licence, + copied verbatim in the file "LICENSE". + + In applying this licence, CERN does not waive the privileges and immunities + granted to it by virtue of its status as an Intergovernmental Organization + or submit itself to any jurisdiction. +--> +<!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'> +<extension class="GaudiTest.GaudiExeTest" kind="test"> + <argument name="program"> + <text>../../tests/scripts/newparts.py</text> + </argument> +<argument name="validator"><text> +block1 = """ +Gaudi::Particle...SUCCESS New/updated particles (from "Particles" property) + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ + | # | Name | PdgID | Q | Mass | (c*)Tau/Gamma | MaxWidth | EvtGen | PythiaID | Antiparticle | + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ + | 582 | chi_c1(1P) | 20443 | 0 | 3.51067 GeV | 839.99989 keV | 0 | chi_c1 | 20443 | self-cc | + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ +""" +block2 = """ +Gaudi::Particle...SUCCESS New/updated particles (from "Particles" property) + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ + | # | Name | PdgID | Q | Mass | (c*)Tau/Gamma | MaxWidth | EvtGen | PythiaID | Antiparticle | + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ + | 582 | chi_c1(1P) | 20443 | 0 | 3.51067 GeV | 839.99989 keV | 0 | chi_c1 | 20443 | self-cc | + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ +""" +findReferenceBlock(block1) +findReferenceBlock(block2) +</text></argument> +</extension> diff --git a/GaudiPartProp/tests/qmtest/partprop.qms/partprop0.qmt b/GaudiPartProp/tests/qmtest/partprop.qms/partprop0.qmt new file mode 100644 index 0000000000000000000000000000000000000000..bf67363e5ae285e70648a59b53bbb770077d61fc --- /dev/null +++ b/GaudiPartProp/tests/qmtest/partprop.qms/partprop0.qmt @@ -0,0 +1,20 @@ +<?xml version="1.0" ?> +<!-- + (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations + + This software is distributed under the terms of the Apache version 2 licence, + copied verbatim in the file "LICENSE". + + In applying this licence, CERN does not waive the privileges and immunities + granted to it by virtue of its status as an Intergovernmental Organization + or submit itself to any jurisdiction. +--> +<!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'> +<extension class="GaudiTest.GaudiExeTest" kind="test"> + <argument name="program"> + <text>../../python/GaudiPartProp/tests.py</text> + </argument> + <argument name="reference"> + <text>../refs/partprop0.ref</text> + </argument> +</extension> diff --git a/GaudiPartProp/tests/qmtest/partprop.qms/partprop_pids.qmt b/GaudiPartProp/tests/qmtest/partprop.qms/partprop_pids.qmt new file mode 100644 index 0000000000000000000000000000000000000000..06da7db22ceb46ac8ed4b3bd8d2869caffac0748 --- /dev/null +++ b/GaudiPartProp/tests/qmtest/partprop.qms/partprop_pids.qmt @@ -0,0 +1,1002 @@ +<?xml version="1.0" ?> +<!-- + (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations + + This software is distributed under the terms of the Apache version 2 licence, + copied verbatim in the file "LICENSE". + + In applying this licence, CERN does not waive the privileges and immunities + granted to it by virtue of its status as an Intergovernmental Organization + or submit itself to any jurisdiction. +--> +<!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'> +<extension class="GaudiTest.GaudiExeTest" kind="test"> + <argument name="program"> + <text>../scripts/pids.py</text> + </argument> + <!-- <argument name="reference"> + <text>../refs/partprop_pids.ref</text> + </argument> --> +<argument name="validator"><text> +block = """ +ApplicationMgr INFO Application Manager Initialized successfully +(-1000020040, 1000020040, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -6, 1, 0, 0, 2, 4, 0, 0, 100) +(-1000020030, 1000020030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -6, 2, 0, 0, 2, 3, 0, 0, 100) +(-1000010030, 1000010030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 1, 3, 0, 0, 100) +(-1000010020, 1000010020, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 1, 2, 0, 0, 100) +(-990000000, 990000000, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 99) +(-99000000, 99000000, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 9) +(-9900042, 9900042, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -6, 1, 0, 0, 0, 0, 0, 9, 0) +(-9900041, 9900041, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -6, 1, 0, 0, 0, 0, 0, 9, 0) +(-9900024, 9900024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 24, 0) +(-9042413, 9042413, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-9010213, 9010213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-9010211, 9010211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-9000213, 9000213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-9000211, 9000211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-4900213, 4900213, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(-4900211, 4900211, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-4900101, 4900101, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-4000012, 4000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(-4000011, 4000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 11, 0) +(-4000002, 4000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 2, 0, 0, 0, 0, 0, 2, 0) +(-4000001, 4000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 2, 0, 0, 0, 0, 0, 1, 0) +(-3000213, 3000213, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-3000211, 3000211, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-2000016, 2000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(-2000015, 2000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 15, 0) +(-2000014, 2000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(-2000013, 2000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 13, 0) +(-2000012, 2000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(-2000011, 2000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 11, 0) +(-2000006, 2000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 6, 0) +(-2000005, 2000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 5, 0) +(-2000004, 2000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 4, 0) +(-2000003, 2000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 3, 0) +(-2000002, 2000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 2, 0) +(-2000001, 2000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 1, 0) +(-1000037, 1000037, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 37, 0) +(-1000024, 1000024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 24, 0) +(-1000016, 1000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(-1000015, 1000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 15, 0) +(-1000014, 1000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(-1000013, 1000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 13, 0) +(-1000012, 1000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(-1000011, 1000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 11, 0) +(-1000006, 1000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 6, 0) +(-1000005, 1000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 5, 0) +(-1000004, 1000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 4, 0) +(-1000003, 1000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 3, 0) +(-1000002, 1000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 2, 0) +(-1000001, 1000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 1, 0) +(-204126, 204126, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-203338, 203338, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(-203326, 203326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-203322, 203322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-203316, 203316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-203312, 203312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-104324, 104324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-104322, 104322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-104314, 104314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-104312, 104312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-104124, 104124, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-103326, 103326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-103316, 103316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-103222, 103222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-103212, 103212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-103112, 103112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-100423, 100423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-100421, 100421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-100413, 100413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-100411, 100411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-100325, 100325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-100323, 100323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-100321, 100321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-100315, 100315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-100313, 100313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-100311, 100311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-100213, 100213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-100211, 100211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-53122, 53122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-52214, 52214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-52114, 52114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-43122, 43122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-42212, 42212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-42124, 42124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-42112, 42112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-41214, 41214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-33122, 33122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-32224, 32224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-32214, 32214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-32212, 32212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-32124, 32124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-32114, 32114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-32112, 32112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-31214, 31214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-31114, 31114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-30363, 30363, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(-30353, 30353, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-30343, 30343, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(-30323, 30323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 2, 0, 0, 0, 0, 0) +(-30313, 30313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(-30213, 30213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 2, 0, 0, 0, 0, 0) +(-23224, 23224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-23222, 23222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-23214, 23214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-23212, 23212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-23126, 23126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-23124, 23124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-23122, 23122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-23114, 23114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-23112, 23112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-22224, 22224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-22222, 22222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-22214, 22214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-22212, 22212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-22124, 22124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-22122, 22122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-22114, 22114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-22112, 22112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-21214, 21214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-21212, 21212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-21114, 21114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-21112, 21112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-20543, 20543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20533, 20533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20523, 20523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20513, 20513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20433, 20433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20423, 20423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20413, 20413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20325, 20325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 1, 2, 0, 0, 0, 0, 0) +(-20323, 20323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20315, 20315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(-20313, 20313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20213, 20213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-15122, 15122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-14122, 14122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-13324, 13324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-13314, 13314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-13226, 13226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-13224, 13224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-13222, 13222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-13216, 13216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-13214, 13214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-13212, 13212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-13126, 13126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-13124, 13124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-13122, 13122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-13116, 13116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-13114, 13114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-13112, 13112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-12226, 12226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 6, 0, 0, 0, 0, 0, 0, 0) +(-12224, 12224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-12222, 12222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-12218, 12218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-12216, 12216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-12214, 12214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-12212, 12212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-12126, 12126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-12122, 12122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-12118, 12118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-12116, 12116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-12114, 12114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-12112, 12112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-11216, 11216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-11212, 11212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-11116, 11116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-11114, 11114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-11112, 11112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-10543, 10543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10541, 10541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10533, 10533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10531, 10531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10523, 10523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10521, 10521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10513, 10513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10511, 10511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10433, 10433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10431, 10431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10423, 10423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10421, 10421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10413, 10413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10411, 10411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10325, 10325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 0, 2, 0, 0, 0, 0, 0) +(-10323, 10323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10321, 10321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10315, 10315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(-10313, 10313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10311, 10311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10215, 10215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 5, 0, 2, 0, 0, 0, 0, 0) +(-10213, 10213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10211, 10211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-5554, 5554, True, True, False, True, True, False, False, False, True, False, False, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5544, 5544, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5542, 5542, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5534, 5534, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5532, 5532, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5524, 5524, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5522, 5522, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5514, 5514, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5512, 5512, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5503, 5503, True, True, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-5444, 5444, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5442, 5442, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5434, 5434, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5432, 5432, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5424, 5424, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5422, 5422, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5414, 5414, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5412, 5412, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5403, 5403, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-5401, 5401, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-5342, 5342, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5334, 5334, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5332, 5332, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5324, 5324, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5322, 5322, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5314, 5314, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5312, 5312, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5303, 5303, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-5301, 5301, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 2, 1, 0, 0, 0, 0, 0, 0, 0) +(-5242, 5242, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5232, 5232, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5224, 5224, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5222, 5222, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5214, 5214, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5212, 5212, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5203, 5203, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-5201, 5201, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-5142, 5142, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5132, 5132, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5124, 5124, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5122, 5122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5114, 5114, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5112, 5112, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5103, 5103, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-5101, 5101, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, 2, 1, 0, 0, 0, 0, 0, 0, 0) +(-4444, 4444, True, True, False, True, True, False, False, False, True, False, False, False, True, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-4434, 4434, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4432, 4432, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4424, 4424, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-4422, 4422, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-4414, 4414, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4412, 4412, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4403, 4403, True, True, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, -4, 3, 0, 0, 0, 0, 0, 0, 0) +(-4334, 4334, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-4332, 4332, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4324, 4324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4322, 4322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4314, 4314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-4312, 4312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4303, 4303, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-4301, 4301, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-4232, 4232, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4224, 4224, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-4222, 4222, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-4214, 4214, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4212, 4212, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4203, 4203, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, -4, 3, 0, 0, 0, 0, 0, 0, 0) +(-4201, 4201, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, -4, 1, 0, 0, 0, 0, 0, 0, 0) +(-4132, 4132, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4122, 4122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4114, 4114, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-4112, 4112, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4103, 4103, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-4101, 4101, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-3334, 3334, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3324, 3324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-3322, 3322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-3314, 3314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3312, 3312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-3303, 3303, True, True, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-3228, 3228, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-3226, 3226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-3224, 3224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3222, 3222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-3218, 3218, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-3216, 3216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-3214, 3214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-3212, 3212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-3203, 3203, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-3201, 3201, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-3128, 3128, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-3126, 3126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-3124, 3124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-3122, 3122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-3118, 3118, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(-3116, 3116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-3114, 3114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3112, 3112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-3103, 3103, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-3101, 3101, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 0, 0) +(-2228, 2228, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 8, 0, 0, 0, 0, 0, 0, 0) +(-2226, 2226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 6, 0, 0, 0, 0, 0, 0, 0) +(-2224, 2224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-2222, 2222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-2218, 2218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-2216, 2216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-2214, 2214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-2212, 2212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-2203, 2203, True, True, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, -4, 3, 0, 0, 0, 0, 0, 0, 0) +(-2128, 2128, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-2126, 2126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-2124, 2124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-2122, 2122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-2118, 2118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-2116, 2116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-2114, 2114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-2112, 2112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-2103, 2103, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-2101, 2101, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-1218, 1218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-1216, 1216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-1214, 1214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-1212, 1212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-1118, 1118, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(-1116, 1116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-1114, 1114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-1112, 1112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-1103, 1103, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-545, 545, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-543, 543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-541, 541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-535, 535, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-533, 533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-531, 531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-525, 525, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-523, 523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-521, 521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-515, 515, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-513, 513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-511, 511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-435, 435, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-433, 433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-431, 431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-425, 425, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-423, 423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-421, 421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-415, 415, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-413, 413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-411, 411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-329, 329, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 9, 1, 3, 0, 0, 0, 0, 0) +(-327, 327, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 7, 1, 2, 0, 0, 0, 0, 0) +(-325, 325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-323, 323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-321, 321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-319, 319, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(-317, 317, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(-315, 315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-313, 313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-311, 311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-219, 219, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 9, 1, 3, 0, 0, 0, 0, 0) +(-217, 217, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 7, 1, 2, 0, 0, 0, 0, 0) +(-215, 215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-213, 213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-211, 211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-87, 87, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 0, 0, 0, 0, 0, 0, 87, 0) +(-86, 86, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 0, 0, 0, 0, 0, 0, 86, 0) +(-85, 85, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 0, 0, 0, 0, 0, 0, 85, 0) +(-84, 84, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 0, 0, 0, 0, 0, 0, 84, 0) +(-82, 82, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 82, 0) +(-44, 44, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 0, 0, 0, 0, 0, 0, 44, 0) +(-42, 42, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 42, 0) +(-41, 41, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 41, 0) +(-37, 37, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 37, 0) +(-34, 34, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 34, 0) +(-24, 24, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 24, 0) +(-18, 18, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 18, 0) +(-17, 17, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 17, 0) +(-16, 16, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 16, 0) +(-15, 15, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 15, 0) +(-14, 14, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 14, 0) +(-13, 13, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 13, 0) +(-12, 12, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(-11, 11, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 11, 0) +(-8, 8, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True, -2, 2, 0, 0, 0, 0, 0, 8, 0) +(-7, 7, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, 1, 2, 0, 0, 0, 0, 0, 7, 0) +(-6, 6, True, True, False, False, False, False, False, True, False, False, False, False, False, False, True, False, False, -2, 2, 0, 0, 0, 0, 0, 6, 0) +(-5, 5, True, True, False, False, False, False, False, True, False, False, False, False, False, True, False, False, False, 1, 2, 0, 0, 0, 0, 0, 5, 0) +(-4, 4, True, True, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, -2, 2, 0, 0, 0, 0, 0, 4, 0) +(-3, 3, True, True, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, 1, 2, 0, 0, 0, 0, 0, 3, 0) +(-2, 2, True, True, False, False, False, False, False, True, False, False, True, False, False, False, False, False, False, -2, 2, 0, 0, 0, 0, 0, 2, 0) +(-1, 1, True, True, False, False, False, False, False, True, False, True, False, False, False, False, False, False, False, 1, 2, 0, 0, 0, 0, 0, 1, 0) +(1, 1, True, True, False, False, False, False, False, True, False, True, False, False, False, False, False, False, False, -1, 2, 0, 0, 0, 0, 0, 1, 0) +(2, 2, True, True, False, False, False, False, False, True, False, False, True, False, False, False, False, False, False, 2, 2, 0, 0, 0, 0, 0, 2, 0) +(3, 3, True, True, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, -1, 2, 0, 0, 0, 0, 0, 3, 0) +(4, 4, True, True, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, 2, 2, 0, 0, 0, 0, 0, 4, 0) +(5, 5, True, True, False, False, False, False, False, True, False, False, False, False, False, True, False, False, False, -1, 2, 0, 0, 0, 0, 0, 5, 0) +(6, 6, True, True, False, False, False, False, False, True, False, False, False, False, False, False, True, False, False, 2, 2, 0, 0, 0, 0, 0, 6, 0) +(7, 7, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, -1, 2, 0, 0, 0, 0, 0, 7, 0) +(8, 8, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True, 2, 2, 0, 0, 0, 0, 0, 8, 0) +(11, 11, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 11, 0) +(12, 12, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(13, 13, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 13, 0) +(14, 14, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 14, 0) +(15, 15, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 15, 0) +(16, 16, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 16, 0) +(17, 17, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 17, 0) +(18, 18, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 18, 0) +(21, 21, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 21, 0) +(22, 22, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 22, 0) +(23, 23, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 23, 0) +(24, 24, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 24, 0) +(25, 25, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 25, 0) +(32, 32, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 32, 0) +(33, 33, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 33, 0) +(34, 34, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 34, 0) +(35, 35, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 35, 0) +(36, 36, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 36, 0) +(37, 37, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 37, 0) +(39, 39, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 39, 0) +(41, 41, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 41, 0) +(42, 42, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 42, 0) +(43, 43, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 43, 0) +(44, 44, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 0, 0, 0, 0, 0, 0, 44, 0) +(81, 81, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 81, 0) +(82, 82, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 82, 0) +(83, 83, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 83, 0) +(84, 84, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 0, 0, 0, 0, 0, 0, 84, 0) +(85, 85, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 0, 0, 0, 0, 0, 0, 85, 0) +(86, 86, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 0, 0, 0, 0, 0, 0, 86, 0) +(87, 87, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 0, 0, 0, 0, 0, 0, 87, 0) +(88, 88, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 88, 0) +(90, 90, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 90, 0) +(91, 91, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 91, 0) +(92, 92, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 92, 0) +(93, 93, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 93, 0) +(94, 94, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 94, 0) +(95, 95, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 95, 0) +(96, 96, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 96, 0) +(97, 97, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 97, 0) +(98, 98, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 98, 0) +(99, 99, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 99, 0) +(111, 111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(113, 113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(115, 115, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(117, 117, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(119, 119, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(130, 130, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(150, 150, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(211, 211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(213, 213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(215, 215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(217, 217, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 7, 1, 2, 0, 0, 0, 0, 0) +(219, 219, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 9, 1, 3, 0, 0, 0, 0, 0) +(221, 221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(223, 223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(225, 225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(227, 227, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(229, 229, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(310, 310, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(311, 311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(313, 313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(315, 315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(317, 317, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(319, 319, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(321, 321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(323, 323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(325, 325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(327, 327, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 7, 1, 2, 0, 0, 0, 0, 0) +(329, 329, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 9, 1, 3, 0, 0, 0, 0, 0) +(331, 331, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(333, 333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(335, 335, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(337, 337, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(350, 350, False, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 0) +(411, 411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(413, 413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(415, 415, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(421, 421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(423, 423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(425, 425, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(431, 431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(433, 433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(435, 435, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(441, 441, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(443, 443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(445, 445, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(510, 510, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(511, 511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(513, 513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(515, 515, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(521, 521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(523, 523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(525, 525, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(530, 530, False, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 0) +(531, 531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(533, 533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(535, 535, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(541, 541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(543, 543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(545, 545, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(551, 551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(553, 553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(555, 555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(557, 557, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(1103, 1103, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(1112, 1112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(1114, 1114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(1116, 1116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(1118, 1118, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(1212, 1212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(1214, 1214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(1216, 1216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(1218, 1218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(2101, 2101, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(2103, 2103, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(2112, 2112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(2114, 2114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(2116, 2116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(2118, 2118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(2122, 2122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(2124, 2124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(2126, 2126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(2128, 2128, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(2203, 2203, True, True, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 4, 3, 0, 0, 0, 0, 0, 0, 0) +(2212, 2212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(2214, 2214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(2216, 2216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(2218, 2218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(2222, 2222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(2224, 2224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(2226, 2226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 6, 0, 0, 0, 0, 0, 0, 0) +(2228, 2228, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 8, 0, 0, 0, 0, 0, 0, 0) +(3101, 3101, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 0, 0) +(3103, 3103, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(3112, 3112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(3114, 3114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(3116, 3116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(3118, 3118, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(3122, 3122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(3124, 3124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(3126, 3126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(3128, 3128, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(3201, 3201, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(3203, 3203, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(3212, 3212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(3214, 3214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(3216, 3216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(3218, 3218, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(3222, 3222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(3224, 3224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(3226, 3226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(3228, 3228, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(3303, 3303, True, True, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(3312, 3312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(3314, 3314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(3322, 3322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(3324, 3324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(3334, 3334, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(4101, 4101, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(4103, 4103, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(4112, 4112, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4114, 4114, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(4122, 4122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4132, 4132, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4201, 4201, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, 4, 1, 0, 0, 0, 0, 0, 0, 0) +(4203, 4203, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, 4, 3, 0, 0, 0, 0, 0, 0, 0) +(4212, 4212, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4214, 4214, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4222, 4222, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(4224, 4224, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(4232, 4232, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4301, 4301, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(4303, 4303, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(4312, 4312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4314, 4314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(4322, 4322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4324, 4324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4332, 4332, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4334, 4334, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(4403, 4403, True, True, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, 4, 3, 0, 0, 0, 0, 0, 0, 0) +(4412, 4412, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4414, 4414, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4422, 4422, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(4424, 4424, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(4432, 4432, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4434, 4434, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4444, 4444, True, True, False, True, True, False, False, False, True, False, False, False, True, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(5101, 5101, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, -2, 1, 0, 0, 0, 0, 0, 0, 0) +(5103, 5103, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(5112, 5112, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5114, 5114, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5122, 5122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5124, 5124, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5132, 5132, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5142, 5142, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5201, 5201, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(5203, 5203, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(5212, 5212, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5214, 5214, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5222, 5222, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5224, 5224, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(5232, 5232, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5242, 5242, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5301, 5301, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, -2, 1, 0, 0, 0, 0, 0, 0, 0) +(5303, 5303, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(5312, 5312, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5314, 5314, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5322, 5322, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5324, 5324, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5332, 5332, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5334, 5334, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5342, 5342, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5401, 5401, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(5403, 5403, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(5412, 5412, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5414, 5414, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5422, 5422, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5424, 5424, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(5432, 5432, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5434, 5434, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5442, 5442, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5444, 5444, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(5503, 5503, True, True, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(5512, 5512, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5514, 5514, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5522, 5522, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5524, 5524, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5532, 5532, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5534, 5534, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5542, 5542, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5544, 5544, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5554, 5554, True, True, False, True, True, False, False, False, True, False, False, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(10022, 10022, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 22, 0) +(10111, 10111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10113, 10113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10115, 10115, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10211, 10211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10213, 10213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10215, 10215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 5, 0, 2, 0, 0, 0, 0, 0) +(10221, 10221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10223, 10223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10225, 10225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10311, 10311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10313, 10313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10315, 10315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10321, 10321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10323, 10323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10325, 10325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 0, 2, 0, 0, 0, 0, 0) +(10331, 10331, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10333, 10333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10335, 10335, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10411, 10411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10413, 10413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10421, 10421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10423, 10423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10431, 10431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10433, 10433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10441, 10441, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10443, 10443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10511, 10511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10513, 10513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10521, 10521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10523, 10523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10531, 10531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10533, 10533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10541, 10541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10543, 10543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10551, 10551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10553, 10553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10555, 10555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(11112, 11112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(11114, 11114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(11116, 11116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(11212, 11212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(11216, 11216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(12112, 12112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(12114, 12114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(12116, 12116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(12118, 12118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(12122, 12122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(12126, 12126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(12212, 12212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(12214, 12214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(12216, 12216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(12218, 12218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(12222, 12222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(12224, 12224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(12226, 12226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 6, 0, 0, 0, 0, 0, 0, 0) +(13112, 13112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(13114, 13114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(13116, 13116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(13122, 13122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(13124, 13124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(13126, 13126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(13212, 13212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(13214, 13214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(13216, 13216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(13222, 13222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(13224, 13224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(13226, 13226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(13314, 13314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(13324, 13324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(14122, 14122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(15122, 15122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(20022, 20022, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 22, 0) +(20113, 20113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20213, 20213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20223, 20223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20313, 20313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20315, 20315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(20323, 20323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20325, 20325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 1, 2, 0, 0, 0, 0, 0) +(20333, 20333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20413, 20413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20423, 20423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20433, 20433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20443, 20443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20513, 20513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20523, 20523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20533, 20533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20543, 20543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20553, 20553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20555, 20555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(21112, 21112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(21114, 21114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(21212, 21212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(21214, 21214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(22112, 22112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(22114, 22114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(22122, 22122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(22124, 22124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(22212, 22212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(22214, 22214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(22222, 22222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(22224, 22224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(23112, 23112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(23114, 23114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(23122, 23122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(23124, 23124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(23126, 23126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(23212, 23212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(23214, 23214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(23222, 23222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(23224, 23224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(30113, 30113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30213, 30213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 2, 0, 0, 0, 0, 0) +(30223, 30223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30313, 30313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30323, 30323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 2, 0, 0, 0, 0, 0) +(30343, 30343, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(30353, 30353, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(30363, 30363, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(30443, 30443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30553, 30553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(31114, 31114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(31214, 31214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(32112, 32112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(32114, 32114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(32124, 32124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(32212, 32212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(32214, 32214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(32224, 32224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(33122, 33122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(41214, 41214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(42112, 42112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(42124, 42124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(42212, 42212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(43122, 43122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(52114, 52114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(52214, 52214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(53122, 53122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(100111, 100111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100113, 100113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100211, 100211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(100213, 100213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(100221, 100221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100223, 100223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100311, 100311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100313, 100313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100315, 100315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(100321, 100321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(100323, 100323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(100325, 100325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(100331, 100331, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100333, 100333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100411, 100411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(100413, 100413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(100421, 100421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100423, 100423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100441, 100441, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100443, 100443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100445, 100445, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(100551, 100551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100553, 100553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100555, 100555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(100557, 100557, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(103112, 103112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(103212, 103212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(103222, 103222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(103316, 103316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(103326, 103326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(104124, 104124, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(104312, 104312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(104314, 104314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(104322, 104322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(104324, 104324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(110551, 110551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(110553, 110553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(110555, 110555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(120553, 120553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(120555, 120555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(130553, 130553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(200551, 200551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(200553, 200553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(200555, 200555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(203312, 203312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(203316, 203316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(203322, 203322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(203326, 203326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(203338, 203338, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(204126, 204126, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(210551, 210551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(210553, 210553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(220553, 220553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(300553, 300553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(1000001, 1000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 1, 0) +(1000002, 1000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 2, 0) +(1000003, 1000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 3, 0) +(1000004, 1000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 4, 0) +(1000005, 1000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 5, 0) +(1000006, 1000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 6, 0) +(1000011, 1000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 11, 0) +(1000012, 1000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(1000013, 1000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 13, 0) +(1000014, 1000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(1000015, 1000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 15, 0) +(1000016, 1000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(1000021, 1000021, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 21, 0) +(1000022, 1000022, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 22, 0) +(1000023, 1000023, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 23, 0) +(1000024, 1000024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 24, 0) +(1000025, 1000025, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 25, 0) +(1000035, 1000035, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 35, 0) +(1000037, 1000037, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 37, 0) +(1000039, 1000039, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 10, 0) +(1000522, 1000522, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(1000542, 1000542, True, False, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(1009002, 1009002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 21, 0) +(2000001, 2000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 1, 0) +(2000002, 2000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 2, 0) +(2000003, 2000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 3, 0) +(2000004, 2000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 4, 0) +(2000005, 2000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 5, 0) +(2000006, 2000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 6, 0) +(2000011, 2000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 11, 0) +(2000012, 2000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(2000013, 2000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 13, 0) +(2000014, 2000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(2000015, 2000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 15, 0) +(2000016, 2000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(3000111, 3000111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3000113, 3000113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3000211, 3000211, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(3000213, 3000213, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(3000221, 3000221, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3000223, 3000223, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3000331, 3000331, True, False, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3100021, 3100021, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3100111, 3100111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3100113, 3100113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3200111, 3200111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3200113, 3200113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3300113, 3300113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3400113, 3400113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(4000001, 4000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 2, 0, 0, 0, 0, 0, 1, 0) +(4000002, 4000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 2, 0, 0, 0, 0, 0, 2, 0) +(4000011, 4000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 11, 0) +(4000012, 4000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(4900021, 4900021, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 21, 0) +(4900023, 4900023, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 23, 0) +(4900101, 4900101, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(4900111, 4900111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(4900113, 4900113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(4900211, 4900211, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(4900213, 4900213, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(5000039, 5000039, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 39, 0) +(9000111, 9000111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9000113, 9000113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9000211, 9000211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(9000213, 9000213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(9000221, 9000221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9000443, 9000443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9000553, 9000553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9010111, 9010111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9010113, 9010113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9010211, 9010211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(9010213, 9010213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(9010221, 9010221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9010443, 9010443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9010553, 9010553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9020221, 9020221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9020443, 9020443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9030221, 9030221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9042413, 9042413, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(9050225, 9050225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9060225, 9060225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9080225, 9080225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9090225, 9090225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9900012, 9900012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(9900014, 9900014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 14, 0) +(9900016, 9900016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 16, 0) +(9900023, 9900023, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 23, 0) +(9900024, 9900024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 24, 0) +(9900041, 9900041, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 6, 1, 0, 0, 0, 0, 0, 9, 0) +(9900042, 9900042, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 6, 1, 0, 0, 0, 0, 0, 9, 0) +(9910445, 9910445, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9920443, 9920443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(480000000, 480000000, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 48) +(1000010020, 1000010020, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 1, 2, 0, 0, 100) +(1000010030, 1000010030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 1, 3, 0, 0, 100) +(1000020030, 1000020030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 6, 2, 0, 0, 2, 3, 0, 0, 100) +(1000020040, 1000020040, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 6, 1, 0, 0, 2, 4, 0, 0, 100) +(1000030070, 1000030070, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 9, 2, 0, 0, 3, 7, 0, 0, 100) +(1000040080, 1000040080, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 12, 1, 0, 0, 4, 8, 0, 0, 100) +(1000040090, 1000040090, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 12, 2, 0, 0, 4, 9, 0, 0, 100) +(1000040100, 1000040100, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 12, 1, 0, 0, 4, 10, 0, 0, 100) +(1000050100, 1000050100, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 15, 1, 0, 0, 5, 10, 0, 0, 100) +(1000050110, 1000050110, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 15, 2, 0, 0, 5, 11, 0, 0, 100) +(1000050120, 1000050120, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 15, 1, 0, 0, 5, 12, 0, 0, 100) +(1000060120, 1000060120, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 18, 1, 0, 0, 6, 12, 0, 0, 100) +(1000060130, 1000060130, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 18, 2, 0, 0, 6, 13, 0, 0, 100) +(1000060140, 1000060140, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 18, 1, 0, 0, 6, 14, 0, 0, 100) +(1000070140, 1000070140, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 21, 1, 0, 0, 7, 14, 0, 0, 100) +(1000070150, 1000070150, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 21, 2, 0, 0, 7, 15, 0, 0, 100) +(1000070160, 1000070160, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 21, 1, 0, 0, 7, 16, 0, 0, 100) +(1000080160, 1000080160, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 1, 0, 0, 8, 16, 0, 0, 100) +(1000080170, 1000080170, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 2, 0, 0, 8, 17, 0, 0, 100) +(1000080180, 1000080180, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 1, 0, 0, 8, 18, 0, 0, 100) +(1000080190, 1000080190, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 2, 0, 0, 8, 19, 0, 0, 100) +(1000090190, 1000090190, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 27, 2, 0, 0, 9, 19, 0, 0, 100) +(1000100220, 1000100220, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 30, 1, 0, 0, 10, 22, 0, 0, 100) +(1000100230, 1000100230, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 30, 2, 0, 0, 10, 23, 0, 0, 100) +(1000110240, 1000110240, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 33, 1, 0, 0, 11, 24, 0, 0, 100) +(1000120240, 1000120240, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 1, 0, 0, 12, 24, 0, 0, 100) +(1000120250, 1000120250, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 2, 0, 0, 12, 25, 0, 0, 100) +(1000120260, 1000120260, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 1, 0, 0, 12, 26, 0, 0, 100) +(1000120270, 1000120270, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 2, 0, 0, 12, 27, 0, 0, 100) +(1000130270, 1000130270, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 39, 2, 0, 0, 13, 27, 0, 0, 100) +(1000130280, 1000130280, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 39, 1, 0, 0, 13, 28, 0, 0, 100) +(1000140280, 1000140280, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 42, 1, 0, 0, 14, 28, 0, 0, 100) +(1000140290, 1000140290, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 42, 2, 0, 0, 14, 29, 0, 0, 100) +(1000140300, 1000140300, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 42, 1, 0, 0, 14, 30, 0, 0, 100) +(1000150310, 1000150310, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 45, 2, 0, 0, 15, 31, 0, 0, 100) +(1000170390, 1000170390, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 51, 2, 0, 0, 17, 39, 0, 0, 100) +(1000170400, 1000170400, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 51, 1, 0, 0, 17, 40, 0, 0, 100) +(1000180360, 1000180360, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 54, 1, 0, 0, 18, 36, 0, 0, 100) +(1000180400, 1000180400, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 54, 1, 0, 0, 18, 40, 0, 0, 100) +(1000240500, 1000240500, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 1, 0, 0, 24, 50, 0, 0, 100) +(1000240520, 1000240520, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 1, 0, 0, 24, 52, 0, 0, 100) +(1000240530, 1000240530, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 2, 0, 0, 24, 53, 0, 0, 100) +(1000240540, 1000240540, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 1, 0, 0, 24, 54, 0, 0, 100) +(1000250550, 1000250550, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 75, 2, 0, 0, 25, 55, 0, 0, 100) +(1000260540, 1000260540, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 1, 0, 0, 26, 54, 0, 0, 100) +(1000260560, 1000260560, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 1, 0, 0, 26, 56, 0, 0, 100) +(1000260570, 1000260570, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 2, 0, 0, 26, 57, 0, 0, 100) +(1000260590, 1000260590, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 2, 0, 0, 26, 59, 0, 0, 100) +(1000280580, 1000280580, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 58, 0, 0, 100) +(1000280600, 1000280600, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 60, 0, 0, 100) +(1000280610, 1000280610, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 2, 0, 0, 28, 61, 0, 0, 100) +(1000280620, 1000280620, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 62, 0, 0, 100) +(1000280630, 1000280630, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 2, 0, 0, 28, 63, 0, 0, 100) +(1000280640, 1000280640, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 64, 0, 0, 100) +(1000290630, 1000290630, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 87, 2, 0, 0, 29, 63, 0, 0, 100) +(1000290650, 1000290650, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 87, 2, 0, 0, 29, 65, 0, 0, 100) +(1000420920, 1000420920, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 92, 0, 0, 100) +(1000420950, 1000420950, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 2, 0, 0, 42, 95, 0, 0, 100) +(1000420960, 1000420960, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 96, 0, 0, 100) +(1000420970, 1000420970, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 2, 0, 0, 42, 97, 0, 0, 100) +(1000420980, 1000420980, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 98, 0, 0, 100) +(1000421000, 1000421000, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 100, 0, 0, 100) +(1000461080, 1000461080, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 138, 1, 0, 0, 46, 108, 0, 0, 100) +(1000791970, 1000791970, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 237, 2, 0, 0, 79, 197, 0, 0, 100) +(1000822040, 1000822040, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 1, 0, 0, 82, 204, 0, 0, 100) +(1000822060, 1000822060, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 1, 0, 0, 82, 206, 0, 0, 100) +(1000822070, 1000822070, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 2, 0, 0, 82, 207, 0, 0, 100) +(1000822080, 1000822080, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 1, 0, 0, 82, 208, 0, 0, 100) +""" +findReferenceBlock(block) +</text></argument> +</extension> diff --git a/GaudiPartProp/tests/qmtest/partprop.qms/usesvc0.qmt b/GaudiPartProp/tests/qmtest/partprop.qms/usesvc0.qmt new file mode 100644 index 0000000000000000000000000000000000000000..aa76a9b88350eefcf6fbe3a48852262bf4eb8d23 --- /dev/null +++ b/GaudiPartProp/tests/qmtest/partprop.qms/usesvc0.qmt @@ -0,0 +1,15 @@ +<?xml version="1.0" ?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'> +<!-- + (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations + + This software is distributed under the terms of the Apache version 2 licence, + copied verbatim in the file "LICENSE". + + In applying this licence, CERN does not waive the privileges and immunities + granted to it by virtue of its status as an Intergovernmental Organization + or submit itself to any jurisdiction. +--> +<extension class="GaudiTest.GaudiExeTest" kind="test"> + <argument name="program"><text>gaudirun.py</text></argument> + <argument name="args"><set><text>../options/PartPropAlg.py</text></set></argument> +</extension> diff --git a/GaudiPartProp/tests/qmtest/partprop.qms/usesvc1.qmt b/GaudiPartProp/tests/qmtest/partprop.qms/usesvc1.qmt new file mode 100644 index 0000000000000000000000000000000000000000..6cbf0576f4628f3f60a19d02eb6051f324c2482d --- /dev/null +++ b/GaudiPartProp/tests/qmtest/partprop.qms/usesvc1.qmt @@ -0,0 +1,14 @@ +<?xml version="1.0" ?><!DOCTYPE extension PUBLIC '-//QM/2.3/Extension//EN' 'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'> +<!-- + (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations + + This software is distributed under the terms of the Apache version 2 licence, + copied verbatim in the file "LICENSE". + + In applying this licence, CERN does not waive the privileges and immunities + granted to it by virtue of its status as an Intergovernmental Organization + or submit itself to any jurisdiction. +--> +<extension class="GaudiTest.GaudiExeTest" kind="test"> + <argument name="program"><text>../scripts/PartPropSvc.py</text></argument> +</extension> diff --git a/GaudiPartProp/tests/refs/partprop0.ref b/GaudiPartProp/tests/refs/partprop0.ref new file mode 100644 index 0000000000000000000000000000000000000000..7756b700025368374b1cb9fedb066c6b795352dd --- /dev/null +++ b/GaudiPartProp/tests/refs/partprop0.ref @@ -0,0 +1,174 @@ +NAME3 PDG: 123, Q: 0, mass: 503 MeV, ctau: 2.99792 cm +NAME2 PDG: 122, Q: -1, mass: 502 MeV, ctau: 2.99792 cm +NAME1 PDG: 121, Q: +1, mass: 501 MeV, ctau: 2.99792 cm + ---------------------------------------------------------------------------------------------------------------------------------------------------------- +| Name | PdgID | Q | Mass | (c*)Tau/Gamma | MaxWidth | EvtGen | PythiaID | Antiparticle | + ---------------------------------------------------------------------------------------------------------------------------------------------------------- +| NAME3 | 123 | 0 | 503 MeV | 2.9979246 cm | 0.001 | NAME3 | 123 | - | +| NAME2 | 122 | -1 | 502 MeV | 2.9979246 cm | 0.001 | NAME2 | 122 | NAME1 | +| NAME1 | 121 | 1 | 501 MeV | 2.9979246 cm | 0.001 | NAME1 | 121 | NAME2 | + ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + ---------------------------------------------------------------------------------------------------------------------------------------------------------- +| Name | PdgID | Q | Mass | (c*)Tau/Gamma | MaxWidth | EvtGen | PythiaID | Antiparticle | + ---------------------------------------------------------------------------------------------------------------------------------------------------------- +| NAME1 | 121 | 1 | 501 MeV | 2.9979246 cm | 0.001 | NAME1 | 121 | NAME2 | +| NAME2 | 122 | -1 | 502 MeV | 2.9979246 cm | 0.001 | NAME2 | 122 | NAME1 | +| NAME3 | 123 | 0 | 503 MeV | 2.9979246 cm | 0.001 | NAME3 | 123 | - | + ---------------------------------------------------------------------------------------------------------------------------------------------------------- + +[Gaudi.ParticleID(123), Gaudi.ParticleID(122), Gaudi.ParticleID(121)] +[Gaudi.ParticleID(121), Gaudi.ParticleID(122), Gaudi.ParticleID(123)] +Gaudi.ParticleID(121) 121 +Gaudi.ParticleID(122) 122 +Gaudi.ParticleID(123) 123 +Gaudi.ParticleID(5122) + isValid True + isMeson False + isBaryon True + isDiQuark False + isHadron True + isLepton False + isNucleus False + hasUp True + hasDown True + hasStrange False + hasCharm False + hasBottom True + hasTop False + hasQuarks True + isQuark False + threeCharge 0 + jSpin 2 + sSpin 0 + lSpin 0 + fundamental 0 + extra 0 + A 0 + Z 0 + nLambda 0 +Gaudi.ParticleID(4) + isValid True + isMeson False + isBaryon False + isDiQuark False + isHadron False + isLepton False + isNucleus False + hasUp False + hasDown False + hasStrange False + hasCharm True + hasBottom False + hasTop False + hasQuarks False + isQuark True + threeCharge 2 + jSpin 2 + sSpin 0 + lSpin 0 + fundamental 4 + extra 0 + A 0 + Z 0 + nLambda 0 +Gaudi.ParticleID(2212) + isValid True + isMeson False + isBaryon True + isDiQuark False + isHadron True + isLepton False + isNucleus False + hasUp True + hasDown True + hasStrange False + hasCharm False + hasBottom False + hasTop False + hasQuarks True + isQuark False + threeCharge 3 + jSpin 2 + sSpin 0 + lSpin 0 + fundamental 0 + extra 0 + A 0 + Z 0 + nLambda 0 +Gaudi.ParticleID(1000020040) + isValid True + isMeson False + isBaryon False + isDiQuark False + isHadron False + isLepton False + isNucleus True + hasUp False + hasDown False + hasStrange False + hasCharm False + hasBottom False + hasTop False + hasQuarks False + isQuark False + threeCharge 6 + jSpin 1 + sSpin 0 + lSpin 0 + fundamental 0 + extra 100 + A 4 + Z 2 + nLambda 0 +Gaudi.ParticleID(1000822080) + isValid True + isMeson False + isBaryon False + isDiQuark False + isHadron False + isLepton False + isNucleus True + hasUp False + hasDown False + hasStrange False + hasCharm False + hasBottom False + hasTop False + hasQuarks False + isQuark False + threeCharge 246 + jSpin 1 + sSpin 0 + lSpin 0 + fundamental 0 + extra 100 + A 208 + Z 82 + nLambda 0 +Gaudi.ParticleID(450000000) + isValid True + isMeson False + isBaryon False + isDiQuark False + isHadron False + isLepton False + isNucleus True + hasUp False + hasDown False + hasStrange False + hasCharm False + hasBottom False + hasTop False + hasQuarks False + isQuark False + threeCharge 3 + jSpin 1 + sSpin 0 + lSpin 0 + fundamental 0 + extra 100 + A 2 + Z 1 + nLambda 0 diff --git a/GaudiPartProp/tests/refs/partprop_pids.ref b/GaudiPartProp/tests/refs/partprop_pids.ref new file mode 100644 index 0000000000000000000000000000000000000000..0da683b6955f642fdbb94134c8fb3f3b35d2e6fc --- /dev/null +++ b/GaudiPartProp/tests/refs/partprop_pids.ref @@ -0,0 +1,977 @@ +ApplicationMgr INFO Application Manager Initialized successfully +(-1000020040, 1000020040, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -6, 1, 0, 0, 2, 4, 0, 0, 100) +(-1000020030, 1000020030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -6, 2, 0, 0, 2, 3, 0, 0, 100) +(-1000010030, 1000010030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 1, 3, 0, 0, 100) +(-1000010020, 1000010020, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 1, 2, 0, 0, 100) +(-990000000, 990000000, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 99) +(-99000000, 99000000, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 9) +(-9900042, 9900042, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -6, 1, 0, 0, 0, 0, 0, 9, 0) +(-9900041, 9900041, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -6, 1, 0, 0, 0, 0, 0, 9, 0) +(-9900024, 9900024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 24, 0) +(-9042413, 9042413, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-9010213, 9010213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-9010211, 9010211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-9000213, 9000213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-9000211, 9000211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-4900213, 4900213, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(-4900211, 4900211, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-4900101, 4900101, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-4000012, 4000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(-4000011, 4000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 11, 0) +(-4000002, 4000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 2, 0, 0, 0, 0, 0, 2, 0) +(-4000001, 4000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 2, 0, 0, 0, 0, 0, 1, 0) +(-3000213, 3000213, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-3000211, 3000211, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-2000016, 2000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(-2000015, 2000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 15, 0) +(-2000014, 2000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(-2000013, 2000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 13, 0) +(-2000012, 2000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(-2000011, 2000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 11, 0) +(-2000006, 2000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 6, 0) +(-2000005, 2000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 5, 0) +(-2000004, 2000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 4, 0) +(-2000003, 2000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 3, 0) +(-2000002, 2000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 2, 0) +(-2000001, 2000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 1, 0) +(-1000037, 1000037, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 37, 0) +(-1000024, 1000024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 24, 0) +(-1000016, 1000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(-1000015, 1000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 15, 0) +(-1000014, 1000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(-1000013, 1000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 13, 0) +(-1000012, 1000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(-1000011, 1000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 11, 0) +(-1000006, 1000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 6, 0) +(-1000005, 1000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 5, 0) +(-1000004, 1000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 4, 0) +(-1000003, 1000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 3, 0) +(-1000002, 1000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 2, 0) +(-1000001, 1000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 1, 0) +(-204126, 204126, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-203338, 203338, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(-203326, 203326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-203322, 203322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-203316, 203316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-203312, 203312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-104324, 104324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-104322, 104322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-104314, 104314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-104312, 104312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-104124, 104124, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-103326, 103326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-103316, 103316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-103222, 103222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-103212, 103212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-103112, 103112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-100423, 100423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-100421, 100421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-100413, 100413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-100411, 100411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-100325, 100325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-100323, 100323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-100321, 100321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-100315, 100315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-100313, 100313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-100311, 100311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-100213, 100213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-100211, 100211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-53122, 53122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-52214, 52214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-52114, 52114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-43122, 43122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-42212, 42212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-42124, 42124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-42112, 42112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-41214, 41214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-33122, 33122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-32224, 32224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-32214, 32214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-32212, 32212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-32124, 32124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-32114, 32114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-32112, 32112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-31214, 31214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-31114, 31114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-30363, 30363, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(-30353, 30353, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 0, 0) +(-30343, 30343, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(-30323, 30323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 2, 0, 0, 0, 0, 0) +(-30313, 30313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(-30213, 30213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 2, 0, 0, 0, 0, 0) +(-23224, 23224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-23222, 23222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-23214, 23214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-23212, 23212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-23126, 23126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-23124, 23124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-23122, 23122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-23114, 23114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-23112, 23112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-22224, 22224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-22222, 22222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-22214, 22214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-22212, 22212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-22124, 22124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-22122, 22122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-22114, 22114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-22112, 22112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-21214, 21214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-21212, 21212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-21114, 21114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-21112, 21112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-20543, 20543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20533, 20533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20523, 20523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20513, 20513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20433, 20433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20423, 20423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20413, 20413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20325, 20325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 1, 2, 0, 0, 0, 0, 0) +(-20323, 20323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-20315, 20315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(-20313, 20313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(-20213, 20213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 1, 0, 0, 0, 0, 0) +(-15122, 15122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-14122, 14122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-13324, 13324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-13314, 13314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-13226, 13226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-13224, 13224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-13222, 13222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-13216, 13216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-13214, 13214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-13212, 13212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-13126, 13126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-13124, 13124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-13122, 13122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-13116, 13116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-13114, 13114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-13112, 13112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-12226, 12226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 6, 0, 0, 0, 0, 0, 0, 0) +(-12224, 12224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-12222, 12222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-12218, 12218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-12216, 12216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-12214, 12214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-12212, 12212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-12126, 12126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-12122, 12122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-12118, 12118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-12116, 12116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-12114, 12114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-12112, 12112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-11216, 11216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-11212, 11212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-11116, 11116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-11114, 11114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-11112, 11112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-10543, 10543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10541, 10541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10533, 10533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10531, 10531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10523, 10523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10521, 10521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10513, 10513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10511, 10511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10433, 10433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10431, 10431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10423, 10423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10421, 10421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10413, 10413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10411, 10411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10325, 10325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 0, 2, 0, 0, 0, 0, 0) +(-10323, 10323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10321, 10321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-10315, 10315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(-10313, 10313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(-10311, 10311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(-10215, 10215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 5, 0, 2, 0, 0, 0, 0, 0) +(-10213, 10213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 0, 1, 0, 0, 0, 0, 0) +(-10211, 10211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 1, 1, 0, 0, 0, 0, 0) +(-5554, 5554, True, True, False, True, True, False, False, False, True, False, False, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5544, 5544, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5542, 5542, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5534, 5534, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5532, 5532, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5524, 5524, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5522, 5522, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5514, 5514, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5512, 5512, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5503, 5503, True, True, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-5444, 5444, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5442, 5442, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5434, 5434, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5432, 5432, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5424, 5424, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5422, 5422, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5414, 5414, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5412, 5412, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5403, 5403, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-5401, 5401, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-5342, 5342, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5334, 5334, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5332, 5332, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5324, 5324, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5322, 5322, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5314, 5314, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5312, 5312, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5303, 5303, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-5301, 5301, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 2, 1, 0, 0, 0, 0, 0, 0, 0) +(-5242, 5242, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5232, 5232, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5224, 5224, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5222, 5222, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5214, 5214, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5212, 5212, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5203, 5203, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-5201, 5201, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-5142, 5142, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5132, 5132, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5124, 5124, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-5122, 5122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-5114, 5114, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-5112, 5112, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-5103, 5103, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-5101, 5101, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, 2, 1, 0, 0, 0, 0, 0, 0, 0) +(-4444, 4444, True, True, False, True, True, False, False, False, True, False, False, False, True, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-4434, 4434, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4432, 4432, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4424, 4424, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-4422, 4422, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-4414, 4414, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4412, 4412, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4403, 4403, True, True, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, -4, 3, 0, 0, 0, 0, 0, 0, 0) +(-4334, 4334, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-4332, 4332, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4324, 4324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4322, 4322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4314, 4314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-4312, 4312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4303, 4303, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-4301, 4301, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-4232, 4232, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4224, 4224, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-4222, 4222, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-4214, 4214, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-4212, 4212, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4203, 4203, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, -4, 3, 0, 0, 0, 0, 0, 0, 0) +(-4201, 4201, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, -4, 1, 0, 0, 0, 0, 0, 0, 0) +(-4132, 4132, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4122, 4122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-4114, 4114, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-4112, 4112, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-4103, 4103, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-4101, 4101, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-3334, 3334, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3324, 3324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-3322, 3322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-3314, 3314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3312, 3312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-3303, 3303, True, True, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-3228, 3228, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-3226, 3226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-3224, 3224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3222, 3222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-3218, 3218, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-3216, 3216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-3214, 3214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-3212, 3212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-3203, 3203, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-3201, 3201, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-3128, 3128, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-3126, 3126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-3124, 3124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-3122, 3122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-3118, 3118, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(-3116, 3116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-3114, 3114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-3112, 3112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-3103, 3103, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-3101, 3101, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 0, 0) +(-2228, 2228, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 8, 0, 0, 0, 0, 0, 0, 0) +(-2226, 2226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 6, 0, 0, 0, 0, 0, 0, 0) +(-2224, 2224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 4, 0, 0, 0, 0, 0, 0, 0) +(-2222, 2222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, -6, 2, 0, 0, 0, 0, 0, 0, 0) +(-2218, 2218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-2216, 2216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-2214, 2214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-2212, 2212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-2203, 2203, True, True, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, -4, 3, 0, 0, 0, 0, 0, 0, 0) +(-2128, 2128, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(-2126, 2126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(-2124, 2124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(-2122, 2122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(-2118, 2118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-2116, 2116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-2114, 2114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-2112, 2112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-2103, 2103, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -1, 3, 0, 0, 0, 0, 0, 0, 0) +(-2101, 2101, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 0, 0) +(-1218, 1218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(-1216, 1216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(-1214, 1214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(-1212, 1212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(-1118, 1118, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(-1116, 1116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(-1114, 1114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(-1112, 1112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(-1103, 1103, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 2, 3, 0, 0, 0, 0, 0, 0, 0) +(-545, 545, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-543, 543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-541, 541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-535, 535, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-533, 533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-531, 531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-525, 525, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-523, 523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-521, 521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-515, 515, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-513, 513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-511, 511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-435, 435, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-433, 433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-431, 431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-425, 425, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-423, 423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-421, 421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-415, 415, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-413, 413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-411, 411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-329, 329, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 9, 1, 3, 0, 0, 0, 0, 0) +(-327, 327, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 7, 1, 2, 0, 0, 0, 0, 0) +(-325, 325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-323, 323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-321, 321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-319, 319, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(-317, 317, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(-315, 315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(-313, 313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(-311, 311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(-219, 219, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 9, 1, 3, 0, 0, 0, 0, 0) +(-217, 217, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 7, 1, 2, 0, 0, 0, 0, 0) +(-215, 215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 5, 1, 1, 0, 0, 0, 0, 0) +(-213, 213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 3, 1, 0, 0, 0, 0, 0, 0) +(-211, 211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 0, 0) +(-87, 87, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 0, 0, 0, 0, 0, 0, 87, 0) +(-86, 86, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 0, 0, 0, 0, 0, 0, 86, 0) +(-85, 85, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 0, 0, 0, 0, 0, 0, 85, 0) +(-84, 84, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -2, 0, 0, 0, 0, 0, 0, 84, 0) +(-82, 82, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 82, 0) +(-44, 44, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 0, 0, 0, 0, 0, 0, 44, 0) +(-42, 42, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 42, 0) +(-41, 41, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 41, 0) +(-37, 37, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 37, 0) +(-34, 34, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 34, 0) +(-24, 24, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 3, 0, 0, 0, 0, 0, 24, 0) +(-18, 18, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 18, 0) +(-17, 17, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 17, 0) +(-16, 16, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 16, 0) +(-15, 15, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 15, 0) +(-14, 14, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 14, 0) +(-13, 13, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 13, 0) +(-12, 12, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(-11, 11, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 11, 0) +(-8, 8, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True, -2, 2, 0, 0, 0, 0, 0, 8, 0) +(-7, 7, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, 1, 2, 0, 0, 0, 0, 0, 7, 0) +(-6, 6, True, True, False, False, False, False, False, True, False, False, False, False, False, False, True, False, False, -2, 2, 0, 0, 0, 0, 0, 6, 0) +(-5, 5, True, True, False, False, False, False, False, True, False, False, False, False, False, True, False, False, False, 1, 2, 0, 0, 0, 0, 0, 5, 0) +(-4, 4, True, True, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, -2, 2, 0, 0, 0, 0, 0, 4, 0) +(-3, 3, True, True, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, 1, 2, 0, 0, 0, 0, 0, 3, 0) +(-2, 2, True, True, False, False, False, False, False, True, False, False, True, False, False, False, False, False, False, -2, 2, 0, 0, 0, 0, 0, 2, 0) +(-1, 1, True, True, False, False, False, False, False, True, False, True, False, False, False, False, False, False, False, 1, 2, 0, 0, 0, 0, 0, 1, 0) +(1, 1, True, True, False, False, False, False, False, True, False, True, False, False, False, False, False, False, False, -1, 2, 0, 0, 0, 0, 0, 1, 0) +(2, 2, True, True, False, False, False, False, False, True, False, False, True, False, False, False, False, False, False, 2, 2, 0, 0, 0, 0, 0, 2, 0) +(3, 3, True, True, False, False, False, False, False, True, False, False, False, True, False, False, False, False, False, -1, 2, 0, 0, 0, 0, 0, 3, 0) +(4, 4, True, True, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, 2, 2, 0, 0, 0, 0, 0, 4, 0) +(5, 5, True, True, False, False, False, False, False, True, False, False, False, False, False, True, False, False, False, -1, 2, 0, 0, 0, 0, 0, 5, 0) +(6, 6, True, True, False, False, False, False, False, True, False, False, False, False, False, False, True, False, False, 2, 2, 0, 0, 0, 0, 0, 6, 0) +(7, 7, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, -1, 2, 0, 0, 0, 0, 0, 7, 0) +(8, 8, True, True, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True, 2, 2, 0, 0, 0, 0, 0, 8, 0) +(11, 11, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 11, 0) +(12, 12, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(13, 13, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 13, 0) +(14, 14, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 14, 0) +(15, 15, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 15, 0) +(16, 16, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 16, 0) +(17, 17, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 17, 0) +(18, 18, True, True, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 18, 0) +(21, 21, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 21, 0) +(22, 22, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 22, 0) +(23, 23, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 23, 0) +(24, 24, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 24, 0) +(25, 25, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 25, 0) +(32, 32, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 32, 0) +(33, 33, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 33, 0) +(34, 34, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 34, 0) +(35, 35, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 35, 0) +(36, 36, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 36, 0) +(37, 37, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 37, 0) +(39, 39, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 39, 0) +(41, 41, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 41, 0) +(42, 42, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 42, 0) +(43, 43, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 43, 0) +(44, 44, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 0, 0, 0, 0, 0, 0, 44, 0) +(81, 81, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 81, 0) +(82, 82, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 82, 0) +(83, 83, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 83, 0) +(84, 84, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 0, 0, 0, 0, 0, 0, 84, 0) +(85, 85, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 0, 0, 0, 0, 0, 0, 85, 0) +(86, 86, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 0, 0, 0, 0, 0, 0, 86, 0) +(87, 87, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 0, 0, 0, 0, 0, 0, 87, 0) +(88, 88, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 88, 0) +(90, 90, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 90, 0) +(91, 91, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 91, 0) +(92, 92, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 92, 0) +(93, 93, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 93, 0) +(94, 94, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 94, 0) +(95, 95, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 95, 0) +(96, 96, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 96, 0) +(97, 97, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 97, 0) +(98, 98, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 98, 0) +(99, 99, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 99, 0) +(111, 111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(113, 113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(115, 115, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(117, 117, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(119, 119, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(130, 130, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(150, 150, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(211, 211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(213, 213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(215, 215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(217, 217, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 7, 1, 2, 0, 0, 0, 0, 0) +(219, 219, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 9, 1, 3, 0, 0, 0, 0, 0) +(221, 221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(223, 223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(225, 225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(227, 227, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(229, 229, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(310, 310, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(311, 311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(313, 313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(315, 315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(317, 317, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(319, 319, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 9, 1, 3, 0, 0, 0, 0, 0) +(321, 321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(323, 323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(325, 325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(327, 327, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 7, 1, 2, 0, 0, 0, 0, 0) +(329, 329, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 9, 1, 3, 0, 0, 0, 0, 0) +(331, 331, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(333, 333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(335, 335, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(337, 337, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(350, 350, False, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 0) +(411, 411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(413, 413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(415, 415, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(421, 421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(423, 423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(425, 425, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(431, 431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(433, 433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(435, 435, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(441, 441, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(443, 443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(445, 445, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(510, 510, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(511, 511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(513, 513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(515, 515, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(521, 521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(523, 523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(525, 525, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(530, 530, False, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 0) +(531, 531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(533, 533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(535, 535, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(541, 541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(543, 543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(545, 545, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(551, 551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(553, 553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(555, 555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(557, 557, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(1103, 1103, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(1112, 1112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(1114, 1114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(1116, 1116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(1118, 1118, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(1212, 1212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(1214, 1214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(1216, 1216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(1218, 1218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(2101, 2101, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(2103, 2103, True, True, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(2112, 2112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(2114, 2114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(2116, 2116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(2118, 2118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(2122, 2122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(2124, 2124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(2126, 2126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(2128, 2128, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(2203, 2203, True, True, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 4, 3, 0, 0, 0, 0, 0, 0, 0) +(2212, 2212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(2214, 2214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(2216, 2216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(2218, 2218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(2222, 2222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(2224, 2224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(2226, 2226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 6, 0, 0, 0, 0, 0, 0, 0) +(2228, 2228, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 8, 0, 0, 0, 0, 0, 0, 0) +(3101, 3101, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, -2, 1, 0, 0, 0, 0, 0, 0, 0) +(3103, 3103, True, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(3112, 3112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(3114, 3114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(3116, 3116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(3118, 3118, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(3122, 3122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(3124, 3124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(3126, 3126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(3128, 3128, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(3201, 3201, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(3203, 3203, True, True, False, False, False, False, False, False, True, False, True, True, False, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(3212, 3212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(3214, 3214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(3216, 3216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(3218, 3218, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(3222, 3222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(3224, 3224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(3226, 3226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(3228, 3228, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(3303, 3303, True, True, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(3312, 3312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(3314, 3314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(3322, 3322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(3324, 3324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(3334, 3334, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(4101, 4101, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(4103, 4103, True, True, False, False, False, False, False, False, True, True, False, False, True, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(4112, 4112, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4114, 4114, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(4122, 4122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4132, 4132, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4201, 4201, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, 4, 1, 0, 0, 0, 0, 0, 0, 0) +(4203, 4203, True, True, False, False, False, False, False, False, True, False, True, False, True, False, False, False, False, 4, 3, 0, 0, 0, 0, 0, 0, 0) +(4212, 4212, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4214, 4214, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4222, 4222, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(4224, 4224, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(4232, 4232, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4301, 4301, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(4303, 4303, True, True, False, False, False, False, False, False, True, False, False, True, True, False, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(4312, 4312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4314, 4314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(4322, 4322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4324, 4324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4332, 4332, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(4334, 4334, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(4403, 4403, True, True, False, False, False, False, False, False, True, False, False, False, True, False, False, False, False, 4, 3, 0, 0, 0, 0, 0, 0, 0) +(4412, 4412, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4414, 4414, True, True, False, True, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4422, 4422, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(4424, 4424, True, True, False, True, True, False, False, False, True, False, True, False, True, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(4432, 4432, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(4434, 4434, True, True, False, True, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(4444, 4444, True, True, False, True, True, False, False, False, True, False, False, False, True, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(5101, 5101, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, -2, 1, 0, 0, 0, 0, 0, 0, 0) +(5103, 5103, True, True, False, False, False, False, False, False, True, True, False, False, False, True, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(5112, 5112, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5114, 5114, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5122, 5122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5124, 5124, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5132, 5132, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5142, 5142, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5201, 5201, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(5203, 5203, True, True, False, False, False, False, False, False, True, False, True, False, False, True, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(5212, 5212, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5214, 5214, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5222, 5222, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5224, 5224, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(5232, 5232, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5242, 5242, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5301, 5301, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, -2, 1, 0, 0, 0, 0, 0, 0, 0) +(5303, 5303, True, True, False, False, False, False, False, False, True, False, False, True, False, True, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(5312, 5312, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5314, 5314, True, True, False, True, True, False, False, False, True, True, False, True, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5322, 5322, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5324, 5324, True, True, False, True, True, False, False, False, True, False, True, True, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5332, 5332, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5334, 5334, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5342, 5342, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5401, 5401, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, 1, 1, 0, 0, 0, 0, 0, 0, 0) +(5403, 5403, True, True, False, False, False, False, False, False, True, False, False, False, True, True, False, False, False, 1, 3, 0, 0, 0, 0, 0, 0, 0) +(5412, 5412, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5414, 5414, True, True, False, True, True, False, False, False, True, True, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5422, 5422, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5424, 5424, True, True, False, True, True, False, False, False, True, False, True, False, True, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(5432, 5432, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5434, 5434, True, True, False, True, True, False, False, False, True, False, False, True, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5442, 5442, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(5444, 5444, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(5503, 5503, True, True, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, -2, 3, 0, 0, 0, 0, 0, 0, 0) +(5512, 5512, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5514, 5514, True, True, False, True, True, False, False, False, True, True, False, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5522, 5522, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5524, 5524, True, True, False, True, True, False, False, False, True, False, True, False, False, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5532, 5532, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(5534, 5534, True, True, False, True, True, False, False, False, True, False, False, True, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(5542, 5542, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(5544, 5544, True, True, False, True, True, False, False, False, True, False, False, False, True, True, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(5554, 5554, True, True, False, True, True, False, False, False, True, False, False, False, False, True, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(10022, 10022, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 22, 0) +(10111, 10111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10113, 10113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10115, 10115, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10211, 10211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10213, 10213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10215, 10215, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 5, 0, 2, 0, 0, 0, 0, 0) +(10221, 10221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10223, 10223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10225, 10225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10311, 10311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10313, 10313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10315, 10315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10321, 10321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10323, 10323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10325, 10325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 0, 2, 0, 0, 0, 0, 0) +(10331, 10331, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10333, 10333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10335, 10335, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(10411, 10411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10413, 10413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10421, 10421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10423, 10423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10431, 10431, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10433, 10433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10441, 10441, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10443, 10443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10511, 10511, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10513, 10513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10521, 10521, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10523, 10523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10531, 10531, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10533, 10533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10541, 10541, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 1, 1, 1, 0, 0, 0, 0, 0) +(10543, 10543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 3, 0, 1, 0, 0, 0, 0, 0) +(10551, 10551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(10553, 10553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(10555, 10555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(11112, 11112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(11114, 11114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(11116, 11116, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(11212, 11212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(11216, 11216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(12112, 12112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(12114, 12114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(12116, 12116, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(12118, 12118, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 8, 0, 0, 0, 0, 0, 0, 0) +(12122, 12122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(12126, 12126, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(12212, 12212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(12214, 12214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(12216, 12216, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(12218, 12218, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 8, 0, 0, 0, 0, 0, 0, 0) +(12222, 12222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(12224, 12224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(12226, 12226, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 6, 0, 0, 0, 0, 0, 0, 0) +(13112, 13112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(13114, 13114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(13116, 13116, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(13122, 13122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(13124, 13124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(13126, 13126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(13212, 13212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(13214, 13214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(13216, 13216, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(13222, 13222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(13224, 13224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(13226, 13226, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(13314, 13314, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(13324, 13324, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(14122, 14122, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(15122, 15122, True, True, False, True, True, False, False, False, True, True, True, False, False, True, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(20022, 20022, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 22, 0) +(20113, 20113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20213, 20213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20223, 20223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20313, 20313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20315, 20315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(20323, 20323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20325, 20325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 1, 2, 0, 0, 0, 0, 0) +(20333, 20333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20413, 20413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20423, 20423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20433, 20433, True, True, True, False, True, False, False, False, True, False, False, True, True, False, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20443, 20443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20513, 20513, True, True, True, False, True, False, False, False, True, True, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20523, 20523, True, True, True, False, True, False, False, False, True, False, True, False, False, True, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20533, 20533, True, True, True, False, True, False, False, False, True, False, False, True, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20543, 20543, True, True, True, False, True, False, False, False, True, False, False, False, True, True, False, False, False, 3, 3, 1, 1, 0, 0, 0, 0, 0) +(20553, 20553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(20555, 20555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(21112, 21112, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(21114, 21114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(21212, 21212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(21214, 21214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(22112, 22112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(22114, 22114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(22122, 22122, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(22124, 22124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(22212, 22212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(22214, 22214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(22222, 22222, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 2, 0, 0, 0, 0, 0, 0, 0) +(22224, 22224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(23112, 23112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(23114, 23114, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(23122, 23122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(23124, 23124, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(23126, 23126, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(23212, 23212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(23214, 23214, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(23222, 23222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(23224, 23224, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(30113, 30113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30213, 30213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 2, 0, 0, 0, 0, 0) +(30223, 30223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30313, 30313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30323, 30323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 2, 0, 0, 0, 0, 0) +(30343, 30343, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(30353, 30353, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(30363, 30363, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(30443, 30443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(30553, 30553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(31114, 31114, True, True, False, True, True, False, False, False, True, True, False, False, False, False, False, False, False, -3, 4, 0, 0, 0, 0, 0, 0, 0) +(31214, 31214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(32112, 32112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(32114, 32114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(32124, 32124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(32212, 32212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(32214, 32214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(32224, 32224, True, True, False, True, True, False, False, False, True, False, True, False, False, False, False, False, False, 6, 4, 0, 0, 0, 0, 0, 0, 0) +(33122, 33122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(41214, 41214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(42112, 42112, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(42124, 42124, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(42212, 42212, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(43122, 43122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(52114, 52114, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(52214, 52214, True, True, False, True, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(53122, 53122, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(100111, 100111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100113, 100113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100211, 100211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(100213, 100213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(100221, 100221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100223, 100223, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100311, 100311, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100313, 100313, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100315, 100315, True, True, True, False, True, False, False, False, True, True, False, True, False, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(100321, 100321, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(100323, 100323, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(100325, 100325, True, True, True, False, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 5, 1, 1, 0, 0, 0, 0, 0) +(100331, 100331, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100333, 100333, True, True, True, False, True, False, False, False, True, False, False, True, False, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100411, 100411, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(100413, 100413, True, True, True, False, True, False, False, False, True, True, False, False, True, False, False, False, False, 3, 3, 1, 0, 0, 0, 0, 0, 0) +(100421, 100421, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100423, 100423, True, True, True, False, True, False, False, False, True, False, True, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100441, 100441, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100443, 100443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100445, 100445, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(100551, 100551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(100553, 100553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(100555, 100555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(100557, 100557, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 7, 1, 2, 0, 0, 0, 0, 0) +(103112, 103112, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(103212, 103212, True, True, False, True, True, False, False, False, True, True, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(103222, 103222, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(103316, 103316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(103326, 103326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(104124, 104124, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(104312, 104312, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(104314, 104314, True, True, False, True, True, False, False, False, True, True, False, True, True, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 0, 0) +(104322, 104322, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 0, 0) +(104324, 104324, True, True, False, True, True, False, False, False, True, False, True, True, True, False, False, False, False, 3, 4, 0, 0, 0, 0, 0, 0, 0) +(110551, 110551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(110553, 110553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(110555, 110555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 0, 2, 0, 0, 0, 0, 0) +(120553, 120553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(120555, 120555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 2, 0, 0, 0, 0, 0) +(130553, 130553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 2, 0, 0, 0, 0, 0) +(200551, 200551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(200553, 200553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(200555, 200555, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 5, 1, 1, 0, 0, 0, 0, 0) +(203312, 203312, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(203316, 203316, True, True, False, True, True, False, False, False, True, True, False, True, False, False, False, False, False, -3, 6, 0, 0, 0, 0, 0, 0, 0) +(203322, 203322, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 0, 0) +(203326, 203326, True, True, False, True, True, False, False, False, True, False, True, True, False, False, False, False, False, 0, 6, 0, 0, 0, 0, 0, 0, 0) +(203338, 203338, True, True, False, True, True, False, False, False, True, False, False, True, False, False, False, False, False, -3, 8, 0, 0, 0, 0, 0, 0, 0) +(204126, 204126, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 6, 0, 0, 0, 0, 0, 0, 0) +(210551, 210551, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 1, 1, 1, 0, 0, 0, 0, 0) +(210553, 210553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 1, 0, 0, 0, 0, 0) +(220553, 220553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 1, 0, 0, 0, 0, 0) +(300553, 300553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 1, 0, 0, 0, 0, 0, 0) +(1000001, 1000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 1, 0) +(1000002, 1000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 2, 0) +(1000003, 1000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 3, 0) +(1000004, 1000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 4, 0) +(1000005, 1000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 5, 0) +(1000006, 1000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 6, 0) +(1000011, 1000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 11, 0) +(1000012, 1000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(1000013, 1000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 13, 0) +(1000014, 1000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(1000015, 1000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 15, 0) +(1000016, 1000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(1000021, 1000021, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 21, 0) +(1000022, 1000022, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 22, 0) +(1000023, 1000023, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 23, 0) +(1000024, 1000024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 24, 0) +(1000025, 1000025, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 25, 0) +(1000035, 1000035, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 35, 0) +(1000037, 1000037, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 0, 0, 0, 37, 0) +(1000039, 1000039, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 4, 0, 0, 0, 0, 0, 10, 0) +(1000522, 1000522, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(1000542, 1000542, True, False, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, -3, 2, 0, 0, 0, 0, 0, 0, 0) +(1009002, 1009002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 21, 0) +(2000001, 2000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 1, 0) +(2000002, 2000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 2, 0) +(2000003, 2000003, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 3, 0) +(2000004, 2000004, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 4, 0) +(2000005, 2000005, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 1, 0, 0, 0, 0, 0, 5, 0) +(2000006, 2000006, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 1, 0, 0, 0, 0, 0, 6, 0) +(2000011, 2000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 11, 0) +(2000012, 2000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 12, 0) +(2000013, 2000013, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 13, 0) +(2000014, 2000014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 14, 0) +(2000015, 2000015, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 1, 0, 0, 0, 0, 0, 15, 0) +(2000016, 2000016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 16, 0) +(3000111, 3000111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3000113, 3000113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3000211, 3000211, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(3000213, 3000213, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(3000221, 3000221, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3000223, 3000223, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3000331, 3000331, True, False, False, False, False, False, False, False, True, False, False, True, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3100021, 3100021, True, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3100111, 3100111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3100113, 3100113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3200111, 3200111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(3200113, 3200113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3300113, 3300113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(3400113, 3400113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(4000001, 4000001, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -1, 2, 0, 0, 0, 0, 0, 1, 0) +(4000002, 4000002, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 2, 2, 0, 0, 0, 0, 0, 2, 0) +(4000011, 4000011, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, -3, 2, 0, 0, 0, 0, 0, 11, 0) +(4000012, 4000012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(4900021, 4900021, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 21, 0) +(4900023, 4900023, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 23, 0) +(4900101, 4900101, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(4900111, 4900111, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(4900113, 4900113, True, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(4900211, 4900211, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(4900213, 4900213, True, False, False, False, False, False, False, False, True, False, True, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(5000039, 5000039, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 39, 0) +(9000111, 9000111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9000113, 9000113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9000211, 9000211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(9000213, 9000213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(9000221, 9000221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9000443, 9000443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9000553, 9000553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9010111, 9010111, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9010113, 9010113, True, True, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9010211, 9010211, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 1, 0, 0, 0, 0, 0, 0, 0) +(9010213, 9010213, True, True, True, False, True, False, False, False, True, True, True, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(9010221, 9010221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9010443, 9010443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9010553, 9010553, True, True, True, False, True, False, False, False, True, False, False, False, False, True, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9020221, 9020221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9020443, 9020443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(9030221, 9030221, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 1, 0, 0, 0, 0, 0, 0, 0) +(9042413, 9042413, True, True, False, True, True, False, False, False, True, True, True, False, True, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 0, 0) +(9050225, 9050225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9060225, 9060225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9080225, 9080225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9090225, 9090225, True, True, True, False, True, False, False, False, True, False, True, False, False, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9900012, 9900012, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 12, 0) +(9900014, 9900014, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 14, 0) +(9900016, 9900016, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 2, 0, 0, 0, 0, 0, 16, 0) +(9900023, 9900023, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 23, 0) +(9900024, 9900024, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 3, 3, 0, 0, 0, 0, 0, 24, 0) +(9900041, 9900041, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 6, 1, 0, 0, 0, 0, 0, 9, 0) +(9900042, 9900042, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 6, 1, 0, 0, 0, 0, 0, 9, 0) +(9910445, 9910445, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 5, 0, 0, 0, 0, 0, 0, 0) +(9920443, 9920443, True, True, True, False, True, False, False, False, True, False, False, False, True, False, False, False, False, 0, 3, 0, 0, 0, 0, 0, 0, 0) +(480000000, 480000000, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 0, 0, 0, 0, 0, 0, 0, 0, 48) +(1000010020, 1000010020, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 3, 1, 0, 0, 1, 2, 0, 0, 100) +(1000010030, 1000010030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 3, 2, 0, 0, 1, 3, 0, 0, 100) +(1000020030, 1000020030, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 6, 2, 0, 0, 2, 3, 0, 0, 100) +(1000020040, 1000020040, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 6, 1, 0, 0, 2, 4, 0, 0, 100) +(1000030070, 1000030070, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 9, 2, 0, 0, 3, 7, 0, 0, 100) +(1000040080, 1000040080, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 12, 1, 0, 0, 4, 8, 0, 0, 100) +(1000040090, 1000040090, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 12, 2, 0, 0, 4, 9, 0, 0, 100) +(1000040100, 1000040100, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 12, 1, 0, 0, 4, 10, 0, 0, 100) +(1000050100, 1000050100, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 15, 1, 0, 0, 5, 10, 0, 0, 100) +(1000050110, 1000050110, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 15, 2, 0, 0, 5, 11, 0, 0, 100) +(1000050120, 1000050120, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 15, 1, 0, 0, 5, 12, 0, 0, 100) +(1000060120, 1000060120, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 18, 1, 0, 0, 6, 12, 0, 0, 100) +(1000060130, 1000060130, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 18, 2, 0, 0, 6, 13, 0, 0, 100) +(1000060140, 1000060140, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 18, 1, 0, 0, 6, 14, 0, 0, 100) +(1000070140, 1000070140, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 21, 1, 0, 0, 7, 14, 0, 0, 100) +(1000070150, 1000070150, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 21, 2, 0, 0, 7, 15, 0, 0, 100) +(1000070160, 1000070160, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 21, 1, 0, 0, 7, 16, 0, 0, 100) +(1000080160, 1000080160, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 1, 0, 0, 8, 16, 0, 0, 100) +(1000080170, 1000080170, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 2, 0, 0, 8, 17, 0, 0, 100) +(1000080180, 1000080180, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 1, 0, 0, 8, 18, 0, 0, 100) +(1000080190, 1000080190, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 24, 2, 0, 0, 8, 19, 0, 0, 100) +(1000090190, 1000090190, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 27, 2, 0, 0, 9, 19, 0, 0, 100) +(1000100220, 1000100220, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 30, 1, 0, 0, 10, 22, 0, 0, 100) +(1000100230, 1000100230, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 30, 2, 0, 0, 10, 23, 0, 0, 100) +(1000110240, 1000110240, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 33, 1, 0, 0, 11, 24, 0, 0, 100) +(1000120240, 1000120240, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 1, 0, 0, 12, 24, 0, 0, 100) +(1000120250, 1000120250, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 2, 0, 0, 12, 25, 0, 0, 100) +(1000120260, 1000120260, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 1, 0, 0, 12, 26, 0, 0, 100) +(1000120270, 1000120270, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 36, 2, 0, 0, 12, 27, 0, 0, 100) +(1000130270, 1000130270, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 39, 2, 0, 0, 13, 27, 0, 0, 100) +(1000130280, 1000130280, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 39, 1, 0, 0, 13, 28, 0, 0, 100) +(1000140280, 1000140280, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 42, 1, 0, 0, 14, 28, 0, 0, 100) +(1000140290, 1000140290, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 42, 2, 0, 0, 14, 29, 0, 0, 100) +(1000140300, 1000140300, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 42, 1, 0, 0, 14, 30, 0, 0, 100) +(1000150310, 1000150310, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 45, 2, 0, 0, 15, 31, 0, 0, 100) +(1000170390, 1000170390, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 51, 2, 0, 0, 17, 39, 0, 0, 100) +(1000170400, 1000170400, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 51, 1, 0, 0, 17, 40, 0, 0, 100) +(1000180360, 1000180360, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 54, 1, 0, 0, 18, 36, 0, 0, 100) +(1000180400, 1000180400, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 54, 1, 0, 0, 18, 40, 0, 0, 100) +(1000240500, 1000240500, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 1, 0, 0, 24, 50, 0, 0, 100) +(1000240520, 1000240520, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 1, 0, 0, 24, 52, 0, 0, 100) +(1000240530, 1000240530, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 2, 0, 0, 24, 53, 0, 0, 100) +(1000240540, 1000240540, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 72, 1, 0, 0, 24, 54, 0, 0, 100) +(1000250550, 1000250550, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 75, 2, 0, 0, 25, 55, 0, 0, 100) +(1000260540, 1000260540, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 1, 0, 0, 26, 54, 0, 0, 100) +(1000260560, 1000260560, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 1, 0, 0, 26, 56, 0, 0, 100) +(1000260570, 1000260570, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 2, 0, 0, 26, 57, 0, 0, 100) +(1000260590, 1000260590, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 78, 2, 0, 0, 26, 59, 0, 0, 100) +(1000280580, 1000280580, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 58, 0, 0, 100) +(1000280600, 1000280600, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 60, 0, 0, 100) +(1000280610, 1000280610, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 2, 0, 0, 28, 61, 0, 0, 100) +(1000280620, 1000280620, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 62, 0, 0, 100) +(1000280630, 1000280630, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 2, 0, 0, 28, 63, 0, 0, 100) +(1000280640, 1000280640, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 84, 1, 0, 0, 28, 64, 0, 0, 100) +(1000290630, 1000290630, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 87, 2, 0, 0, 29, 63, 0, 0, 100) +(1000290650, 1000290650, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 87, 2, 0, 0, 29, 65, 0, 0, 100) +(1000420920, 1000420920, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 92, 0, 0, 100) +(1000420950, 1000420950, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 2, 0, 0, 42, 95, 0, 0, 100) +(1000420960, 1000420960, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 96, 0, 0, 100) +(1000420970, 1000420970, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 2, 0, 0, 42, 97, 0, 0, 100) +(1000420980, 1000420980, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 98, 0, 0, 100) +(1000421000, 1000421000, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 126, 1, 0, 0, 42, 100, 0, 0, 100) +(1000461080, 1000461080, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 138, 1, 0, 0, 46, 108, 0, 0, 100) +(1000791970, 1000791970, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 237, 2, 0, 0, 79, 197, 0, 0, 100) +(1000822040, 1000822040, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 1, 0, 0, 82, 204, 0, 0, 100) +(1000822060, 1000822060, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 1, 0, 0, 82, 206, 0, 0, 100) +(1000822070, 1000822070, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 2, 0, 0, 82, 207, 0, 0, 100) +(1000822080, 1000822080, True, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, 246, 1, 0, 0, 82, 208, 0, 0, 100) diff --git a/GaudiPartProp/tests/scripts/PartPropSvc.py b/GaudiPartProp/tests/scripts/PartPropSvc.py new file mode 100755 index 0000000000000000000000000000000000000000..e144d8f0133b53bbddfbd0618ecce5be92980235 --- /dev/null +++ b/GaudiPartProp/tests/scripts/PartPropSvc.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file +# The configuration file to run QMTest for the package GaudiPartProp +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-02 +# ============================================================================= +""" +The configuration file to run QMTest for the package GaudiPartProp +""" + +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +__version__ = "" + +from GaudiPartProp.PartPropSvc import test + +test() diff --git a/GaudiPartProp/tests/scripts/ParticleTable.dddb-20200424.txt b/GaudiPartProp/tests/scripts/ParticleTable.dddb-20200424.txt new file mode 100644 index 0000000000000000000000000000000000000000..06e51069ffb3d9d4f38e3827435628166f1a0bc8 --- /dev/null +++ b/GaudiPartProp/tests/scripts/ParticleTable.dddb-20200424.txt @@ -0,0 +1,983 @@ +# +# ParticleTable.txt file containing particle +# properties for ParticlePropertySvc, EvtGen and Pythia. +# Uses PDG 2014 when available. +# +PARTICLE +# +# GEANTID PDGID CHARGE MASS(GeV) TLIFE(s) EVTGENNAME PYTHIAID MAXWIDTH +# + gamma 1 22 0.0 0.00000000 1.000000e+16 gamma 22 0.00000000 + W+ 53 24 1.0 80.37900000 3.156893e-25 W+ 24 0.00000000 + W- 54 -24 -1.0 80.37900000 3.156893e-25 W- -24 0.00000000 + Z0 55 23 0.0 91.18760000 2.637914e-25 Z0 23 0.00000000 + e+ 2 -11 1.0 0.00051100 1.000000e+16 e+ -11 0.00000000 + e- 3 11 -1.0 0.00051100 1.000000e+16 e- 11 0.00000000 + nu_e 4 12 0.0 0.00000000 1.000000e+16 nu_e 12 0.00000000 + nu_e~ 302 -12 0.0 0.00000000 1.000000e+16 anti-nu_e -12 0.00000000 + mu+ 5 -13 1.0 0.10565837 2.196981e-06 mu+ -13 0.00000000 + mu- 6 13 -1.0 0.10565837 2.196981e-06 mu- 13 0.00000000 + nu_mu 300 14 0.0 0.00000000 1.000000e+16 nu_mu 14 0.00000000 + nu_mu~ 301 -14 0.0 0.00000000 1.000000e+16 anti-nu_mu -14 0.00000000 + tau+ 51 -15 1.0 1.77686000 2.903449e-13 tau+ -15 0.00000000 + tau- 52 15 -1.0 1.77686000 2.903449e-13 tau- 15 0.00000000 + pi0 7 111 0.0 0.13497700 8.520000e-17 pi0 111 0.00000000 + pi+ 8 211 1.0 0.13957061 2.603300e-08 pi+ 211 0.00000000 + pi- 9 -211 -1.0 0.13957061 2.603300e-08 pi- -211 0.00000000 + eta 17 221 0.0 0.54786200 5.063171e-19 eta 221 0.00000000 + rho(770)0 33 113 0.0 0.77526000 4.414569e-24 rho0 113 0.00000000 + rho(770)+ 34 213 1.0 0.77526000 4.414569e-24 rho+ 213 0.00000000 + rho(770)- 35 -213 -1.0 0.77526000 4.414569e-24 rho- -213 0.00000000 + omega(782) 36 223 0.0 0.78265000 7.752794e-23 omega 223 0.00000000 + eta_prime 127 331 0.0 0.95778000 3.358224e-21 eta' 331 0.00000000 + sigma_0 850 9000221 0.0 0.47500000 1.196749e-24 sigma_0 0 0.00000000 + f_0(980) 596 9010221 0.0 0.99000000 1.097020e-23 f_0 10221 0.00000000 + a_0(980)0 132 9000111 0.0 0.98000000 8.776163e-24 a_00 10111 0.00000000 + a_0(980)+ 133 9000211 1.0 0.98000000 8.776163e-24 a_0+ 10211 0.00000000 + a_0(980)- 134 -9000211 -1.0 0.98000000 8.776163e-24 a_0- -10211 0.00000000 + phi(1020) 37 333 0.0 1.01946100 1.549099e-22 phi 333 0.00000000 + h_1(1170) 597 10223 0.0 1.17000000 1.828367e-24 h_1 10223 0.00000000 + b_1(1235)0 588 10113 0.0 1.22950000 4.635297e-24 b_10 10113 0.00000000 + b_1(1235)+ 592 10213 1.0 1.22950000 4.635297e-24 b_1+ 10213 0.00000000 + b_1(1235)- 593 -10213 -1.0 1.22950000 4.635297e-24 b_1- -10213 0.00000000 + a_1(1260)0 135 20113 0.0 1.23000000 1.567172e-24 a_10 20113 0.00000000 + a_1(1260)+ 42 20213 1.0 1.23000000 1.567172e-24 a_1+ 20213 0.00000000 + a_1(1260)- 43 -20213 -1.0 1.23000000 1.567172e-24 a_1- -20213 0.00000000 + f_2(1270) 367 225 0.0 1.27550000 3.555982e-24 f_2 225 0.00000000 + f_1(1285) 687 20223 0.0 1.28190000 2.899612e-23 f_1 20223 0.00000000 + eta(1295) 811 100221 0.0 1.29400000 1.196749e-23 eta(2S) 0 0.00000000 + pi(1300)0 805 100111 0.0 1.30000000 1.645530e-24 pi(2S)0 0 0.00000000 + pi(1300)+ 807 100211 1.0 1.30000000 1.645530e-24 pi(2S)+ 0 0.00000000 + pi(1300)- 808 -100211 -1.0 1.30000000 1.645530e-24 pi(2S)- 0 0.00000000 + a_2(1320)0 136 115 0.0 1.31690000 6.151516e-24 a_20 115 0.00000000 + a_2(1320)+ 137 215 1.0 1.31690000 6.151516e-24 a_2+ 215 0.00000000 + a_2(1320)- 138 -215 -1.0 1.31690000 6.151516e-24 a_2- -215 0.00000000 + f_0(1370) 686 10221 0.0 1.35000000 1.880606e-24 f'_0 10331 0.00000000 + h_1(1380) 604 10333 0.0 1.41600000 7.313467e-24 h'_1 10333 0.00000000 + pi_1(1400)0 1021 9000113 0.0 1.35400000 1.994582e-24 pi_1(1400)0 0 0.00000000 + pi_1(1400)+ 1023 9000213 1.0 1.35400000 1.994582e-24 pi_1(1400)+ 0 0.00000000 + pi_1(1400)- 1024 -9000213 -1.0 1.35400000 1.994582e-24 pi_1(1400)- 0 0.00000000 + eta(1405)0 1025 9020221 0.0 1.40880000 1.313796e-23 eta(1405)0 0 0.00000000 + omega(1420) 812 100223 0.0 1.42500000 3.061452e-24 omega(2S) 0 0.00000000 + f_1(1420) 692 20333 0.0 1.42640000 1.198929e-23 f'_1 20333 0.00000000 + rho(1450)0 806 100113 0.0 1.46500000 1.645530e-24 rho(2S)0 0 0.00000000 + rho(1450)+ 809 100213 1.0 1.46500000 1.645530e-24 rho(2S)+ 0 0.00000000 + rho(1450)- 810 -100213 -1.0 1.46500000 1.645530e-24 rho(2S)- 0 0.00000000 + a_0(1450)0 587 10111 0.0 1.46700000 2.483820e-24 a_0(1450)0 0 0.00000000 + a_0(1450)+ 590 10211 1.0 1.46700000 2.483820e-24 a_0(1450)+ 0 0.00000000 + a_0(1450)- 591 -10211 -1.0 1.46700000 2.483820e-24 a_0(1450)- 0 0.00000000 + eta(1475) 826 100331 0.0 1.47500000 7.743673e-24 eta(1475) 0 0.00000000 + f_0(1500) 855 9030221 0.0 1.50600000 6.038644e-24 f_0(1500) 0 0.00000000 + f'_2(1525) 380 335 0.0 1.52500000 9.016605e-24 f'_2 335 0.00000000 + pi_1(1600)0 1027 9010113 0.0 1.66000000 2.742551e-24 pi_1(1600)0 0 0.00000000 + pi_1(1600)+ 1029 9010213 1.0 1.66000000 2.742551e-24 pi_1(1600)+ 0 0.00000000 + pi_1(1600)- 1030 -9010213 -1.0 1.66000000 2.742551e-24 pi_1(1600)- 0 0.00000000 + eta_2(1645) 598 10225 0.0 1.61700000 3.636531e-24 eta_2(1645) 0 0.00000000 + omega(1650) 746 30223 0.0 1.67000000 2.089563e-24 omega(1650) 0 0.00000000 + pi_2(1670)0 589 10115 0.0 1.67060000 2.551209e-24 pi_2(1670)0 0 0.00000000 + pi_2(1670)+ 594 10215 1.0 1.67060000 2.551209e-24 pi_2(1670)+ 0 0.00000000 + pi_2(1670)- 595 -10215 -1.0 1.67060000 2.551209e-24 pi_2(1670)- 0 0.00000000 + omega_3(1670) 368 227 0.0 1.66700000 3.917930e-24 omega_3(1670) 0 0.00000000 + phi(1680) 827 100333 0.0 1.68000000 4.388081e-24 phi(1680) 0 0.00000000 + rho_3(1690)0 361 117 0.0 1.68880000 4.088274e-24 rho_3(1690)0 0 0.00000000 + rho_3(1690)+ 363 217 1.0 1.68880000 4.088274e-24 rho_3(1690)+ 0 0.00000000 + rho_3(1690)- 364 -217 -1.0 1.68880000 4.088274e-24 rho_3(1690)- 0 0.00000000 + rho(1700)0 743 30113 0.0 1.72000000 2.632849e-24 rho(3S)0 0 0.00000000 + rho(1700)+ 744 30213 1.0 1.72000000 2.632849e-24 rho(3S)+ 0 0.00000000 + rho(1700)- 745 -30213 -1.0 1.72000000 2.632849e-24 rho(3S)- 0 0.00000000 + f_0(1710) 603 10331 0.0 1.70400000 5.351317e-24 f_0(1710) 0 0.00000000 + pi(1800)0 840 9010111 0.0 1.81000000 3.164482e-24 pi(1800)0 0 0.00000000 + pi(1800)+ 841 9010211 1.0 1.81000000 3.164482e-24 pi(1800)+ 0 0.00000000 + pi(1800)- 842 -9010211 -1.0 1.81000000 3.164482e-24 pi(1800)- 0 0.00000000 + phi_3(1850) 381 337 0.0 1.85400000 7.565657e-24 phi_3(1850) 0 0.00000000 + eta_2(1870) 605 10335 0.0 1.85400000 0.000000e+00 eta_2(1870) 0 0.00000000 + f_2(1950) 813 9050225 0.0 1.93600000 1.418560e-24 f_2(1950) 0 0.00000000 + f_2(2010) 828 9060225 0.0 2.01000000 3.291061e-24 f_2(2010) 0 0.00000000 + a_4(2040)0 362 119 0.0 1.96700000 2.581224e-24 a_4(2040)0 0 0.00000000 + a_4(2040)+ 365 219 1.0 1.96700000 2.581224e-24 a_4(2040)+ 0 0.00000000 + a_4(2040)- 366 -219 -1.0 1.96700000 2.581224e-24 a_4(2040)- 0 0.00000000 + f_4(2050) 369 229 0.0 2.01800000 2.777267e-24 f_4(2050) 0 0.00000000 + f_2(2300) 857 9080225 0.0 2.29700000 4.417530e-24 f_2(2300) 0 0.00000000 + f_2(2340) 858 9090225 0.0 2.35000000 2.063361e-24 f_2(2340) 0 0.00000000 + K0 370 311 0.0 0.49761100 0.000000e+00 K0 311 0.00000000 + K~0 371 -311 0.0 0.49761100 0.000000e+00 anti-K0 -311 0.00000000 + KS0 16 310 0.0 0.49761100 8.956400e-11 K_S0 310 0.00000000 + KL0 10 130 0.0 0.49761100 5.116000e-08 K_L0 130 0.00000000 + K+ 11 321 1.0 0.49367700 1.238000e-08 K+ 321 0.00000000 + K- 12 -321 -1.0 0.49367700 1.238000e-08 K- -321 0.00000000 + K*(892)0 40 313 0.0 0.89555000 1.391569e-23 K*0 313 0.00000000 + K*(892)~0 41 -313 0.0 0.89555000 1.391569e-23 anti-K*0 -313 0.00000000 + K*(892)+ 38 323 1.0 0.89166000 1.308573e-23 K*+ 323 0.00000000 + K*(892)- 39 -323 -1.0 0.89166000 1.308573e-23 K*- -323 0.00000000 + K_1(1270)0 141 10313 0.0 1.27200000 7.313469e-24 K_10 10313 0.00000000 + K_1(1270)~0 142 -10313 0.0 1.27200000 7.313469e-24 anti-K_10 -10313 0.00000000 + K_1(1270)+ 139 10323 1.0 1.27200000 7.313469e-24 K_1+ 10323 0.00000000 + K_1(1270)- 140 -10323 -1.0 1.27200000 7.313469e-24 K_1- -10323 0.00000000 + K_1(1400)0 145 20313 0.0 1.40300000 3.782829e-24 K'_10 20313 0.00000000 + K_1(1400)~0 146 -20313 0.0 1.40300000 3.782829e-24 anti-K'_10 -20313 0.00000000 + K_1(1400)+ 143 20323 1.0 1.40300000 3.782829e-24 K'_1+ 20323 0.00000000 + K_1(1400)- 144 -20323 -1.0 1.40300000 3.782829e-24 K'_1- -20323 0.00000000 + K*(1410)0 816 100313 0.0 1.42100000 2.837122e-24 K'*0 0 0.00000000 + K*(1410)~0 817 -100313 0.0 1.42100000 2.837122e-24 anti-K'*0 0 0.00000000 + K*(1410)+ 822 100323 1.0 1.42100000 2.837122e-24 K'*+ 0 0.00000000 + K*(1410)- 823 -100323 -1.0 1.42100000 2.837122e-24 K'*- 0 0.00000000 + K*_0(1430)0 149 10311 0.0 1.43000000 2.437823e-24 K_0*0 10311 0.00000000 + K*_0(1430)~0 150 -10311 0.0 1.43000000 2.437823e-24 anti-K_0*0 -10311 0.00000000 + K*_0(1430)+ 147 10321 1.0 1.43000000 2.437823e-24 K_0*+ 10321 0.00000000 + K*_0(1430)- 148 -10321 -1.0 1.43000000 2.437823e-24 K_0*- -10321 0.00000000 + K*_2(1430)0 153 315 0.0 1.43240000 6.038644e-24 K_2*0 315 0.00000000 + K*_2(1430)~0 154 -315 0.0 1.43240000 6.038644e-24 anti-K_2*0 -315 0.00000000 + K*_2(1430)+ 151 325 1.0 1.42560000 6.682357e-24 K_2*+ 325 0.00000000 + K*_2(1430)- 152 -325 -1.0 1.42560000 6.682357e-24 K_2*- -325 0.00000000 + K(1460)0 814 100311 0.0 1.43240000 0.000000e+00 K(1460)0 0 0.00000000 + K(1460)~0 815 -100311 0.0 1.43240000 0.000000e+00 anti-K(1460)0 0 0.00000000 + K(1460)+ 820 100321 1.0 1.43240000 0.000000e+00 K(1460)+ 0 0.00000000 + K(1460)- 821 -100321 -1.0 1.43240000 0.000000e+00 K(1460)- 0 0.00000000 + K*(1680)0 747 30313 0.0 1.71800000 2.056913e-24 K''*0 0 0.00000000 + K*(1680)~0 748 -30313 0.0 1.71800000 2.056913e-24 anti-K''*0 0 0.00000000 + K*(1680)+ 749 30323 1.0 1.71800000 2.056913e-24 K''*+ 0 0.00000000 + K*(1680)- 750 -30323 -1.0 1.71800000 2.056913e-24 K''*- 0 0.00000000 + K_2(1770)0 599 10315 0.0 1.77300000 3.538775e-24 K_2(1770)0 0 0.00000000 + K_2(1770)~0 600 -10315 0.0 1.77300000 3.538775e-24 anti-K_2(1770)0 0 0.00000000 + K_2(1770)+ 601 10325 1.0 1.77300000 3.538775e-24 K_2(1770)+ 0 0.00000000 + K_2(1770)- 602 -10325 -1.0 1.77300000 3.538775e-24 K_2(1770)- 0 0.00000000 + K*_3(1780)0 372 317 0.0 1.77600000 4.139699e-24 K_3*0 0 0.00000000 + K*_3(1780)~0 373 -317 0.0 1.77600000 4.139699e-24 anti-K_3*0 0 0.00000000 + K*_3(1780)+ 376 327 1.0 1.77600000 4.139699e-24 K_3*+ 0 0.00000000 + K*_3(1780)- 377 -327 -1.0 1.77600000 4.139699e-24 K_3*- 0 0.00000000 + K_2(1820)0 688 20315 0.0 1.81900000 2.493227e-24 K_2(1820)0 0 0.00000000 + K_2(1820)~0 689 -20315 0.0 1.81900000 2.493227e-24 anti-K_2(1820)0 0 0.00000000 + K_2(1820)+ 690 20325 1.0 1.81900000 2.493227e-24 K_2(1820)+ 0 0.00000000 + K_2(1820)- 691 -20325 -1.0 1.81900000 2.493227e-24 K_2(1820)- 0 0.00000000 + K*_2(1980)0 818 100315 0.0 1.97300000 0.000000e+00 K*_2(1980)0 0 0.00000000 + K*_2(1980)~0 819 -100315 0.0 1.97300000 0.000000e+00 anti-K*_2(1980)0 0 0.00000000 + K*_2(1980)+ 824 100325 1.0 1.97300000 0.000000e+00 K*_2(1980)+ 0 0.00000000 + K*_2(1980)- 825 -100325 -1.0 1.97300000 0.000000e+00 K*_2(1980)- 0 0.00000000 + K*_4(2045)0 374 319 0.0 2.04500000 3.324304e-24 K_4*0 0 0.00000000 + K*_4(2045)~0 375 -319 0.0 2.04500000 3.324304e-24 anti-K_4*0 0 0.00000000 + K*_4(2045)+ 378 329 1.0 2.04500000 3.324304e-24 K_4*+ 0 0.00000000 + K*_4(2045)- 379 -329 -1.0 2.04500000 3.324304e-24 K_4*- 0 0.00000000 + D0 58 421 0.0 1.86483000 4.101000e-13 D0 421 0.00000000 + D~0 59 -421 0.0 1.86483000 4.101000e-13 anti-D0 -421 0.00000000 + D+ 56 411 1.0 1.86965000 1.040000e-12 D+ 411 0.00000000 + D- 57 -411 -1.0 1.86965000 1.040000e-12 D- -411 0.00000000 + D*(2007)0 67 423 0.0 2.00685000 1.000003e-19 D*0 423 0.00000000 + D*(2007)~0 68 -423 0.0 2.00685000 1.000003e-19 anti-D*0 -423 0.00000000 + D*(2010)+ 65 413 1.0 2.01026000 7.892230e-21 D*+ 413 0.00000000 + D*(2010)- 66 -413 -1.0 2.01026000 7.892230e-21 D*- -413 0.00000000 + D*_0+ 155 10411 1.0 2.34900000 2.978335e-24 D_0*+ 10411 0.00000000 + D*_0- 159 -10411 -1.0 2.34900000 2.978335e-24 D_0*- -10411 0.00000000 + D*_00 163 10421 0.0 2.30000000 2.402234e-24 D_0*0 10421 0.00000000 + D*_0~0 167 -10421 0.0 2.30000000 2.402234e-24 anti-D_0*0 -10421 0.00000000 + D_1(H)0 164 20423 0.0 2.44500000 2.630000e-24 D'_10 20423 0.00000000 + D_1(H)~0 168 -20423 0.0 2.44500000 2.630000e-24 anti-D'_10 -20423 0.00000000 + D_1(H)+ 156 20413 1.0 2.44500000 2.630000e-24 D'_1+ 20413 0.00000000 + D_1(H)- 160 -20413 -1.0 2.44500000 2.630000e-24 D'_1- -20413 0.00000000 + D_1(2420)0 165 10423 0.0 2.42080000 2.428827e-23 D_10 10423 0.00000000 + D_1(2420)~0 169 -10423 0.0 2.42080000 2.428827e-23 anti-D_10 -10423 0.00000000 + D_1(2420)+ 157 10413 1.0 2.42300000 3.290000e-23 D_1+ 10413 0.00000000 + D_1(2420)- 161 -10413 -1.0 2.42300000 3.290000e-23 D_1- -10413 0.00000000 + D*_2(2460)0 170 425 0.0 2.46070000 1.385709e-23 D_2*0 425 0.00000000 + D*_2(2460)~0 166 -425 0.0 2.46070000 1.385709e-23 anti-D_2*0 -425 0.00000000 + D*_2(2460)+ 162 415 1.0 2.46540000 1.778952e-23 D_2*+ 415 0.00000000 + D*_2(2460)- 158 -415 -1.0 2.46540000 1.778952e-23 D_2*- -415 0.00000000 + D(2S)0 761 100421 0.0 2.58000000 0.000000e+00 D(2S)0 0 0.00000000 + D(2S)~0 762 -100421 0.0 2.58000000 0.000000e+00 anti-D(2S)0 0 0.00000000 + D(2S)+ 757 100411 1.0 2.58000000 0.000000e+00 D(2S)+ 0 0.00000000 + D(2S)- 758 -100411 -1.0 2.58000000 0.000000e+00 D(2S)- 0 0.00000000 + D*(2640)0 763 100423 0.0 2.64000000 0.000000e+00 D*(2S)0 0 0.00000000 + D*(2640)~0 764 -100423 0.0 2.64000000 0.000000e+00 anti-D*(2S)0 0 0.00000000 + D*(2640)+ 759 100413 1.0 2.64000000 0.000000e+00 D*(2S)+ 0 0.00000000 + D*(2640)- 760 -100413 -1.0 2.64000000 0.000000e+00 D*(2S)- 0 0.00000000 + D_s+ 60 431 1.0 1.96834000 5.043770e-13 D_s+ 431 0.00000000 + D_s- 61 -431 -1.0 1.96834000 5.043770e-13 D_s- -431 0.00000000 + D*_s+ 69 433 1.0 2.11220000 1.000003e-19 D_s*+ 433 0.00000000 + D*_s- 70 -433 -1.0 2.11220000 1.000003e-19 D_s*- -433 0.00000000 + D*_s0+ 171 10431 1.0 2.31780000 6.582100e-22 D_s0*+ 10431 0.00000000 + D*_s0- 175 -10431 -1.0 2.31780000 6.582100e-22 D_s0*- -10431 0.00000000 + D_s1(2460)+ 172 20433 1.0 2.45950000 6.582100e-22 D_s1+ 20433 0.00000000 + D_s1(2460)- 176 -20433 -1.0 2.45950000 6.582100e-22 D_s1- -20433 0.00000000 + D_s1(2536)+ 173 10433 1.0 2.53511000 7.154480e-22 D'_s1+ 10433 0.00000000 + D_s1(2536)- 177 -10433 -1.0 2.53511000 7.154480e-22 D'_s1- -10433 0.00000000 + D*_s2+ 174 435 1.0 2.56910000 3.894746e-23 D_s2*+ 435 0.00000000 + D*_s2- 178 -435 -1.0 2.56910000 3.894746e-23 D_s2*- -435 0.00000000 + B0 73 511 0.0 5.27964000 1.520120e-12 B0 511 0.00000000 + B~0 74 -511 0.0 5.27964000 1.520120e-12 anti-B0 -511 0.00000000 + B0H 99998 510 0.0 5.27958000 1.519000e-12 B0H 0 0.00000000 + B0L 99999 150 0.0 5.27958000 1.519000e-12 B0L 0 0.00000000 + B+ 71 521 1.0 5.27933000 1.638158e-12 B+ 521 0.00000000 + B- 72 -521 -1.0 5.27933000 1.638158e-12 B- -521 0.00000000 + B*0 189 513 0.0 5.32470000 1.000019e-19 B*0 513 0.00000000 + B*~0 190 -513 0.0 5.32470000 1.000019e-19 anti-B*0 -513 0.00000000 + B*- 187 -523 -1.0 5.32470000 1.000019e-19 B*- -523 0.00000000 + B*+ 188 523 1.0 5.32470000 1.000019e-19 B*+ 523 0.00000000 + B*_00 201 10511 0.0 5.73800000 4.390000e-24 B_0*0 10511 0.00000000 + B*_0~0 205 -10511 0.0 5.73800000 4.390000e-24 anti-B_0*0 -10511 0.00000000 + B*_0+ 193 10521 1.0 5.73800000 4.390000e-24 B_0*+ 10521 0.00000000 + B*_0- 197 -10521 -1.0 5.73800000 4.390000e-24 B_0*- -10521 0.00000000 + B_1(H)0 202 20513 0.0 5.75700000 2.630000e-24 B'_10 20513 0.00000000 + B_1(H)~0 206 -20513 0.0 5.75700000 2.630000e-24 anti-B'_10 -20513 0.00000000 + B_1(H)+ 194 20523 1.0 5.75700000 2.630000e-24 B'_1+ 20523 0.00000000 + B_1(H)- 198 -20523 -1.0 5.75700000 2.630000e-24 B'_1- -20523 0.00000000 + B_1(L)0 203 10513 0.0 5.72610000 3.134000e-23 B_10 10513 0.00000000 + B_1(L)~0 207 -10513 0.0 5.72610000 3.134000e-23 anti-B_10 -10513 0.00000000 + B_1(L)+ 195 10523 1.0 5.72590000 3.134000e-23 B_1+ 10523 0.00000000 + B_1(L)- 199 -10523 -1.0 5.72590000 3.134000e-23 B_1- -10523 0.00000000 + B*_20 204 515 0.0 5.73950000 2.861792e-23 B_2*0 515 0.00000000 + B*_2~0 208 -515 0.0 5.73950000 2.861792e-23 anti-B_2*0 -515 0.00000000 + B*_2+ 196 525 1.0 5.73720000 3.291060e-23 B_2*+ 525 0.00000000 + B*_2- 200 -525 -1.0 5.73720000 3.291060e-23 B_2*- -525 0.00000000 + B_s0 75 531 0.0 5.36688000 1.512000e-12 B_s0 531 0.00000000 + B_s~0 76 -531 0.0 5.36688000 1.512000e-12 anti-B_s0 -531 0.00000000 + B_s0H 99996 530 0.0 5.36677000 1.661000e-12 B_s0H 0 0.00000000 + B_s0L 99997 350 0.0 5.36677000 1.405000e-12 B_s0L 0 0.00000000 + B*_s0 191 533 0.0 5.41540000 1.000000e-19 B_s*0 533 0.00000000 + B*_s~0 192 -533 0.0 5.41540000 1.000000e-19 anti-B_s*0 -533 0.00000000 + B*_s00 209 10531 0.0 5.84100000 4.390000e-24 B_s0*0 10531 0.00000000 + B*_s0~0 213 -10531 0.0 5.84100000 4.390000e-24 anti-B_s0*0 -10531 0.00000000 + B_s1(H)0 210 20533 0.0 5.85900000 2.630000e-24 B'_s10 20533 0.00000000 + B_s1(H)~0 214 -20533 0.0 5.85900000 2.630000e-24 anti-B'_s10 -20533 0.00000000 + B_s1(L)0 211 10533 0.0 5.82870000 1.316424e-21 B_s10 10533 0.00000000 + B_s1(L)~0 215 -10533 0.0 5.82870000 1.316424e-21 anti-B_s10 -10533 0.00000000 + B*_s20 212 535 0.0 5.83985000 4.477633e-22 B_s2*0 535 0.00000000 + B*_s2~0 216 -535 0.0 5.83985000 4.477633e-22 anti-B_s2*0 -535 0.00000000 + B_c+ 77 541 1.0 6.27370000 5.098466e-13 B_c+ 541 0.00000000 + B_c- 78 -541 -1.0 6.27370000 5.098466e-13 B_c- -541 0.00000000 + B_c*+ 382 543 1.0 6.60200000 0.000000e+00 B_c*+ 543 0.00000000 + B_c*- 383 -543 -1.0 6.60200000 0.000000e+00 B_c*- -543 0.00000000 + B_c0*+ 607 10541 1.0 7.25000000 0.000000e+00 B_c0*+ 10541 0.00000000 + B_c0*- 608 -10541 -1.0 7.25000000 0.000000e+00 B_c0*- -10541 0.00000000 + B_c1(L)+ 609 10543 1.0 7.30000000 0.000000e+00 B_c1+ 10543 0.00000000 + B_c1(L)- 610 -10543 -1.0 7.30000000 0.000000e+00 B_c1- -10543 0.00000000 + B_c1(H)+ 693 20543 1.0 7.40000000 0.000000e+00 B'_c1+ 20543 0.00000000 + B_c1(H)- 694 -20543 -1.0 7.40000000 0.000000e+00 B'_c1- -20543 0.00000000 + B_c2*+ 384 545 1.0 7.35000000 0.000000e+00 B_c2*+ 545 0.00000000 + B_c2*- 385 -545 -1.0 7.35000000 0.000000e+00 B_c2*- -545 0.00000000 + eta_c(1S) 128 441 0.0 2.98390000 2.216203e-23 eta_c 441 0.00000000 + J/psi(1S) 64 443 0.0 3.09690000 7.085169e-21 J/psi 443 0.00000000 + chi_c0(1P) 129 10441 0.0 3.41471000 6.328963e-23 chi_c0 10441 0.00000000 + chi_c1(1P) 130 20443 0.0 3.51067000 7.835857e-22 chi_c1 20443 0.00000000 + h_c(1P) 606 10443 0.0 3.52538000 9.403029e-22 h_c 10443 0.00000000 + chi_c2(1P) 131 445 0.0 3.55617000 3.410425e-22 chi_c2 445 0.00000000 + eta_c(2S) 829 100441 0.0 3.63750000 6.582122e-23 eta_c(2S) 100441 0.00000000 + psi(2S) 126 100443 0.0 3.68609700 2.238816e-21 psi(2S) 100443 0.00000000 + psi(3770) 765 30443 0.0 3.77313000 2.419898e-23 psi(3770) 30443 0.00000000 + chi_c2(2P) 1031 100445 0.0 3.92720000 2.742551e-23 chi_c2(2P) 0 0.00000000 + psi(4040) 851 9000443 0.0 4.03900000 8.227652e-24 psi(4040) 0 0.00000000 + psi(4160) 853 9010443 0.0 4.19100000 9.403029e-24 psi(4160) 0 0.00000000 + psi(4415) 856 9020443 0.0 4.42100000 1.061633e-23 psi(4415) 0 0.00000000 + X_1(3872) 1016 9920443 0.0 3.87169000 2.076340e-21 X_1(3872) 9920443 0.00000000 + X_2(3872) 1017 9910445 0.0 3.87169000 2.076340e-21 X_2(3872) 9910445 0.00000000 + Z(4430)+ 1018 9042413 1.0 4.47800000 3.630504e-24 Z(4430)+ 9042413 0.00000000 + Z(4430)- 1019 -9042413 -1.0 4.47800000 3.630504e-24 Z(4430)- -9042413 0.00000000 + eta_b(1S) 386 551 0.0 9.39870000 6.582120e-23 eta_b 551 0.00000000 + eta_b(2S) 830 100551 0.0 9.99700000 0.000000e+00 eta_b(2S) 0 0.00000000 + eta_b(3S) 843 200551 0.0 10.33500000 0.000000e+00 eta_b(3S) 0 0.00000000 + eta_b2(1D) 613 10555 0.0 10.15700000 0.000000e+00 eta_b2(1D) 10555 0.00000000 + eta_b2(2D) 836 110555 0.0 10.44100000 0.000000e+00 eta_b2(2D) 110555 0.00000000 + Upsilon(1S) 387 553 0.0 9.46030000 1.218911e-20 Upsilon 553 0.00000000 + Upsilon(2S) 831 100553 0.0 10.02326000 2.058199e-20 Upsilon(2S) 100553 0.00000000 + Upsilon(3S) 844 200553 0.0 10.35520000 3.242425e-20 Upsilon(3S) 200553 0.00000000 + Upsilon_1(1D) 766 30553 0.0 10.16370000 0.000000e+00 Upsilon_1(1D) 30553 0.00000000 + Upsilon_1(2D) 839 130553 0.0 10.43490000 0.000000e+00 Upsilon_1(2D) 130553 0.00000000 + Upsilon_2(1D) 696 20555 0.0 10.15620000 0.000000e+00 Upsilon_2(1D) 20555 0.00000000 + Upsilon_2(2D) 838 120555 0.0 10.44060000 0.000000e+00 Upsilon_2(2D) 120555 0.00000000 + Upsilon_3(1D) 389 557 0.0 10.15990000 0.000000e+00 Upsilon_3(1D) 557 0.00000000 + Upsilon_3(2D) 833 100557 0.0 10.44430000 0.000000e+00 Upsilon_3(2D) 100557 0.00000000 + Upsilon(4S) 849 300553 0.0 10.57940000 3.210791e-23 Upsilon(4S) 300553 0.00000000 + Upsilon(10860) 852 9000553 0.0 10.88990000 1.290612e-23 Upsilon(5S) 0 0.00000000 + Upsilon(11020) 854 9010553 0.0 10.99290000 1.343290e-23 Upsilon(11020) 0 0.00000000 + chi_b0(1P) 611 10551 0.0 9.85940000 0.000000e+00 chi_b0 10551 0.00000000 + chi_b0(2P) 834 110551 0.0 10.23250000 0.000000e+00 chi_b0(2P) 110551 0.00000000 + chi_b0(3P) 846 210551 0.0 10.50040000 0.000000e+00 chi_b0(3P) 210551 0.00000000 + chi_b1(3P) 848 220553 0.0 10.51210000 0.000000e+00 chi_b1(3P) 220553 0.00000000 + chi_b1(1P) 695 20553 0.0 9.89287800 0.000000e+00 chi_b1 20553 0.00000000 + chi_b1(2P) 837 120553 0.0 10.25546000 0.000000e+00 chi_b1(2P) 120553 0.00000000 + chi_b2(1P) 388 555 0.0 9.91221000 0.000000e+00 chi_b2 555 0.00000000 + chi_b2(2P) 832 100555 0.0 10.26865000 0.000000e+00 chi_b2(2P) 100555 0.00000000 + chi_b2(3P) 845 200555 0.0 10.52620000 0.000000e+00 chi_b2(3P) 200555 0.00000000 + h_b(1P) 612 10553 0.0 9.89930000 0.000000e+00 h_b 10553 0.00000000 + h_b(2P) 835 110553 0.0 10.25500000 0.000000e+00 h_b(2P) 110553 0.00000000 + h_b(3P) 847 210553 0.0 10.51600000 0.000000e+00 h_b(3P) 210553 0.00000000 + n0 13 2112 0.0 0.93956541 8.803000e+02 n0 2112 0.00000000 + n~0 25 -2112 0.0 0.93956541 8.803000e+02 anti-n0 -2112 0.00000000 + p+ 14 2212 1.0 0.93827208 1.000000e+16 p+ 2212 0.00000000 + p~- 15 -2212 -1.0 0.93827208 1.000000e+16 anti-p- -2212 0.00000000 + N(1440)0 624 12112 0.0 1.44000000 2.194041e-24 N(1440)0 0 0.00000000 + N(1440)~0 625 -12112 0.0 1.44000000 2.194041e-24 anti-N(1440)0 0 0.00000000 + N(1440)+ 636 12212 1.0 1.44000000 2.194041e-24 N(1440)+ 0 0.00000000 + N(1440)~- 637 -12212 -1.0 1.44000000 2.194041e-24 anti-N(1440)- 0 0.00000000 + N(1520)0 404 1214 0.0 1.51500000 5.983745e-24 N(1520)0 0 0.00000000 + N(1520)~0 405 -1214 0.0 1.51500000 5.983745e-24 anti-N(1520)0 0 0.00000000 + N(1520)+ 420 2124 1.0 1.51500000 5.983745e-24 N(1520)+ 0 0.00000000 + N(1520)~- 421 -2124 -1.0 1.51500000 5.983745e-24 anti-N(1520)- 0 0.00000000 + N(1535)0 705 22112 0.0 1.53000000 4.388081e-24 N(1535)0 0 0.00000000 + N(1535)~0 706 -22112 0.0 1.53000000 4.388081e-24 anti-N(1535)0 0 0.00000000 + N(1535)+ 713 22212 1.0 1.53000000 4.388081e-24 N(1535)+ 0 0.00000000 + N(1535)~- 714 -22212 -1.0 1.53000000 4.388081e-24 anti-N(1535)- 0 0.00000000 + N(1650)0 771 32112 0.0 1.65000000 5.265696e-24 N(1650)0 0 0.00000000 + N(1650)~0 772 -32112 0.0 1.65000000 5.265696e-24 anti-N(1650)0 0 0.00000000 + N(1650)+ 777 32212 1.0 1.65000000 5.265696e-24 N(1650)+ 0 0.00000000 + N(1650)~- 778 -32212 -1.0 1.65000000 5.265696e-24 anti-N(1650)- 0 0.00000000 + N(1675)0 414 2116 0.0 1.67500000 4.539393e-24 N(1675)0 0 0.00000000 + N(1675)~0 415 -2116 0.0 1.67500000 4.539393e-24 anti-N(1675)0 0 0.00000000 + N(1675)+ 428 2216 1.0 1.67500000 4.539393e-24 N(1675)+ 0 0.00000000 + N(1675)~- 429 -2216 -1.0 1.67500000 4.539393e-24 anti-N(1675)- 0 0.00000000 + N(1680)0 628 12116 0.0 1.68500000 5.485100e-24 N(1680)0 0 0.00000000 + N(1680)~0 629 -12116 0.0 1.68500000 5.485100e-24 anti-N(1680)0 0 0.00000000 + N(1680)+ 640 12216 1.0 1.68500000 5.485100e-24 N(1680)+ 0 0.00000000 + N(1680)~- 641 -12216 -1.0 1.68500000 5.485100e-24 anti-N(1680)- 0 0.00000000 + N(1700)+ 711 22124 1.0 1.72000000 4.388081e-24 N(1700)+ 0 0.00000000 + N(1700)~- 712 -22124 -1.0 1.72000000 4.388081e-24 anti-N(1700)- 0 0.00000000 + N(1700)0 703 21214 0.0 1.72000000 4.388081e-24 N(1700)0 0 0.00000000 + N(1700)~0 704 -21214 0.0 1.72000000 4.388081e-24 anti-N(1700)0 0 0.00000000 + N(1710)0 791 42112 0.0 1.71000000 6.582122e-24 N(1710)0 0 0.00000000 + N(1710)~0 792 -42112 0.0 1.71000000 6.582122e-24 anti-N(1710)0 0 0.00000000 + N(1710)+ 795 42212 1.0 1.71000000 6.582122e-24 N(1710)+ 0 0.00000000 + N(1710)~- 796 -42212 -1.0 1.71000000 6.582122e-24 anti-N(1710)- 0 0.00000000 + N(1720)0 769 31214 0.0 1.72000000 2.632849e-24 N(1720)0 0 0.00000000 + N(1720)~0 770 -31214 0.0 1.72000000 2.632849e-24 anti-N(1720)0 0 0.00000000 + N(1720)+ 775 32124 1.0 1.72000000 2.632849e-24 N(1720)+ 0 0.00000000 + N(1720)~- 776 -32124 -1.0 1.72000000 2.632849e-24 anti-N(1720)- 0 0.00000000 + N(1900)0 789 41214 0.0 1.89500000 5.476011e-24 N(1900)0 0 0.00000000 + N(1900)~0 790 -41214 0.0 1.89500000 5.476011e-24 anti-N(1900)0 0 0.00000000 + N(1900)+ 793 42124 1.0 1.89500000 5.476011e-24 N(1900)+ 0 0.00000000 + N(1900)~- 794 -42124 -1.0 1.89500000 5.476011e-24 anti-N(1900)- 0 0.00000000 + N(1990)0 630 12118 0.0 1.95000000 0.000000e+00 N(1990)0 0 0.00000000 + N(1990)~0 631 -12118 0.0 1.95000000 0.000000e+00 anti-N(1990)0 0 0.00000000 + N(1990)+ 642 12218 1.0 1.95000000 0.000000e+00 N(1990)+ 0 0.00000000 + N(1990)~- 643 -12218 -1.0 1.95000000 0.000000e+00 anti-N(1990)- 0 0.00000000 + N(2090)0 799 52114 0.0 2.00000000 0.000000e+00 N(2090)0 0 0.00000000 + N(2090)~0 800 -52114 0.0 2.00000000 0.000000e+00 anti-N(2090)0 0 0.00000000 + N(2090)+ 801 52214 1.0 2.00000000 0.000000e+00 N(2090)+ 0 0.00000000 + N(2090)~- 802 -52214 -1.0 2.00000000 0.000000e+00 anti-N(2090)- 0 0.00000000 + N(2190)0 408 1218 0.0 2.18000000 1.645530e-24 N(2190)0 0 0.00000000 + N(2190)~0 409 -1218 0.0 2.18000000 1.645530e-24 anti-N(2190)0 0 0.00000000 + N(2190)+ 424 2128 1.0 2.18000000 1.645530e-24 N(2190)+ 0 0.00000000 + N(2190)~- 425 -2128 -1.0 2.18000000 1.645530e-24 anti-N(2190)- 0 0.00000000 + Delta- 182 1114 -1.0 1.23200000 5.625745e-24 Delta- 1114 0.00000000 + Delta~+ 186 -1114 1.0 1.23200000 5.625745e-24 anti-Delta+ -1114 0.00000000 + Delta0 181 2114 0.0 1.23200000 5.625745e-24 Delta0 2114 0.00000000 + Delta~0 185 -2114 0.0 1.23200000 5.625745e-24 anti-Delta0 -2114 0.00000000 + Delta+ 180 2214 1.0 1.23200000 5.625745e-24 Delta+ 2214 0.00000000 + Delta~- 184 -2214 -1.0 1.23200000 5.625745e-24 anti-Delta- -2214 0.00000000 + Delta++ 179 2224 2.0 1.23200000 5.625745e-24 Delta++ 2224 0.00000000 + Delta~-- 183 -2224 -2.0 1.23200000 5.625745e-24 anti-Delta-- -2224 0.00000000 + Delta(1600)- 767 31114 -1.0 1.57000000 2.632848e-24 Delta(1600)- 0 0.00000000 + Delta(1600)~+ 768 -31114 1.0 1.57000000 2.632848e-24 anti-Delta(1600)+ 0 0.00000000 + Delta(1600)0 773 32114 0.0 1.57000000 2.632848e-24 Delta(1600)0 0 0.00000000 + Delta(1600)~0 774 -32114 0.0 1.57000000 2.632848e-24 anti-Delta(1600)0 0 0.00000000 + Delta(1600)+ 779 32214 1.0 1.57000000 2.632848e-24 Delta(1600)+ 0 0.00000000 + Delta(1600)~- 780 -32214 -1.0 1.57000000 2.632848e-24 anti-Delta(1600)- 0 0.00000000 + Delta(1600)++ 781 32224 2.0 1.57000000 2.632848e-24 Delta(1600)++ 0 0.00000000 + Delta(1600)~-- 782 -32224 -2.0 1.57000000 2.632848e-24 anti-Delta(1600)-- 0 0.00000000 + Delta(1620)- 396 1112 -1.0 1.61000000 5.063169e-24 Delta(1620)- 0 0.00000000 + Delta(1620)~+ 397 -1112 1.0 1.61000000 5.063169e-24 anti-Delta(1620)+ 0 0.00000000 + Delta(1620)0 402 1212 0.0 1.61000000 5.063169e-24 Delta(1620)0 0 0.00000000 + Delta(1620)~0 403 -1212 0.0 1.61000000 5.063169e-24 anti-Delta(1620)0 0 0.00000000 + Delta(1620)+ 418 2122 1.0 1.61000000 5.063169e-24 Delta(1620)+ 0 0.00000000 + Delta(1620)~- 419 -2122 -1.0 1.61000000 5.063169e-24 anti-Delta(1620)- 0 0.00000000 + Delta(1620)++ 432 2222 2.0 1.61000000 5.063169e-24 Delta(1620)++ 0 0.00000000 + Delta(1620)~-- 433 -2222 -2.0 1.61000000 5.063169e-24 anti-Delta(1620)-- 0 0.00000000 + Delta(1700)- 616 11114 -1.0 1.71000000 2.194041e-24 Delta(1700)- 0 0.00000000 + Delta(1700)~+ 617 -11114 1.0 1.71000000 2.194041e-24 anti-Delta(1700)+ 0 0.00000000 + Delta(1700)0 626 12114 0.0 1.71000000 2.194041e-24 Delta(1700)0 0 0.00000000 + Delta(1700)~0 627 -12114 0.0 1.71000000 2.194041e-24 anti-Delta(1700)0 0 0.00000000 + Delta(1700)+ 638 12214 1.0 1.71000000 2.194041e-24 Delta(1700)+ 0 0.00000000 + Delta(1700)~- 639 -12214 -1.0 1.71000000 2.194041e-24 anti-Delta(1700)- 0 0.00000000 + Delta(1700)++ 646 12224 2.0 1.71000000 2.194041e-24 Delta(1700)++ 0 0.00000000 + Delta(1700)~-- 647 -12224 -2.0 1.71000000 2.194041e-24 anti-Delta(1700)-- 0 0.00000000 + Delta(1900)- 614 11112 -1.0 1.86000000 2.632848e-24 Delta(1900)- 0 0.00000000 + Delta(1900)~+ 615 -11112 1.0 1.86000000 2.632848e-24 anti-Delta(1900)+ 0 0.00000000 + Delta(1900)0 620 11212 0.0 1.86000000 2.632848e-24 Delta(1900)0 0 0.00000000 + Delta(1900)~0 621 -11212 0.0 1.86000000 2.632848e-24 anti-Delta(1900)0 0 0.00000000 + Delta(1900)+ 632 12122 1.0 1.86000000 2.632848e-24 Delta(1900)+ 0 0.00000000 + Delta(1900)~- 633 -12122 -1.0 1.86000000 2.632848e-24 anti-Delta(1900)- 0 0.00000000 + Delta(1900)++ 644 12222 2.0 1.86000000 2.632848e-24 Delta(1900)++ 0 0.00000000 + Delta(1900)~-- 645 -12222 -2.0 1.86000000 2.632848e-24 anti-Delta(1900)-- 0 0.00000000 + Delta(1905)- 398 1116 -1.0 1.88000000 1.994582e-24 Delta(1905)- 0 0.00000000 + Delta(1905)~+ 399 -1116 1.0 1.88000000 1.994582e-24 anti-Delta(1905)+ 0 0.00000000 + Delta(1905)0 406 1216 0.0 1.88000000 1.994582e-24 Delta(1905)0 0 0.00000000 + Delta(1905)~0 407 -1216 0.0 1.88000000 1.994582e-24 anti-Delta(1905)0 0 0.00000000 + Delta(1905)+ 422 2126 1.0 1.88000000 1.994582e-24 Delta(1905)+ 0 0.00000000 + Delta(1905)~- 423 -2126 -1.0 1.88000000 1.994582e-24 anti-Delta(1905)- 0 0.00000000 + Delta(1905)++ 434 2226 2.0 1.88000000 1.994582e-24 Delta(1905)++ 0 0.00000000 + Delta(1905)~-- 435 -2226 -2.0 1.88000000 1.994582e-24 anti-Delta(1905)-- 0 0.00000000 + Delta(1910)- 697 21112 -1.0 1.90000000 2.350758e-24 Delta(1910)- 0 0.00000000 + Delta(1910)~+ 698 -21112 1.0 1.90000000 2.350758e-24 anti-Delta(1910)+ 0 0.00000000 + Delta(1910)0 701 21212 0.0 1.90000000 2.350758e-24 Delta(1910)0 0 0.00000000 + Delta(1910)~0 702 -21212 0.0 1.90000000 2.350758e-24 anti-Delta(1910)0 0 0.00000000 + Delta(1910)+ 709 22122 1.0 1.90000000 2.350758e-24 Delta(1910)+ 0 0.00000000 + Delta(1910)~- 710 -22122 -1.0 1.90000000 2.350758e-24 anti-Delta(1910)- 0 0.00000000 + Delta(1910)++ 717 22222 2.0 1.90000000 2.350758e-24 Delta(1910)++ 0 0.00000000 + Delta(1910)~-- 718 -22222 -2.0 1.90000000 2.350758e-24 anti-Delta(1910)-- 0 0.00000000 + Delta(1920)- 699 21114 -1.0 1.92000000 2.531585e-24 Delta(1920)- 0 0.00000000 + Delta(1920)~+ 700 -21114 1.0 1.92000000 2.531585e-24 anti-Delta(1920)+ 0 0.00000000 + Delta(1920)0 707 22114 0.0 1.92000000 2.531585e-24 Delta(1920)0 0 0.00000000 + Delta(1920)~0 708 -22114 0.0 1.92000000 2.531585e-24 anti-Delta(1920)0 0 0.00000000 + Delta(1920)+ 715 22214 1.0 1.92000000 2.531585e-24 Delta(1920)+ 0 0.00000000 + Delta(1920)~- 716 -22214 -1.0 1.92000000 2.531585e-24 anti-Delta(1920)- 0 0.00000000 + Delta(1920)++ 719 22224 2.0 1.92000000 2.531585e-24 Delta(1920)++ 0 0.00000000 + Delta(1920)~-- 720 -22224 -2.0 1.92000000 2.531585e-24 anti-Delta(1920)-- 0 0.00000000 + Delta(1930)- 618 11116 -1.0 1.95000000 2.194040e-24 Delta(1930)- 0 0.00000000 + Delta(1930)~+ 619 -11116 1.0 1.95000000 2.194040e-24 anti-Delta(1930)+ 0 0.00000000 + Delta(1930)0 622 11216 0.0 1.95000000 2.194040e-24 Delta(1930)0 0 0.00000000 + Delta(1930)~0 623 -11216 0.0 1.95000000 2.194040e-24 anti-Delta(1930)0 0 0.00000000 + Delta(1930)+ 634 12126 1.0 1.95000000 2.194040e-24 Delta(1930)+ 0 0.00000000 + Delta(1930)~- 635 -12126 -1.0 1.95000000 2.194040e-24 anti-Delta(1930)- 0 0.00000000 + Delta(1930)++ 648 12226 2.0 1.95000000 2.194040e-24 Delta(1930)++ 0 0.00000000 + Delta(1930)~-- 649 -12226 -2.0 1.95000000 2.194040e-24 anti-Delta(1930)-- 0 0.00000000 + Delta(1950)- 400 1118 -1.0 1.93000000 2.350758e-24 Delta(1950)- 0 0.00000000 + Delta(1950)~+ 401 -1118 1.0 1.93000000 2.350758e-24 anti-Delta(1950)+ 0 0.00000000 + Delta(1950)0 416 2118 0.0 1.93000000 2.350758e-24 Delta(1950)0 0 0.00000000 + Delta(1950)~0 417 -2118 0.0 1.93000000 2.350758e-24 anti-Delta(1950)0 0 0.00000000 + Delta(1950)+ 430 2218 1.0 1.93000000 2.350758e-24 Delta(1950)+ 0 0.00000000 + Delta(1950)~- 431 -2218 -1.0 1.93000000 2.350758e-24 anti-Delta(1950)- 0 0.00000000 + Delta(1950)++ 436 2228 2.0 1.93000000 2.350758e-24 Delta(1950)++ 0 0.00000000 + Delta(1950)~-- 437 -2228 -2.0 1.93000000 2.350758e-24 anti-Delta(1950)-- 0 0.00000000 + Lambda0 18 3122 0.0 1.11568300 2.632000e-10 Lambda0 3122 0.00000000 + Lambda~0 26 -3122 0.0 1.11568300 2.632000e-10 anti-Lambda0 -3122 0.00000000 + Lambda(1405)0 656 13122 0.0 1.40510000 1.316424e-23 Lambda(1405)0 0 0.00000000 + Lambda(1405)~0 657 -13122 0.0 1.40510000 1.316424e-23 anti-Lambda(1405)0 0 0.00000000 + Lambda(1520)0 448 3124 0.0 1.51950000 4.219309e-23 Lambda(1520)0 0 0.00000000 + Lambda(1520)~0 449 -3124 0.0 1.51950000 4.219309e-23 anti-Lambda(1520)0 0 0.00000000 + Lambda(1600)0 725 23122 0.0 1.60000000 4.388081e-24 Lambda(1600)0 0 0.00000000 + Lambda(1600)~0 726 -23122 0.0 1.60000000 4.388081e-24 anti-Lambda(1600)0 0 0.00000000 + Lambda(1670)0 783 33122 0.0 1.67000000 1.880606e-23 Lambda(1670)0 0 0.00000000 + Lambda(1670)~0 784 -33122 0.0 1.67000000 1.880606e-23 anti-Lambda(1670)0 0 0.00000000 + Lambda(1690)0 658 13124 0.0 1.69000000 1.097020e-23 Lambda(1690)0 0 0.00000000 + Lambda(1690)~0 659 -13124 0.0 1.69000000 1.097020e-23 anti-Lambda(1690)0 0 0.00000000 + Lambda(1800)0 797 43122 0.0 1.80000000 2.194041e-24 Lambda(1800)0 0 0.00000000 + Lambda(1800)~0 798 -43122 0.0 1.80000000 2.194041e-24 anti-Lambda(1800)0 0 0.00000000 + Lambda(1810)0 803 53122 0.0 1.81000000 4.388081e-24 Lambda(1810)0 0 0.00000000 + Lambda(1810)~0 804 -53122 0.0 1.81000000 4.388081e-24 anti-Lambda(1810)0 0 0.00000000 + Lambda(1820)0 450 3126 0.0 1.82000000 8.227652e-24 Lambda(1820)0 0 0.00000000 + Lambda(1820)~0 451 -3126 0.0 1.82000000 8.227652e-24 anti-Lambda(1820)0 0 0.00000000 + Lambda(1830)0 660 13126 0.0 1.83000000 6.928549e-24 Lambda(1830)0 0 0.00000000 + Lambda(1830)~0 661 -13126 0.0 1.83000000 6.928549e-24 anti-Lambda(1830)0 0 0.00000000 + Lambda(1890)0 727 23124 0.0 1.89000000 6.582122e-24 Lambda(1890)0 0 0.00000000 + Lambda(1890)~0 728 -23124 0.0 1.89000000 6.582122e-24 anti-Lambda(1890)0 0 0.00000000 + Lambda(2100)0 452 3128 0.0 2.10000000 3.291061e-24 Lambda(2100)0 0 0.00000000 + Lambda(2100)~0 453 -3128 0.0 2.10000000 3.291061e-24 anti-Lambda(2100)0 0 0.00000000 + Lambda(2110)0 729 23126 0.0 2.11000000 3.291061e-24 Lambda(2110)0 0 0.00000000 + Lambda(2110)~0 730 -23126 0.0 2.11000000 3.291061e-24 anti-Lambda(2110)0 0 0.00000000 + Sigma- 21 3112 -1.0 1.19744900 1.479128e-10 Sigma- 3112 0.00000000 + Sigma~+ 29 -3112 1.0 1.19744900 1.479128e-10 anti-Sigma+ -3112 0.00000000 + Sigma0 20 3212 0.0 1.19264200 7.400000e-20 Sigma0 3212 0.00000000 + Sigma~0 28 -3212 0.0 1.19264200 7.400000e-20 anti-Sigma0 -3212 0.00000000 + Sigma+ 19 3222 1.0 1.18937000 8.018175e-11 Sigma+ 3222 0.00000000 + Sigma~- 27 -3222 -1.0 1.18937000 8.018175e-11 anti-Sigma- -3222 0.00000000 + Sigma*- 442 3114 -1.0 1.38720000 1.670589e-23 Sigma*- 3114 0.00000000 + Sigma*~+ 443 -3114 1.0 1.38720000 1.670589e-23 anti-Sigma*+ -3114 0.00000000 + Sigma*0 458 3214 0.0 1.38370000 1.828367e-23 Sigma*0 3214 0.00000000 + Sigma*~0 459 -3214 0.0 1.38370000 1.828367e-23 anti-Sigma*0 -3214 0.00000000 + Sigma*+ 464 3224 1.0 1.38280000 1.828367e-23 Sigma*+ 3224 0.00000000 + Sigma*~- 465 -3224 -1.0 1.38280000 1.828367e-23 anti-Sigma*- -3224 0.00000000 + Sigma(1660)- 650 13112 -1.0 1.66000000 6.582122e-24 Sigma(1660)- 0 0.00000000 + Sigma(1660)~+ 651 -13112 1.0 1.66000000 6.582122e-24 anti-Sigma(1660)+ 0 0.00000000 + Sigma(1660)0 662 13212 0.0 1.66000000 6.582122e-24 Sigma(1660)0 0 0.00000000 + Sigma(1660)~0 663 -13212 0.0 1.66000000 6.582122e-24 anti-Sigma(1660)0 0 0.00000000 + Sigma(1660)+ 668 13222 1.0 1.66000000 6.582122e-24 Sigma(1660)+ 0 0.00000000 + Sigma(1660)~- 669 -13222 -1.0 1.66000000 6.582122e-24 anti-Sigma(1660)- 0 0.00000000 + Sigma(1670)- 652 13114 -1.0 1.67000000 1.097020e-23 Sigma(1670)- 0 0.00000000 + Sigma(1670)~+ 653 -13114 1.0 1.67000000 1.097020e-23 anti-Sigma(1670)+ 0 0.00000000 + Sigma(1670)0 664 13214 0.0 1.67000000 1.097020e-23 Sigma(1670)0 0 0.00000000 + Sigma(1670)~0 665 -13214 0.0 1.67000000 1.097020e-23 anti-Sigma(1670)0 0 0.00000000 + Sigma(1670)+ 670 13224 1.0 1.67000000 1.097020e-23 Sigma(1670)+ 0 0.00000000 + Sigma(1670)~- 671 -13224 -1.0 1.67000000 1.097020e-23 anti-Sigma(1670)- 0 0.00000000 + Sigma(1750)- 721 23112 -1.0 1.75000000 7.313469e-24 Sigma(1750)- 0 0.00000000 + Sigma(1750)~+ 722 -23112 1.0 1.75000000 7.313469e-24 anti-Sigma(1750)+ 0 0.00000000 + Sigma(1750)0 731 23212 0.0 1.75000000 7.313469e-24 Sigma(1750)0 0 0.00000000 + Sigma(1750)~0 732 -23212 0.0 1.75000000 7.313469e-24 anti-Sigma(1750)0 0 0.00000000 + Sigma(1750)+ 735 23222 1.0 1.75000000 7.313469e-24 Sigma(1750)+ 0 0.00000000 + Sigma(1750)~- 736 -23222 -1.0 1.75000000 7.313469e-24 anti-Sigma(1750)- 0 0.00000000 + Sigma(1775)- 444 3116 -1.0 1.77500000 5.485102e-24 Sigma(1775)- 0 0.00000000 + Sigma(1775)~+ 445 -3116 1.0 1.77500000 5.485102e-24 anti-Sigma(1775)+ 0 0.00000000 + Sigma(1775)0 460 3216 0.0 1.77500000 5.485102e-24 Sigma(1775)0 0 0.00000000 + Sigma(1775)~0 461 -3216 0.0 1.77500000 5.485102e-24 anti-Sigma(1775)0 0 0.00000000 + Sigma(1775)+ 466 3226 1.0 1.77500000 5.485102e-24 Sigma(1775)+ 0 0.00000000 + Sigma(1775)~- 467 -3226 -1.0 1.77500000 5.485102e-24 anti-Sigma(1775)- 0 0.00000000 + Sigma(1915)- 654 13116 -1.0 1.91500000 5.485102e-24 Sigma(1915)- 0 0.00000000 + Sigma(1915)~+ 655 -13116 1.0 1.91500000 5.485102e-24 anti-Sigma(1915)+ 0 0.00000000 + Sigma(1915)0 666 13216 0.0 1.91500000 5.485102e-24 Sigma(1915)0 0 0.00000000 + Sigma(1915)~0 667 -13216 0.0 1.91500000 5.485102e-24 anti-Sigma(1915)0 0 0.00000000 + Sigma(1915)+ 672 13226 1.0 1.91500000 5.485102e-24 Sigma(1915)+ 0 0.00000000 + Sigma(1915)~- 673 -13226 -1.0 1.91500000 5.485102e-24 anti-Sigma(1915)- 0 0.00000000 + Sigma(1940)- 723 23114 -1.0 1.94000000 2.991874e-24 Sigma(1940)- 0 0.00000000 + Sigma(1940)~+ 724 -23114 1.0 1.94000000 2.991874e-24 anti-Sigma(1940)+ 0 0.00000000 + Sigma(1940)0 733 23214 0.0 1.94000000 2.991874e-24 Sigma(1940)0 0 0.00000000 + Sigma(1940)~0 734 -23214 0.0 1.94000000 2.991874e-24 anti-Sigma(1940)0 0 0.00000000 + Sigma(1940)+ 737 23224 1.0 1.94000000 2.991874e-24 Sigma(1940)+ 0 0.00000000 + Sigma(1940)~- 738 -23224 -1.0 1.94000000 2.991874e-24 anti-Sigma(1940)- 0 0.00000000 + Sigma(2030)0 462 3218 0.0 2.03000000 3.656734e-24 Sigma(2030)0 0 0.00000000 + Sigma(2030)~0 463 -3218 0.0 2.03000000 3.656734e-24 anti-Sigma(2030)0 0 0.00000000 + Sigma(2030)+ 468 3228 1.0 2.03000000 3.656734e-24 Sigma(2030)+ 0 0.00000000 + Sigma(2030)~- 469 -3228 -1.0 2.03000000 3.656734e-24 anti-Sigma(2030)- 0 0.00000000 + Sigma(2030)- 446 3118 -1.0 2.03000000 3.656734e-24 Sigma(2030)- 0 0.00000000 + Sigma(2030)~+ 447 -3118 1.0 2.03000000 3.656734e-24 anti-Sigma(2030)+ 0 0.00000000 + Sigma(2250)0 1059 103212 0.0 2.25000000 6.580000e-24 Sigma(2250)0 0 0.00000000 + Sigma(2250)~0 1060 -103212 0.0 2.25000000 6.580000e-24 anti-Sigma(2250)0 0 0.00000000 + Sigma(2250)+ 1061 103222 1.0 2.25000000 6.580000e-24 Sigma(2250)+ 0 0.00000000 + Sigma(2250)~- 1062 -103222 -1.0 2.25000000 6.580000e-24 anti-Sigma(2250)- 0 0.00000000 + Sigma(2250)- 1063 103112 -1.0 2.25000000 6.580000e-24 Sigma(2250)- 0 0.00000000 + Sigma(2250)~+ 1064 -103112 1.0 2.25000000 6.580000e-24 anti-Sigma(2250)+ 0 0.00000000 + Xi- 23 3312 -1.0 1.32171000 1.639000e-10 Xi- 3312 0.00000000 + Xi~+ 31 -3312 1.0 1.32171000 1.639000e-10 anti-Xi+ -3312 0.00000000 + Xi0 22 3322 0.0 1.31486000 2.900000e-10 Xi0 3322 0.00000000 + Xi~0 30 -3322 0.0 1.31486000 2.900000e-10 anti-Xi0 -3322 0.00000000 + Xi*- 472 3314 -1.0 1.53500000 6.648608e-23 Xi*- 3314 0.00000000 + Xi*~+ 473 -3314 1.0 1.53500000 6.648608e-23 anti-Xi*+ -3314 0.00000000 + Xi*0 474 3324 0.0 1.53180000 7.233101e-23 Xi*0 3324 0.00000000 + Xi*~0 475 -3324 0.0 1.53180000 7.233101e-23 anti-Xi*0 -3324 0.00000000 + Xi(1690)- 1033 203312 -1.0 1.69000000 0.000000e+00 Xi(1690)- 0 0.00000000 + Xi(1690)~+ 1034 -203312 1.0 1.69000000 0.000000e+00 anti-Xi(1690)+ 0 0.00000000 + Xi(1690)0 1035 203322 0.0 1.69000000 0.000000e+00 Xi(1690)0 0 0.00000000 + Xi(1690)~0 1036 -203322 0.0 1.69000000 0.000000e+00 anti-Xi(1690)0 0 0.00000000 + Xi(1820)- 674 13314 -1.0 1.82300000 2.742551e-23 Xi(1820)- 0 0.00000000 + Xi(1820)~+ 675 -13314 1.0 1.82300000 2.742551e-23 anti-Xi(1820)+ 0 0.00000000 + Xi(1820)0 678 13324 0.0 1.82300000 2.742551e-23 Xi(1820)0 0 0.00000000 + Xi(1820)~0 679 -13324 0.0 1.82300000 2.742551e-23 anti-Xi(1820)0 0 0.00000000 + Xi(1950)- 1037 103316 -1.0 1.95000000 1.097020e-23 Xi(1950)- 0 0.00000000 + Xi(1950)~+ 1038 -103316 1.0 1.95000000 1.097020e-23 anti-Xi(1950)+ 0 0.00000000 + Xi(1950)0 1039 103326 0.0 1.95000000 1.097020e-23 Xi(1950)0 0 0.00000000 + Xi(1950)~0 1040 -103326 0.0 1.95000000 1.097020e-23 anti-Xi(1950)0 0 0.00000000 + Xi(2030)- 1041 203316 -1.0 2.02500000 3.291061e-23 Xi(2030)- 0 0.00000000 + Xi(2030)~+ 1042 -203316 1.0 2.02500000 3.291061e-23 anti-Xi(2030)+ 0 0.00000000 + Xi(2030)0 1043 203326 0.0 2.02500000 3.291061e-23 Xi(2030)0 0 0.00000000 + Xi(2030)~0 1044 -203326 0.0 2.02500000 3.291061e-23 anti-Xi(2030)0 0 0.00000000 + Omega- 24 3334 -1.0 1.67245000 8.210000e-11 Omega- 3334 0.00000000 + Omega~+ 32 -3334 1.0 1.67245000 8.210000e-11 anti-Omega+ -3334 0.00000000 + Omega(2250)- 1045 203338 -1.0 2.25200000 1.196749e-23 Omega(2250)- 0 0.00000000 + Omega(2250)~+ 1046 -203338 1.0 2.25200000 1.196749e-23 anti-Omega(2250)+ 0 0.00000000 + Lambda_c+ 62 4122 1.0 2.28646000 2.000000e-13 Lambda_c+ 4122 0.00000000 + Lambda_c~- 63 -4122 -1.0 2.28646000 2.000000e-13 anti-Lambda_c- -4122 0.00000000 + Lambda_c(2595)+ 682 14122 1.0 2.59225000 2.531585e-22 Lambda_c(2593)+ 0 0.00000000 + Lambda_c(2595)~- 683 -14122 -1.0 2.59225000 2.531585e-22 anti-Lambda_c(2593)- 0 0.00000000 + Lambda_c(2625)+ 1047 104124 1.0 2.62811000 0.000000e+00 Lambda_c(2625)+ 0 0.00000000 + Lambda_c(2625)~- 1048 -104124 -1.0 2.62811000 0.000000e+00 anti-Lambda_c(2625)- 0 0.00000000 + Lambda_c(2880)+ 1049 204126 1.0 2.88163000 1.175379e-22 Lambda_c(2880)+ 0 0.00000000 + Lambda_c(2880)~- 1050 -204126 -1.0 2.88163000 1.175379e-22 anti-Lambda_c(2880)- 0 0.00000000 + Sigma_c0 81 4112 0.0 2.45375000 3.596787e-22 Sigma_c0 4112 0.00000000 + Sigma_c~0 82 -4112 0.0 2.45375000 3.596787e-22 anti-Sigma_c0 -4112 0.00000000 + Sigma_c+ 83 4212 1.0 2.45290000 3.999999e-22 Sigma_c+ 4212 0.00000000 + Sigma_c~- 84 -4212 -1.0 2.45290000 3.999999e-22 anti-Sigma_c- -4212 0.00000000 + Sigma_c++ 85 4222 2.0 2.45397000 3.482603e-22 Sigma_c++ 4222 0.00000000 + Sigma_c~-- 86 -4222 -2.0 2.45397000 3.482603e-22 anti-Sigma_c-- -4222 0.00000000 + Sigma_c*0 480 4114 0.0 2.51848000 4.539394e-23 Sigma_c*0 4114 0.00000000 + Sigma_c*~0 481 -4114 0.0 2.51848000 4.539394e-23 anti-Sigma_c*0 -4114 0.00000000 + Sigma_c*+ 486 4214 1.0 2.51750000 3.291061e-22 Sigma_c*+ 4214 0.00000000 + Sigma_c*~- 487 -4214 -1.0 2.51750000 3.291061e-22 anti-Sigma_c*- -4214 0.00000000 + Sigma_c*++ 488 4224 2.0 2.51841000 4.453396e-23 Sigma_c*++ 4224 0.00000000 + Sigma_c*~-- 489 -4224 -2.0 2.51841000 4.453396e-23 anti-Sigma_c*-- -4224 0.00000000 + Xi_c0 106 4132 0.0 2.47091000 1.530726e-13 Xi_c0 4132 0.00000000 + Xi_c~0 107 -4132 0.0 2.47091000 1.530726e-13 anti-Xi_c0 -4132 0.00000000 + Xi_c+ 108 4232 1.0 2.46793000 4.420000e-13 Xi_c+ 4232 0.00000000 + Xi_c~- 109 -4232 -1.0 2.46793000 4.420000e-13 anti-Xi_c- -4232 0.00000000 + Xi'_c0 100 4312 0.0 2.57920000 0.000000e+00 Xi'_c0 4312 0.00000000 + Xi'_c~0 101 -4312 0.0 2.57920000 0.000000e+00 anti-Xi'_c0 -4312 0.00000000 + Xi'_c+ 102 4322 1.0 2.57840000 0.000000e+00 Xi'_c+ 4322 0.00000000 + Xi'_c~- 103 -4322 -1.0 2.57840000 0.000000e+00 anti-Xi'_c- -4322 0.00000000 + Xi_c*0 494 4314 0.0 2.64638000 2.800902e-22 Xi_c*0 4314 0.00000000 + Xi_c*~0 495 -4314 0.0 2.64638000 2.800902e-22 anti-Xi_c*0 -4314 0.00000000 + Xi_c*+ 496 4324 1.0 2.64557000 3.075757e-22 Xi_c*+ 4324 0.00000000 + Xi_c*~- 497 -4324 -1.0 2.64557000 3.075757e-22 anti-Xi_c*- -4324 0.00000000 + Xi_c(2790)+ 1051 104324 1.0 2.79240000 7.395640e-23 Xi_c(2790)+ 0 0.00000000 + Xi_c(2790)~- 1052 -104324 -1.0 2.79240000 7.395640e-23 anti-Xi_c(2790)- 0 0.00000000 + Xi_c(2790)0 1053 104314 0.0 2.79410000 6.582120e-23 Xi_c(2790)0 0 0.00000000 + Xi_c(2790)~0 1054 -104314 0.0 2.79410000 6.582120e-23 anti-Xi_c(2790)0 0 0.00000000 + Xi_c(2815)+ 1055 104322 1.0 2.81673000 2.708691e-22 Xi_c(2815)+ 0 0.00000000 + Xi_c(2815)~- 1056 -104322 -1.0 2.81673000 2.708691e-22 anti-Xi_c(2815)- 0 0.00000000 + Xi_c(2815)0 1057 104312 0.0 2.82026000 2.591386e-22 Xi_c(2815)0 0 0.00000000 + Xi_c(2815)~0 1058 -104312 0.0 2.82026000 2.591386e-22 anti-Xi_c(2815)0 0 0.00000000 + Omega_c0 104 4332 0.0 2.69520000 2.680000e-13 Omega_c0 4332 0.00000000 + Omega_c~0 105 -4332 0.0 2.69520000 2.680000e-13 anti-Omega_c0 -4332 0.00000000 + Omega_c*0 498 4334 0.0 2.76590000 0.000000e+00 Omega_c*0 4334 0.00000000 + Omega_c*~0 499 -4334 0.0 2.76590000 0.000000e+00 anti-Omega_c*0 -4334 0.00000000 + Xi_cc+ 502 4412 1.0 3.62140000 0.800000e-13 Xi_cc+ 4412 0.00000000 + Xi_cc~- 503 -4412 -1.0 3.62140000 0.800000e-13 anti-Xi_cc- -4412 0.00000000 + Xi*_cc+ 504 4414 1.0 3.65648000 0.000000e+00 Xi_cc*+ 4414 0.00000000 + Xi*_cc~- 505 -4414 -1.0 3.65648000 0.000000e+00 anti-Xi_cc*- -4414 0.00000000 + Xi_cc++ 506 4422 2.0 3.62140000 2.560000e-13 Xi_cc++ 4422 0.00000000 + Xi_cc~-- 507 -4422 -2.0 3.62140000 2.560000e-13 anti-Xi_cc-- -4422 0.00000000 + Xi*_cc++ 508 4424 2.0 3.65648000 0.000000e+00 Xi_cc*++ 4424 0.00000000 + Xi*_cc~-- 509 -4424 -2.0 3.65648000 0.000000e+00 anti-Xi_cc*-- -4424 0.00000000 + Omega_cc+ 510 4432 1.0 3.73800000 1.600000e-13 Omega_cc+ 4432 0.00000000 + Omega_cc~- 511 -4432 -1.0 3.73800000 1.600000e-13 anti-Omega_cc- -4432 0.00000000 + Omega*_cc+ 512 4434 1.0 3.82466000 0.000000e+00 Omega_cc*+ 4434 0.00000000 + Omega*_cc~- 513 -4434 -1.0 3.82466000 0.000000e+00 anti-Omega_cc*- -4434 0.00000000 + Omega*_ccc++ 514 4444 2.0 4.91594000 0.000000e+00 Omega*_ccc++ 4444 0.00000000 + Omega*_ccc~-- 515 -4444 -2.0 4.91594000 0.000000e+00 anti-Omega*_ccc-- -4444 0.00000000 + Lambda_b0 79 5122 0.0 5.61960000 1.470865e-12 Lambda_b0 5122 0.00000000 + Lambda_b~0 80 -5122 0.0 5.61960000 1.470865e-12 anti-Lambda_b0 -5122 0.00000000 + Lambda_b(5912)0 1065 15122 0.0 5.91220000 1.316000e-21 Lambda_b(5912)0 15122 0.00000000 + Lambda_b(5912)~0 1066 -15122 0.0 5.91220000 1.316000e-21 anti-Lambda_b(5912)0 -15122 0.00000000 + Lambda_b(5920)0 1067 5124 0.0 5.91992000 1.316000e-21 Lambda_b(5920)0 5124 0.00000000 + Lambda_b(5920)~0 1068 -5124 0.0 5.91992000 1.316000e-21 anti-Lambda_b(5920)0 -5124 0.00000000 + Sigma_b- 114 5112 -1.0 5.81564000 1.343290e-22 Sigma_b- 5112 0.00000000 + Sigma_b~+ 115 -5112 1.0 5.81564000 1.343290e-22 anti-Sigma_b+ -5112 0.00000000 + Sigma_b0 112 5212 0.0 5.80780000 1.000000e-19 Sigma_b0 5212 0.00000000 + Sigma_b~0 113 -5212 0.0 5.80780000 1.000000e-19 anti-Sigma_b0 -5212 0.00000000 + Sigma_b+ 110 5222 1.0 5.81056000 1.316424e-22 Sigma_b+ 5222 0.00000000 + Sigma_b~- 111 -5222 -1.0 5.81056000 1.316424e-22 anti-Sigma_b- -5222 0.00000000 + Sigma_b*- 520 5114 -1.0 5.83474000 8.776160e-23 Sigma_b*- 5114 0.00000000 + Sigma_b*~+ 521 -5114 1.0 5.83474000 8.776160e-23 anti-Sigma_b*+ -5114 0.00000000 + Sigma_b*0 528 5214 0.0 5.82900000 0.000000e+00 Sigma_b*0 5214 0.00000000 + Sigma_b*~0 529 -5214 0.0 5.82900000 0.000000e+00 anti-Sigma_b*0 -5214 0.00000000 + Sigma_b*+ 530 5224 1.0 5.83032000 7.002255e-23 Sigma_b*+ 5224 0.00000000 + Sigma_b*~- 531 -5224 -1.0 5.83032000 7.002255e-23 anti-Sigma_b*- -5224 0.00000000 + Xi_b- 122 5132 -1.0 5.79700000 1.570912e-12 Xi_b- 5132 0.00000000 + Xi_b~+ 123 -5132 1.0 5.79700000 1.570912e-12 anti-Xi_b+ -5132 0.00000000 + Xi_b0 124 5232 0.0 5.79190000 1.490000e-12 Xi_b0 5232 0.00000000 + Xi_b~0 125 -5232 0.0 5.79190000 1.490000e-12 anti-Xi_b0 -5232 0.00000000 + Xi'_b- 116 5312 -1.0 5.96000000 1.000000e-19 Xi'_b- 5312 0.00000000 + Xi'_b~+ 117 -5312 1.0 5.96000000 1.000000e-19 anti-Xi'_b+ -5312 0.00000000 + Xi'_b0 118 5322 0.0 5.96000000 1.000000e-19 Xi'_b0 5322 0.00000000 + Xi'_b~0 119 -5322 0.0 5.96000000 1.000000e-19 anti-Xi'_b0 -5322 0.00000000 + Xi_b*- 538 5314 -1.0 5.97000000 0.000000e+00 Xi_b*- 5314 0.00000000 + Xi_b*~+ 539 -5314 1.0 5.97000000 0.000000e+00 anti-Xi_b*+ -5314 0.00000000 + Xi_b*0 540 5324 0.0 5.97000000 0.000000e+00 Xi_b*0 5324 0.00000000 + Xi_b*~0 541 -5324 0.0 5.97000000 0.000000e+00 anti-Xi_b*0 -5324 0.00000000 + Omega_b*- 542 5334 -1.0 6.13000000 0.000000e+00 Omega_b*- 5334 0.00000000 + Omega_b*~+ 543 -5334 1.0 6.13000000 0.000000e+00 anti-Omega_b*+ -5334 0.00000000 + Omega_b- 120 5332 -1.0 6.04610000 1.645530e-12 Omega_b- 5332 0.00000000 + Omega_b~+ 121 -5332 1.0 6.04610000 1.645530e-12 anti-Omega_b+ -5332 0.00000000 + Xi_bc0 522 5142 0.0 6.90000000 0.500000e-12 Xi_bc0 5142 0.00000000 + Xi_bc~0 523 -5142 0.0 6.90000000 0.500000e-12 anti-Xi_bc0 -5142 0.00000000 + Xi_bc+ 532 5242 1.0 6.90000000 0.500000e-12 Xi_bc+ 5242 0.00000000 + Xi_bc~- 533 -5242 -1.0 6.90000000 0.500000e-12 anti-Xi_bc- -5242 0.00000000 + Omega_bc0 544 5342 0.0 7.19099000 0.500000e-12 Omega_bc0 5342 0.00000000 + Omega_bc~0 545 -5342 0.0 7.19099000 0.500000e-12 anti-Omega_bc0 -5342 0.00000000 + Xi'_bc0 550 5412 0.0 7.03724000 0.000000e+00 Xi'_bc0 5412 0.00000000 + Xi'_bc~0 551 -5412 0.0 7.03724000 0.000000e+00 anti-Xi'_bc0 -5412 0.00000000 + Xi*_bc0 552 5414 0.0 7.04850000 0.000000e+00 Xi*_bc0 5414 0.00000000 + Xi*_bc~0 553 -5414 0.0 7.04850000 0.000000e+00 anti-Xi*_bc0 -5414 0.00000000 + Xi'_bc+ 554 5422 1.0 7.03724000 0.000000e+00 Xi'_bc+ 5422 0.00000000 + Xi'_bc~- 555 -5422 -1.0 7.03724000 0.000000e+00 anti-Xi'_bc- -5422 0.00000000 + Xi*_bc+ 556 5424 1.0 7.04850000 0.000000e+00 Xi*_bc+ 5424 0.00000000 + Xi*_bc~- 557 -5424 -1.0 7.04850000 0.000000e+00 anti-Xi*_bc+ -5424 0.00000000 + Omega'_bc0 558 5432 0.0 7.21101000 0.000000e+00 Omega'_bc0 5432 0.00000000 + Omega'_bc~0 559 -5432 0.0 7.21101000 0.000000e+00 anti-Omega'_bc0 -5432 0.00000000 + Omega*_bc0 560 5434 0.0 7.21900000 0.000000e+00 Omega*_bc0 5434 0.00000000 + Omega*_bc~0 561 -5434 0.0 7.21900000 0.000000e+00 anti-Omega*_bc0 -5434 0.00000000 + Omega_bcc+ 562 5442 1.0 8.30945000 1.290893e-12 Omega_bcc+ 5442 0.00000000 + Omega_bcc~- 563 -5442 -1.0 8.30945000 1.290893e-12 anti-Omega_bcc- -5442 0.00000000 + Omega*_bcc+ 564 5444 1.0 8.31325000 0.000000e+00 Omega*_bcc+ 5444 0.00000000 + Omega*_bcc~- 565 -5444 -1.0 8.31325000 0.000000e+00 anti-Omega*_bcc- -5444 0.00000000 + Xi_bb- 568 5512 -1.0 10.42272000 1.290893e-12 Xi_bb- 5512 0.00000000 + Xi_bb~+ 569 -5512 1.0 10.42272000 1.290893e-12 anti-Xi_bb+ -5512 0.00000000 + Xi*_bb- 570 5514 -1.0 10.44144000 0.000000e+00 Xi*_bb- 5514 0.00000000 + Xi*_bb~+ 571 -5514 1.0 10.44144000 0.000000e+00 anti-Xi*_bb+ -5514 0.00000000 + Xi_bb0 572 5522 0.0 10.42272000 1.290893e-12 Xi_bb0 5522 0.00000000 + Xi_bb~0 573 -5522 0.0 10.42272000 1.290893e-12 anti-Xi_bb0 -5522 0.00000000 + Xi*_bb0 574 5524 0.0 10.44144000 0.000000e+00 Xi*_bb0 5524 0.00000000 + Xi*_bb~0 575 -5524 0.0 10.44144000 0.000000e+00 anti-Xi*_bb0 -5524 0.00000000 + Omega_bb- 576 5532 -1.0 10.60209000 1.290893e-12 Omega_bb- 5532 0.00000000 + Omega_bb~+ 577 -5532 1.0 10.60209000 1.290893e-12 anti-Omega_bb+ -5532 0.00000000 + Omega*_bb- 578 5534 -1.0 10.61426000 0.000000e+00 Omega*_bb- 5534 0.00000000 + Omega*_bb~+ 579 -5534 1.0 10.61426000 0.000000e+00 anti-Omega*_bb+ -5534 0.00000000 + Omega_bbc0 580 5542 0.0 11.70767000 1.290893e-12 Omega_bbc0 5542 0.00000000 + Omega_bbc~0 581 -5542 0.0 11.70767000 1.290893e-12 anti-Omega_bbc0 -5542 0.00000000 + Omega*_bbc0 582 5544 0.0 11.71147000 0.000000e+00 Omega*_bbc0 5544 0.00000000 + Omega*_bbc~0 583 -5544 0.0 11.71147000 0.000000e+00 anti-Omega*_bbc0 -5544 0.00000000 + Omega*_bbb- 584 5554 -1.0 15.11061000 0.000000e+00 Omega*_bbb- 5554 0.00000000 + Omega*_bbb~+ 585 -5554 1.0 15.11061000 0.000000e+00 anti-Omega*_bbb+ -5554 0.00000000 + deuteron 45 1000010020 1.0 1.87561300 1.000000e+15 deuteron 0 0.00000000 + triton 46 1000010030 1.0 2.80925000 1.000000e+15 tritium 0 0.00000000 + alpha 47 1000020040 2.0 3.72741700 1.000000e+15 alpha 0 0.00000000 + geantino 48 480000000 0.0 0.00000000 1.000000e+15 geantino 0 0.00000000 + opticalphoton 50 20022 0.0 0.00000000 1.000000e+16 Cerenkov 0 0.00000000 + H_10 87 25 0.0 125.10000000 9.400000e-26 Higgs0 25 0.00000000 + H_20 88 35 0.0 310.00000000 9.400000e-26 Higgs'0 35 0.00000000 + H_30 89 36 0.0 310.00000000 9.400000e-26 A0 36 0.00000000 + H+ 90 37 1.0 310.00000000 9.400000e-26 Higgs+ 37 0.00000000 + H- 91 -37 -1.0 310.00000000 9.400000e-26 Higgs- -37 0.00000000 + d 303 1 -0.3 0.00990000 0.000000e+00 d 1 0.00000000 + anti-d 304 -1 0.3 0.00990000 0.000000e+00 anti-d -1 0.00000000 + u 305 2 0.7 0.00560000 0.000000e+00 u 2 0.00000000 + anti-u 306 -2 -0.7 0.00560000 0.000000e+00 anti-u -2 0.00000000 + s 307 3 -0.3 0.19900000 0.000000e+00 s 3 0.00000000 + anti-s 308 -3 0.3 0.19900000 0.000000e+00 anti-s -3 0.00000000 + c 309 4 0.7 1.35000000 0.000000e+00 c 4 0.00000000 + anti-c 310 -4 -0.7 1.35000000 0.000000e+00 anti-c -4 0.00000000 + b 311 5 -0.3 5.00000000 0.000000e+00 b 5 0.00000000 + anti-b 312 -5 0.3 5.00000000 0.000000e+00 anti-b -5 0.00000000 + t 313 6 0.7 173.50000000 3.291061e-25 t 6 0.00000000 + anti-t 314 -6 -0.7 173.50000000 3.291061e-25 anti-t -6 0.00000000 + b' 315 7 -0.3 400.00000000 0.000000e+00 b' 7 0.00000000 + anti-b' 316 -7 0.3 400.00000000 0.000000e+00 anti-b' -7 0.00000000 + t' 317 8 0.7 500.00000000 0.000000e+00 t' 8 0.00000000 + anti-t' 318 -8 -0.7 500.00000000 0.000000e+00 anti-t' -8 0.00000000 + nu_tau 319 16 0.0 0.00000000 1.000000e+16 nu_tau 16 0.00000000 + nu_tau~ 320 -16 0.0 0.00000000 1.000000e+16 anti-nu_tau -16 0.00000000 + L- 321 17 -1.0 400.00000000 0.000000e+00 L- 17 0.00000000 + L+ 322 -17 1.0 400.00000000 0.000000e+00 L+ -17 0.00000000 + nu_L 323 18 0.0 0.00000000 0.000000e+00 nu_L 18 0.00000000 + anti-nu_L 324 -18 0.0 0.00000000 0.000000e+00 anti-nu_L -18 0.00000000 + g 325 21 0.0 0.00000000 1.000000e+16 g 21 0.00000000 + Z'0 326 32 0.0 500.00000000 0.000000e+00 Z'0 32 0.00000000 + Z''0 327 33 0.0 900.00000000 0.000000e+00 Z''0 33 0.00000000 + W'+ 328 34 1.0 500.00000000 0.000000e+00 W'+ 34 0.00000000 + W'- 329 -34 -1.0 500.00000000 0.000000e+00 W'- -34 0.00000000 + Graviton 330 39 0.0 0.00000000 0.000000e+00 unknown 39 0.00000000 + R0 331 41 0.0 5000.00000000 0.000000e+00 R0 41 0.00000000 + anti-R0 332 -41 0.0 5000.00000000 0.000000e+00 anti-R0 -41 0.00000000 + LQ_ue 333 42 -0.3 200.00000000 0.000000e+00 unknown 42 0.00000000 + LQ_uebar 334 -42 0.3 200.00000000 0.000000e+00 unknown -42 0.00000000 + Xu0 335 43 0.0 1.00000000 0.000000e+00 Xu0 43 0.00000000 + Xu+ 336 44 1.0 1.00000000 0.000000e+00 Xu+ 44 0.00000000 + Xu- 337 -44 -1.0 1.00000000 0.000000e+00 Xu- -44 0.00000000 + specflav 338 81 0.0 0.00000000 0.000000e+00 specflav 81 0.00000000 + rndmflav 339 82 0.0 0.00000000 0.000000e+00 rndmflav 82 0.00000000 + anti-rndmflav 340 -82 0.0 0.00000000 0.000000e+00 anti-rndmflav -82 0.00000000 + phasespa 341 83 0.0 1.00000000 0.000000e+00 phasespa 83 0.00000000 + c-hadron 342 84 0.7 2.00000000 3.335641e-13 c-hadron 84 0.00000000 + anti-c-hadron 343 -84 -0.7 2.00000000 3.335641e-13 anti-c-hadron -84 0.00000000 + b-hadron 344 85 -0.3 5.00000000 1.290893e-12 b-hadron 85 0.00000000 + anti-b-hadron 345 -85 0.3 5.00000000 1.290893e-12 anti-b-hadron -85 0.00000000 + t-hadron 346 86 0.7 175.00000000 0.000000e+00 t-hadron 0 0.00000000 + anti-t-hadron 347 -86 -0.7 175.00000000 0.000000e+00 anti-t-hadron 0 0.00000000 + b'-hadron 348 87 -0.3 400.00000000 0.000000e+00 b'-hadron 0 0.00000000 + anti-b'-hadron 349 -87 0.3 400.00000000 0.000000e+00 anti-b'-hadron 0 0.00000000 + junction 350 88 0.0 0.00000000 0.000000e+00 junction 88 0.00000000 + system 351 90 0.0 0.00000000 0.000000e+00 system 90 0.00000000 + cluster 352 91 0.0 0.00000000 0.000000e+00 cluster 91 0.00000000 + string 353 92 0.0 0.00000000 0.000000e+00 string 92 0.00000000 + indep 354 93 0.0 0.00000000 0.000000e+00 indep 93 0.00000000 + CMshower 355 94 0.0 0.00000000 0.000000e+00 CMshower 94 0.00000000 + SPHEaxis 356 95 0.0 0.00000000 0.000000e+00 SPHEaxis 95 0.00000000 + THRUaxis 357 96 0.0 0.00000000 0.000000e+00 THRUaxis 96 0.00000000 + CLUSjet 358 97 0.0 0.00000000 0.000000e+00 CLUSjet 97 0.00000000 + CELLjet 359 98 0.0 0.00000000 0.000000e+00 CELLjet 98 0.00000000 + table 360 99 0.0 0.00000000 0.000000e+00 table 99 0.00000000 + deuteron~ 390 -1000010020 -1.0 1.87561300 0.000000e+00 anti-deuteron 0 0.00000000 + triton~ 392 -1000010030 -1.0 2.80925000 0.000000e+00 anti-tritium 0 0.00000000 + alpha~ 393 -1000020040 -2.0 3.72741700 0.000000e+00 anti-alpha 0 0.00000000 + dd_1 394 1103 -0.7 0.00000000 0.000000e+00 dd_1 1103 0.00000000 + anti-dd_1 395 -1103 0.7 0.00000000 0.000000e+00 anti-dd_1 -1103 0.00000000 + ud_0 410 2101 0.3 0.00000000 0.000000e+00 ud_0 2101 0.00000000 + anti-ud_0 411 -2101 -0.3 0.00000000 0.000000e+00 anti-ud_0 -2101 0.00000000 + ud_1 412 2103 0.3 0.00000000 0.000000e+00 ud_1 2103 0.00000000 + anti-ud_1 413 -2103 -0.3 0.00000000 0.000000e+00 anti-ud_1 -2103 0.00000000 + uu_1 426 2203 1.3 0.00000000 0.000000e+00 uu_1 2203 0.00000000 + anti-uu_1 427 -2203 -1.3 0.00000000 0.000000e+00 anti-uu_1 -2203 0.00000000 + sd_0 438 3101 -0.7 0.00000000 0.000000e+00 sd_0 3101 0.00000000 + anti-sd_0 439 -3101 0.7 0.00000000 0.000000e+00 anti-sd_0 -3101 0.00000000 + sd_1 440 3103 -0.7 0.00000000 0.000000e+00 sd_1 3103 0.00000000 + anti-sd_1 441 -3103 0.7 0.00000000 0.000000e+00 anti-sd_1 -3103 0.00000000 + su_0 454 3201 0.3 0.00000000 0.000000e+00 su_0 3201 0.00000000 + anti-su_0 455 -3201 -0.3 0.00000000 0.000000e+00 anti-su_0 -3201 0.00000000 + su_1 456 3203 0.3 0.00000000 0.000000e+00 su_1 3203 0.00000000 + anti-su_1 457 -3203 -0.3 0.00000000 0.000000e+00 anti-su_1 -3203 0.00000000 + ss_1 470 3303 -0.7 0.00000000 0.000000e+00 ss_1 3303 0.00000000 + anti-ss_1 471 -3303 0.7 0.00000000 0.000000e+00 anti-ss_1 -3303 0.00000000 + cd_0 476 4101 0.3 0.00000000 0.000000e+00 cd_0 4101 0.00000000 + anti-cd_0 477 -4101 -0.3 0.00000000 0.000000e+00 anti-cd_0 -4101 0.00000000 + cd_1 478 4103 0.3 0.00000000 0.000000e+00 cd_1 4103 0.00000000 + anti-cd_1 479 -4103 -0.3 0.00000000 0.000000e+00 anti-cd_1 -4103 0.00000000 + cu_0 482 4201 1.3 0.00000000 0.000000e+00 cu_0 4201 0.00000000 + anti-cu_0 483 -4201 -1.3 0.00000000 0.000000e+00 anti-cu_0 -4201 0.00000000 + cu_1 484 4203 1.3 0.00000000 0.000000e+00 cu_1 4203 0.00000000 + anti-cu_1 485 -4203 -1.3 0.00000000 0.000000e+00 anti-cu_1 -4203 0.00000000 + cs_0 490 4301 0.3 0.00000000 0.000000e+00 cs_0 4301 0.00000000 + anti-cs_0 491 -4301 -0.3 0.00000000 0.000000e+00 anti-cs_0 -4301 0.00000000 + cs_1 492 4303 0.3 0.00000000 0.000000e+00 cs_1 4303 0.00000000 + anti-cs_1 493 -4303 -0.3 0.00000000 0.000000e+00 anti-cs_1 -4303 0.00000000 + cc_1 500 4403 1.3 0.00000000 0.000000e+00 cc_1 4403 0.00000000 + anti-cc_1 501 -4403 -1.3 0.00000000 0.000000e+00 anti-cc_1 -4403 0.00000000 + bd_0 516 5101 -0.7 0.00000000 0.000000e+00 bd_0 5101 0.00000000 + anti-bd_0 517 -5101 0.7 0.00000000 0.000000e+00 anti-bd_0 -5101 0.00000000 + bd_1 518 5103 -0.7 0.00000000 0.000000e+00 bd_1 5103 0.00000000 + anti-bd_1 519 -5103 0.7 0.00000000 0.000000e+00 anti-bd_1 -5103 0.00000000 + bu_0 524 5201 0.3 0.00000000 0.000000e+00 bu_0 5201 0.00000000 + anti-bu_0 525 -5201 -0.3 0.00000000 0.000000e+00 anti-bu_0 -5201 0.00000000 + bu_1 526 5203 0.3 0.00000000 0.000000e+00 bu_1 5203 0.00000000 + anti-bu_1 527 -5203 -0.3 0.00000000 0.000000e+00 anti-bu_1 -5203 0.00000000 + bs_0 534 5301 -0.7 0.00000000 0.000000e+00 bs_0 5301 0.00000000 + anti-bs_0 535 -5301 0.7 0.00000000 0.000000e+00 anti-bs_0 -5301 0.00000000 + bs_1 536 5303 -0.7 0.00000000 0.000000e+00 bs_1 5303 0.00000000 + anti-bs_1 537 -5303 0.7 0.00000000 0.000000e+00 anti-bs_1 -5303 0.00000000 + bc_0 546 5401 0.3 0.00000000 0.000000e+00 bc_0 5401 0.00000000 + anti-bc_0 547 -5401 -0.3 0.00000000 0.000000e+00 anti-bc_0 -5401 0.00000000 + bc_1 548 5403 0.3 0.00000000 0.000000e+00 bc_1 5403 0.00000000 + anti-bc_1 549 -5403 -0.3 0.00000000 0.000000e+00 anti-bc_1 -5403 0.00000000 + bb_1 566 5503 -0.7 0.00000000 0.000000e+00 bb_1 5503 0.00000000 + anti-bb_1 567 -5503 0.7 0.00000000 0.000000e+00 anti-bb_1 -5503 0.00000000 + vpho 586 10022 0.0 0.00000000 0.000000e+00 vpho 0 0.00000000 + Xsd 751 30343 0.0 1.60000000 0.000000e+00 Xsd 30343 0.00000000 + anti-Xsd 752 -30343 0.0 1.60000000 0.000000e+00 anti-Xsd -30343 0.00000000 + Xsu 753 30353 1.0 1.60000000 0.000000e+00 Xsu 30353 0.00000000 + anti-Xsu 754 -30353 -1.0 1.60000000 0.000000e+00 anti-Xsu -30353 0.00000000 + Xss 755 30363 0.0 1.80000000 0.000000e+00 Xss 30363 0.00000000 + anti-Xss 756 -30363 0.0 1.80000000 0.000000e+00 anti-Xss -30363 0.00000000 + ~d_L 859 1000001 -0.3 500.00000000 0.000000e+00 unknown 1000001 0.00000000 + ~d_Lbar 860 -1000001 0.3 500.00000000 0.000000e+00 unknown -1000001 0.00000000 + ~u_L 861 1000002 0.7 500.00000000 0.000000e+00 unknown 1000002 0.00000000 + ~u_Lbar 862 -1000002 -0.7 500.00000000 0.000000e+00 unknown -1000002 0.00000000 + ~s_L 863 1000003 -0.3 500.00000000 0.000000e+00 unknown 1000003 0.00000000 + ~s_Lbar 864 -1000003 0.3 500.00000000 0.000000e+00 unknown -1000003 0.00000000 + ~c_L 865 1000004 0.7 500.00000000 0.000000e+00 unknown 1000004 0.00000000 + ~c_Lbar 866 -1000004 -0.7 500.00000000 0.000000e+00 unknown -1000004 0.00000000 + ~b_1 867 1000005 -0.3 500.00000000 0.000000e+00 unknown 1000005 0.00000000 + ~b_1bar 868 -1000005 0.3 500.00000000 0.000000e+00 unknown -1000005 0.00000000 + ~t_1 869 1000006 0.7 500.00000000 0.000000e+00 unknown 1000006 0.00000000 + ~t_1bar 870 -1000006 -0.7 500.00000000 0.000000e+00 unknown -1000006 0.00000000 + ~e_L- 871 1000011 -1.0 500.00000000 0.000000e+00 unknown 1000011 0.00000000 + ~e_L+ 872 -1000011 1.0 500.00000000 0.000000e+00 unknown -1000011 0.00000000 + ~nu_eL 873 1000012 0.0 500.00000000 0.000000e+00 unknown 1000012 0.00000000 + ~nu_eLbar 874 -1000012 0.0 500.00000000 0.000000e+00 unknown -1000012 0.00000000 + ~mu_L- 875 1000013 -1.0 500.00000000 0.000000e+00 unknown 1000013 0.00000000 + ~mu_L+ 876 -1000013 1.0 500.00000000 0.000000e+00 unknown -1000013 0.00000000 + ~nu_muL 877 1000014 0.0 500.00000000 0.000000e+00 unknown 1000014 0.00000000 + ~nu_muLbar 878 -1000014 0.0 500.00000000 0.000000e+00 unknown -1000014 0.00000000 + ~tau_1- 879 1000015 -1.0 500.00000000 0.000000e+00 unknown 1000015 0.00000000 + ~tau_1+ 880 -1000015 1.0 500.00000000 0.000000e+00 unknown -1000015 0.00000000 + ~nu_tauL 881 1000016 0.0 500.00000000 0.000000e+00 unknown 1000016 0.00000000 + ~nu_tauLbar 882 -1000016 0.0 500.00000000 0.000000e+00 unknown -1000016 0.00000000 + ~g 883 1000021 0.0 500.00000000 0.000000e+00 unknown 1000021 0.00000000 + ~chi_10 884 1000022 0.0 500.00000000 0.000000e+00 unknown 1000022 0.00000000 + ~chi_20 885 1000023 0.0 500.00000000 0.000000e+00 unknown 1000023 0.00000000 + ~chi_1+ 886 1000024 1.0 500.00000000 0.000000e+00 unknown 1000024 0.00000000 + ~chi_1- 887 -1000024 -1.0 500.00000000 0.000000e+00 unknown -1000024 0.00000000 + ~chi_30 888 1000025 0.0 500.00000000 0.000000e+00 unknown 1000025 0.00000000 + ~chi_40 889 1000035 0.0 500.00000000 0.000000e+00 unknown 1000035 0.00000000 + ~chi_2+ 890 1000037 1.0 500.00000000 0.000000e+00 unknown 1000037 0.00000000 + ~chi_2- 891 -1000037 -1.0 500.00000000 0.000000e+00 unknown -1000037 0.00000000 + ~Gravitino 892 1000039 0.0 500.00000000 0.000000e+00 unknown 1000039 0.00000000 + ~d_R 893 2000001 -0.3 500.00000000 0.000000e+00 unknown 2000001 0.00000000 + ~d_Rbar 894 -2000001 0.3 500.00000000 0.000000e+00 unknown -2000001 0.00000000 + ~u_R 895 2000002 0.7 500.00000000 0.000000e+00 unknown 2000002 0.00000000 + ~u_Rbar 896 -2000002 -0.7 500.00000000 0.000000e+00 unknown -2000002 0.00000000 + ~s_R 897 2000003 -0.3 500.00000000 0.000000e+00 unknown 2000003 0.00000000 + ~s_Rbar 898 -2000003 0.3 500.00000000 0.000000e+00 unknown -2000003 0.00000000 + ~c_R 899 2000004 0.7 500.00000000 0.000000e+00 unknown 2000004 0.00000000 + ~c_Rbar 900 -2000004 -0.7 500.00000000 0.000000e+00 unknown -2000004 0.00000000 + ~b_2 901 2000005 -0.3 500.00000000 0.000000e+00 unknown 2000005 0.00000000 + ~b_2bar 902 -2000005 0.3 500.00000000 0.000000e+00 unknown -2000005 0.00000000 + ~t_2 903 2000006 0.7 500.00000000 0.000000e+00 unknown 2000006 0.00000000 + ~t_2bar 904 -2000006 -0.7 500.00000000 0.000000e+00 unknown -2000006 0.00000000 + ~e_R- 905 2000011 -1.0 500.00000000 0.000000e+00 unknown 2000011 0.00000000 + ~e_R+ 906 -2000011 1.0 500.00000000 0.000000e+00 unknown -2000011 0.00000000 + ~nu_eR 907 2000012 0.0 500.00000000 0.000000e+00 unknown 2000012 0.00000000 + ~nu_eRbar 908 -2000012 0.0 500.00000000 0.000000e+00 unknown -2000012 0.00000000 + ~mu_R- 909 2000013 -1.0 500.00000000 0.000000e+00 unknown 2000013 0.00000000 + ~mu_R+ 910 -2000013 1.0 500.00000000 0.000000e+00 unknown -2000013 0.00000000 + ~nu_muR 911 2000014 0.0 500.00000000 0.000000e+00 unknown 2000014 0.00000000 + ~nu_muRbar 912 -2000014 0.0 500.00000000 0.000000e+00 unknown -2000014 0.00000000 + ~tau_2- 913 2000015 -1.0 500.00000000 0.000000e+00 unknown 2000015 0.00000000 + ~tau_2+ 914 -2000015 1.0 500.00000000 0.000000e+00 unknown -2000015 0.00000000 + ~nu_tauR 915 2000016 0.0 500.00000000 0.000000e+00 unknown 2000016 0.00000000 + ~nu_tauRbar 916 -2000016 0.0 500.00000000 0.000000e+00 unknown -2000016 0.00000000 + pi_tc0 917 3000111 0.0 110.00000000 0.000000e+00 unknown 3000111 0.00000000 + rho_tc0 918 3000113 0.0 210.00000000 0.000000e+00 unknown 3000113 0.00000000 + pi_tc+ 919 3000211 1.0 110.00000000 0.000000e+00 unknown 3000211 0.00000000 + pi_tc- 920 -3000211 -1.0 110.00000000 0.000000e+00 unknown -3000211 0.00000000 + rho_tc+ 921 3000213 1.0 210.00000000 0.000000e+00 unknown 3000213 0.00000000 + rho_tc- 922 -3000213 -1.0 210.00000000 0.000000e+00 unknown -3000213 0.00000000 + pi'_tc0 923 3000221 0.0 110.00000000 0.000000e+00 unknown 3000221 0.00000000 + omega_tc 924 3000223 0.0 210.00000000 0.000000e+00 unknown 3000223 0.00000000 + eta_tc0 925 3000331 0.0 350.00000000 0.000000e+00 unknown 3000331 0.00000000 + V8_tc 926 3100021 0.0 500.00000000 0.000000e+00 unknown 3100021 0.00000000 + pi_22_1_tc 927 3100111 0.0 125.00000000 0.000000e+00 unknown 3100111 0.00000000 + rho_11_tc 928 3100113 0.0 400.00000000 0.000000e+00 unknown 3100113 0.00000000 + pi_22_8_tc 929 3200111 0.0 250.00000000 0.000000e+00 unknown 3200111 0.00000000 + rho_12_tc 930 3200113 0.0 350.00000000 0.000000e+00 unknown 3200113 0.00000000 + rho_21_tc 931 3300113 0.0 350.00000000 0.000000e+00 unknown 3300113 0.00000000 + rho_22_tc 932 3400113 0.0 300.00000000 0.000000e+00 unknown 3400113 0.00000000 + d* 933 4000001 -0.3 400.00000000 0.000000e+00 unknown 4000001 0.00000000 + d*bar 934 -4000001 0.3 400.00000000 0.000000e+00 unknown -4000001 0.00000000 + u* 935 4000002 0.7 400.00000000 0.000000e+00 unknown 4000002 0.00000000 + u*bar 936 -4000002 -0.7 400.00000000 0.000000e+00 unknown -4000002 0.00000000 + e*- 937 4000011 -1.0 400.00000000 0.000000e+00 unknown 4000011 0.00000000 + e*bar+ 938 -4000011 1.0 400.00000000 0.000000e+00 unknown -4000011 0.00000000 + nu*_e0 939 4000012 0.0 400.00000000 0.000000e+00 unknown 4000012 0.00000000 + nu*_ebar0 940 -4000012 0.0 400.00000000 0.000000e+00 unknown -4000012 0.00000000 + gv 4900021 4900021 0.0 0.00000000 0.0000e+00 gv 4900021 0.00000000 + Zv 4900023 4900023 0.0 125.00000000 6.5800e-23 Zv 4900023 0.01000000 + qv 4900101 4900101 0.0 1.00000000 0.0000e+00 qv 4900101 0.00000000 + qvbar -4900101 -4900101 0.0 1.00000000 0.0000e+00 qvbar -4900101 0.00000000 + pivDiag 4900111 4900111 0.0 1.20000000 5.0000e-12 pivDiag 4900111 2.0000e-11 + pivUp 4900211 4900211 0.0 1.20000000 0.0000e+00 pivUp 4900211 0.00000000 + pivDn -4900211 -4900211 0.0 1.20000000 0.0000e+00 pivDn -4900211 0.00000000 + rhovDiag 4900113 4900113 0.0 1.20000000 0.0000e+00 rhovDiag 4900113 0.00000000 + rhovUp 4900213 4900213 0.0 1.20000000 0.0000e+00 rhovUp 4900213 0.00000000 + rhovDn -4900213 -4900213 0.0 1.20000000 0.0000e+00 rhovDn -4900213 0.00000000 + Graviton* 941 5000039 0.0 1000.00000000 0.000000e+00 unknown 5000039 0.00000000 + nu_Re 942 9900012 0.0 500.00000000 0.000000e+00 unknown 9900012 0.00000000 + nu_Rmu 943 9900014 0.0 500.00000000 0.000000e+00 unknown 9900014 0.00000000 + nu_Rtau 944 9900016 0.0 500.00000000 0.000000e+00 unknown 9900016 0.00000000 + Z_R0 945 9900023 0.0 1200.00000000 0.000000e+00 unknown 9900023 0.00000000 + W_R+ 946 9900024 1.0 750.00000000 0.000000e+00 unknown 9900024 0.00000000 + W_R- 947 -9900024 -1.0 750.00000000 0.000000e+00 unknown -9900024 0.00000000 + H_L++ 948 9900041 2.0 200.00000000 0.000000e+00 unknown 9900041 0.00000000 + H_L-- 949 -9900041 -2.0 200.00000000 0.000000e+00 unknown -9900041 0.00000000 + H_R++ 950 9900042 2.0 200.00000000 0.000000e+00 unknown 9900042 0.00000000 + H_R-- 951 -9900042 -2.0 200.00000000 0.000000e+00 unknown -9900042 0.00000000 + He3[0.0] 49 1000020030 2.0 2.80923000 1.000000e+15 He3 0 0.00000000 + He3~[0.0] 391 -1000020030 -2.0 2.80923000 0.000000e+00 anti-He3 0 0.00000000 + Li7[0.0] 988 1000030070 3.0 6.53536500 0.000000e+00 unknown 0 0.00000000 + Be8[0.0] 992 1000040080 4.0 7.45689300 0.000000e+00 unknown 0 0.00000000 + Be9[0.0] 959 1000040090 4.0 8.39479200 0.000000e+00 unknown 0 0.00000000 + Be10[0.0] 993 1000040100 4.0 9.32754500 0.000000e+00 unknown 0 0.00000000 + B10[0.0] 994 1000050100 5.0 9.32698900 0.000000e+00 unknown 0 0.00000000 + B11[0.0] 974 1000050110 5.0 10.25510100 0.000000e+00 unknown 0 0.00000000 + B12[0.0] 975 1000050120 5.0 11.19129500 0.000000e+00 unknown 0 0.00000000 + C12[0.0] 953 1000060120 6.0 11.17490000 0.000000e+00 unknown 0 0.00000000 + C13[0.0] 976 1000060130 6.0 12.11254500 0.000000e+00 unknown 0 0.00000000 + C14[0.0] 977 1000060140 6.0 13.04393400 0.000000e+00 unknown 0 0.00000000 + N14[0.0] 955 1000070140 7.0 13.04378000 0.000000e+00 unknown 0 0.00000000 + N15[0.0] 982 1000070150 7.0 13.04377800 0.000000e+00 unknown 0 0.00000000 + N16[0.0] 995 1000070160 7.0 14.90958500 0.000000e+00 unknown 0 0.00000000 + O16[0.0] 956 1000080160 8.0 14.89510000 0.000000e+00 unknown 0 0.00000000 + O17[0.0] 996 1000080170 8.0 15.83458700 0.000000e+00 unknown 0 0.00000000 + O18[0.0] 967 1000080180 8.0 16.76610800 0.000000e+00 unknown 0 0.00000000 + O19[0.0] 997 1000080190 8.0 17.70171700 0.000000e+00 unknown 0 0.00000000 + F19[0.0] 960 1000090190 9.0 17.69689600 0.000000e+00 unknown 0 0.00000000 + Ne22[0.0] 983 1000100220 10.0 20.48484100 0.000000e+00 unknown 0 0.00000000 + Ne23[0.0] 998 1000100230 10.0 21.41920500 0.000000e+00 unknown 0 0.00000000 + Na24[0.0] 999 1000110240 11.0 22.34743500 0.000000e+00 unknown 0 0.00000000 + Mg24[0.0] 979 1000120240 12.0 22.34192000 0.000000e+00 unknown 0 0.00000000 + Mg25[0.0] 989 1000120250 12.0 23.27415400 0.000000e+00 unknown 0 0.00000000 + Mg26[0.0] 980 1000120260 12.0 24.20262600 0.000000e+00 unknown 0 0.00000000 + Mg27[0.0] 981 1000120270 12.0 25.13574800 0.000000e+00 unknown 0 0.00000000 + Al27[0.0] 952 1000130270 13.0 25.12650000 0.000000e+00 unknown 0 0.00000000 + Al28[0.0] 972 1000130280 13.0 26.06497800 0.000000e+00 unknown 0 0.00000000 + Si28[0.0] 957 1000140280 14.0 26.05320000 0.000000e+00 unknown 0 0.00000000 + Si29[0.0] 964 1000140290 14.0 26.99142700 0.000000e+00 unknown 0 0.00000000 + Si30[0.0] 968 1000140300 14.0 27.92038300 0.000000e+00 unknown 0 0.00000000 + P31[0.0] 1000 1000150310 15.0 28.85186900 0.000000e+00 unknown 0 0.00000000 + Cl39[0.0] 1001 1000170390 17.0 36.29846000 0.000000e+00 unknown 0 0.00000000 + Cl40[0.0] 1002 1000170400 17.0 37.23220100 0.000000e+00 unknown 0 0.00000000 + Ar36[0.0] 1003 1000180360 18.0 33.50354900 0.000000e+00 unknown 0 0.00000000 + Ar40[0.0] 973 1000180400 18.0 37.22471500 0.000000e+00 unknown 0 0.00000000 + Cr50[0.0] 1004 1000240500 24.0 46.52443900 0.000000e+00 unknown 0 0.00000000 + Cr52[0.0] 978 1000240520 24.0 48.37010000 0.000000e+00 unknown 0 0.00000000 + Cr53[0.0] 990 1000240530 24.0 49.31389400 0.000000e+00 unknown 0 0.00000000 + Cr54[0.0] 1005 1000240540 24.0 50.24374100 0.000000e+00 unknown 0 0.00000000 + Mn55[0.0] 991 1000250550 25.0 51.17445700 0.000000e+00 unknown 0 0.00000000 + Fe54[0.0] 966 1000260540 26.0 50.24442100 0.000000e+00 unknown 0 0.00000000 + Fe56[0.0] 961 1000260560 26.0 52.10305600 0.000000e+00 unknown 0 0.00000000 + Fe57[0.0] 969 1000260570 26.0 53.03497500 0.000000e+00 unknown 0 0.00000000 + Fe59[0.0] 1006 1000260590 26.0 54.89748000 0.000000e+00 unknown 0 0.00000000 + Ni58[0.0] 984 1000280580 28.0 53.96642200 0.000000e+00 unknown 0 0.00000000 + Ni60[0.0] 985 1000280600 28.0 55.82516400 0.000000e+00 unknown 0 0.00000000 + Ni61[0.0] 1007 1000280610 28.0 56.75690900 0.000000e+00 unknown 0 0.00000000 + Ni62[0.0] 986 1000280620 28.0 57.68587700 0.000000e+00 unknown 0 0.00000000 + Ni63[0.0] 1008 1000280630 28.0 58.61860500 0.000000e+00 unknown 0 0.00000000 + Ni64[0.0] 987 1000280640 28.0 59.54851200 0.000000e+00 unknown 0 0.00000000 + Cu63[0.0] 954 1000290630 29.0 58.61860000 0.000000e+00 unknown 0 0.00000000 + Cu65[0.0] 958 1000290650 29.0 60.47984200 0.000000e+00 unknown 0 0.00000000 + Mo92[0.0] 1009 1000420920 42.0 85.61063000 0.000000e+00 unknown 0 0.00000000 + Mo95[0.0] 1010 1000420950 42.0 88.40421000 0.000000e+00 unknown 0 0.00000000 + Mo96[0.0] 1011 1000420960 42.0 89.33462100 0.000000e+00 unknown 0 0.00000000 + Mo97[0.0] 1012 1000420970 42.0 90.26736500 0.000000e+00 unknown 0 0.00000000 + Mo98[0.0] 1013 1000420980 42.0 91.19828700 0.000000e+00 unknown 0 0.00000000 + Mo100[0.0] 1014 1000421000 42.0 93.06320300 0.000000e+00 unknown 0 0.00000000 + Pd108[0.0] 1015 1000461080 46.0 100.51181600 0.000000e+00 unknown 0 0.00000000 + Au197[0.0] 1020 1000791970 79.0 183.43336000 0.000000e+00 unknown 0 0.00000000 + Pb207[0.0] 962 1000822070 82.0 192.79676500 0.000000e+00 unknown 0 0.00000000 + Pb208[0.0] 963 1000822080 82.0 193.72896200 0.000000e+00 unknown 0 0.00000000 + Pb206[0.0] 965 1000822060 82.0 191.86393700 0.000000e+00 unknown 0 0.00000000 + Pb204[0.0] 970 1000822040 82.0 189.99962700 0.000000e+00 unknown 0 0.00000000 + Intermediate 971 -99000000 0.0 0.00000000 0.000000e+00 unknown 0 0.00000000 +# +END PARTICLE diff --git a/GaudiPartProp/tests/scripts/newparts.py b/GaudiPartProp/tests/scripts/newparts.py new file mode 100755 index 0000000000000000000000000000000000000000..9d9be9679ebb9e42cd3e73ab3673a77c9b359090 --- /dev/null +++ b/GaudiPartProp/tests/scripts/newparts.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file newparts.py +# Simple test for adding new particle +# @author Vanya BELYAEV Ivan.Belyaev@itep.ru +# @date 2018-07-12 +# ============================================================================= +""" Simple test for adding new particle +""" + +# ============================================================================= +__author__ = "Vanya BELYAEV Ivan.Belyaev@itep.ru" +from pathlib import Path + +import GaudiPartProp.decorators + +# ============================================================================= +# The following lines are misunderstood by flake8 - the imports are needed as they +# have necessary side effects +import GaudiPartProp.PartPropAlg # noqa: F401 +import GaudiPartProp.Service # noqa: F401 +from Configurables import Gaudi__ParticlePropertySvc +from GaudiKernel.SystemOfUnits import GeV, second +from GaudiPython.Bindings import AppMgr + +# ============================================================================= +## test the nodes +Gaudi__ParticlePropertySvc( + ParticlePropertiesFile=str( + Path(__file__).parent / "ParticleTable.dddb-20200424.txt" + ) +) + +gaudi = AppMgr() +gaudi.initialize() + + +## simple test-function +def test(): + """Simple function for the test""" + pps = gaudi.gaudiPartProp() + + try: + # If we have no ParticleProperties this isn't going to work + c = pps.find("chi_c1(1P)") + + ## redefine properties + line1 = "%s 0 %d 0.0 %g %20.12g %s %d %g " % ( + c.name(), + c.pid().pid(), + c.mass() / GeV, + c.lifetime() / second, + c.evtGen(), + c.pythia(), + c.maxWidth() / GeV, + ) + line2 = "%s 0 %d 0.0 %g %20.12g %s %d %g " % ( + c.name(), + c.pid().pid(), + c.mass() / GeV, + -c.width() / GeV, + c.evtGen(), + c.pythia(), + c.maxWidth() / GeV, + ) + + pps.Particles = [line1] + pps.Particles = [line2] + except ReferenceError: + pass + + +# ============================================================================= +if "__main__" == __name__: + test() diff --git a/GaudiPartProp/tests/scripts/pids.py b/GaudiPartProp/tests/scripts/pids.py new file mode 100755 index 0000000000000000000000000000000000000000..bd42b8c28c4f2105a9f893ad4096056718924f5b --- /dev/null +++ b/GaudiPartProp/tests/scripts/pids.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +##################################################################################### +# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations # +# # +# This software is distributed under the terms of the Apache version 2 licence, # +# copied verbatim in the file "LICENSE". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +##################################################################################### +# ============================================================================= +## @file PartPropSvc.py +# Demo-file for interactive work with new Particle Property Service +# @author Vanya BELYAEV Ivan.Belyaev@nikhef.nl +# @date 2008-12-02 +# ============================================================================= +""" +Demo-file for interactive work with new Particle Property Service +""" + +__author__ = "Vanya BELYAEV Ivan.Belyaev@nikhef.nl" +from pathlib import Path + +# The following lines are misunderstood by flake8 - the imports are needed as +# they have necessary side effects +import GaudiPartProp.PartPropAlg # noqa: F401 +import GaudiPartProp.Service # noqa: F401 + +# from DDDB.CheckDD4Hep import UseDD4Hep +# if UseDD4Hep: +# # use a predefined particle table file +from Configurables import Gaudi__ParticlePropertySvc + +## test the nodes +from GaudiPartProp.Nodes import Gaudi +from GaudiPython.Bindings import AppMgr + +Gaudi__ParticlePropertySvc( + ParticlePropertiesFile=str( + Path(__file__).parent / "ParticleTable.dddb-20200424.txt" + ) +) + +gaudi = AppMgr() +gaudi.initialize() + + +## simple test-function +def test(): + """Simple function for the test""" + pps = gaudi.gaudiPartProp() + + ## get all known pids + all = pps.get(lambda x: True) + + pids = set() + for p in all: + pids.add(p.particleID().pid()) + + ## add "special" values + pids.add(10022) + pids.add(20022) + ## + pids.add(30343) + pids.add(30353) + pids.add(30363) + ## + pids.add(1009002) + pids.add(1000542) + pids.add(1000522) + pids.add(1000039) + pids.add(3100021) + pids.add(480000000) + pids.add(-990000000) + + for p in sorted(pids): + pp = Gaudi.ParticleID(p) + + print( + "({})".format( + ", ".join( + str(x) + for x in ( + pp.pid(), + pp.abspid(), + pp.isValid(), + pp.isSM(), + pp.isMeson(), + pp.isBaryon(), + pp.isHadron(), + pp.isLepton(), + pp.isNucleus(), + pp.isQuark(), + pp.hasQuarks(), + pp.hasDown(), + pp.hasUp(), + pp.hasStrange(), + pp.hasCharm(), + pp.hasBottom(), + pp.hasTop(), + pp.hasBottomPrime(), + pp.hasTopPrime(), + pp.threeCharge(), + pp.jSpin(), + pp.sSpin(), + pp.lSpin(), + pp.Z(), + pp.A(), + pp.nLambda(), + pp.fundamentalID(), + pp.extraBits(), + ) + ) + ) + ) + + +if "__main__" == __name__: + test() diff --git a/GaudiPython/dict/kernel.h b/GaudiPython/dict/kernel.h index d7b790349083bbe235a16e741f620dc9b56e052e..26f6562a07b37feb1b1d1313c7028daf860ebc1c 100644 --- a/GaudiPython/dict/kernel.h +++ b/GaudiPython/dict/kernel.h @@ -25,7 +25,6 @@ #include "GaudiKernel/IRegistry.h" #include "GaudiKernel/Map.h" #include "GaudiKernel/MapBase.h" -#include "GaudiKernel/ParticleProperty.h" #include "GaudiKernel/Range.h" #include "GaudiKernel/SerializeSTL.h" #include "GaudiKernel/Stat.h" diff --git a/GaudiPython/dict/selection_fragment_main.xml b/GaudiPython/dict/selection_fragment_main.xml index db2f7f5f854df43a73d1487e2dca505cfea8ba1a..40b223c2edc6fc74fd31d7840a819117eeb126c1 100644 --- a/GaudiPython/dict/selection_fragment_main.xml +++ b/GaudiPython/dict/selection_fragment_main.xml @@ -51,7 +51,6 @@ <class pattern = "AIDA::I*" /> <class name = "GaudiPython::PyAlgorithm"/> <class name = "GaudiPython::CallbackStreamBuf"/> - <class name = "ParticleProperty"/> <class name = "Gaudi::StringKey" /> <class name = "Gaudi::Utils::MapBase" /> diff --git a/ci-utils/preset-default.cmake b/ci-utils/preset-default.cmake index c42425255becfe92c2901a17f552a5389f4133bc..145c7e81004f50413d1296b7696a449a767e9f72 100644 --- a/ci-utils/preset-default.cmake +++ b/ci-utils/preset-default.cmake @@ -10,4 +10,5 @@ # set(GAUDI_USE_INTELAMPLIFIER OFF CACHE BOOL "") # set(GAUDI_USE_JEMALLOC ON CACHE BOOL "") # set(GAUDI_ENABLE_GAUDIALG OFF CACHE BOOL "") +# set(GAUDI_ENABLE_GAUDIPARTPROP ON CACHE BOOL "") # set(BUILD_TESTING ON CACHE BOOL "") diff --git a/ci-utils/preset-full.cmake b/ci-utils/preset-full.cmake index 98ccb053a525d1ee0f5bd2aa097724a28a3a966d..6c7c58d008c1ed4d337968ade75115c2c118f401 100644 --- a/ci-utils/preset-full.cmake +++ b/ci-utils/preset-full.cmake @@ -10,4 +10,5 @@ set(GAUDI_USE_DOXYGEN ON CACHE BOOL "") set(GAUDI_USE_INTELAMPLIFIER ON CACHE BOOL "") set(GAUDI_USE_JEMALLOC ON CACHE BOOL "") set(GAUDI_ENABLE_GAUDIALG ON CACHE BOOL "") +set(GAUDI_ENABLE_GAUDIPARTPROP ON CACHE BOOL "") set(BUILD_TESTING ON CACHE BOOL "") diff --git a/ci-utils/preset-minimal.cmake b/ci-utils/preset-minimal.cmake index 8a58d67413ad029854b4a15e9ab23f484f93759d..dd8e50d0746a62a26bd3a0e6535c7f6aa2305d1d 100644 --- a/ci-utils/preset-minimal.cmake +++ b/ci-utils/preset-minimal.cmake @@ -10,4 +10,5 @@ set(GAUDI_USE_DOXYGEN OFF CACHE BOOL "") set(GAUDI_USE_INTELAMPLIFIER OFF CACHE BOOL "") set(GAUDI_USE_JEMALLOC OFF CACHE BOOL "") set(GAUDI_ENABLE_GAUDIALG OFF CACHE BOOL "") +set(GAUDI_ENABLE_GAUDIPARTPROP OFF CACHE BOOL "") set(BUILD_TESTING OFF CACHE BOOL "") diff --git a/ci-utils/preset-no-AIDA.cmake b/ci-utils/preset-no-AIDA.cmake index 756ecda66f05d85e4221485d1efecc1dcd971055..bffb63416008d48cf0e0b8d123dd4d4cee220e55 100644 --- a/ci-utils/preset-no-AIDA.cmake +++ b/ci-utils/preset-no-AIDA.cmake @@ -10,4 +10,5 @@ set(GAUDI_USE_DOXYGEN ON CACHE BOOL "") set(GAUDI_USE_INTELAMPLIFIER ON CACHE BOOL "") set(GAUDI_USE_JEMALLOC ON CACHE BOOL "") set(GAUDI_ENABLE_GAUDIALG OFF CACHE BOOL "") +set(GAUDI_ENABLE_GAUDIPARTPROP ON CACHE BOOL "") set(BUILD_TESTING ON CACHE BOOL "") diff --git a/ci-utils/preset-no-GaudiAlg.cmake b/ci-utils/preset-no-GaudiAlg.cmake index 0bb43683554b3490ee655140b5630e769b2e4ebe..e3c5668a649a5bc3cdaad79f8a8bee99c0c53db0 100644 --- a/ci-utils/preset-no-GaudiAlg.cmake +++ b/ci-utils/preset-no-GaudiAlg.cmake @@ -10,4 +10,5 @@ set(GAUDI_USE_DOXYGEN ON CACHE BOOL "") set(GAUDI_USE_INTELAMPLIFIER ON CACHE BOOL "") set(GAUDI_USE_JEMALLOC ON CACHE BOOL "") set(GAUDI_ENABLE_GAUDIALG OFF CACHE BOOL "") +set(GAUDI_ENABLE_GAUDIPARTPROP ON CACHE BOOL "") set(BUILD_TESTING ON CACHE BOOL "") diff --git a/ci-utils/preset-no-test.cmake b/ci-utils/preset-no-test.cmake index 81f183cf90c8c3befd8067b1786b4eb46a51549d..f31bf21593708716f2545a8bbc1adea4d5594606 100644 --- a/ci-utils/preset-no-test.cmake +++ b/ci-utils/preset-no-test.cmake @@ -10,4 +10,5 @@ # set(GAUDI_USE_INTELAMPLIFIER OFF CACHE BOOL "") # set(GAUDI_USE_JEMALLOC ON CACHE BOOL "") # set(GAUDI_ENABLE_GAUDIALG OFF CACHE BOOL "") +# set(GAUDI_ENABLE_GAUDIPARTPROP ON CACHE BOOL "") set(BUILD_TESTING OFF CACHE BOOL "") diff --git a/cmake/GaudiDependencies.cmake b/cmake/GaudiDependencies.cmake index cc39608902803d08447021f1b4094f90ebc68244..82a529f7b08dd83771ec3bbfd9a3e9dc1558d809 100644 --- a/cmake/GaudiDependencies.cmake +++ b/cmake/GaudiDependencies.cmake @@ -139,6 +139,7 @@ endif() set(gperftools_pkgconfig_module "libprofiler>=2.7.0") option(GAUDI_ENABLE_GAUDIALG "Build the subdirectory GaudiAlg" NO) +option(GAUDI_ENABLE_GAUDIPARTPROP "Build the subdirectory GaudiPartProp" YES) foreach(dep IN LISTS deps) string(TOUPPER ${dep} DEP)