diff --git a/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.cc b/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.cc index ee96668e92a24..f81cde9e42c3b 100644 --- a/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.cc +++ b/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.cc @@ -22,7 +22,9 @@ #include "FWCore/Framework/interface/EventSetup.h" #include "FWCore/Framework/interface/EventSetupRecord.h" #include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/Utilities/interface/Exception.h" +#include // // constructors and destructor // @@ -45,18 +47,25 @@ namespace { L1TTkMuonFilter::L1TTkMuonFilter(const edm::ParameterSet& iConfig) : HLTFilter(iConfig), l1TkMuonTag_(iConfig.getParameter("inputTag")), - tkMuonToken_(consumes(l1TkMuonTag_)), - qualityCut_(iConfig.getParameter("qualities")) { + tkMuonToken_(consumes(l1TkMuonTag_)) { min_Pt_ = iConfig.getParameter("MinPt"); min_N_ = iConfig.getParameter("MinN"); min_Eta_ = iConfig.getParameter("MinEta"); max_Eta_ = iConfig.getParameter("MaxEta"); applyQuality_ = iConfig.getParameter("applyQuality"); applyDuplicateRemoval_ = iConfig.getParameter("applyDuplicateRemoval"); + qualities_ = iConfig.getParameter>("qualities"); scalings_ = iConfig.getParameter("Scalings"); barrelScalings_ = scalings_.getParameter>("barrel"); overlapScalings_ = scalings_.getParameter>("overlap"); endcapScalings_ = scalings_.getParameter>("endcap"); + + std::sort(qualities_.begin(), qualities_.end()); + + if (applyQuality_ && qualities_.empty()) { + throw cms::Exception("InvalidConfiguration") + << "If you want to applyQuality the qualities vector should not be empty!"; + } } L1TTkMuonFilter::~L1TTkMuonFilter() = default; @@ -75,8 +84,7 @@ void L1TTkMuonFilter::fillDescriptions(edm::ConfigurationDescriptions& descripti desc.add("inputTag", edm::InputTag("L1TkMuons")); desc.add("applyQuality", false); desc.add("applyDuplicateRemoval", true); - desc.add("qualities", MuonQualityCut::makePSetDescription()); - + desc.add>("qualities", {}); edm::ParameterSetDescription descScalings; descScalings.add>("barrel", {0.0, 1.0, 0.0}); descScalings.add>("overlap", {0.0, 1.0, 0.0}); @@ -118,7 +126,13 @@ bool L1TTkMuonFilter::hltFilter(edm::Event& iEvent, l1t::TrackerMuonCollection::const_iterator itkMuon; for (itkMuon = atrkmuons; itkMuon != otrkmuons; itkMuon++) { double offlinePt = this->TkMuonOfflineEt(itkMuon->phPt(), itkMuon->phEta()); - bool passesQual = !applyQuality_ || qualityCut_(*itkMuon); + + // The muonDetector() and quality() methods are not available for TrackerMuon + // as they were for TkMuon (TkMuon being the old implementation, at the times + // of the HLT-TDR). So we fall back to the hwQual() method inherited from + // L1Candidate, and compare it with a vector of allowed qualities. + bool passesQual = !applyQuality_ || std::binary_search(qualities_.begin(), qualities_.end(), itkMuon->hwQual()); + if (passesQual && offlinePt >= min_Pt_ && itkMuon->phEta() <= max_Eta_ && itkMuon->phEta() >= min_Eta_) { l1t::TrackerMuonRef ref(tkMuons, distance(atrkmuons, itkMuon)); if (!applyDuplicateRemoval_ || !isDupMuon(ref, passingMuons)) { @@ -135,53 +149,6 @@ bool L1TTkMuonFilter::hltFilter(edm::Event& iEvent, return accept; } -L1TTkMuonFilter::MuonQualityCut::MuonQualityCut(const edm::ParameterSet& iConfig) { - auto detQualities = iConfig.getParameter>("values"); - for (const auto& detQuality : detQualities) { - auto dets = detQuality.getParameter>("detectors"); - auto qualities = detQuality.getParameter>("qualities"); - std::sort(qualities.begin(), qualities.end()); - for (const auto& det : dets) { - allowedQualities_.insert({det, std::move(qualities)}); - } - } -} - -bool L1TTkMuonFilter::MuonQualityCut::operator()(const l1t::TrackerMuon& muon) const { - // If we didn't load any qualities from the config file, that means we don't care. - // So we set passesQuality to true. - if (allowedQualities_.empty()) { - return true; - } - - bool passesQuality(false); - // The muonDetector() method is not available for TrackerMuon (it was available in TkMuon), - // so for the time being we just take the union of all quality vectors for all muon detectors. - for (const auto& detQuality : allowedQualities_) { - passesQuality |= std::binary_search(detQuality.second.begin(), detQuality.second.end(), muon.hwQual()); - } - - return passesQuality; -} - -void L1TTkMuonFilter::MuonQualityCut::fillPSetDescription(edm::ParameterSetDescription& desc) { - edm::ParameterSetDescription detQualDesc; - detQualDesc.add>("detectors", {-99}); - detQualDesc.add>("qualities", {-99, -99, -99}); - std::vector detQualDefaults; - edm::ParameterSet detQualDefault; - detQualDefault.addParameter>("detectors", {-99}); - detQualDefault.addParameter>("qualities", {-99, -99, -99}); - detQualDefaults.push_back(detQualDefault); - desc.addVPSet("values", detQualDesc, detQualDefaults); -} - -edm::ParameterSetDescription L1TTkMuonFilter::MuonQualityCut::makePSetDescription() { - edm::ParameterSetDescription desc; - fillPSetDescription(desc); - return desc; -} - double L1TTkMuonFilter::TkMuonOfflineEt(double Et, double Eta) const { if (std::abs(Eta) < 0.9) return (barrelScalings_.at(0) + Et * barrelScalings_.at(1) + Et * Et * barrelScalings_.at(2)); diff --git a/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.h b/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.h index e33e272b76cdf..92958433cf833 100644 --- a/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.h +++ b/HLTrigger/HLTfilters/plugins/L1TTkMuonFilter.h @@ -30,17 +30,6 @@ class L1TTkMuonFilter : public HLTFilter { trigger::TriggerFilterObjectWithRefs& filterproduct) const override; private: - class MuonQualityCut { - public: - MuonQualityCut(const edm::ParameterSet&); - bool operator()(const l1t::TrackerMuon&) const; - static void fillPSetDescription(edm::ParameterSetDescription& desc); - static edm::ParameterSetDescription makePSetDescription(); - - private: - std::unordered_map> allowedQualities_; - }; - edm::InputTag l1TkMuonTag_; //input tag for L1 TrackerMuon product edm::EDGetTokenT tkMuonToken_; // token identifying product containing L1 TrackerMuons @@ -48,15 +37,14 @@ class L1TTkMuonFilter : public HLTFilter { int min_N_; // min number of candidates above pT cut double min_Eta_; // min eta cut double max_Eta_; // max eta cut - bool applyQuality_; // apply quaility cuts + bool applyQuality_; // apply quality cuts bool applyDuplicateRemoval_; // apply duplicate removal + std::vector qualities_; // allowed qualities edm::ParameterSet scalings_; // all scalings. An indirection level allows extra flexibility std::vector barrelScalings_; // barrel scalings std::vector overlapScalings_; // overlap scalings std::vector endcapScalings_; // endcap scalings - MuonQualityCut qualityCut_; - double TkMuonOfflineEt(double Et, double Eta) const; };