File indexing completed on 2024-07-03 04:17:59
0001 #include "HLTMuonTrkL1TkMuFilter.h"
0002
0003 #include "DataFormats/Common/interface/Handle.h"
0004 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
0005 #include "DataFormats/HLTReco/interface/TriggerRefsCollections.h"
0006 #include "DataFormats/Math/interface/deltaR.h"
0007 #include "DataFormats/TrackReco/interface/Track.h"
0008 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
0009 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
0010 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0011 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0012 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeed.h"
0013 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeedCollection.h"
0014
0015 #include "TrackingTools/PatternTools/interface/ClosestApproachInRPhi.h"
0016 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
0017 #include "MagneticField/Engine/interface/MagneticField.h"
0018 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0019
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0022 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0023 #include "FWCore/Utilities/interface/InputTag.h"
0024 #include "FWCore/Utilities/interface/EDMException.h"
0025
0026 HLTMuonTrkL1TkMuFilter::HLTMuonTrkL1TkMuFilter(const edm::ParameterSet& iConfig) : HLTFilter(iConfig) {
0027 m_muonsTag = iConfig.getParameter<edm::InputTag>("inputMuonCollection");
0028 m_muonsToken = consumes<reco::MuonCollection>(m_muonsTag);
0029 m_candsTag = iConfig.getParameter<edm::InputTag>("inputCandCollection");
0030 m_candsToken = consumes<reco::RecoChargedCandidateCollection>(m_candsTag);
0031 m_l1GTAlgoBlockTag = iConfig.getParameter<edm::InputTag>("l1GTAlgoBlockTag");
0032 m_algoBlockToken = consumes<l1t::P2GTAlgoBlockMap>(m_l1GTAlgoBlockTag);
0033 m_l1GTAlgoNames = iConfig.getParameter<std::vector<std::string>>("l1GTAlgoNames");
0034 m_minTrkHits = iConfig.getParameter<int>("minTrkHits");
0035 m_minMuonHits = iConfig.getParameter<int>("minMuonHits");
0036 m_minMuonStations = iConfig.getParameter<int>("minMuonStations");
0037 m_maxNormalizedChi2 = iConfig.getParameter<double>("maxNormalizedChi2");
0038 m_minPt = iConfig.getParameter<double>("minPt");
0039 m_minN = iConfig.getParameter<unsigned int>("minN");
0040 m_maxAbsEta = iConfig.getParameter<double>("maxAbsEta");
0041 }
0042
0043 void HLTMuonTrkL1TkMuFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0044 edm::ParameterSetDescription desc;
0045 makeHLTFilterDescription(desc);
0046 desc.add<edm::InputTag>("inputMuonCollection", edm::InputTag(""));
0047 desc.add<edm::InputTag>("inputCandCollection", edm::InputTag(""));
0048 desc.add<edm::InputTag>("l1GTAlgoBlockTag", edm::InputTag(""));
0049 desc.add<std::vector<std::string>>("l1GTAlgoNames", {});
0050 desc.add<int>("minTrkHits", -1);
0051 desc.add<int>("minMuonHits", -1);
0052 desc.add<int>("minMuonStations", -1);
0053 desc.add<double>("maxNormalizedChi2", 1e99);
0054 desc.add<unsigned int>("trkMuonId", 0);
0055 desc.add<double>("minPt", 24);
0056 desc.add<unsigned int>("minN", 1);
0057 desc.add<double>("maxAbsEta", 1e99);
0058 descriptions.add("hltMuonTrkL1TkMuFilter", desc);
0059 }
0060
0061 bool HLTMuonTrkL1TkMuFilter::hltFilter(edm::Event& iEvent,
0062 const edm::EventSetup& iSetup,
0063 trigger::TriggerFilterObjectWithRefs& filterproduct) const {
0064 edm::Handle<reco::MuonCollection> muons;
0065 iEvent.getByToken(m_muonsToken, muons);
0066 edm::Handle<reco::RecoChargedCandidateCollection> cands;
0067 iEvent.getByToken(m_candsToken, cands);
0068 if (saveTags())
0069 filterproduct.addCollectionTag(m_candsTag);
0070 if (cands->size() != muons->size())
0071 throw edm::Exception(edm::errors::Configuration)
0072 << "Both input collection must be aligned and represent same physical muon objects";
0073
0074 std::vector<l1t::P2GTCandidateRef> vl1cands;
0075 bool check_l1match = true;
0076 if (m_l1GTAlgoBlockTag == edm::InputTag("") || m_l1GTAlgoNames.empty())
0077 check_l1match = false;
0078 if (check_l1match) {
0079 const l1t::P2GTAlgoBlockMap& algos = iEvent.get(m_algoBlockToken);
0080 for (auto& algoName : m_l1GTAlgoNames) {
0081 if (algos.count(algoName) > 0 && algos.at(algoName).decisionBeforeBxMaskAndPrescale()) {
0082 const l1t::P2GTCandidateVectorRef& objects = algos.at(algoName).trigObjects();
0083 for (const l1t::P2GTCandidateRef& obj : objects) {
0084 if (obj->objectType() == l1t::P2GTCandidate::ObjectType::GMTTkMuons) {
0085 vl1cands.push_back(obj);
0086 LogDebug("HLTMuonTrkL1TkMuFilter") << "Found P2GTCandidate ObjectType::GMTTkMuons" << std::endl;
0087 }
0088 }
0089 }
0090 }
0091 }
0092
0093 float dR2max = 0.3 * 0.3;
0094 std::vector<unsigned int> filteredMuons;
0095 for (unsigned int i = 0; i < muons->size(); ++i) {
0096 const reco::Muon& muon(muons->at(i));
0097
0098 if (check_l1match) {
0099 bool matchl1 = false;
0100 for (auto const& l1cand : vl1cands) {
0101 if (reco::deltaR2(muon.eta(), muon.phi(), l1cand->eta(), l1cand->phi()) < dR2max) {
0102 matchl1 = true;
0103 LogDebug("HLTMuonTrkL1TkMuFilterP2GT") << "Matched to L1 muon" << std::endl;
0104 break;
0105 }
0106 }
0107 if (!matchl1)
0108 continue;
0109 }
0110
0111 if (muon.numberOfMatchedStations() < m_minMuonStations)
0112 continue;
0113
0114 if (!muon.innerTrack().isNull()) {
0115 if (muon.innerTrack()->numberOfValidHits() < m_minTrkHits)
0116 continue;
0117 }
0118
0119 if (!muon.globalTrack().isNull()) {
0120 if (muon.globalTrack()->normalizedChi2() > m_maxNormalizedChi2)
0121 continue;
0122 if (muon.globalTrack()->hitPattern().numberOfValidMuonHits() < m_minMuonHits)
0123 continue;
0124 }
0125
0126 if (muon.pt() < m_minPt)
0127 continue;
0128
0129 if (std::abs(muon.eta()) > m_maxAbsEta)
0130 continue;
0131
0132 filteredMuons.push_back(i);
0133 }
0134
0135 for (std::vector<unsigned int>::const_iterator itr = filteredMuons.begin(); itr != filteredMuons.end(); ++itr)
0136 filterproduct.addObject(trigger::TriggerMuon, reco::RecoChargedCandidateRef(cands, *itr));
0137
0138 return filteredMuons.size() >= m_minN;
0139 }
0140
0141
0142 #include "FWCore/Framework/interface/MakerMacros.h"
0143 DEFINE_FWK_MODULE(HLTMuonTrkL1TkMuFilter);