diff --git a/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx index d6fdf943c3c83cf817a3029d6c74f86162652e55..a9ae9559fdfc0a3e7b0e7170c94c3fe98d315603 100644 --- a/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx +++ b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx @@ -18,6 +18,8 @@ namespace xAOD { AUX_VARIABLE( linkColKeys ); AUX_VARIABLE( linkColIndices ); AUX_VARIABLE( linkColClids ); + + AUX_VARIABLE( decisions ); } } // namespace xAOD diff --git a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx index 50905d65e450824752caf6dcab3f24291161530e..c0603fb755d73a457b5927bf541d7f068f2cae46 100644 --- a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx +++ b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx @@ -47,6 +47,9 @@ namespace xAOD { AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::string, name, setName ) + AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::vector<TrigCompositeUtils::DecisionID>, + decisions, setDecisions ) + // ///////////////////////////////////////////////////////////////////////////// @@ -97,6 +100,10 @@ namespace xAOD { if (newName == "") { newName = name; } + if (newName == "self") { + if (s_throwOnCopyError) throw std::runtime_error("It does not make sense for the 'self' link to be in a collection. There can be only one."); + return false; + } const std::string mangledName = name + s_collectionSuffix; const std::string mangledNewName = newName + s_collectionSuffix; if (other.hasObjectLink(mangledName)) { @@ -123,8 +130,8 @@ namespace xAOD { bool TrigComposite_v1::copyAllLinksFrom(const xAOD::TrigComposite_v1& other) { bool didCopy = false; for (const std::string& name : other.linkColNames()) { - // Cannot copy any 'self' links as *this does not know its own location in its parent container - if (name == "self") continue; + // Cannot copy any 'self' link(s) as *this does not know its own location in its parent container + if (name == "self" || name == "self" + s_collectionSuffix) continue; // Check we don't have one (or more) entries with this raw name (raw = might be mangled). if (this->hasObjectLink(name)) continue; // Check if the link is for a single object or collection of objects by looking for the mangled suffix @@ -173,6 +180,17 @@ namespace xAOD { return hasObjectLink( mangledName ); } + bool TrigComposite_v1::hasObjectLinkExact(const std::string& name, const uint32_t key, const uint16_t index, const uint32_t clid) const { + for (size_t i = 0; i < this->linkColNames().size(); ++i) { + if (this->linkColNames().at(i) != name) continue; + if (this->linkColKeys().at(i) != key) continue; + if (this->linkColIndices().at(i) != index) continue; + if (this->linkColClids().at(i) != clid) continue; + return true; + } + return false; + } + AUXSTORE_OBJECT_GETTER( TrigComposite_v1, std::vector< std::string >, linkColNames ) AUXSTORE_OBJECT_GETTER( TrigComposite_v1, std::vector< uint32_t >, @@ -209,7 +227,7 @@ namespace xAOD { void TrigComposite_v1::typelessSetObjectLink( const std::string& name, const uint32_t key, const uint32_t clid, const uint16_t beginIndex, const uint16_t endIndex ) { // Loop over collections - if ( endIndex - beginIndex > 1 ) { + if ( endIndex - beginIndex > 1 ) { // Adding a *collection* of links // Check uniqueness const std::string mangledName = name + s_collectionSuffix; @@ -247,7 +265,7 @@ namespace xAOD { this->linkColClidsNC().push_back( clid ); } } - else { + else { // Adding a *single* link // Check uniqueness if ( std::find( linkColNamesNC().begin(), linkColNamesNC().end(), name ) == linkColNamesNC().end() ) { @@ -280,12 +298,19 @@ namespace xAOD { std::ostream& operator<<(std::ostream& os, const xAOD::TrigComposite_v1& tc) { - os << "TrigComposite_v1 '" << tc.name() << "' link: name, key, index, CLID" << std::endl; + os << "TrigComposite_v1 name:'" << tc.name() << "'" << std::endl; + os << " N Lnks:" << tc.linkColNames().size(); for (size_t i=0; i<tc.linkColNames().size(); ++i){ - os << tc.linkColNames()[i] << ", "; - os << tc.linkColKeys()[i] << ", "; - os << tc.linkColIndices()[i] << ", "; - os << tc.linkColClids()[i] << std::endl; + if (!i) os << std::endl; + os << " Link Name:" << tc.linkColNames()[i]; + os << ", Key:" << tc.linkColKeys()[i]; + os << ", Index:" << tc.linkColIndices()[i]; + os << ", CLID:" << tc.linkColClids()[i]; + if (i != tc.linkColNames().size() - 1) os << std::endl; + } + if (tc.decisions().size()) { + os << std::endl << " N Decisions: '" << tc.decisions().size() << std::endl << " "; + for (const TrigCompositeUtils::DecisionID id : tc.decisions()) os << id << ", "; } return os; } diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h b/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h index 32524ccb8d3133b433503338bf811cd71a1dcd2e..6fc5a85eec5a526e1af68657fd44b202c3c74789 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h +++ b/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h @@ -11,8 +11,6 @@ // Local include(s): #include "xAODTrigger/versions/TrigComposite_v1.h" -#include <set> - namespace xAOD{ /// Declare the latest version of the class typedef TrigComposite_v1 TrigComposite; @@ -20,9 +18,6 @@ namespace xAOD{ namespace TrigCompositeUtils{ typedef xAOD::TrigComposite Decision; - - typedef unsigned int DecisionID; - typedef std::set<DecisionID> DecisionIDContainer; } // Declare a CLID for the type: diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h index a930c557c246d21a8ce1ae5b7aa37d3da8c18465..fce55c86b240c21e0ed0c09e311e6487ed1aebcf 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h +++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h @@ -18,6 +18,8 @@ extern "C" { // xAOD include(s): #include "xAODCore/AuxContainerBase.h" +#include "xAODTrigger/TrigComposite.h" + namespace xAOD { /// Auxiliary store for TrigComposite containers @@ -41,6 +43,8 @@ namespace xAOD { std::vector< std::vector< uint16_t > > linkColIndices; std::vector< std::vector< uint32_t > > linkColClids; + std::vector< std::vector< TrigCompositeUtils::DecisionID > > decisions; + }; // class TrigCompositeAuxContainer_v2 } // namespace xAOD diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h index b65c66e1b880f035c1d2cd9b6e3624d65b05836b..6b529cabc190dd0102630bb320c80a2a6ca45c79 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h +++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h @@ -14,12 +14,18 @@ extern "C" { } #include <string> #include <vector> +#include <set> // EDM include(s): #include "AthContainers/AuxElement.h" #include "AthLinks/ElementLink.h" #include "AthLinks/ElementLinkVector.h" +namespace TrigCompositeUtils{ + typedef unsigned int DecisionID; + typedef std::set<DecisionID> DecisionIDContainer; +} + namespace xAOD { /// Class used to describe composite objects in the HLT @@ -54,6 +60,11 @@ namespace xAOD { /// Set a human-readable name for the object void setName( const std::string& name ); + /// Get positive HLT chain decisions associated with this TrigComposite. Navigation use + const std::vector<TrigCompositeUtils::DecisionID>& decisions() const; + /// Set positive HLT chain decisions associated with this TrigComposite. Navigation use + void setDecisions( const std::vector<TrigCompositeUtils::DecisionID>& decisions ); + /// @} /// @name Functions for accessing basic properties on the object @@ -94,11 +105,11 @@ namespace xAOD { template< class OBJECT > const OBJECT* object( const std::string& name ) const; - /// Add a link to a single object within a collection + /// Add a link to a single object within a collection. Performs de-duplication template< class CONTAINER > bool addObjectCollectionLink( const std::string& collectionName, const ElementLink< CONTAINER >& link ); - /// Add links to multiple objects within a collection + /// Add links to multiple objects within a collection. Performs de-duplication template< class CONTAINER > bool addObjectCollectionLinks( const std::string& collectionName, const ElementLinkVector< CONTAINER >& links ); @@ -176,6 +187,9 @@ namespace xAOD { /// Raw access to the persistent link CLIDs (non-const) std::vector< uint32_t >& linkColClidsNC(); + // Helper function, check for exact link match + bool hasObjectLinkExact(const std::string& name, const uint32_t key, const uint16_t index, const uint32_t clid) const; + /// Helper function, copy one link into this object void copyLinkInternal(const xAOD::TrigComposite_v1& other, const size_t index, const std::string& newName); diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc index 360664965ada39b4a054b1a6beaf1e6d3a60151e..598f26110174cef2457cc5c9481e81e35d5ed487 100644 --- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc +++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc @@ -184,12 +184,14 @@ namespace xAOD { // No method currently provided to update or check for uniqueness of a link // being added to a container. - // Add a new object: + // Add a new object (unless it would duplicate an existing one): const std::string mangledName = collectionName + s_collectionSuffix; - linkColNamesNC().push_back( mangledName ); - linkColKeysNC().push_back( link.key() ); - linkColIndicesNC().push_back( link.index() ); - linkColClidsNC().push_back( ClassID_traits< CONTAINER >::ID() ); + if (!hasObjectLinkExact(mangledName, link.key(), link.index(), ClassID_traits< CONTAINER >::ID())) { + linkColNamesNC().push_back( mangledName ); + linkColKeysNC().push_back( link.key() ); + linkColIndicesNC().push_back( link.index() ); + linkColClidsNC().push_back( ClassID_traits< CONTAINER >::ID() ); + } return true; } diff --git a/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx b/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx index 42ea4e63556ab3fadf64fb2b6bc80b8ef8f4326f..9b288cf02da0b22b5372f19fbe02e2d015213201 100644 --- a/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx +++ b/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx @@ -92,7 +92,7 @@ StatusCode PEBInfoWriterAlg::execute(const EventContext& eventContext) const { // Link to new decision newd->setObjectLink("roi", roiEL); newd->setObjectLink("view", viewEL); - linkToPrevious(newd, decisionInput().key(), counter); + linkToPrevious(newd, previousDecision); ATH_MSG_DEBUG("REGTEST: View = " << (*viewEL)); ATH_MSG_DEBUG("REGTEST: RoI = eta/phi = " << (*roiEL)->eta() << "/" << (*roiEL)->phi()); diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx index b5d7bcf9eb119224617abc759c0c677095712bd5..bb07fa0e5b2299df1ac8044d0b1a7e3f34f6e70a 100644 --- a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx +++ b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx @@ -55,7 +55,7 @@ StatusCode TrigL2CaloHypoAlgMT::execute( const EventContext& context ) const { // loop over previous decisions size_t counter=0; - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { //get RoI auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" ); @@ -82,7 +82,7 @@ StatusCode TrigL2CaloHypoAlgMT::execute( const EventContext& context ) const { } d->setObjectLink( "roi", roiELInfo.link ); - TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter ); + TrigCompositeUtils::linkToPrevious( d, previousDecision ); ATH_MSG_DEBUG( "Added view, roi, cluster, previous decision to new decision " << counter << " for view " << (*viewELInfo.link)->name() ); counter++; diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx index df1a85c30c1c68339e76f4b2dc28a9d605f828fb..981fb5a24e11e4f127aebe4da913acb67b3d6ca3 100755 --- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx @@ -74,7 +74,7 @@ StatusCode TrigMufastHypoAlg::execute( const EventContext& context ) const std::vector<TrigMufastHypoTool::MuonClusterInfo> toolInput; // loop over previous decisions size_t counter=0; - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { //get RoI auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" ); auto roiEL = roiInfo.link; @@ -104,7 +104,7 @@ StatusCode TrigMufastHypoAlg::execute( const EventContext& context ) const newd->setObjectLink( "feature", muonEL ); newd->setObjectLink( "roi", roiEL ); newd->setObjectLink( "view", viewEL ); - TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter ); + TrigCompositeUtils::linkToPrevious( newd, previousDecision ); ATH_MSG_DEBUG("REGTEST: " << m_muFastKey.key() << " pT = " << (*muonEL)->pt() << " GeV"); ATH_MSG_DEBUG("REGTEST: " << m_muFastKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi()); diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx index 166b8cc483c8ab247a085e858032d80f0a35d3eb..f5bed116b9ab0bea0f912e6282747cdc8f6b2b4b 100644 --- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx @@ -68,7 +68,7 @@ StatusCode TrigMuisoHypoAlg::execute( const EventContext& context) const std::vector<TrigMuisoHypoTool::MuisoInfo> toolInput; size_t counter = 0; // view counter - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { // get View auto viewEL = previousDecision->objectLink< ViewContainer >( "view" ); ATH_CHECK( viewEL.isValid() ); @@ -90,7 +90,7 @@ StatusCode TrigMuisoHypoAlg::execute( const EventContext& context) const newd->setObjectLink( "feature", muonEL ); newd->setObjectLink( "view", viewEL ); - TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter ); + TrigCompositeUtils::linkToPrevious( newd, previousDecision ); ATH_MSG_DEBUG("REGTEST: " << m_muIsoKey.key() << " pT = " << (*muonEL)->pt() << " GeV"); ATH_MSG_DEBUG("REGTEST: " << m_muIsoKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi()); diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx index 2de33a5573a324d8f670f4bdea892072ebab46ea..be33078a44f834b44c49da8b4f49d8f23c8a9dac 100755 --- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx @@ -75,7 +75,7 @@ StatusCode TrigMuonEFCombinerHypoAlg::execute( const EventContext& context ) con size_t counter = 0; // view counter // loop over previous decisions - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { // get RoIs auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" ); auto roiEL = roiInfo.link; @@ -110,7 +110,7 @@ StatusCode TrigMuonEFCombinerHypoAlg::execute( const EventContext& context ) con newd -> setObjectLink( "feature", muonEL ); newd -> setObjectLink( "roi", roiEL ); newd -> setObjectLink( "view", viewEL ); - TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter ); + TrigCompositeUtils::linkToPrevious( newd, previousDecision ); ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " pT = " << (*muonEL)->pt() << " GeV"); ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi()); diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx index 40bed09b2bdb1d0eb84992dc87921cdb034e2981..e91f559945aa6c79683b76631d26dfcff65ee58d 100755 --- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx @@ -75,7 +75,7 @@ StatusCode TrigMuonEFMSonlyHypoAlg::execute( const EventContext& context ) const size_t counter = 0; // view counter // loop over previous decisions - for ( auto previousDecision: *previousDecisionsHandle ) { + for (const auto previousDecision: *previousDecisionsHandle ) { // get RoIs auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" ); auto roiEL = roiInfo.link; @@ -110,7 +110,7 @@ StatusCode TrigMuonEFMSonlyHypoAlg::execute( const EventContext& context ) const newd -> setObjectLink( "feature", muonEL ); newd -> setObjectLink( "roi", roiEL ); newd -> setObjectLink( "view", viewEL ); - TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter ); + TrigCompositeUtils::linkToPrevious( newd, previousDecision ); ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " pT = " << (*muonEL)->pt() << " GeV"); ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi()); diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx index f1a59c2d650f44df95cce2e388063571332486e2..8c991854a1f48c3a2075db21876a3cad6e0308a6 100755 --- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx @@ -71,7 +71,7 @@ StatusCode TrigMuonEFTrackIsolationHypoAlg::execute( const EventContext& context std::vector<TrigMuonEFTrackIsolationHypoTool::EFIsolationMuonInfo> toolInput; size_t counter = 0; - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { // get RoIs auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" ); auto roiEL = roiInfo.link; @@ -105,7 +105,7 @@ StatusCode TrigMuonEFTrackIsolationHypoAlg::execute( const EventContext& context newd -> setObjectLink( "roi", roiEL ); newd -> setObjectLink( "view", viewEL ); - TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter ); + TrigCompositeUtils::linkToPrevious( newd, previousDecision ); ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " pT = " << (*muonEL)->pt() << " GeV"); diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx index ea94c0bc76ea8c65a4da78deed9d86e2719b15eb..95ecf0836b6f7269388bf510baebeeaf6523f1f4 100644 --- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx +++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx @@ -75,7 +75,7 @@ StatusCode TrigmuCombHypoAlg::execute(const EventContext& context) const // loop over previous decisions size_t counter = 0; - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { // get L2MuonSA Feature TrigCompositeUtils::LinkInfo<xAOD::L2StandAloneMuonContainer> linkInfo = TrigCompositeUtils::findLink<xAOD::L2StandAloneMuonContainer>(previousDecision, "feature"); @@ -104,7 +104,7 @@ StatusCode TrigmuCombHypoAlg::execute(const EventContext& context) const // set objectLink newd->setObjectLink( "feature", muCombEL ); - TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter); + TrigCompositeUtils::linkToPrevious( newd, previousDecision); // DEBUG auto muFastInfo = (*muCombEL)->muSATrack(); diff --git a/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx index e03f9bac680661df8d8eea2d74fe26b943e1beae..f709144b2293813c1308ea1657607e9af3e2fe12 100644 --- a/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx +++ b/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx @@ -52,7 +52,7 @@ StatusCode TrigTauCaloHypoAlgMT::execute( const EventContext& context ) const { // loop over previous decisions size_t counter=0; - for ( auto previousDecision: *previousDecisionsHandle ) { + for ( const auto previousDecision: *previousDecisionsHandle ) { //get RoI auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" ); ATH_CHECK( roiELInfo.isValid() ); @@ -70,15 +70,15 @@ StatusCode TrigTauCaloHypoAlgMT::execute( const EventContext& context ) const { toolInput.emplace_back( d, roi, clusterHandle.cptr(), previousDecision ); - { - auto el = ViewHelper::makeLink( *(viewELInfo.link), clusterHandle, 0 ); + { + auto el = ViewHelper::makeLink( *(viewELInfo.link), clusterHandle, 0 ); ATH_CHECK( el.isValid() ); d->setObjectLink( "feature", el ); } - d->setObjectLink( "roi", roiELInfo.link ); - TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter ); - ATH_MSG_DEBUG( "Added view, roi, cluster, previous decision to new decision " << counter << " for view " << (*viewELInfo.link)->name() ); - counter++; + d->setObjectLink( "roi", roiELInfo.link ); + TrigCompositeUtils::linkToPrevious( d, previousDecision ); + ATH_MSG_DEBUG( "Added view, roi, cluster, previous decision to new decision " << counter << " for view " << (*viewELInfo.link)->name() ); + counter++; } diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h index f72f8f21b16729e9981b021606b7afc0a7101ac9..1bbd5cdcd5b27a4eefb764e885e34a61c1702660 100644 --- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h +++ b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h @@ -55,7 +55,6 @@ namespace TrigCompositeUtils { /** * @brief Creates and right away records the DecisionContainer using the provided WriteHandle. **/ - void createAndStore( SG::WriteHandle<DecisionContainer>& handle ); /** @@ -94,6 +93,12 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: **/ void insertDecisionIDs( const Decision* src, Decision* dest ); + /** + * @brief Appends the decision IDs of src to the dest decision object + * @warning Performing merging of IDs and solving the duples (via set) + **/ + void insertDecisionIDs( const DecisionIDContainer& src, Decision* dest ); + /** * @brief Make unique list of decision IDs of dest Decision object * @warning Use vector->set->vector @@ -109,14 +114,17 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: /** * @brief Another variant of the above method to access DecisionIDs stored in - the Decision object, returns const accessor + * the Decision object, returns const accessor + * @warning Operates on the underlying xAOD vector form rather than the DecisionContainer set form **/ - const std::vector<int>& decisionIDs( const Decision* d ); + const std::vector<DecisionID>& decisionIDs( const Decision* d ); /** - * @brief Another variant of the above method to access DecisionIDs stored in the Decision object, returns read/write accessor + * @brief Another variant of the above method to access DecisionIDs stored in + * the Decision object, returns read/write accessor + * @warning Operates on the underlying xAOD vector form rather than the DecisionContainer set form **/ - std::vector<int>& decisionIDs( Decision* d ); + std::vector<DecisionID>& decisionIDs( Decision* d ); /** @@ -135,19 +143,24 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: bool passed( DecisionID id, const DecisionIDContainer& ); /** - * @brief Links to the previous object + * @brief Links to the previous object, location of previous 'seed' decision supplied by hand **/ void linkToPrevious(Decision* d, const std::string& previousCollectionKey, size_t previousIndex); /** - * @brief checks if there is a link to previous object + * @brief Links to the previous object, 'seed' decision provided explicitly. + **/ + void linkToPrevious(Decision* d, const Decision* dOld); + + /** + * @brief checks if there is at least one 'seed' link to previous object **/ bool hasLinkToPrevious(const Decision* d); /** - * @brief returns link to previous decision object + * @brief returns links to previous decision object 'seed' **/ - ElementLinkVector<DecisionContainer> getLinkToPrevious(const Decision*); + const ElementLinkVector<DecisionContainer> getLinkToPrevious(const Decision*); /** * @brief copy all links from src to dest TC objects @@ -180,6 +193,24 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: std::string m_name; }; + /** + * @brief Prerequisite object usable with @see filter allowing to find TC having a link to an object collection of name + **/ + class HasObjectCollection { + public: + /** + * @brief constructor specifying the link name + **/ + HasObjectCollection(const std::string& name): m_name(name) {} + /** + * @brief checks if the arg TC has link collection of name specified at construction + * @warning method for internal consumption within @see find function + **/ + bool operator()(const xAOD::TrigComposite* ) const; + private: + std::string m_name; + }; + /** * @brief collects all TC linked back to the start TC @@ -196,7 +227,7 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: : source{0} {} LinkInfo(const xAOD::TrigComposite *s, const ElementLink<T>& l) : source{s}, link{l} {} - + bool isValid() const { return source && link.isValid(); } /** @@ -204,7 +235,7 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: */ operator StatusCode () { return (isValid() ? StatusCode::SUCCESS : StatusCode::FAILURE); } - + const xAOD::TrigComposite *source; ElementLink<T> link; }; @@ -217,25 +248,7 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std: */ template<typename T> LinkInfo<T> - findLink(const xAOD::TrigComposite* start, const std::string& linkName) { - auto source = find(start, HasObject(linkName) ); - // - if ( not source ){ - auto seeds = getLinkToPrevious(start); - // std::cout<<"Looking for seeds: found " <<seeds.size()<<std::endl; - for (auto seed: seeds){ - const xAOD::TrigComposite* dec = *seed;//deference - LinkInfo<T> link= findLink<T>( dec, linkName ); - // return the first found - if (link.isValid()) return link; - } - return LinkInfo<T>(); // invalid link - } - - //std::cout<<"Found source for "<<linkName<<std::endl; - - return LinkInfo<T>( source, source->objectLink<T>( linkName ) ); - } + findLink(const xAOD::TrigComposite* start, const std::string& linkName); /** * Prints the TC including the linked seeds diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc index 4f47a25430580aa651fe7c37ec81ea204ddb3015..198d9a223faeee541fedc427b7ad896877fe4efd 100644 --- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc +++ b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc @@ -36,5 +36,23 @@ namespace TrigCompositeUtils { return handle; } + template<typename T> + LinkInfo<T> + findLink(const xAOD::TrigComposite* start, const std::string& linkName) { + auto source = find(start, HasObject(linkName) ); + // + if ( not source ){ + auto seeds = getLinkToPrevious(start); + for (auto seed: seeds){ + const xAOD::TrigComposite* dec = *seed;//deference + LinkInfo<T> link= findLink<T>( dec, linkName ); + // return the first found + if (link.isValid()) return link; + } + return LinkInfo<T>(); // invalid link + } + + return LinkInfo<T>( source, source->objectLink<T>( linkName ) ); + } } diff --git a/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref b/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref index 4336ef8e73c8cd36b427b307f184f51fe89d7639..0efaa06a2d0d91f617cc1585a5565f79113cb83c 100644 --- a/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref +++ b/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref @@ -1,7 +1,7 @@ ApplicationMgr SUCCESS ==================================================================================================================================== - Welcome to ApplicationMgr (GaudiCoreSvc v27r1p99) - running on karma on Thu Dec 27 22:27:34 2018 + Welcome to ApplicationMgr (GaudiCoreSvc v30r5) + running on pc-tbed-pub-24.cern.ch on Wed Feb 20 14:16:00 2019 ==================================================================================================================================== ApplicationMgr INFO Application Manager Configured successfully EventLoopMgr WARNING Unable to locate service "EventSelector" @@ -9,18 +9,18 @@ EventLoopMgr WARNING No events will be processed from external input. HistogramPersis...WARNING Histograms saving not required. ApplicationMgr INFO Application Manager Initialized successfully ApplicationMgr Ready -ClassIDSvc INFO getRegistryEntries: read 10811 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 7561 CLIDRegistry entries for module ALL Context: s: 0 e: 0 Current context: s: 0 e: 0 ClassIDSvc INFO getRegistryEntries: read 372 CLIDRegistry entries for module ALL initialize SG::WriteHandleKey<DecisionContainer> whkT call createAndStore( whkT ) with default context, twice StoreGateSvc_Impl WARNING setupProxy:: error setting up proxy for key arbitrary and clid 1333228823 - Pre-existing valid DataProxy @0x1a48360 found in Store for key arbitrary with clid 1333228823 -StoreGateSvc_Impl WARNING record_impl: Problem setting up the proxy for object @0x1a458a0 - recorded with key arbitrary of type xAOD::TrigCompositeContainer (CLID 1333228823) in DataObject @0x1a42ea0 -VarHandle(Store... ERROR Control/StoreGate/src/VarHandleBase.cxx:733 (FUNC): code 0: recordObject failed - FATAL Control/StoreGate/StoreGate/WriteHandle.icc:887 (FUNC): code 0: this->record(std::move(data)) + Pre-existing valid DataProxy @0xf666d0 found in Store for key arbitrary with clid 1333228823 +StoreGateSvc_Impl WARNING record_impl: Problem setting up the proxy for object @0xf64f10 + recorded with key arbitrary of type xAOD::TrigCompositeContainer (CLID 1333228823) in DataObject @0xf66810 +VarHandle(Store... ERROR /build1/atnight/localbuilds/nightlies/master/athena/Control/StoreGate/src/VarHandleBase.cxx:733 (FUNC): code 0: recordObject failed + FATAL /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-11T2351/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/src/Control/StoreGate/StoreGate/WriteHandle.icc:887 (FUNC): code 0: this->record(std::move(data)) handle name "arbitrary" isPresent 1 isValid 1 handle name "arbitrary" isPresent 1 isValid 0 @@ -44,32 +44,33 @@ Call setObjectLink with a bad ElementLink that has no corresponding collection. xAOD::TrigComposite_v1::setObjectLink ERROR link is not valid New decision d3b with name & context -d3b: TrigComposite_v1 'd3b' link: name, key, index, CLID -self, 1042135810, 3, 1333228823 -testlink, 1042135810, 1, 1333228823 - +d3b: TrigComposite_v1 name:'d3b' + N Lnks:2 + Link Name:self, Key:1042135810, Index:3, CLID:1333228823 + Link Name:testlink, Key:1042135810, Index:1, CLID:1333228823 el2 1042135810 1 -d3: TrigComposite_v1 '' link: name, key, index, CLID -self, 1042135810, 2, 1333228823 -seed, 1042135810, 1, 1333228823 - -d4: TrigComposite_v1 '' link: name, key, index, CLID -self, 1042135810, 4, 1333228823 -seed, 1042135810, 1, 1333228823 - +d3: TrigComposite_v1 name:'' + N Lnks:2 + Link Name:self, Key:1042135810, Index:2, CLID:1333228823 + Link Name:seed__COLL, Key:1042135810, Index:1, CLID:1333228823 + N Decisions: '2 + 95, 99, +d4: TrigComposite_v1 name:'' + N Lnks:2 + Link Name:self, Key:1042135810, Index:4, CLID:1333228823 + Link Name:seed__COLL, Key:1042135810, Index:1, CLID:1333228823 el: key 1042135810 index 1 create d5 set link -d5: TrigComposite_v1 'd5' link: name, key, index, CLID -self, 1042135810, 5, 1333228823 -feature, 1042135810, 1, 1333228823 - +d5: TrigComposite_v1 name:'d5' + N Lnks:2 + Link Name:self, Key:1042135810, Index:5, CLID:1333228823 + Link Name:feature, Key:1042135810, Index:1, CLID:1333228823 create d6 -d6: TrigComposite_v1 'd6' link: name, key, index, CLID -self, 1042135810, 6, 1333228823 -feature, 1042135810, 1, 1333228823 -seed, 1042135810, 5, 1333228823 - +d6: TrigComposite_v1 name:'d6' + N Lnks:2 + Link Name:self, Key:1042135810, Index:6, CLID:1333228823 + Link Name:seed__COLL, Key:1042135810, Index:5, CLID:1333228823 get d5 feature link get d6 feature link compare feature links diff --git a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx index 02488db94d84359d669f5d1ac3bc075fe5ea2606..a99a873cd1228fab6297cdee6687c8d40cb1488e 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx @@ -10,7 +10,7 @@ using namespace TrigCompositeUtils; ComboHypo::ComboHypo(const std::string& name, ISvcLocator* pSvcLocator) - : ::AthReentrantAlgorithm(name, pSvcLocator) +: ::AthReentrantAlgorithm(name, pSvcLocator) {} ComboHypo::~ComboHypo() @@ -34,8 +34,8 @@ StatusCode ComboHypo::initialize() { // find max inputs size auto maxMultEl = std::max_element( m_multiplicitiesReqMap.begin(), m_multiplicitiesReqMap.end(), - []( MultiplicityReqMap::value_type a, MultiplicityReqMap::value_type b ){ - return a.second.size() < b.second.size(); } ); + []( MultiplicityReqMap::value_type a, MultiplicityReqMap::value_type b ){ + return a.second.size() < b.second.size(); } ); const size_t maxMult = maxMultEl->second.size(); @@ -64,7 +64,7 @@ StatusCode ComboHypo::finalize() { StatusCode ComboHypo::copyDecisions( const DecisionIDContainer& passing, const EventContext& context ) const { - + ATH_MSG_DEBUG( "Copying "<<passing.size()<<" positive decisions to outputs"); for ( size_t input_counter = 0; input_counter < m_inputs.size(); ++input_counter ) { @@ -74,51 +74,47 @@ StatusCode ComboHypo::copyDecisions( const DecisionIDContainer& passing, const E auto inputHandle = SG::makeHandle( m_inputs[input_counter], context ); if ( inputHandle.isValid() ) { - const DecisionContainer* inputs = inputHandle.cptr(); - const size_t sz = inputs->size(); - for ( size_t i = 0; i < sz; ++i ) { - const Decision *inputDecision = inputs->at(i); - DecisionIDContainer inputDecisionIDs; - decisionIDs( inputDecision, inputDecisionIDs ); - - // from all poitive decision in the input only the ones that survived counting are passed over - DecisionIDContainer common; - std::set_intersection( inputDecisionIDs.begin(), inputDecisionIDs.end(), passing.begin(), passing.end(), - std::inserter( common, common.end() ) ); - - - Decision* newDec = newDecisionIn( outDecisions ); - linkToPrevious( newDec, inputHandle.key(), i ); - ATH_MSG_DEBUG("New decision has "<< (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( newDec, "initialRoI")).isValid() - <<" valid initialRoI and "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions"); - - for ( auto id: common ) { - addDecisionID( id, newDec ); - } - - // add View? - if ( inputDecision->hasObjectLink( "view" ) ) { - auto viewEL = inputDecision->objectLink< ViewContainer >( "view" ); - CHECK( viewEL.isValid() ); - newDec->setObjectLink( "view", viewEL ); - } + for (const Decision* inputDecision: *inputHandle) { + + DecisionIDContainer inputDecisionIDs; + decisionIDs( inputDecision, inputDecisionIDs ); + + // from all poitive decision in the input only the ones that survived counting are passed over + DecisionIDContainer common; + std::set_intersection( inputDecisionIDs.begin(), inputDecisionIDs.end(), passing.begin(), passing.end(), + std::inserter( common, common.end() ) ); + + Decision* newDec = newDecisionIn( outDecisions ); + linkToPrevious( newDec, inputDecision ); + ATH_MSG_DEBUG("New decision has "<< (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( newDec, "initialRoI")).isValid() + << " valid initialRoI and "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions"); + + insertDecisionIDs( common, newDec ); + + // add View? + if ( inputDecision->hasObjectLink( "view" ) ) { + auto viewEL = inputDecision->objectLink< ViewContainer >( "view" ); + CHECK( viewEL.isValid() ); + newDec->setObjectLink( "view", viewEL ); + } } } // debug printout: - if ( msgLvl(MSG::DEBUG)) { + if ( msgLvl(MSG::DEBUG) ) { ATH_MSG_DEBUG(outputHandle.key() <<" with "<< outputHandle->size() <<" decisions:"); for (auto outdecision: *outputHandle){ - TrigCompositeUtils::DecisionIDContainer objDecisions; - TrigCompositeUtils::decisionIDs( outdecision, objDecisions ); - ATH_MSG_DEBUG("Number of positive decisions for this output: " << objDecisions.size() ); - for ( TrigCompositeUtils::DecisionID id : objDecisions ) { - ATH_MSG_DEBUG( " --- decision " << HLT::Identifier( id ) ); - } + TrigCompositeUtils::DecisionIDContainer objDecisions; + TrigCompositeUtils::decisionIDs( outdecision, objDecisions ); + ATH_MSG_DEBUG("Number of positive decisions for this output: " << objDecisions.size() ); + for ( TrigCompositeUtils::DecisionID id : objDecisions ) { + ATH_MSG_DEBUG( " --- decision " << HLT::Identifier( id ) ); + } } } } + return StatusCode::SUCCESS; } @@ -129,11 +125,11 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, const E ATH_MSG_DEBUG( "Found implicit RH from " << inputHandle.key() <<" with "<< inputHandle->size() << " elements:" ); MultiplicityMap thisInputDmap; for ( const Decision* decision : *inputHandle.cptr() ) { - ATH_MSG_DEBUG( "Decision with "<< decisionIDs( decision ).size() << " chains passed:" ); - for ( DecisionID id: decisionIDs( decision ) ) { - ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) ); - thisInputDmap[id] ++; - } + ATH_MSG_DEBUG( "Decision with "<< decisionIDs( decision ).size() << " chains passed:" ); + for ( DecisionID id: decisionIDs( decision ) ) { + ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) ); + thisInputDmap[id] ++; + } } dmap[i]= thisInputDmap; } @@ -143,7 +139,6 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, const E } } - //debug ATH_MSG_DEBUG( "Decision map filled :" ); int i=0; @@ -158,7 +153,7 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >& dmap, const E StatusCode ComboHypo::execute(const EventContext& context ) const { ATH_MSG_DEBUG( "Executing " << name() << "..." ); - + DecisionIDContainer passing; // this map is filled with the count of positive decisions from each input @@ -175,8 +170,8 @@ StatusCode ComboHypo::execute(const EventContext& context ) const { 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 ) { - overallDecision = false; - break; + overallDecision = false; + break; } } ATH_MSG_DEBUG( "Chain " << m.first << ( overallDecision ? " is accepted" : " is rejected") ); @@ -186,7 +181,6 @@ StatusCode ComboHypo::execute(const EventContext& context ) const { } ATH_CHECK( copyDecisions( passing, context ) ); - return StatusCode::SUCCESS; } diff --git a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx index 6406db2a9d765067c5e7028e807cfa471418ff70..ae9f403eb8cf864fc9e352e4a2e7c6edc3a34be1 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx @@ -10,7 +10,7 @@ using namespace TrigCompositeUtils; InputMakerBase::InputMakerBase( const std::string& name, ISvcLocator* pSvcLocator ) - : ::AthReentrantAlgorithm( name, pSvcLocator ) {} +: ::AthReentrantAlgorithm( name, pSvcLocator ) {} InputMakerBase::~InputMakerBase() {} @@ -65,55 +65,66 @@ StatusCode InputMakerBase::decisionInputToOutput(const EventContext& context, st } ATH_MSG_DEBUG( "Running on input "<< inputKey.key()<<" with " << inputHandle->size() << " elements" ); - // create the output container + // We have an input container with >= 1 Decision objects. Create an output container with the same index. TrigCompositeUtils::createAndStore(outputHandles[outputIndex]); auto outDecisions = outputHandles[outputIndex].ptr(); - //map all RoIs that are stored in this input container - std::vector <ElementLink<TrigRoiDescriptorCollection> > RoIsFromDecision; - + // If using m_mergeOutputs, then collate all RoIs that are stored in this input container + ElementLinkVector<TrigRoiDescriptorCollection> RoIsFromDecision; + // loop over decisions retrieved from this input size_t input_counter =0; size_t output_counter =0; - - for ( auto decision : *inputHandle){ - ATH_MSG_DEBUG( "Input Decision "<<input_counter <<" has " <<TrigCompositeUtils::getLinkToPrevious(decision).size()<<" previous links"); - TrigCompositeUtils::Decision* newDec; - bool addDecision=false; - int roi_counter=0; + for (const TrigCompositeUtils::Decision* inputDecision : *inputHandle){ + ATH_MSG_DEBUG( "Input Decision "<<input_counter <<" has " <<TrigCompositeUtils::getLinkToPrevious(inputDecision).size()<<" previous links"); + TrigCompositeUtils::Decision* newDec = nullptr; + bool addDecision = false; + ElementLink<TrigRoiDescriptorCollection> roiEL = ElementLink<TrigRoiDescriptorCollection>(); + if (m_mergeOutputs){ - auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( decision, m_roisLink.value()); - CHECK( roiELInfo.isValid() ); - auto roiEL = roiELInfo.link; - auto roiIt=find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL); - addDecision = (roiIt == RoIsFromDecision.end()); - if (addDecision) { - RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used - const TrigRoiDescriptor* roi = *roiEL; - ATH_MSG_DEBUG( "Found RoI:" <<*roi<<" FS="<<roi->isFullscan()); - roi_counter = roiIt-RoIsFromDecision.begin(); - } - } else - addDecision=true; + // Get RoI from this input decision + const auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value()); + CHECK( roiELInfo.isValid() ); + roiEL = roiELInfo.link; + const auto roiIt = std::find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL); + addDecision = (roiIt == RoIsFromDecision.end()); + // addDecision is positive here if we have *not* before encountered this RoI within this input collection. + if (addDecision) { + RoIsFromDecision.push_back(roiEL); // To keep track of which we have used + ATH_MSG_DEBUG( "Found RoI:" << **roiEL <<" FS="<< (*roiEL)->isFullscan()); + } + } else { // Not merging, keep a 1-to-1 mapping of Decisions in Input & Output containers + addDecision=true; + } if ( addDecision ){ - newDec = TrigCompositeUtils::newDecisionIn( outDecisions ); - output_counter++; - } - else{ - newDec = outDecisions[outputIndex][roi_counter]; + // Create a new Decision in the Output container to mirror one in the Input container + newDec = TrigCompositeUtils::newDecisionIn( outDecisions ); + output_counter++; + } else{ + // addDecision can only be false if m_mergeOutputs was true and roiEL was found within RoIsFromDecision + // Re-use a Decision already added to the Output container + const auto roiIt = std::find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL); + if (roiIt == RoIsFromDecision.end()) { + ATH_MSG_ERROR("Logic error in decisionInputToOutput. Cannot find existing RoI."); + return StatusCode::FAILURE; + } + const size_t roiCounter = std::distance( RoIsFromDecision.begin(), roiIt ); + newDec = outDecisions[outputIndex][roiCounter]; } - - TrigCompositeUtils::linkToPrevious( newDec, inputKey.key(), input_counter ); - TrigCompositeUtils::insertDecisionIDs( decision, newDec ); + + TrigCompositeUtils::linkToPrevious( newDec, inputDecision ); // Link inputDecision object as the 'seed' of newDec + TrigCompositeUtils::insertDecisionIDs( inputDecision, newDec ); // Copy decision IDs from inputDecision into newDec ATH_MSG_DEBUG("New decision has "<< (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( newDec, m_roisLink.value())).isValid() <<" valid "<<m_roisLink.value() <<" and "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions"); - input_counter++; + input_counter++; } // loop over input decisions ATH_MSG_DEBUG( "Filled output key " << decisionOutputs()[ outputIndex ].key() <<" of size "<<outDecisions->size() <<" at index "<< outputIndex); - outputIndex++; + for (auto i : *outDecisions) msg() << i << " "; + msg() << endmsg; + outputIndex++; } // end of first loop over input keys return StatusCode::SUCCESS; @@ -176,4 +187,4 @@ size_t InputMakerBase::countInputHandles( const EventContext& context ) const { - + diff --git a/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx b/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx index a527412adc03f363ff443842de31fcee677b423f..e396a41734d7d451beda37ea95c45a0bbca81b4f 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx @@ -12,10 +12,11 @@ using TrigCompositeUtils::DecisionContainer; using TrigCompositeUtils::Decision; using TrigCompositeUtils::linkToPrevious; using TrigCompositeUtils::getLinkToPrevious; +using TrigCompositeUtils::findLink; InputMakerForRoI:: InputMakerForRoI( const std::string& name, - ISvcLocator* pSvcLocator ) - : InputMakerBase( name, pSvcLocator ) {} + ISvcLocator* pSvcLocator ) +: InputMakerBase( name, pSvcLocator ) {} InputMakerForRoI::~ InputMakerForRoI() {} @@ -38,12 +39,12 @@ StatusCode InputMakerForRoI::execute( const EventContext& context ) const { ATH_MSG_DEBUG( "Executing " << name() << "..." ); // call base class helper method to read input decisions, loop over them create outputs and connect them, returns with outputHandles filled - std::vector< SG::WriteHandle<TrigCompositeUtils::DecisionContainer> > outputHandles; + std::vector< SG::WriteHandle<DecisionContainer> > outputHandles; ATH_CHECK (decisionInputToOutput(context, outputHandles)); // Prepare Outputs std::unique_ptr< TrigRoiDescriptorCollection > oneRoIColl( new TrigRoiDescriptorCollection() ); - + // use also this: ElementLinkVector<xAOD::MuonRoIContainer> getMuonRoILinks = obj->objectCollectionLinks<xAOD::MuonRoIContainer>("ManyMuonRoIs"); std::vector <ElementLink<TrigRoiDescriptorCollection> > RoIsFromDecision; // used to check for duplicate features linked to different inputHandles @@ -61,24 +62,23 @@ StatusCode InputMakerForRoI::execute( const EventContext& context ) const { ATH_MSG_DEBUG( "Got output "<< outputHandle.key()<<" with " << outputHandle->size() << " elements" ); // loop over output decisions in container of outputHandle, follow link to inputDecision for ( auto outputDecision : *outputHandle){ - ElementLinkVector<DecisionContainer> inputLinks = TrigCompositeUtils::getLinkToPrevious(outputDecision); + ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision); for (auto input: inputLinks){ - const Decision* inputDecision = *input; - auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() ); - auto roiEL = roiELInfo.link; - ATH_CHECK( roiEL.isValid() ); - - // avoid adding the same feature multiple times: check if not in container, if not add it - if ( find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL) - == RoIsFromDecision.end() ){ - RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used - const TrigRoiDescriptor* roi = *roiEL; - ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan()); - //make a new one: - TrigRoiDescriptor* newroi= new TrigRoiDescriptor(*roi); //use copy constructor - oneRoIColl->push_back(newroi); - ATH_MSG_DEBUG("Added RoI:" <<*newroi<<" FS="<<newroi->isFullscan()); - } + const Decision* inputDecision = *input; + auto roiELInfo = findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() ); + auto roiEL = roiELInfo.link; + ATH_CHECK( roiEL.isValid() ); + + // avoid adding the same feature multiple times: check if not in container, if not add it + if ( find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL) == RoIsFromDecision.end() ) { + RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used + const TrigRoiDescriptor* roi = *roiEL; + ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan()); + //make a new one: + TrigRoiDescriptor* newroi= new TrigRoiDescriptor(*roi); //use copy constructor + oneRoIColl->push_back(newroi); + ATH_MSG_DEBUG("Added RoI:" <<*newroi<<" FS="<<newroi->isFullscan()); + } } // loop over previous input links } // loop over decisions } // loop over output keys diff --git a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx index dc97402c08734eb7ba704aa50bc48b3c313c4c35..33aa17f46550e97d04f34761a9bbe26ad9b24eda 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx @@ -7,6 +7,15 @@ #include "GaudiKernel/Property.h" +using TrigCompositeUtils::DecisionContainer; +using TrigCompositeUtils::Decision; +using TrigCompositeUtils::DecisionIDContainer; +using TrigCompositeUtils::DecisionID; +using TrigCompositeUtils::decisionIDs; +using TrigCompositeUtils::insertDecisionIDs; +using TrigCompositeUtils::createAndStore; +using TrigCompositeUtils::newDecisionIn; + RoRSeqFilter::RoRSeqFilter( const std::string& name, ISvcLocator* pSvcLocator ) : ::AthAlgorithm( name, pSvcLocator ) @@ -87,34 +96,35 @@ StatusCode RoRSeqFilter::execute() { if ( m_mergeInputs ) { ATH_MSG_DEBUG( "Recording " << m_outputKeys[ 0 ].key() ); - TrigCompositeUtils::createAndStore(outputHandles[0]); - TrigCompositeUtils::DecisionContainer* output = outputHandles[0].ptr(); + createAndStore(outputHandles[0]); + DecisionContainer* output = outputHandles[0].ptr(); for ( auto inputKey: m_inputKeys ) { auto inputHandle = SG::makeHandle( inputKey ); if( inputHandle.isValid() ) - passCounter += copyPassing( *inputHandle, inputKey.key(), *output ); + passCounter += copyPassing( *inputHandle, *output ); } outputIndex++; - } else { + } else { // Not merging inputs for ( auto inputKey: m_inputKeys ) { // already made handles, so this code could be simplified to a loop over inputHandles. auto inputHandle = SG::makeHandle( inputKey ); if( not inputHandle.isValid() ) { - ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" not present" ); + ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" not present" ); } else if ( inputHandle->empty() ) { - ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" contains all rejected decisions, skipping" ); + ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" contains all rejected decisions, skipping" ); } else { - ATH_MSG_DEBUG( "Checking inputHandle "<< inputKey.key() <<" with " << inputHandle->size() <<" elements"); - TrigCompositeUtils::createAndStore(outputHandles[outputIndex]); - TrigCompositeUtils::DecisionContainer* output = outputHandles[outputIndex].ptr(); - passCounter += copyPassing( *inputHandle, inputKey.key(), *output ); - ATH_MSG_DEBUG( "Recorded output key " << m_outputKeys[ outputIndex ].key() <<" of size "<<output->size() <<" at index "<< outputIndex); + ATH_MSG_DEBUG( "Checking inputHandle "<< inputKey.key() <<" with " << inputHandle->size() <<" elements"); + createAndStore(outputHandles[outputIndex]); + DecisionContainer* output = outputHandles[outputIndex].ptr(); + passCounter += copyPassing( *inputHandle, *output ); + ATH_MSG_DEBUG( "Recorded output key " << m_outputKeys[ outputIndex ].key() <<" of size "<<output->size() <<" at index "<< outputIndex); } outputIndex++; // Keep the mapping of inputKey<->outputKey correct } + } setFilterPassed( passCounter != 0 ); @@ -127,33 +137,36 @@ StatusCode RoRSeqFilter::execute() { return StatusCode::SUCCESS; } -size_t RoRSeqFilter::copyPassing( const TrigCompositeUtils::DecisionContainer& input, - const std::string& inputKey, - TrigCompositeUtils::DecisionContainer& output ) const { +size_t RoRSeqFilter::copyPassing( const DecisionContainer& input, + DecisionContainer& output ) const { size_t passCounter = 0; ATH_MSG_DEBUG( "Input size " << input.size() ); for (size_t i = 0; i < input.size(); ++i) { - const TrigCompositeUtils::Decision* inputDecision = input.at(i); + const Decision* inputDecision = input.at(i); - TrigCompositeUtils::DecisionIDContainer objDecisions; - TrigCompositeUtils::decisionIDs( inputDecision, objDecisions ); + DecisionIDContainer objDecisions; + decisionIDs( inputDecision, objDecisions ); ATH_MSG_DEBUG("Number of positive decisions for this input: " << objDecisions.size() ); - for ( TrigCompositeUtils::DecisionID id : objDecisions ) { + for ( DecisionID id : objDecisions ) { ATH_MSG_DEBUG( " -- Positive decision " << HLT::Identifier( id ) ); } - std::vector<TrigCompositeUtils::DecisionID> intersection; + DecisionIDContainer intersection; std::set_intersection( m_chains.begin(), m_chains.end(), objDecisions.begin(), objDecisions.end(), - std::back_inserter( intersection ) ); + std::inserter(intersection, intersection.end()) ); if ( not intersection.empty() ) { - TrigCompositeUtils::Decision* decisionCopy = TrigCompositeUtils::newDecisionIn( &output, name() ); - *decisionCopy = *inputDecision; // copies auxdata from one auxstore to the other - // future improvement: could use newDecisionIn(&output,input,name which internally does the linkToPrevious, then no longer need to pass the key - TrigCompositeUtils::linkToPrevious(decisionCopy, inputKey, i); // Update seed + // This sets up the 'self' link & the 'seed' link (seeds from inputDecision) + Decision* decisionCopy = newDecisionIn( &output, inputDecision, name() ); + + // Copy accross only the DecisionIDs which have passed through this Filter for this Decision object. + // WARNING: Still need to 100% confirm if the correct set to propagate forward is objDecisions or intersection. + // Tim M changing this from objDecisions (all IDs) -> intersection (only passed IDs) Feb 19 + insertDecisionIDs(intersection, decisionCopy); + passCounter ++; ATH_MSG_DEBUG("Input satisfied at least one active chain"); } else { diff --git a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h index ee6a6dd2f9fbf02a472f854ee4c31b9c938eee8f..6e572e48d7fc85a9a70ca09f87976dc0c11f973f 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h +++ b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h @@ -79,17 +79,15 @@ class RoRSeqFilter /** * @brief Applies generic filter to input container, keeping only the decision objects with at least * one affirmative decision from the previous Stage. Considering only decisions from chains utilising this filter. - * @param input Reference to input container of decision objects. * @param inputKey Storegate key of input, needed to link newly created decision objects to their parents. * @param output Writeable output container to store copies of decision objects which pass the filter. * @return The number of decision objects which passed the filter. * - * Produced a deep-copy of all Decision objects in the input container which possess a positive decision from + * Produced a selective copy of all Decision objects in the input container which possess a positive decision from * at least one of the chains which this filter algorithm is configured for. This new object is linked to its * parent and stored in the output collection. It will form the starting point for the next Step. **/ size_t copyPassing( const TrigCompositeUtils::DecisionContainer& input, - const std::string& inputKey, TrigCompositeUtils::DecisionContainer& output) const; }; diff --git a/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx b/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx index 581958e813a97f4db2c9337ecf1aaa93d00b65d3..8a8e92a003e73c29d862c742b47937dc4ac9ae57 100644 --- a/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx +++ b/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx @@ -10,10 +10,8 @@ #include "StoreGate/WriteHandle.h" #include "DecisionHandling/TrigCompositeUtils.h" - - -static const SG::AuxElement::Accessor< std::vector< int > > readWriteAccessor( "decisions" ); -static const SG::AuxElement::ConstAccessor< std::vector<int> > readOnlyAccessor( "decisions" ); +static const SG::AuxElement::Accessor< std::vector<TrigCompositeUtils::DecisionID> > readWriteAccessor("decisions"); +static const SG::AuxElement::ConstAccessor< std::vector<TrigCompositeUtils::DecisionID> > readOnlyAccessor("decisions"); namespace TrigCompositeUtils { @@ -36,7 +34,6 @@ namespace TrigCompositeUtils { Decision* newDecisionIn ( DecisionContainer* dc, const std::string& name, const EventContext& ctx ) { Decision * x = new Decision; dc->push_back( x ); - readWriteAccessor( *x ).size(); // fake operation just to make the decisions decoration size_t index = dc->size() - 1; // make self link, useful to copy for seed link in a successor, but requires that DecisionContainer is already recorded in SG. ElementLink<DecisionContainer> el(*dc, index, ctx); @@ -51,68 +48,63 @@ namespace TrigCompositeUtils { } Decision* newDecisionIn ( DecisionContainer* dc, const Decision* dOld, const std::string& name, const EventContext& ctx ) { - Decision* dNew = newDecisionIn( dc, name, ctx); - if ( dOld->hasObjectLink("roi" ) ){ - dNew->copyLinkFrom(dOld,"roi"); - } - else if ( dOld->hasObjectLink("initialRoI") ){ - dNew->copyLinkFrom(dOld,"initialRoI","roi"); - } - if ( dOld->hasObjectLink("view" ) ){ - dNew->copyLinkFrom(dOld,"view"); - } - if ( dOld->hasObjectLink("feature" ) ){ - dNew->copyLinkFrom(dOld,"feature"); - } - if ( dOld->hasObjectLink("self" ) ){ - dNew->copyLinkFrom(dOld,"self","seed"); // make use of self-link - } - return dNew; + Decision* dNew = newDecisionIn( dc, name, ctx); // Sets up 'self' link of dNew + linkToPrevious(dNew, dOld); // Sets up link to 'seed' collection, points to 'self' link of dOld + return dNew; } void addDecisionID( DecisionID id, Decision* d ) { - std::vector<int>& decisions = readWriteAccessor( *d ); - if ( decisions.size() == 0 or decisions.back() != static_cast<int>(id) ) + std::vector<DecisionID>& decisions = readWriteAccessor( *d ); + if ( decisions.size() == 0 or decisions.back() != id) decisions.push_back( id ); } void decisionIDs( const Decision* d, DecisionIDContainer& destination ) { - const std::vector<int>& decisions = readOnlyAccessor( *d ); + const std::vector<DecisionID>& decisions = readOnlyAccessor( *d ); destination.insert( decisions.begin(), decisions.end() ); } - const std::vector<int>& decisionIDs( const Decision* d ) { + const std::vector<DecisionID>& decisionIDs( const Decision* d ) { return readOnlyAccessor( *d ); } - std::vector<int>& decisionIDs( Decision* d ) { + std::vector<DecisionID>& decisionIDs( Decision* d ) { return readWriteAccessor( *d ); } - void insertDecisionIDs( const Decision* src, Decision* dest ){ - DecisionIDContainer ids; - decisionIDs( src, ids ); - decisionIDs( dest, ids ); - decisionIDs( dest ).clear(); - decisionIDs( dest ).insert( decisionIDs(dest).end(), ids.begin(), ids.end() ); + void insertDecisionIDs(const Decision* src, Decision* dest ){ + DecisionIDContainer srcIds; + decisionIDs( src, srcIds ); // Now stored in a set + insertDecisionIDs( srcIds, dest); + } + + void insertDecisionIDs( const DecisionIDContainer& src, Decision* dest ) { + DecisionIDContainer collateIDs; + // Decision are xAOD objects backed by a std::vector + // Here we use a std::set to de-duplicate IDs from src and dest before setting dest + decisionIDs( dest, collateIDs ); // Set operation 1. Get from dest + collateIDs.insert( src.begin(), src.end() ); // Set operation 2. Get from src + decisionIDs( dest ).clear(); // Clear target + // Copy from set to (ordered) vector + decisionIDs( dest ).insert( decisionIDs(dest).end(), src.begin(), src.end() ); } - void uniqueDecisionIDs( Decision* dest){ - DecisionIDContainer ids; - decisionIDs( dest, ids ); - decisionIDs( dest ).clear(); - decisionIDs( dest ).insert( decisionIDs(dest).end(), ids.begin(), ids.end() ); + void uniqueDecisionIDs(Decision* dest) { + // Re-use above insertDecisionIDs method. + // This implicitly performs de-duplication + return insertDecisionIDs(dest, dest); } bool allFailed( const Decision* d ) { - const std::vector<int>& decisions = readOnlyAccessor( *d ); + const std::vector<DecisionID>& decisions = readOnlyAccessor( *d ); return decisions.empty(); } bool isAnyIDPassing( const Decision* d, const DecisionIDContainer& required ) { - for ( auto id : readOnlyAccessor( *d ) ) { - if ( required.count( id ) > 0 ) - return true; + for ( DecisionID id : readOnlyAccessor( *d ) ) { + if ( required.count( id ) > 0 ) { + return true; + } } return false; } @@ -122,29 +114,29 @@ namespace TrigCompositeUtils { } void linkToPrevious( Decision* d, const std::string& previousCollectionKey, size_t previousIndex ) { - ElementLinkVector<DecisionContainer> seeds; - ElementLink<DecisionContainer> new_seed= ElementLink<DecisionContainer>( previousCollectionKey, previousIndex ); - // do we need this link to self link? - if ( (*new_seed)->hasObjectLink("self" ) ) - seeds.push_back( (*new_seed)->objectLink<DecisionContainer>("self")); // make use of self-link - else - seeds.push_back(ElementLink<DecisionContainer>( previousCollectionKey, previousIndex )); - - if (hasLinkToPrevious(d) ){ - ElementLinkVector<DecisionContainer> oldseeds = d->objectCollectionLinks<DecisionContainer>( "seed" ); - seeds.reserve( seeds.size() + oldseeds.size() ); - std::move( oldseeds.begin(), oldseeds.end(), std::back_inserter( seeds ) ); + ElementLink<DecisionContainer> seed = ElementLink<DecisionContainer>( previousCollectionKey, previousIndex ); + if (!seed.isValid()) { + throw GaudiException("Invalid Decision Link key or index provided", "TrigCompositeUtils::linkToPrevious", StatusCode::FAILURE); + } else { + d->addObjectCollectionLink("seed", seed); } + } - d->addObjectCollectionLinks("seed", seeds); - + void linkToPrevious( Decision* d, const Decision* dOld) { + if ( dOld && dOld->hasObjectLink("self") ) { + // Internally de-dupes the "seed" collection of links + d->addObjectCollectionLink("seed", dOld->objectLink<DecisionContainer>("self")); + } else { + throw GaudiException("Using linkToPrevious with a previous decision requires that decision to have its 'self' link set", + "TrigCompositeUtils::linkToPrevious", StatusCode::FAILURE); + } } bool hasLinkToPrevious( const Decision* d ) { - return d->hasObjectLink( "seed" ); + return d->hasObjectCollectionLinks( "seed" ); } - ElementLinkVector <DecisionContainer> getLinkToPrevious( const Decision* d ) { + const ElementLinkVector<DecisionContainer> getLinkToPrevious( const Decision* d ) { return d->objectCollectionLinks<DecisionContainer>( "seed" ); } @@ -155,23 +147,35 @@ namespace TrigCompositeUtils { - const xAOD::TrigComposite* find( const xAOD::TrigComposite* start, const std::function<bool( const xAOD::TrigComposite* )>& filter ) { + const Decision* find( const Decision* start, const std::function<bool( const Decision* )>& filter ) { if ( filter( start ) ) return start; - if ( start->hasObjectLink( "seed" ) ) { - return find( start->object<xAOD::TrigComposite>( "seed" ), filter ); + if ( hasLinkToPrevious(start) ) { + const ElementLinkVector<DecisionContainer> seeds = getLinkToPrevious(start); + for (const ElementLink<DecisionContainer>& seedEL : seeds) { + const Decision* result = find( *seedEL, filter ); + if (result) return result; + } } - else return nullptr; + + return nullptr; } - bool HasObject::operator()( const xAOD::TrigComposite* composite ) const { + bool HasObject::operator()( const Decision* composite ) const { return composite->hasObjectLink( m_name ); } - bool recursiveGetObjectLinks( const xAOD::TrigComposite* start, ElementLinkVector<xAOD::TrigCompositeContainer>& linkVector ){ + bool HasObjectCollection::operator()( const Decision* composite ) const { + return composite->hasObjectCollectionLinks( m_name ); + } + + bool recursiveGetObjectLinks( const Decision* start, ElementLinkVector<DecisionContainer>& linkVector ){ //recursively find in the seeds - if ( start->hasObjectLink( "seed" ) ) { - return recursiveGetObjectLinks( start->object<xAOD::TrigComposite>( "seed" ), linkVector ); + if ( hasLinkToPrevious(start) ) { + const ElementLinkVector<DecisionContainer> seeds = getLinkToPrevious(start); + for (const ElementLink<DecisionContainer>& seedEL : seeds) { + recursiveGetObjectLinks( *seedEL, linkVector ); + } } int isComposite=0; @@ -183,7 +187,7 @@ namespace TrigCompositeUtils { // ElementLink<xAOD::TrigComposite> test; // test = start->objectLink( "childProxies" ); - ElementLinkVector<xAOD::TrigCompositeContainer> links = start->objectCollectionLinks<xAOD::TrigCompositeContainer>( "childProxies" ); + ElementLinkVector<DecisionContainer> links = start->objectCollectionLinks<DecisionContainer>( "childProxies" ); linkVector.reserve( linkVector.size() + links.size() ); std::move( links.begin(), links.end(), std::back_inserter( linkVector ) ); @@ -191,13 +195,13 @@ namespace TrigCompositeUtils { return true; } - std::string dump( const xAOD::TrigComposite* tc, std::function< std::string( const xAOD::TrigComposite* )> printerFnc ) { + std::string dump( const Decision* tc, std::function< std::string( const Decision* )> printerFnc ) { std::string ret; ret += printerFnc( tc ); - if ( tc->hasObjectLink("seed") ) { - const xAOD::TrigComposite* seedTc = tc->object<xAOD::TrigComposite>( "seed" ); - if ( seedTc ) { - ret += " -> " + dump( seedTc, printerFnc ); + if ( hasLinkToPrevious(tc) ) { + const ElementLinkVector<DecisionContainer> seeds = getLinkToPrevious(tc); + for (const ElementLink<DecisionContainer>& seedEL : seeds) { + ret += " -> " + dump( *seedEL, printerFnc ); } } return ret; diff --git a/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx b/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx index 48940d6b33693bfa6b19b953d486a2fb675cc546..b2ef8139eb0987f54752253cd08413db790aec9d 100644 --- a/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx +++ b/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx @@ -13,12 +13,12 @@ #include "TestTools/expect.h" #include "DecisionHandling/TrigCompositeUtils.h" #include "xAODTrigger/TrigCompositeAuxContainer.h" +#include "CxxUtils/checker_macros.h" -bool xAOD::TrigComposite::s_throwOnCopyError = true; - -int main() { +int main ATLAS_NOT_THREAD_SAFE () { using namespace TrigCompositeUtils; + xAOD::TrigComposite::s_throwOnCopyError = true; errorcheck::ReportMessage::hideFunctionNames (true); @@ -131,10 +131,10 @@ int main() { addDecisionID( 95, d3 ); addDecisionID( 99, d3 ); addDecisionID( 99, d3 ); - auto storedDecisions = d3->getDetail<std::vector<int>>( "decisions" ); + auto storedDecisions = d3->getDetail<std::vector<DecisionID>>( "decisions" ); VALUE ( storedDecisions.size() ) EXPECTED ( 2 ); - VALUE ( ( int )storedDecisions.front() ) EXPECTED ( 95 ); - VALUE ( ( int )storedDecisions.back() ) EXPECTED ( 99 ); + VALUE ( ( DecisionID )storedDecisions.front() ) EXPECTED ( 95 ); + VALUE ( ( DecisionID )storedDecisions.back() ) EXPECTED ( 99 ); // Make an EL with an invalid (zero) hash key and try to add it to a Decision auto data1 = std::make_unique<DecisionContainer>() ; @@ -152,10 +152,12 @@ int main() { VALUE ( d3->setObjectLink( "bad", badEL2 ) ) EXPECTED ( false ); // this fails, and cerr output also expected - // Make, store and retrieve a "seed" link + // Make, store and retrieve a "seed" link within a collection ElementLink<DecisionContainer> el( *dc, 1 ); - assert( d3->setObjectLink( "seed", el ) ); - ElementLink<DecisionContainer > resEl = d3->objectLink<DecisionContainer>("seed"); + assert( d3->addObjectCollectionLink( "seed", el ) ); + ElementLinkVector<DecisionContainer > resElVector = d3->objectCollectionLinks<DecisionContainer>("seed"); + assert( resElVector.size() == 1 ); + ElementLink<DecisionContainer> resEl = resElVector.front(); VALUE( resEl.index() ) EXPECTED ( el.index() ); VALUE( resEl.key() ) EXPECTED ( el.key() ); @@ -163,14 +165,16 @@ int main() { std::cout << std::endl; std::cout << "New decision d3b with name & context " << std::endl; auto d3b = newDecisionIn( dc, "d3b", ctx ); - // Make, store and retrieve a "seed" link, with context + // Make, store and retrieve a "testLink" link, with context ElementLink<DecisionContainer> el2( *dc, 1, ctx ); assert ( d3b->setObjectLink( "testlink", el2 ) ); std::cout << "d3b: " << *d3b << std::endl; std::cout << "el2 " << el2.key() << " " << el2.index() << std::endl; ElementLink<DecisionContainer > resEl2 = d3b->objectLink<DecisionContainer>("testlink"); + const Decision* res2 = d3b->object<Decision>("testlink"); VALUE( resEl2.index() ) EXPECTED ( el2.index() ); VALUE( resEl2.key() ) EXPECTED ( el2.key() ); + VALUE( *resEl2.cptr() ) EXPECTED ( res2 ); // check copyLinks (copies all) auto d4 = newDecisionIn( dc ); @@ -178,7 +182,8 @@ int main() { std::cout << "d3: " << *d3 << std::endl; std::cout << "d4: " << *d4 << std::endl; std::cout << "el: key " << el.key() << " index " << el.index() << std::endl; - ElementLink<DecisionContainer > resElCopied = d4->objectLink<DecisionContainer>("seed"); + ElementLinkVector<DecisionContainer > resElCopiedVector = d4->objectCollectionLinks<DecisionContainer>("seed"); + ElementLink<DecisionContainer> resElCopied = resElCopiedVector.front(); VALUE ( resElCopied.index() ) EXPECTED ( el.index() ); VALUE ( resElCopied.key() ) EXPECTED ( el.key() ); @@ -194,15 +199,19 @@ int main() { std::cout << "get d5 feature link " << std::endl; ElementLink<DecisionContainer > d5feature = d5->objectLink<DecisionContainer>("feature"); std::cout << "get d6 feature link " << std::endl; - ElementLink<DecisionContainer > d6feature = d6->objectLink<DecisionContainer>("feature"); + // We have to get this recursivly + LinkInfo<DecisionContainer> linkInfo = findLink<DecisionContainer>(d6, "feature"); + VALUE ( linkInfo.isValid() ) EXPECTED ( true ); + ElementLink<DecisionContainer > d6feature = linkInfo.link; std::cout << "compare feature links " << std::endl; VALUE ( d5feature.index() ) EXPECTED ( d6feature.index() ); VALUE ( d5feature.key() ) EXPECTED ( d6feature.key() ); std::cout << "get self and seed links " << std::endl; auto d5self = d5->objectLink<DecisionContainer>("self"); - auto d6seed = d6->objectLink<DecisionContainer>("seed"); - VALUE ( d5self.index() ) EXPECTED ( d6seed.index() ); - VALUE ( d5self.key() ) EXPECTED ( d6seed.key() ); + auto d6seedVector = getLinkToPrevious(d6); + auto d6seed = d6seedVector.front(); + VALUE ( d5self.index() ) EXPECTED ( d6seed.index() ); + VALUE ( d5self.key() ) EXPECTED ( d6seed.key() ); return 0; diff --git a/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx b/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx index 3929467e0389e801badc70d4508103ae34c6f7a5..f952bea82082e2181e2d1cc13b2378b38eca0346 100644 --- a/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx +++ b/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx @@ -13,7 +13,7 @@ using namespace TrigCompositeUtils; EventViewCreatorAlgorithm::EventViewCreatorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator ) - : InputMakerBase( name, pSvcLocator ) {} +: InputMakerBase( name, pSvcLocator ) {} EventViewCreatorAlgorithm::~EventViewCreatorAlgorithm(){} @@ -31,7 +31,7 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con // create the output decisions, similar to inputs (copy basic links) std::vector< SG::WriteHandle<TrigCompositeUtils::DecisionContainer> > outputHandles; ATH_CHECK (decisionInputToOutput(context, outputHandles)); - + // make the views auto viewsHandle = SG::makeHandle( m_viewsKey ); auto viewVector1 = std::make_unique< ViewContainer >(); @@ -46,7 +46,7 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con unsigned int conditionsRun = context.getExtension<Atlas::ExtendedEventContext>().conditionsRun(); //map all RoIs that are stored - std::vector <ElementLink<TrigRoiDescriptorCollection> > RoIsFromDecision; + ElementLinkVector<TrigRoiDescriptorCollection> RoIsFromDecision; // loop over decisions for (auto outputHandle: outputHandles) { @@ -63,39 +63,40 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con // loop over output decisions in container of outputHandle, follow link to inputDecision for ( auto outputDecision : *outputHandle){ ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision); + ATH_MSG_DEBUG( "Got inputLinks with " << inputLinks.size() << " elements" ); // loop over input links as predecessors for (auto input: inputLinks){ - const Decision* inputDecision = *input; - // find the RoI - auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() ); - auto roiEL = roiELInfo.link; - ATH_CHECK( roiEL.isValid() ); - // check if already found - auto roiIt=find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL); - if ( roiIt == RoIsFromDecision.end() ){ - RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used - const TrigRoiDescriptor* roi = *roiEL; - ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan()); - ATH_MSG_DEBUG( "Positive decisions on RoI, preparing view" ); - - // make the view - ATH_MSG_DEBUG( "Making the View" ); - auto newView = ViewHelper::makeView( name()+"_view", viewCounter++, m_viewFallThrough ); //pointer to the view - viewVector->push_back( newView ); - contexts.emplace_back( context ); - contexts.back().setExtension( Atlas::ExtendedEventContext( viewVector->back(), conditionsRun, roi ) ); - - // link decision to this view - outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), viewVector->size()-1 ));//adding view to TC - ATH_MSG_DEBUG( "Adding new view to new decision; storing view in viewVector component " << viewVector->size()-1 ); - ATH_CHECK( linkViewToParent( inputDecision, viewVector->back() ) ); - ATH_CHECK( placeRoIInView( roi, viewVector->back(), contexts.back() ) ); - } - else { - int iview = roiIt-RoIsFromDecision.begin(); - outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), iview ) ); //adding view to TC - ATH_MSG_DEBUG( "Adding already mapped view " << iview << " in ViewVector , to new decision"); - } + const Decision* inputDecision = *input; + // find the RoI + auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() ); + auto roiEL = roiELInfo.link; + ATH_CHECK( roiEL.isValid() ); + // check if already found + auto roiIt=find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL); + if ( roiIt == RoIsFromDecision.end() ){ + RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used + const TrigRoiDescriptor* roi = *roiEL; + ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan()); + ATH_MSG_DEBUG("Positive decisions on RoI, preparing view" ); + + // make the view + ATH_MSG_DEBUG( "Making the View" ); + auto newView = ViewHelper::makeView( name()+"_view", viewCounter++, m_viewFallThrough ); //pointer to the view + viewVector->push_back( newView ); + contexts.emplace_back( context ); + contexts.back().setExtension( Atlas::ExtendedEventContext( viewVector->back(), conditionsRun, roi ) ); + + // link decision to this view + outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), viewVector->size()-1 ));//adding view to TC + ATH_MSG_DEBUG( "Adding new view to new decision; storing view in viewVector component " << viewVector->size()-1 ); + ATH_CHECK( linkViewToParent( inputDecision, viewVector->back() ) ); + ATH_CHECK( placeRoIInView( roi, viewVector->back(), contexts.back() ) ); + } + else { + int iview = roiIt - RoIsFromDecision.begin(); + outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), iview ) ); //adding view to TC + ATH_MSG_DEBUG( "Adding already mapped view " << iview << " in ViewVector , to new decision"); + } }// loop over previous inputs } // loop over decisions }// loop over output keys @@ -105,9 +106,9 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con ATH_MSG_DEBUG( "Launching execution in " << viewVector->size() << " views" ); ATH_CHECK( ViewHelper::ScheduleViews( viewVector, // Vector containing views - m_viewNodeName, // CF node to attach views to - context, // Source context - m_scheduler.get() ) ); + m_viewNodeName, // CF node to attach views to + context, // Source context + m_scheduler.get() ) ); // report number of views, stored already when container was created // auto viewsHandle = SG::makeHandle( m_viewsKey ); @@ -132,8 +133,8 @@ StatusCode EventViewCreatorAlgorithm::linkViewToParent( const TrigCompositeUtils if ( m_requireParentView ) { ATH_MSG_ERROR( "Parent view not linked because it could not be found" ); ATH_MSG_ERROR( TrigCompositeUtils::dump( inputDecision, [](const xAOD::TrigComposite* tc){ - return "TC " + tc->name() + ( tc->hasObjectLink("view") ? " has view " : " has no view " ); - } ) ); + return "TC " + tc->name() + ( tc->hasObjectLink("view") ? " has view " : " has no view " ); + } ) ); return StatusCode::FAILURE; } @@ -146,7 +147,7 @@ StatusCode EventViewCreatorAlgorithm::placeRoIInView( const TrigRoiDescriptor* r auto oneRoIColl = std::make_unique< ConstDataVector<TrigRoiDescriptorCollection> >(); oneRoIColl->clear( SG::VIEW_ELEMENTS ); //Don't delete the RoIs oneRoIColl->push_back( roi ); - + //store the RoI in the view auto handle = SG::makeHandle( m_inViewRoIs, context ); ATH_CHECK( handle.setProxyDict( view ) ); diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py index 19ef84faf0d755e528139c3f5254fa14277c9e50..06ad199e389d1848358a3cae6b11daf0733ba886 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py @@ -119,7 +119,7 @@ decisionObjectsToRecord = [] for d in decisionObjects: decisionObjectsToRecord.extend([ "xAOD::TrigCompositeContainer_v1#%s" % d, - "xAOD::TrigCompositeAuxContainer_v2#%s.decisions" % d + "xAOD::TrigCompositeAuxContainer_v2#%s." % d ]) ########################################## diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py b/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py index 474e1c36b3f0a87a9d39ba72c4bd7f0307f565c5..00c05345fad1382118dc87f2e7a93cd4a9b81cbb 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py @@ -349,7 +349,7 @@ serialiser = TriggerEDMSerialiserToolCfg("Serialiser") serialiser.OutputLevel=VERBOSE serialiser.addCollectionListToMainResult([ "xAOD::TrigCompositeContainer_v1#remap_EgammaCaloDecisions", - "xAOD::TrigCompositeAuxContainer_v2#remap_EgammaCaloDecisionsAux.decisions", + "xAOD::TrigCompositeAuxContainer_v2#remap_EgammaCaloDecisionsAux.", "xAOD::TrigEMClusterContainer_v1#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters", "xAOD::TrigEMClusterAuxContainer_v2#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux.RoIword.clusterQuality.e233.e237.e277.e2tsts1.ehad1.emaxs1.energy.energySample.et.eta.eta1.fracs1.nCells.phi.rawEnergy.rawEnergySample.rawEt.rawEta.rawPhi.viewIndex.weta2.wstot", "xAOD::TrigElectronContainer_v1#HLT_xAOD__TrigElectronContainer_L2ElectronFex", diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref index 1c772ff2c5efe1023d0853f5f99752afdcb877a1..26c1b35bf69af09ee108d1d1f4ce6f75d4812a6b 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref @@ -1,6 +1,5 @@ HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes -HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG Fragment size including 128 bytes from 1x DynAux : 508 +HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :396 bytes HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG Fragment size including 88 bytes from 1x DynAux : 892 @@ -8,8 +7,7 @@ HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :748 bytes HLTRMakerAlg.MKTool.Serialiser 0 0 DEBUG Fragment size including 1392 bytes from 14x DynAux : 2140 HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :664 bytes -HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG Fragment size including 184 bytes from 1x DynAux : 848 +HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :740 bytes HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1764 bytes HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG Fragment size including 100 bytes from 1x DynAux : 1864 @@ -17,8 +15,7 @@ HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :2864 bytes HLTRMakerAlg.MKTool.Serialiser 1 0 DEBUG Fragment size including 2680 bytes from 14x DynAux : 5544 HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :856 bytes -HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG Fragment size including 204 bytes from 1x DynAux : 1060 +HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :948 bytes HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :2404 bytes HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG Fragment size including 108 bytes from 1x DynAux : 2512 @@ -26,8 +23,7 @@ HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1760 bytes HLTRMakerAlg.MKTool.Serialiser 2 0 DEBUG Fragment size including 2008 bytes from 14x DynAux : 3768 HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :664 bytes -HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG Fragment size including 172 bytes from 1x DynAux : 836 +HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :728 bytes HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1764 bytes HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG Fragment size including 100 bytes from 1x DynAux : 1864 @@ -35,8 +31,7 @@ HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3324 bytes HLTRMakerAlg.MKTool.Serialiser 3 0 DEBUG Fragment size including 2960 bytes from 14x DynAux : 6284 HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes -HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG Fragment size including 152 bytes from 1x DynAux : 628 +HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :516 bytes HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG Fragment size including 92 bytes from 1x DynAux : 1216 @@ -44,8 +39,7 @@ HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1024 bytes HLTRMakerAlg.MKTool.Serialiser 4 0 DEBUG Fragment size including 1560 bytes from 14x DynAux : 2584 HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :948 bytes -HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG Fragment size including 212 bytes from 1x DynAux : 1160 +HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :1052 bytes HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :2724 bytes HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG Fragment size including 112 bytes from 1x DynAux : 2836 @@ -53,8 +47,7 @@ HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :4612 bytes HLTRMakerAlg.MKTool.Serialiser 5 0 DEBUG Fragment size including 3744 bytes from 14x DynAux : 8356 HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes -HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG Fragment size including 132 bytes from 1x DynAux : 512 +HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :400 bytes HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG Fragment size including 88 bytes from 1x DynAux : 892 @@ -62,8 +55,7 @@ HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1208 bytes HLTRMakerAlg.MKTool.Serialiser 6 0 DEBUG Fragment size including 1672 bytes from 14x DynAux : 2880 HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :568 bytes -HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG Fragment size including 160 bytes from 1x DynAux : 728 +HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :620 bytes HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1444 bytes HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG Fragment size including 96 bytes from 1x DynAux : 1540 @@ -71,8 +63,7 @@ HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3048 bytes HLTRMakerAlg.MKTool.Serialiser 7 0 DEBUG Fragment size including 2792 bytes from 14x DynAux : 5840 HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes -HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG Fragment size including 160 bytes from 1x DynAux : 636 +HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :524 bytes HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG Fragment size including 92 bytes from 1x DynAux : 1216 @@ -80,14 +71,13 @@ HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :840 bytes HLTRMakerAlg.MKTool.Serialiser 8 0 DEBUG Fragment size including 1448 bytes from 14x DynAux : 2288 HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :284 bytes +HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :296 bytes HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :484 bytes HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigElectronContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFex Fragment size :196 bytes HLTRMakerAlg.MKTool.Serialiser 9 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :472 bytes HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :664 bytes -HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG Fragment size including 204 bytes from 1x DynAux : 868 +HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :760 bytes HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1764 bytes HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG Fragment size including 100 bytes from 1x DynAux : 1864 @@ -95,8 +85,7 @@ HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3508 bytes HLTRMakerAlg.MKTool.Serialiser 10 0 DEBUG Fragment size including 3072 bytes from 14x DynAux : 6580 HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes -HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG Fragment size including 128 bytes from 1x DynAux : 508 +HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :396 bytes HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG Fragment size including 88 bytes from 1x DynAux : 892 @@ -104,8 +93,7 @@ HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :840 bytes HLTRMakerAlg.MKTool.Serialiser 11 0 DEBUG Fragment size including 1448 bytes from 14x DynAux : 2288 HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :1044 bytes -HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG Fragment size including 256 bytes from 1x DynAux : 1300 +HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :1192 bytes HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :3044 bytes HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG Fragment size including 116 bytes from 1x DynAux : 3160 @@ -113,8 +101,7 @@ HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3876 bytes HLTRMakerAlg.MKTool.Serialiser 12 0 DEBUG Fragment size including 3296 bytes from 14x DynAux : 7172 HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes -HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG Fragment size including 164 bytes from 1x DynAux : 640 +HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :528 bytes HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG Fragment size including 92 bytes from 1x DynAux : 1216 @@ -122,8 +109,7 @@ HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :2496 bytes HLTRMakerAlg.MKTool.Serialiser 13 0 DEBUG Fragment size including 2456 bytes from 14x DynAux : 4952 HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes -HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG Fragment size including 132 bytes from 1x DynAux : 512 +HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :400 bytes HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG Fragment size including 88 bytes from 1x DynAux : 892 @@ -131,22 +117,20 @@ HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :748 bytes HLTRMakerAlg.MKTool.Serialiser 14 0 DEBUG Fragment size including 1392 bytes from 14x DynAux : 2140 HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :284 bytes +HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :296 bytes HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :484 bytes HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigElectronContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFex Fragment size :196 bytes HLTRMakerAlg.MKTool.Serialiser 15 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :472 bytes HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes -HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG Fragment size including 124 bytes from 1x DynAux : 504 +HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :392 bytes HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG Fragment size including 88 bytes from 1x DynAux : 892 HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigElectronContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFex Fragment size :196 bytes HLTRMakerAlg.MKTool.Serialiser 16 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :472 bytes HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes -HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG Fragment size including 164 bytes from 1x DynAux : 640 +HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :528 bytes HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG Fragment size including 92 bytes from 1x DynAux : 1216 @@ -154,8 +138,7 @@ HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1392 bytes HLTRMakerAlg.MKTool.Serialiser 17 0 DEBUG Fragment size including 1784 bytes from 14x DynAux : 3176 HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes -HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG Fragment size including 160 bytes from 1x DynAux : 636 +HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :524 bytes HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG Fragment size including 92 bytes from 1x DynAux : 1216 @@ -163,8 +146,7 @@ HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigElectronContai HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :840 bytes HLTRMakerAlg.MKTool.Serialiser 18 0 DEBUG Fragment size including 1448 bytes from 14x DynAux : 2288 HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes -HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :568 bytes -HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG Fragment size including 152 bytes from 1x DynAux : 720 +HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :612 bytes HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1444 bytes HLTRMakerAlg.MKTool.Serialiser 19 0 DEBUG Fragment size including 96 bytes from 1x DynAux : 1540 diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py index 5c2e333931c91e8850c3fc65a1d5b99672c18c66..45862afb45c47defcb21e35248d16973d819b481 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py +++ b/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py @@ -120,7 +120,7 @@ decisionObjectsToRecord = [] for d in decisionObjects: decisionObjectsToRecord.extend([ "xAOD::TrigCompositeContainer_v1#%s" % d, - "xAOD::TrigCompositeAuxContainer_v2#%s.decisions" % d + "xAOD::TrigCompositeAuxContainer_v2#%s." % d ]) ########################################## diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx index 94b86c7dfa59afef4fd0b43da787a54b6971f267..a220b43967725e4388bf3e4f3a4ff06955ce3278 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx +++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx @@ -6,9 +6,9 @@ #include "TestHypoAlg.h" namespace HLTTest { - + TestHypoAlg::TestHypoAlg( const std::string& name, ISvcLocator* pSvcLocator ) - : ::HypoBase( name, pSvcLocator ) {} + : ::HypoBase( name, pSvcLocator ) {} TestHypoAlg::~TestHypoAlg() {} @@ -51,9 +51,9 @@ namespace HLTTest { // find features: std::vector<const FeatureOBJ*> featureFromDecision; - for ( auto previousDecision: *previousDecisionsHandle ) { - auto linkInfo = TrigCompositeUtils::findLink<FeatureContainer>(previousDecision, m_linkName.value()); - auto featureLink = linkInfo.link; + for ( const auto previousDecision: *previousDecisionsHandle ) { + const auto linkInfo = TrigCompositeUtils::findLink<FeatureContainer>(previousDecision, m_linkName.value()); + const auto featureLink = linkInfo.link; CHECK( featureLink.isValid() ); const FeatureOBJ* feature = *featureLink; featureFromDecision.push_back( feature); @@ -62,51 +62,50 @@ namespace HLTTest { //map reco object and decision: find in reco obejct the initial RoI and map it to the correct decision size_t reco_counter = 0; - for (auto recoobj: *recoInput){ - auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( recoobj, "initialRoI" ); - auto roiEL = roiInfo.link; + for (const auto recoobj: *recoInput){ + const auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( recoobj, "initialRoI" ); + const auto roiEL = roiInfo.link; CHECK( roiEL.isValid() ); - auto featureInfo = TrigCompositeUtils::findLink<FeatureContainer>( recoobj, m_linkName.value() ); - auto featurelink = featureInfo.link; + const auto featureInfo = TrigCompositeUtils::findLink<FeatureContainer>( recoobj, m_linkName.value() ); + const auto featurelink = featureInfo.link; CHECK( featurelink.isValid() ); if ( not featurelink.isValid() ) { - ATH_MSG_ERROR( " Can not find reference to " + m_linkName.value() + " from the decision" ); - return StatusCode::FAILURE; + ATH_MSG_ERROR( " Can not find reference to " + m_linkName.value() + " from the decision" ); + return StatusCode::FAILURE; } ATH_MSG_DEBUG(" Found link from the reco object to feature "<<m_linkName.value() ); const FeatureOBJ* feature = *featurelink; // find the same roi in the previous decisions bool foundFeatureInDecision=false; - size_t pos=distance(featureFromDecision.begin(), find(featureFromDecision.begin(), featureFromDecision.end(), feature)); - if (pos < featureFromDecision.size()){ - foundFeatureInDecision=true; - } - - if (foundFeatureInDecision){ - ATH_MSG_DEBUG(" Found link from the reco object to the previous decision at position "<<pos); - auto d = newDecisionIn(decisions); - d->setObjectLink( "feature", ElementLink<xAOD::TrigCompositeContainer>(m_recoInput.key(), reco_counter) );// feature used by the Tool - d->setObjectLink( m_linkName.value(), featurelink ); - linkToPrevious( d, decisionInput().key(), pos ); - } - else{ - ATH_MSG_ERROR( " Can not find reference to previous decision from feature " + m_linkName.value() + " from reco object " << reco_counter ); - return StatusCode::FAILURE; - } - reco_counter++; + size_t pos=distance(featureFromDecision.begin(), find(featureFromDecision.begin(), featureFromDecision.end(), feature)); + if (pos < featureFromDecision.size()){ + foundFeatureInDecision=true; + } + + if (foundFeatureInDecision){ + ATH_MSG_DEBUG(" Found link from the reco object to the previous decision at position "<<pos); + auto d = newDecisionIn(decisions); + d->setObjectLink( "feature", ElementLink<xAOD::TrigCompositeContainer>(m_recoInput.key(), reco_counter) );// feature used by the Tool + d->setObjectLink( m_linkName.value(), featurelink ); + linkToPrevious( d, decisionInput().key(), pos ); + } + else{ + ATH_MSG_ERROR( " Can not find reference to previous decision from feature " + m_linkName.value() + " from reco object " << reco_counter ); + return StatusCode::FAILURE; + } + reco_counter++; } - - if (decisions->size()>0){ for ( auto tool: m_tools ) { - CHECK( tool->decide( decisions ) ); + CHECK( tool->decide( decisions ) ); } } ATH_MSG_DEBUG( "Exiting with "<< outputHandle->size() <<" decisions"); + //debug for (auto outh: *outputHandle){ TrigCompositeUtils::DecisionIDContainer objDecisions; @@ -115,14 +114,11 @@ namespace HLTTest { ATH_MSG_DEBUG("Number of positive decisions for this input: " << objDecisions.size() ); for ( TrigCompositeUtils::DecisionID id : objDecisions ) { - ATH_MSG_DEBUG( " --- found new decision " << HLT::Identifier( id ) ); + ATH_MSG_DEBUG( " --- found new decision " << HLT::Identifier( id ) ); } - } - - + return StatusCode::SUCCESS; } - } //> end namespace HLTTest diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx index cac352bfc086e1737d36e2117255d525f33b91bd..e3f0bf919a51ab90d2b588afbd5acdf01411bb06 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx +++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx @@ -11,10 +11,10 @@ using namespace TrigCompositeUtils; namespace HLTTest { TestHypoTool::TestHypoTool( const std::string& type, - const std::string& name, - const IInterface* parent ) : - ITestHypoTool( name ), - AthAlgTool( type, name, parent ) + const std::string& name, + const IInterface* parent ) : + ITestHypoTool( name ), + AthAlgTool( type, name, parent ) { m_decisionId=HLT::Identifier::fromToolName(name ); } @@ -28,59 +28,59 @@ namespace HLTTest { ATH_MSG_DEBUG("Link name is "<<m_linkName.value()); ATH_MSG_DEBUG("threshold="<<m_threshold); ATH_MSG_DEBUG("property="<<m_property); - return StatusCode::SUCCESS; + return StatusCode::SUCCESS; } - - StatusCode TestHypoTool::decide( DecisionContainer* decisions ) const { ATH_MSG_DEBUG( "Making new decisions " << name() ); size_t counter = 0; - for ( auto d: *decisions ) { + for ( const auto d: *decisions ) { //get previous decisions ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(d); ATH_MSG_DEBUG("Got "<<inputLinks.size()<<" previous decisions"); - for (auto previousDecisions: inputLinks){ - - //auto previousDecisions = linkToPrevious( d); - TrigCompositeUtils::DecisionIDContainer objDecisions; - TrigCompositeUtils::decisionIDs( *previousDecisions, objDecisions ); - - ATH_MSG_DEBUG("Number of previous decisions ID for input "<< counter <<"= " << objDecisions.size() ); - - for ( TrigCompositeUtils::DecisionID id : objDecisions ) { - ATH_MSG_DEBUG( " -- found decision " << HLT::Identifier( id ) ); - } - - auto it= find(objDecisions.begin(), objDecisions.end(), m_decisionId); - if (it != objDecisions.end()){ - auto feature = d->objectLink<xAOD::TrigCompositeContainer>( "feature" ); - //auto feature = d->objectLink<xAOD::TrigCompositeContainer>( m_linkName.value() ); - if ( not feature.isValid() ) { - ATH_MSG_ERROR( " Can not find reference to the object from the decision" ); - return StatusCode::FAILURE; - } - float v = (*feature)->getDetail<float>( m_property ); - if ( v > m_threshold ) { // actual cut will be more complex of course - ATH_MSG_DEBUG( " threshold " << m_threshold << " passed by value: " << v ); - addDecisionID( m_decisionId, d ); - } - else ATH_MSG_DEBUG( " threshold " << m_threshold << " not passed by value " << v ); - } - else { - ATH_MSG_DEBUG("No Input decisions requested by active chain "<< m_decisionId); - } - counter++; + for (const auto previousDecisions: inputLinks){ + + TrigCompositeUtils::DecisionIDContainer objDecisions; + TrigCompositeUtils::decisionIDs( *previousDecisions, objDecisions ); + + ATH_MSG_DEBUG("Number of previous decisions ID for input "<< counter <<"= " << objDecisions.size() ); + + for ( TrigCompositeUtils::DecisionID id : objDecisions ) { + ATH_MSG_DEBUG( " -- found decision " << HLT::Identifier( id ) ); + } + + const auto it = find(objDecisions.begin(), objDecisions.end(), m_decisionId); + if (it != objDecisions.end()){ + + const auto feature = d->objectLink<xAOD::TrigCompositeContainer>( "feature" ); + // Used to fetch m_linkName.value() but this was refactored to "feature" + if ( not feature.isValid() ) { + ATH_MSG_ERROR( " Can not find reference to the object from the decision" ); + return StatusCode::FAILURE; + } + const float v = (*feature)->getDetail<float>( m_property ); + if ( v > m_threshold ) { // actual cut will be more complex of course + ATH_MSG_DEBUG( " threshold " << m_threshold << " passed by value: " << v ); + addDecisionID( m_decisionId, d ); + } else { + ATH_MSG_DEBUG( " threshold " << m_threshold << " not passed by value " << v ); + } + + } else { // it == objDecisions.end() + + ATH_MSG_DEBUG("No Input decisions requested by active chain "<< m_decisionId); + + } + counter++; } } - return StatusCode::SUCCESS; } - + StatusCode TestHypoTool::finalize() { ATH_MSG_INFO( "Finalizing " << name() << "..." ); return StatusCode::SUCCESS; } - } //> end namespace HLTTest +} //> end namespace HLTTest diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx index 3d7b76d870f9b2df38d784cfebf4933b5fe119ef..226e7820b9ae739def0c571c41d0d28b0b38d194 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx +++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx @@ -10,11 +10,11 @@ #include <vector> namespace HLTTest { - + TestInputMaker::TestInputMaker( const std::string& name, - ISvcLocator* pSvcLocator ) - : InputMakerBase( name, pSvcLocator ) {} - + ISvcLocator* pSvcLocator ) + : InputMakerBase( name, pSvcLocator ) {} + TestInputMaker::~TestInputMaker() {} @@ -36,7 +36,7 @@ namespace HLTTest { StatusCode TestInputMaker::execute( const EventContext& context ) const { ATH_MSG_DEBUG( "Executing " << name() << "..." ); - + // call base class helper method to read input decisions, loop over them create outputs and connect them, returns with outputHandles filled std::vector< SG::WriteHandle<TrigCompositeUtils::DecisionContainer> > outputHandles; CHECK (decisionInputToOutput(context, outputHandles)); @@ -50,51 +50,50 @@ namespace HLTTest { // loop over output decisions, navigate to inputs for (auto outputHandle: outputHandles) { if( not outputHandle.isValid() ) { - ATH_MSG_DEBUG( "Got no decisions from output "<< outputHandle.key() << " because handle not valid"); - continue; + ATH_MSG_DEBUG( "Got no decisions from output "<< outputHandle.key() << " because handle not valid"); + continue; } if( outputHandle->size() == 0){ // input filtered out - ATH_MSG_ERROR( "Got no decisions from output "<< outputHandle.key()<<": handle is valid but container is empty. Is this expected?"); - return StatusCode::FAILURE; + ATH_MSG_ERROR( "Got no decisions from output "<< outputHandle.key()<<": handle is valid but container is empty. Is this expected?"); + return StatusCode::FAILURE; } + ATH_MSG_DEBUG( "Got output "<< outputHandle.key()<<" with " << outputHandle->size() << " elements" ); // loop over output decisions in container of outputHandle, follow link to inputDecision - for ( auto outputDecision : *outputHandle){ - ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision); - for (auto input: inputLinks){ - ATH_MSG_DEBUG( "followed seed link to input "<< input.key() ); - const Decision* inputDecision = *input; - auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value()); - CHECK( roiELInfo.isValid() ); - - // retrieve input feature from input decision (TrigComposite), will in this case be a TrigRoiDescriptor - auto featureLinkInfo = TrigCompositeUtils::findLink<FeatureContainer>( inputDecision, m_linkName.value()); - CHECK( featureLinkInfo.isValid() ); - - // link input reco object to outputDecision - auto featureLink = featureLinkInfo.link; - const FeatureOBJ* feature = *featureLink; - ATH_MSG_DEBUG(" Found feature " <<m_linkName.value() ); - - // merge reco outputs that are linked to the same feature (RoI): this avoids processing the same RoI from TC decisions from different chains - - // avoid adding the same feature multiple times: check if not in container, if not add it - if ( find(featuresFromDecision.begin(), featuresFromDecision.end(), feature) - == featuresFromDecision.end() ){ - featuresFromDecision.push_back(feature); // just to keep track of which we have used - // create the "reco" output: this would normally be a copy of the reco input or something derived from it, e.g. detector data inside a RoI. A TrigComposite is used here just for a trivial example. - auto newFeature = new xAOD::TrigComposite; - reco_output->push_back(newFeature); - newFeature->setObjectLink(m_linkName.value(), featureLink); - ATH_MSG_DEBUG(" Added " <<m_linkName.value() << " and " << m_roisLink.value() << " to reco object"); - } - }//loop over previous inputs + for (const auto outputDecision : *outputHandle){ + const ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision); + for (const auto input: inputLinks){ + ATH_MSG_DEBUG( "followed seed link to input "<< input.key() ); + const Decision* inputDecision = *input; + const auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value()); + CHECK( roiELInfo.isValid() ); + + // retrieve input feature from input decision (TrigComposite), will in this case be a TrigRoiDescriptor + const auto featureLinkInfo = TrigCompositeUtils::findLink<FeatureContainer>( inputDecision, m_linkName.value()); + CHECK( featureLinkInfo.isValid() ); + + // link input reco object to outputDecision + const auto featureLink = featureLinkInfo.link; + const FeatureOBJ* feature = *featureLink; + ATH_MSG_DEBUG(" Found feature " <<m_linkName.value() ); + + // merge reco outputs that are linked to the same feature (RoI): this avoids processing the same RoI from TC decisions from different chains + + // avoid adding the same feature multiple times: check if not in container, if not add it + if ( find(featuresFromDecision.begin(), featuresFromDecision.end(), feature) == featuresFromDecision.end() ){ + featuresFromDecision.push_back(feature); // just to keep track of which we have used + // create the "reco" output: this would normally be a copy of the reco input or something derived from it, e.g. detector data inside a RoI. A TrigComposite is used here just for a trivial example. + auto newFeature = new xAOD::TrigComposite; + reco_output->push_back(newFeature); + newFeature->setObjectLink(m_linkName.value(), featureLink); + ATH_MSG_DEBUG(" Added " <<m_linkName.value() << " and " << m_roisLink.value() << " to reco object"); + } + }//loop over previous inputs // For early tests, create TC, link to RoiD, push back onto TCC. // Later will output RoID collection directly via tool. } // loop over decisions } // loop over input keys - - + // Finally, record output ATH_MSG_DEBUG("Produced "<<reco_output->size() <<" reco objects and stored in "<<m_recoOutput); auto reco_outputHandle = SG::makeHandle(m_recoOutput, context); @@ -106,5 +105,5 @@ namespace HLTTest { return StatusCode::SUCCESS; } - + } //> end namespace HLTTest diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx index 43495b0c8053b1ef7a785970d177ae89624096a5..7a0af223d1a2d903634619ddedad3006511346fb 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx +++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx @@ -17,8 +17,8 @@ namespace HLTTest { // Constructors //////////////// TestMerger::TestMerger( const std::string& name, - ISvcLocator* pSvcLocator ) : - ::AthAlgorithm( name, pSvcLocator ) + ISvcLocator* pSvcLocator ) : + ::AthAlgorithm( name, pSvcLocator ) { declareProperty( "Inputs", m_inputs ); declareProperty( "Output", m_outputKey ); @@ -51,17 +51,17 @@ namespace HLTTest { auto aux = std::make_unique<DecisionAuxContainer>(); output->setStore( aux.get() ); - for ( auto input: m_inputs ) { + for (const auto input: m_inputs ) { auto iHandle = SG::ReadHandle<DecisionContainer>(input); if ( iHandle.isValid() ) { - size_t counter = 0; - for ( auto iDecisionIter = iHandle->begin(); iDecisionIter != iHandle->end(); ++iDecisionIter, ++counter ) { - auto d = newDecisionIn(output.get()); - linkToPrevious(d, input, counter ); - } - ATH_MSG_DEBUG( "Input " << input << " present, linked " << counter << " inputs" ); + size_t counter = 0; + for ( auto iDecisionIter = iHandle->begin(); iDecisionIter != iHandle->end(); ++iDecisionIter, ++counter ) { + auto d = newDecisionIn(output.get()); + linkToPrevious(d, *iDecisionIter ); + } + ATH_MSG_DEBUG( "Input " << input << " present, linked " << counter << " inputs" ); } else { - ATH_MSG_DEBUG( "Input " << input << " absent" ); + ATH_MSG_DEBUG( "Input " << input << " absent" ); } } diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx index 968b9f7e8c1826f1c9a37f86336889e753abdb45..db31e748bfd2c3a2825aca525e706b9a07dcacd9 100644 --- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx +++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx @@ -15,8 +15,8 @@ using namespace TrigCompositeUtils; namespace HLTTest { TestRoRSeqFilter::TestRoRSeqFilter( const std::string& name, - ISvcLocator* pSvcLocator ) : - ::AthAlgorithm( name, pSvcLocator ) + ISvcLocator* pSvcLocator ) : + ::AthAlgorithm( name, pSvcLocator ) { declareProperty( "Inputs", m_inputs ); declareProperty( "Outputs", m_outputs ); @@ -34,25 +34,28 @@ namespace HLTTest { ATH_MSG_DEBUG("Will consume the input data: " << m_inputs << " and produce " << m_outputs ); ATH_MSG_DEBUG("This filter has alwaysPass=" << m_alwaysPass); ATH_MSG_DEBUG("Configured chains are:"); - for ( auto& el: m_chainsProperty ) ATH_MSG_DEBUG(el); + for ( auto& el: m_chainsProperty ) { + ATH_MSG_DEBUG(el); + } // if ( m_inputs.size() != m_outputs.size() ) { // ATH_MSG_ERROR("Inputs and Outputs have different size, the mapping is unclear"); // return StatusCode::FAILURE; // } - - for ( auto& el: m_chainsProperty ) + + for ( auto& el: m_chainsProperty ) { m_chains.insert( HLT::Identifier(el).numeric() ); - + } + // minimal validity crosscheck if ( m_chainsProperty.size() == 0 and m_alwaysPass == false ) { ATH_MSG_WARNING("This filter will always reject as it has no chains of interest configured"); } - + if ( m_chains.size() != m_chainsProperty.size() ) { ATH_MSG_ERROR("Repeated chain requirements (annoyance) or chain to hash conversion clash (major configuration issue therefore can not run)"); return StatusCode::FAILURE; } - + return StatusCode::SUCCESS; } @@ -67,7 +70,7 @@ namespace HLTTest { { ATH_MSG_DEBUG ( "Executing " << name() << "..." ); bool pass = false; - + for ( size_t inputIndex = 0; inputIndex < m_inputs.size(); ++inputIndex ) { auto input = m_inputs[inputIndex]; ATH_MSG_DEBUG( "Processing input " << input ); @@ -79,22 +82,21 @@ namespace HLTTest { // not bother recording if there is no output if ( not decisionOutput->empty() ) { - ATH_MSG_DEBUG( "Saving output " << m_outputs[inputIndex] ); - pass = true; - SG::WriteHandle<DecisionContainer> outputDH( m_outputs[inputIndex] ); - CHECK( outputDH.record( std::move( decisionOutput ), std::move( decisionAux ) ) ); + ATH_MSG_DEBUG( "Saving output " << m_outputs[inputIndex] ); + pass = true; + SG::WriteHandle<DecisionContainer> outputDH( m_outputs[inputIndex] ); + CHECK( outputDH.record( std::move( decisionOutput ), std::move( decisionAux ) ) ); } else { - ATH_MSG_DEBUG( "None of the decisions in the input " << input << " passed, skipping recording output " ); + ATH_MSG_DEBUG( "None of the decisions in the input " << input << " passed, skipping recording output " ); } } ATH_MSG_DEBUG( "The overall decision is : " << ( pass or m_alwaysPass ? "positive" : "negative") ); - + setFilterPassed( pass or m_alwaysPass ); return StatusCode::SUCCESS; } - void TestRoRSeqFilter::copyPassing( const std::string& inputKey, DecisionContainer* output ) const { SG::ReadHandle<DecisionContainer> inputDH( inputKey ); if ( not inputDH.isValid() ) { @@ -103,29 +105,29 @@ namespace HLTTest { } ATH_MSG_DEBUG( "Filtering "<<inputDH->size()<<" obejcts with key "<<inputKey); - + size_t counter=0; for ( auto objIter = inputDH->begin(); objIter != inputDH->end(); ++objIter, ++counter ) { DecisionIDContainer objDecisions; decisionIDs( *objIter, objDecisions ); // this should be replaced in production code by method passingIDs but the later is not printing so in tests we want the IDs // here we have to sets of IDs, those we are interested in (via chain property) and those comming from the decision obj - + std::vector<DecisionID> intersection; std::set_intersection( m_chains.begin(), m_chains.end(), - objDecisions.begin(), objDecisions.end(), - std::back_inserter( intersection ) ); - + objDecisions.begin(), objDecisions.end(), + std::back_inserter( intersection ) ); + ATH_MSG_DEBUG( "Found "<<intersection.size()<<" objects of interest for key "<<inputKey); for ( auto positive: intersection ) { - ATH_MSG_DEBUG( "Found positive decision for chain " << HLT::Identifier( positive ) ); + ATH_MSG_DEBUG( "Found positive decision for chain " << HLT::Identifier( positive ) ); } const bool positiveObjectDecision = not intersection.empty(); if ( positiveObjectDecision ) { - auto d = newDecisionIn( output ); - linkToPrevious( d, inputKey, counter ); + auto d = newDecisionIn( output ); + linkToPrevious( d, *objIter ); } else { - ATH_MSG_DEBUG( "Skipping objects with key " << inputKey <<" as they passed no chain of interest to this filter" ); + ATH_MSG_DEBUG( "Skipping objects with key " << inputKey <<" as they passed no chain of interest to this filter" ); } } } diff --git a/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh b/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh index f7156c46c3c4aec55f6896c0a4077af1cb2bfa97..74e9973310d471cfab859f7e5cef03fe65a5069e 100755 --- a/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh +++ b/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh @@ -2,7 +2,7 @@ # art-type: build # art-include: master/Athena -#clear BS from previous runs +#clear BS from previous runs rm -rf data_test.*.data athena --threads=1 --skipEvents=10 --evtMax=20 --filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1" TrigUpgradeTest/egamma.withViews.py && checkxAOD.py myESD.pool.root && diff --git a/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt b/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt index 395e1ccd0c75f2b384fc0505729f0bef14950633..db9b326dafec91e5cc57be1992f50a28f93a9b99 100644 --- a/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt +++ b/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt @@ -25,6 +25,7 @@ atlas_depends_on_subdirs( PUBLIC PRIVATE Control/AthenaKernel Control/CxxUtils + Control/AthViews Event/EventInfo Event/xAOD/xAODEventInfo Event/xAOD/xAODBTagging @@ -64,7 +65,7 @@ atlas_add_component( TrigValAlgs src/*.cxx src/components/*.cxx INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} - LINK_LIBRARIES ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps AthAnalysisBaseCompsLib GaudiKernel TrigDecisionToolLib TrigCaloEvent TrigInDetEvent TrigMuonEvent TrigNavToolsLib TrigNavigationLib TrigParticle TrigSteeringEvent AthenaKernel CxxUtils EventInfo xAODEventInfo xAODBTagging xAODEgamma xAODJet xAODMuon xAODTau xAODTracking xAODTrigBphys xAODTrigCalo xAODTrigEgamma xAODTrigMinBias xAODTrigMissingET xAODTrigMuon xAODCore xAODTrigger AnalysisTriggerEvent MuonCombinedToolInterfaces Particle tauEvent VxSecVertex TrigConfigSvcLib TrigConfHLTData TrigRoiConversionLib TrigDecisionEvent TrigMissingEtEvent TrigInDetTruthEvent TrigT1Interfaces DecisionHandlingLib ) + LINK_LIBRARIES ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps AthAnalysisBaseCompsLib GaudiKernel TrigDecisionToolLib TrigCaloEvent TrigInDetEvent TrigMuonEvent TrigNavToolsLib TrigNavigationLib TrigParticle TrigSteeringEvent AthenaKernel CxxUtils EventInfo xAODEventInfo xAODBTagging xAODEgamma xAODJet xAODMuon xAODTau xAODTracking xAODTrigBphys xAODTrigCalo xAODTrigEgamma xAODTrigMinBias xAODTrigMissingET xAODTrigMuon xAODCore xAODTrigger AnalysisTriggerEvent MuonCombinedToolInterfaces Particle tauEvent VxSecVertex TrigConfigSvcLib TrigConfHLTData TrigRoiConversionLib TrigDecisionEvent TrigMissingEtEvent TrigInDetTruthEvent TrigT1Interfaces DecisionHandlingLib AthViews ) # Install files from the package: atlas_install_headers( TrigValAlgs ) diff --git a/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx b/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx index 4ccbf728073a0eae1e29bdd8cc23be549189e136..a9837a115caa3e58af77951f62ac1b141f8882a7 100644 --- a/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx +++ b/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx @@ -99,6 +99,9 @@ #include "TrigT1Interfaces/RecEmTauRoI.h" +#include "AthViews/ViewHelper.h" +#include "AthViews/View.h" + #include <iostream> #include <fstream> @@ -4030,6 +4033,11 @@ StatusCode TrigEDMChecker::dumpTrigComposite() { m_dumpTrigCompositeContainers.clear(); const CLID TrigCompositeCLID = static_cast<CLID>( ClassID_traits< xAOD::TrigCompositeContainer >::ID() ); evtStore()->keys(TrigCompositeCLID, m_dumpTrigCompositeContainers); + std::string typeNameTC; + ATH_CHECK(m_clidSvc->getTypeNameOfID(TrigCompositeCLID, typeNameTC)); + ATH_MSG_DEBUG("dumpTrigComposite got " << m_dumpTrigCompositeContainers.size() << " keys for " << typeNameTC); + } else { + ATH_MSG_DEBUG("Using supplied " << m_dumpTrigCompositeContainers.size() << " keys"); } for ( const std::string & key: m_dumpTrigCompositeContainers ) { @@ -4042,22 +4050,12 @@ StatusCode TrigEDMChecker::dumpTrigComposite() { const xAOD::TrigCompositeContainer* cont= nullptr; ATH_CHECK( evtStore()->retrieve( cont, key ) ); + size_t count = 0; for ( auto tc: *cont ) { - ATH_MSG_DEBUG("name: " << tc->name()); - - // one gets a bit of info but is not that useful, we need to develop - //SGdebug::print_aux_vars( *tc ); - //SGdebug::dump_aux_vars( *tc ); - - // find the EL and check them - ATH_MSG_DEBUG( "Link col names : " << tc->linkColNames() ); - ATH_MSG_DEBUG( "Link col keys : " << tc->linkColKeys() ); - ATH_MSG_DEBUG( "Link col CLIDs : " << tc->linkColClids() ); - ATH_MSG_DEBUG( "Link col indices : " << tc->linkColIndices() ); - + ATH_MSG_DEBUG(" ########## ELEMENT " << count++); + ATH_MSG_DEBUG(*tc); // Get the objects we know of for (size_t i = 0; i < tc->linkColNames().size(); ++i) ATH_CHECK(checkTrigCompositeElementLink(tc, i)); - } } ATH_MSG_INFO( "REGTEST ==========END of xAOD::TrigCompositeContainer DUMP===========" ); @@ -4074,24 +4072,31 @@ StatusCode TrigEDMChecker::checkTrigCompositeElementLink(const xAOD::TrigComposi if (clid == ClassID_traits< TrigRoiDescriptorCollection >::ID()) { const ElementLink<TrigRoiDescriptorCollection> elementLink = tc->objectLink<TrigRoiDescriptorCollection>(name); - if (!elementLink.isValid()) ATH_MSG_WARNING("Invalid element link from '" << tc->name() << "' to '" << name << "'"); - else ATH_MSG_DEBUG("Got TrigRoiDescriptor:" << *elementLink); + if (!elementLink.isValid()) ATH_MSG_WARNING(" Invalid element link to TrigRoiDescriptorCollection, link name:'" << name << "'"); + else ATH_MSG_DEBUG(" Dereferenced link '" << name << "'' to TrigRoiDescriptor:" << *elementLink); } else if (clid == ClassID_traits< DataVector< LVL1::RecEmTauRoI > >::ID()) { // There could be a few ROI types.... // CLASS_DEF( DataVector< LVL1::RecEmTauRoI >, 6256, 1 ) const ElementLink<DataVector< LVL1::RecEmTauRoI >> elementLink = tc->objectLink<DataVector< LVL1::RecEmTauRoI >>(name); - if (!elementLink.isValid()) ATH_MSG_WARNING("Invalid element link from '" << tc->name() << "' to '" << name << "'"); - else ATH_MSG_DEBUG("Got LVL1::RecEmTauRoI:" << *elementLink); + if (!elementLink.isValid()) ATH_MSG_WARNING(" Invalid element link to LVL1::RecEmTauRoI, link name:'" << name << "'"); + else ATH_MSG_DEBUG(" Dereferenced link '" << name << "' to LVL1::RecEmTauRoI:" << *elementLink); } else if (clid == ClassID_traits< xAOD::TrigCompositeContainer >::ID()) { const ElementLink<xAOD::TrigCompositeContainer> elementLink = tc->objectLink<xAOD::TrigCompositeContainer>(name); - if (!elementLink.isValid()) ATH_MSG_WARNING("Invalid element link from '" << tc->name() << "' to '" << name << "'"); - else ATH_MSG_DEBUG("Got TrigComposite:" << (*elementLink)->name()); + if (!elementLink.isValid()) ATH_MSG_WARNING(" Invalid element link to TrigComposite, link name:'" << name << "'"); + else ATH_MSG_DEBUG(" Dereferenced link '" << name << "' to TrigComposite, TC name:'" << (*elementLink)->name() << "'"); + + } else if (clid == ClassID_traits< ViewContainer >::ID()) { + + const ElementLink<ViewContainer> elementLink = tc->objectLink<ViewContainer>(name); + if (!elementLink.isValid()) ATH_MSG_WARNING(" Invalid element link to View, link name:'" << name << "'"); + else ATH_MSG_DEBUG(" Dereferenced link '" << name << "' to View:'" << *elementLink); + } else { - ATH_MSG_DEBUG("Ignoring link to '" << name << "' with CLID " << clid); + ATH_MSG_DEBUG(" Ignoring link to '" << name << "' with link CLID " << clid); } return StatusCode::SUCCESS; @@ -4104,11 +4109,11 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue // This constexpr is evaluated at compile time const CLID TrigCompositeCLID = static_cast<CLID>( ClassID_traits< xAOD::TrigCompositeContainer >::ID() ); std::vector<std::string> keys; - if ( m_doDumpAll ) { + if ( m_doDumpAllTrigComposite ) { evtStore()->keys(TrigCompositeCLID, keys); } else { - std::vector<std::string> keys = m_dumpTrigCompositeContainers; + keys = m_dumpTrigCompositeContainers; } std::string typeNameTC; ATH_CHECK(m_clidSvc->getTypeNameOfID(TrigCompositeCLID, typeNameTC)); @@ -4123,8 +4128,21 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue ss << " node [shape=rectangle]" << std::endl; ss << " rankdir = BT" << std::endl; + const std::vector<std::string> vetoList = { // Patterns to ignore when dumping all + "TrigCostContainer", + "L1DecoderSummary" + }; + // Now process them - for (const std::string key : keys) { + for (const std::string& key : keys) { + bool veto = false; + for (const std::string& vetoStr : vetoList) { + if (m_doDumpAllTrigComposite && key.find(vetoStr) != std::string::npos) { + veto = true; + break; + } + } + if (veto) continue; ATH_CHECK( evtStore()->retrieve( container, key ) ); size_t index = 0; ss << " subgraph " << key << " {" << std::endl; @@ -4146,21 +4164,23 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue // Output all the things I link to for (size_t i = 0; i < tc->linkColNames().size(); ++i) { const std::string link = tc->linkColNames().at(i); - if (link == "seed") { - const xAOD::TrigComposite* seed = tc->object<xAOD::TrigComposite>("seed"); - ss << " \"" << tc << "\" -> \"" << seed << "\" [label=\"seed\"]" << std::endl; + if (link == "self") { + continue; // Ignore the "self" link + } else if (link == "seed" || link == "seed__COLL") { + const xAOD::TrigComposite* seed = tc->object<xAOD::TrigComposite>(link); + ss << " \"" << tc << "\" -> \"" << seed << "\" [label=\"seed\"]" << std::endl; // Print ptr address } else { // Start with my class ID const CLID linkCLID = static_cast<CLID>( tc->linkColClids().at(i) ); // Use it to get my class name std::string tname; ATH_CHECK(m_clidSvc->getTypeNameOfID(linkCLID, tname)); - // Now ge the sgkey I'm linking to & the index + // Now get the sgkey I'm linking to & the index const SG::sgkey_t key = static_cast<SG::sgkey_t>( tc->linkColKeys().at(i) ); const unsigned index = tc->linkColIndices().at(i); // Look it up CLID checkCLID; - const std::string* keyStr = evtStore()->keyToString(key, checkCLID); + const std::string* keyStr = evtStore()->keyToString(key, checkCLID); // I don't own this str if (keyStr != nullptr && checkCLID != linkCLID) { std::string tnameOfCheck; m_clidSvc->getTypeNameOfID(checkCLID, tnameOfCheck).ignore(); // Might be invalid. But we don't care. @@ -4168,7 +4188,7 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue << ". We were expecting " << linkCLID << " [" << tname << "]"); } // Print - ss << " \"" << tc << "\" -> \""; + ss << " \"" << tc << "\" -> \""; // Print ptr address ss << "Container=" << tname << "\\nKey="; if (keyStr != nullptr) ss << *keyStr; else ss << "[KEY "<< key <<" NOT IN STORE]";