From fee0b4b7efb88d6f3306643dacc98ff0a8623eb1 Mon Sep 17 00:00:00 2001 From: Savanna Marie Shaw Date: Mon, 22 Jul 2019 14:33:47 +0200 Subject: [PATCH 1/3] Ensure that the ComboHypo doesn't double count objects Adding a check that in addition to each leg of a combined chain passing individually, the total number of unique objects is high enough to pass the chain. This avoids chains like HLT_mu6_mu4 from being passed by only a single muon which passes both mu6 and mu4. --- .../DecisionHandling/src/ComboHypo.cxx | 30 +++++++++++++++++-- .../DecisionHandling/src/ComboHypo.h | 3 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx index e8c12dba231..22ad49e8b99 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx @@ -117,7 +117,8 @@ StatusCode ComboHypo::copyDecisions( const DecisionIDContainer& passing, const E return StatusCode::SUCCESS; } -void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, const EventContext& context) const { +void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, std::map>& featureMap, const EventContext& context) const { + for ( size_t i = 0; i < m_inputs.size(); ++i ) { auto inputHandle = SG::makeHandle( m_inputs.at(i), context ); if ( inputHandle.isValid() ) { @@ -128,6 +129,19 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, const E for ( DecisionID id: decisionIDs( decision ) ) { ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) ); thisInputDmap[id] ++; + //map features to make sure we are considering unique objects + auto features = decision->linkColNames(); + int idx=-1; + for(uint i=0; i=0){ + featureMap[id][decision->linkColKeys()[idx]] ++; + } + else ATH_MSG_DEBUG("Did not find "<& dmap, const E } i++; } + } StatusCode ComboHypo::execute(const EventContext& context ) const { @@ -158,14 +173,19 @@ StatusCode ComboHypo::execute(const EventContext& context ) const { // this map is filled with the count of positive decisions from each input std::vector< MultiplicityMap > dmap( m_inputs.size() ); - fillDecisionsMap( dmap, context ); + std::map> dmapFeatures; + uint nRequiredUnique; + fillDecisionsMap( dmap, dmapFeatures, context ); for ( auto m: m_multiplicitiesReqMap ) { + nRequiredUnique=0; const DecisionID requiredDecisionID = HLT::Identifier( m.first ).numeric(); bool overallDecision = true; for ( size_t inputContainerIndex = 0; inputContainerIndex < m.second.size(); ++inputContainerIndex ) { const int requiredMultiplicity = m.second[ inputContainerIndex ]; + nRequiredUnique += requiredMultiplicity; + //check each leg of the chain passes with required multiplicity const int observedMultiplicity = dmap[ inputContainerIndex ][ requiredDecisionID ]; ATH_MSG_DEBUG( "Required multiplicity " << requiredMultiplicity << " for chain " << m.first<< ": observed multiplicity " << observedMultiplicity << " in container " << inputContainerIndex ); if ( observedMultiplicity < requiredMultiplicity ) { @@ -173,6 +193,12 @@ StatusCode ComboHypo::execute(const EventContext& context ) const { break; } } + + //check that the multiplicity of unique features is high enough + ATH_MSG_DEBUG("Number of unique decisions: "<<(dmapFeatures[HLT::Identifier(m.first)]).size()<<", number of required unique decisions: "< MultiplicityMap; - void fillDecisionsMap( std::vector< MultiplicityMap >& dmap, const EventContext& context) const; + void fillDecisionsMap( std::vector< MultiplicityMap >& dmap, std::map>& featureMap, const EventContext& context) const; + }; #endif // DECISIONHANDLING_COMBOHYPO_H -- GitLab From 705043e0a46a7aa19db81743ee79b97fdc09bcbb Mon Sep 17 00:00:00 2001 From: Savanna Marie Shaw Date: Wed, 24 Jul 2019 15:34:42 +0200 Subject: [PATCH 2/3] Update uniqueness check --- Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx index 22ad49e8b99..1f25dff3bea 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx @@ -139,7 +139,7 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, std::ma } } if(idx>=0){ - featureMap[id][decision->linkColKeys()[idx]] ++; + featureMap[id][decision->linkColKeys()[idx]+decision->linkColIndices()[idx]] ++; } else ATH_MSG_DEBUG("Did not find "< Date: Thu, 25 Jul 2019 10:19:45 +0200 Subject: [PATCH 3/3] Add comments, update references --- Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx | 8 +++++--- .../share/q221_RDOtoRDOTrig_mt1_build.ref | 4 ++-- .../TrigUpgradeTest/share/full_menu_build.ref | 11 ++--------- .../TrigValidation/TrigUpgradeTest/share/slice_mu.ref | 6 ++---- .../TrigUpgradeTest/share/slice_mu_mc.ref | 8 ++------ 5 files changed, 13 insertions(+), 24 deletions(-) diff --git a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx index 1f25dff3bea..1c52ba93e2d 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx @@ -129,7 +129,10 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, std::ma for ( DecisionID id: decisionIDs( decision ) ) { ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) ); thisInputDmap[id] ++; - //map features to make sure we are considering unique objects + //Map features to make sure we are considering unique objects. decision->linkColKeys()[idx] + //is the feature collection's name-hash, which is unique per-RoI. Adding the object index + //allows to correctly identify different objects within the same RoI (example: EF muons) + //or different objects produced per event (example: MET) as being unique auto features = decision->linkColNames(); int idx=-1; for(uint i=0; i& dmap, std::ma ATH_MSG_DEBUG(" +++ " << HLT::Identifier( m.first ) <<" mult: "<