diff --git a/Trigger/TrigSteer/DecisionHandling/src/IComboHypoTool.h b/Trigger/TrigSteer/DecisionHandling/src/IComboHypoTool.h new file mode 100644 index 0000000000000000000000000000000000000000..85e4cb30fb0fdeeb9805486556603d9e09bfb23c --- /dev/null +++ b/Trigger/TrigSteer/DecisionHandling/src/IComboHypoTool.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ +#ifndef DECISIONHANDLING_ICOMBOHYPOTOOL_H +#define DECISIONHANDLING_ICOMBOHYPOTOOL_H 1 + +#include "DecisionHandling/HLTIdentifier.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "GaudiKernel/IAlgTool.h" +#include "ComboHypoCombination.h" + +/** + * @class $(klass)s + * @brief + **/ + +typedef std::map<TrigCompositeUtils::DecisionID, ComboHypoCombination> CombinationMap; + +class IComboHypoTool: virtual public ::IAlgTool { + + public: + DeclareInterfaceID(IComboHypoTool, 1, 0); + + virtual ~IComboHypoTool() {}; + IComboHypoTool(const std::string& name) : m_decisionId( HLT::Identifier::fromToolName( name ) ) {} + + // vector of decision that satisfy the mult. requirement + + virtual StatusCode decide(std::vector<TrigCompositeUtils::DecisionContainer>& decisions, + const CombinationMap IDCombMap, std::map<TrigCompositeUtils::DecisionID, std::vector< std::pair<uint32_t,uint16_t> >> & passingComb ) const = 0;//TrigCompositeUtils::DecisionIDContainer& passingIds ) const = 0; + virtual HLT::Identifier decisionId() const { return m_decisionId; } + + protected: + HLT::Identifier m_decisionId; + +}; + + + +#endif //> !DECISIONHANDLING_ICOMBOHYPOTOOL_H diff --git a/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.cxx b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..99e86c04c0762360c6a0fd4ee3605350253a97a5 --- /dev/null +++ b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.cxx @@ -0,0 +1,93 @@ +#include "dRMuMuComboHypoTool.h" +#include "TrigSteeringEvent/TrigRoiDescriptorCollection.h" +#include <algorithm> +#include <cmath> + +using namespace TrigCompositeUtils; + +dRMuMuComboHypoTool::dRMuMuComboHypoTool(const std::string& type, + const std::string& name, + const IInterface* parent) + : IComboHypoTool( name ), + AthAlgTool( type, name, parent ) +{ } + +dRMuMuComboHypoTool::~dRMuMuComboHypoTool(){} + + +StatusCode dRMuMuComboHypoTool::initialize() { + ATH_MSG_DEBUG("Initializing dRMuMuComboHypoTool"); + ATH_MSG_DEBUG("DR threshold set to " << m_DRcut ); + return StatusCode::SUCCESS; +} + +StatusCode dRMuMuComboHypoTool::finalize() { + return StatusCode::SUCCESS; +} + + +StatusCode dRMuMuComboHypoTool::decide( std::vector<TrigCompositeUtils::DecisionContainer>& decisions, const CombinationMap IDCombMap, std::map<TrigCompositeUtils::DecisionID, std::vector< std::pair<uint32_t,uint16_t> >> & passingCombinations ) const { + + + std::vector<xAOD::TrigComposite> TCdecisions_to_combine; // can use Decision? + TrigCompositeUtils::DecisionContainer decisions_to_combine; //DataVector does not have BidirectionalIterator, so cannot use next_permutation + ElementLinkVector<DecisionContainer> ELdecisions_to_combine; + ATH_MSG_DEBUG( "Looking for "<< m_decisionId <<" in the map"); + if (passingCombinations[ m_decisionId].size() >0) + ATH_MSG_ERROR("Passing combinations has "<< passingCombinations[ m_decisionId].size()<<" elements: what to do?"); + + std::vector< std::pair<uint32_t,uint16_t> > newcomb; //better a set? + + for (auto id: IDCombMap){ + if ( HLT::Identifier( id.first ) != m_decisionId ) continue; + ComboHypoCombination comb = id.second; + auto combinations = comb.getCombinations(); + ATH_MSG_DEBUG("Getting "<<combinations.size()<<" combinations for ID: "<< m_decisionId); + for (auto comb:combinations) ATH_MSG_DEBUG(comb<<""); + + // do permutations: next_permutation + using the selector+selected + std::vector<int> selector(combinations.size()); + fill(selector.begin(), selector.begin() + 2, 1);// use two muons + std::vector<int> selected; + do { + for (u_int i = 0; i < combinations.size(); i++) { + if (selector[i]) { + selected.push_back(i); + } + } + auto comb1=combinations[selected[0]]; + auto comb2=combinations[selected[1]]; + auto dec1 = decisions[comb1.first][comb1.second]; + auto dec2 = decisions[comb2.first][comb2.second]; + auto muonLink1 = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( dec1, initialRoIString() ).link; + // ElementLink<xAOD::TrigComposite> muonLink0 = dec0->objectLink<xAOD::TrigComposite>(featureString()); + auto muonLink2 = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( dec2, initialRoIString() ).link; + // ElementLink<xAOD::TrigComposite> muonLink1 = dec1->objectLink<xAOD::TrigComposite>(featureString()); + float Dr = deltaR((*muonLink1)->eta(), (*muonLink2)->eta(), (*muonLink1)->phi(), (*muonLink2)->phi()); + ATH_MSG_DEBUG("Found two muons with eta/phi " << (*muonLink1)->eta() <<"/"<<(*muonLink1)->phi() <<" and "<< (*muonLink2)->eta()<<"/"<<(*muonLink2)->phi() <<" with Dr="<<Dr); + if (Dr < m_DRcut){ + ATH_MSG_DEBUG( "Found two muons within DR<"<<m_DRcut<<". Insert combinations: "<< comb1<<" "<<comb2); + //if(std::find(newcomb.begin(), newcomb.end(), comb1) == newcomb.end()) + newcomb.push_back(comb1); + //if(std::find(newcomb.begin(), newcomb.end(), comb2) == newcomb.end()) + newcomb.push_back(comb2); + } + selected.clear(); + } while (std::prev_permutation(selector.begin(), selector.end())); + } + // remove duplicates: + std::sort( newcomb.begin(), newcomb.end() ); + newcomb.resize(std::distance(newcomb.begin(), std::unique( newcomb.begin(), newcomb.end() ))); + passingCombinations[ m_decisionId]=newcomb; + ATH_MSG_DEBUG("End of tool: Passing combinations with "<< passingCombinations[ m_decisionId].size()<<" elements"); + + return StatusCode::SUCCESS; +} + + + +double dRMuMuComboHypoTool::deltaR(double eta1, double eta2, double phi1, double phi2) const { + double dPhi=std::remainder( phi1 - phi2, 2*M_PI ); + double dEta=std::fabs(eta1-eta2); + return std::sqrt(dEta*dEta + dPhi*dPhi); +} diff --git a/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.h b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.h new file mode 100644 index 0000000000000000000000000000000000000000..6eefe81e7ca8e5f31eb3fcb61552899c8a88e6d6 --- /dev/null +++ b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.h @@ -0,0 +1,39 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef DECISIONHANDLING_DRMUMUCOMBOHYPOTOOL_H +#define DECISIONHANDLING_DRMUMUCOMBOHYPOTOOL_H + + +#include "DecisionHandling/HLTIdentifier.h" +#include "AthenaBaseComps/AthAlgTool.h" +#include "DecisionHandling/TrigCompositeUtils.h" +#include "IComboHypoTool.h" + +class dRMuMuComboHypoTool: virtual public IComboHypoTool, public AthAlgTool { + + public: + + dRMuMuComboHypoTool(const std::string& type, + const std::string& name, + const IInterface* parent); + virtual ~dRMuMuComboHypoTool(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; + virtual StatusCode decide( std::vector<TrigCompositeUtils::DecisionContainer>& decisions, + const CombinationMap IDCombMap, std::map<TrigCompositeUtils::DecisionID, std::vector< std::pair<uint32_t,uint16_t> >> & passingComb ) const override;///TrigCompositeUtils::DecisionIDContainer& passingIds ) const override; + + double deltaR(double eta1, double eta2, double phi1, double phi2) const; + + + private: + + Gaudi::Property<float> m_DRcut{this, "DRcut", 0.1, "DR threshold" }; + + + + +}; // DECISIONHANDLING_DRMUMUCOMBOHYPOTOOL_H +#endif +