diff --git a/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/python/ISF_HepMC_ToolsConfig.py b/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/python/ISF_HepMC_ToolsConfig.py index 86aa55787dfab8fb00165f8c553645a5a223258e..87d00a7c3f629b0825c93180107d1446bad18aad 100644 --- a/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/python/ISF_HepMC_ToolsConfig.py +++ b/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/python/ISF_HepMC_ToolsConfig.py @@ -92,6 +92,8 @@ def getGenParticleInteractingFilter(name="ISF_GenParticleInteractingFilter", **k simdict = simFlags.specialConfiguration.get_Value() if simdict is not None and "InteractingPDGCodes" in simdict: kwargs.setdefault('AdditionalInteractingParticleTypes', simdict["InteractingPDGCodes"]) + if simdict is not None and "NonInteractingPDGCodes" in simdict: + kwargs.setdefault('AdditionalNonInteractingParticleTypes', simdict["InteractingNonPDGCodes"]) return CfgMgr.ISF__GenParticleInteractingFilter(name, **kwargs) def getEtaPhiFilter(name="ISF_EtaPhiFilter", **kwargs): diff --git a/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.cxx b/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.cxx index b48885d715007281faadcd718184258614ce67b3..7eee7c20747b3defa5caacc2c13f876bf2d1baf4 100644 --- a/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.cxx +++ b/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.cxx @@ -22,6 +22,7 @@ ISF::GenParticleInteractingFilter::GenParticleInteractingFilter( const std::stri : base_class(t,n,p) { declareProperty("AdditionalInteractingParticleTypes", m_additionalInteractingParticleTypes); + declareProperty("AdditionalNonInteractingParticleTypes", m_additionalNonInteractingParticleTypes); } StatusCode ISF::GenParticleInteractingFilter::initialize() @@ -35,6 +36,33 @@ StatusCode ISF::GenParticleInteractingFilter::initialize() ATH_MSG_DEBUG(" " << pdg_id); } } + if(m_additionalNonInteractingParticleTypes.empty()) { + ATH_MSG_DEBUG("No additional particle types will be classified as non-interacting."); + } + else { + ATH_MSG_DEBUG("Will classify particles with the following additional PDG codes as non-interacting:"); + for(const auto& pdg_id : m_additionalNonInteractingParticleTypes) { + ATH_MSG_DEBUG(" " << pdg_id); + } + } + if (!m_additionalInteractingParticleTypes.empty() && !m_additionalNonInteractingParticleTypes.empty()) { + //Insanity check + bool clash(false); + for (const auto& pdg_id : m_additionalInteractingParticleTypes) { + if (find(m_additionalNonInteractingParticleTypes.begin(), + m_additionalNonInteractingParticleTypes.end(), + pdg_id) != m_additionalNonInteractingParticleTypes.end()) + { + ATH_MSG_ERROR("Particle with PDG code " << pdg_id << " requested to be classified as both interacting and non-interacting."); + clash=true; + } + } + if (clash) { + ATH_MSG_ERROR("Please check your configuration!"); + return StatusCode::FAILURE; + } + } + return StatusCode::SUCCESS; } @@ -45,6 +73,9 @@ bool ISF::GenParticleInteractingFilter::pass(const HepMC::GenParticle& particle) const bool isInteracting = find(m_additionalInteractingParticleTypes.begin(), m_additionalInteractingParticleTypes.end(), pdg_id) != m_additionalInteractingParticleTypes.end(); - return !MC::isNonInteracting( &particle ) || isInteracting; + const bool isNonInteracting = find(m_additionalNonInteractingParticleTypes.begin(), + m_additionalNonInteractingParticleTypes.end(), + pdg_id) != m_additionalNonInteractingParticleTypes.end(); + return !(MC::isNonInteracting( &particle ) || isNonInteracting) || isInteracting; } diff --git a/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.h b/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.h index 387b4fd6cb6c1912f380b78bd3644efcf65b7cc2..97f0011043c85df66ccbcbabcbe3737547953f16 100644 --- a/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.h +++ b/Simulation/ISF/ISF_HepMC/ISF_HepMC_Tools/src/GenParticleInteractingFilter.h @@ -46,6 +46,9 @@ namespace ISF { /** Additional PDG codes to classify as interacting */ std::vector<int> m_additionalInteractingParticleTypes; + + /** Additional PDG codes to classify as non-interacting */ + std::vector<int> m_additionalNonInteractingParticleTypes; }; }