File indexing completed on 2024-04-06 12:18:36
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "HLTMuonIsoFilter.h"
0010
0011 #include "DataFormats/Common/interface/Handle.h"
0012 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
0013 #include "DataFormats/HLTReco/interface/TriggerRefsCollections.h"
0014
0015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0016
0017 #include "DataFormats/TrackReco/interface/Track.h"
0018 #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
0019 #include "DataFormats/RecoCandidate/interface/IsoDepositFwd.h"
0020 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
0021 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
0022
0023 #include "RecoMuon/MuonIsolation/interface/MuonIsolatorFactory.h"
0024
0025 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0026
0027 #include "FWCore/Framework/interface/ConsumesCollector.h"
0028
0029 #include <iostream>
0030
0031
0032
0033 HLTMuonIsoFilter::HLTMuonIsoFilter(const edm::ParameterSet& iConfig)
0034 : HLTFilter(iConfig),
0035 candTag_(iConfig.getParameter<edm::InputTag>("CandTag")),
0036 candToken_(consumes<reco::RecoChargedCandidateCollection>(candTag_)),
0037 previousCandTag_(iConfig.getParameter<edm::InputTag>("PreviousCandTag")),
0038 previousCandToken_(consumes<trigger::TriggerFilterObjectWithRefs>(previousCandTag_)),
0039 depTag_(iConfig.getParameter<std::vector<edm::InputTag> >("DepTag")),
0040 depToken_(),
0041 min_N_(iConfig.getParameter<int>("MinN")) {
0042 depToken_.reserve(depTag_.size());
0043 for (auto const& t : depTag_) {
0044 depToken_.push_back(consumes<edm::ValueMap<reco::IsoDeposit> >(t));
0045 }
0046 decMapToken_ = consumes<edm::ValueMap<bool> >(depTag_.front());
0047
0048 LogDebug("HLTMuonIsoFilter").log([this](auto& iLog) {
0049 iLog << " candTag : " << candTag_.encode() << "\n";
0050 int i = 0;
0051 for (auto const& t : depTag_) {
0052 iLog << " IsoTag[" << i++ << "] : " << t.encode() << " \n";
0053 }
0054 iLog << " MinN : " << min_N_;
0055 });
0056
0057 edm::ParameterSet isolatorPSet = iConfig.getParameter<edm::ParameterSet>("IsolatorPSet");
0058 if (not isolatorPSet.empty()) {
0059 std::string type = isolatorPSet.getParameter<std::string>("ComponentName");
0060 theDepositIsolator = std::unique_ptr<muonisolation::MuIsoBaseIsolator>(
0061 MuonIsolatorFactory::get()->create(type, isolatorPSet, consumesCollector()));
0062 }
0063
0064 if (theDepositIsolator)
0065 produces<edm::ValueMap<bool> >();
0066 }
0067
0068 HLTMuonIsoFilter::~HLTMuonIsoFilter() = default;
0069
0070
0071
0072
0073 void HLTMuonIsoFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0074 edm::ParameterSetDescription desc;
0075 makeHLTFilterDescription(desc);
0076 desc.add<edm::InputTag>("CandTag", edm::InputTag("hltL3MuonCandidates"));
0077 desc.add<edm::InputTag>("PreviousCandTag", edm::InputTag(""));
0078 desc.add<int>("MinN", 1);
0079 std::vector<edm::InputTag> depTag(1, edm::InputTag("hltL3MuonIsolations"));
0080 desc.add<std::vector<edm::InputTag> >("DepTag", depTag);
0081 edm::ParameterSetDescription isolatorPSet;
0082 desc.add<edm::ParameterSetDescription>("IsolatorPSet", isolatorPSet);
0083 descriptions.add("hltMuonIsoFilter", desc);
0084 }
0085
0086
0087 bool HLTMuonIsoFilter::hltFilter(edm::Event& iEvent,
0088 const edm::EventSetup& iSetup,
0089 trigger::TriggerFilterObjectWithRefs& filterproduct) const {
0090 using namespace std;
0091 using namespace edm;
0092 using namespace trigger;
0093 using namespace reco;
0094
0095
0096
0097
0098
0099
0100 std::unique_ptr<edm::ValueMap<bool> > isoMap(new edm::ValueMap<bool>());
0101
0102
0103 Handle<RecoChargedCandidateCollection> mucands;
0104 if (saveTags())
0105 filterproduct.addCollectionTag(candTag_);
0106 iEvent.getByToken(candToken_, mucands);
0107 Handle<TriggerFilterObjectWithRefs> previousLevelCands;
0108 iEvent.getByToken(previousCandToken_, previousLevelCands);
0109 vector<RecoChargedCandidateRef> vcands;
0110 previousLevelCands->getObjects(TriggerMuon, vcands);
0111
0112
0113 unsigned int nDep = depTag_.size();
0114 std::vector<Handle<edm::ValueMap<reco::IsoDeposit> > > depMap(nDep);
0115 Handle<edm::ValueMap<bool> > decisionMap;
0116 muonisolation::MuIsoBaseIsolator::DepositContainer isoContainer(nDep);
0117
0118 if (theDepositIsolator) {
0119 for (unsigned int i = 0; i != nDep; ++i)
0120 iEvent.getByToken(depToken_[i], depMap[i]);
0121 } else {
0122 bool success = iEvent.getByToken(decMapToken_, decisionMap);
0123 LogDebug("HLTMuonIsoFilter") << "get decisionMap " << success;
0124 }
0125
0126
0127 int nIsolatedMu = 0;
0128 unsigned int nMu = mucands->size();
0129 std::vector<bool> isos(nMu, false);
0130 unsigned int iMu = 0;
0131 for (; iMu < nMu; iMu++) {
0132 RecoChargedCandidateRef candref(mucands, iMu);
0133 LogDebug("HLTMuonIsoFilter") << "candref isNonnull " << candref.isNonnull();
0134
0135
0136 if (!triggerdByPreviousLevel(candref, vcands))
0137 continue;
0138
0139
0140 TrackRef tk = candref->get<TrackRef>();
0141 LogDebug("HLTMuonIsoFilter") << "tk isNonNull " << tk.isNonnull();
0142 if (theDepositIsolator) {
0143
0144 for (unsigned int iDep = 0; iDep != nDep; ++iDep) {
0145 const edm::ValueMap<reco::IsoDeposit>::value_type& muonDeposit = (*(depMap[iDep]))[candref];
0146 LogDebug("HLTMuonIsoFilter") << " Muon with q*pt= " << tk->charge() * tk->pt() << " ("
0147 << candref->charge() * candref->pt() << ") "
0148 << ", eta= " << tk->eta() << " (" << candref->eta() << ") "
0149 << "; has deposit[" << iDep << "]: " << muonDeposit.print();
0150 isoContainer[iDep] = muonisolation::MuIsoBaseIsolator::DepositAndVetos(&muonDeposit);
0151 }
0152
0153
0154 muonisolation::MuIsoBaseIsolator::Result selection = theDepositIsolator->result(isoContainer, *tk);
0155 isos[iMu] = selection.valBool;
0156
0157 } else {
0158
0159 isos[iMu] = (*decisionMap)[candref];
0160 }
0161 LogDebug("HLTMuonIsoFilter") << " Muon with q*pt= " << tk->charge() * tk->pt() << ", eta= " << tk->eta() << "; "
0162 << (isos[iMu] ? "Is an isolated muon." : "Is NOT an isolated muon.");
0163
0164 if (!isos[iMu])
0165 continue;
0166
0167 nIsolatedMu++;
0168 filterproduct.addObject(TriggerMuon, candref);
0169 }
0170
0171
0172 const bool accept(nIsolatedMu >= min_N_);
0173
0174 if (theDepositIsolator) {
0175
0176 if (nMu != 0) {
0177 edm::ValueMap<bool>::Filler isoFiller(*isoMap);
0178 isoFiller.insert(mucands, isos.begin(), isos.end());
0179 isoFiller.fill();
0180 }
0181 iEvent.put(std::move(isoMap));
0182 }
0183
0184 LogDebug("HLTMuonIsoFilter") << " >>>>> Result of HLTMuonIsoFilter is " << accept
0185 << ", number of muons passing isolation cuts= " << nIsolatedMu;
0186
0187 return accept;
0188 }
0189
0190 bool HLTMuonIsoFilter::triggerdByPreviousLevel(const reco::RecoChargedCandidateRef& candref,
0191 const std::vector<reco::RecoChargedCandidateRef>& vcands) {
0192 bool ok = false;
0193 unsigned int i = 0;
0194 unsigned int i_max = vcands.size();
0195 for (; i != i_max; ++i) {
0196 if (candref == vcands[i]) {
0197 ok = true;
0198 break;
0199 }
0200 }
0201
0202 return ok;
0203 }
0204
0205
0206 #include "FWCore/Framework/interface/MakerMacros.h"
0207 DEFINE_FWK_MODULE(HLTMuonIsoFilter);