File indexing completed on 2023-10-25 09:53:14
0001 #include "DataFormats/Common/interface/Handle.h"
0002
0003 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
0004 #include "DataFormats/HLTReco/interface/TriggerRefsCollections.h"
0005
0006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0007
0008 #include "DataFormats/TrackReco/interface/Track.h"
0009 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
0010 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
0011 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0012 #include "HLTMuonTrkFilter.h"
0013 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0014 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeed.h"
0015 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeedCollection.h"
0016 #include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
0017 #include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
0018
0019 #include "TrackingTools/PatternTools/interface/ClosestApproachInRPhi.h"
0020 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
0021 #include "MagneticField/Engine/interface/MagneticField.h"
0022 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0023 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0024 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0025 #include "FWCore/Utilities/interface/InputTag.h"
0026 #include "FWCore/Utilities/interface/EDMException.h"
0027
0028 #include "DataFormats/Math/interface/deltaR.h"
0029
0030 HLTMuonTrkFilter::HLTMuonTrkFilter(const edm::ParameterSet& iConfig)
0031 : HLTFilter(iConfig),
0032 propSetup_(iConfig, consumesCollector()),
0033 m_muonsTag(iConfig.getParameter<edm::InputTag>("inputMuonCollection")),
0034 m_muonsToken(consumes<reco::MuonCollection>(m_muonsTag)),
0035 m_candsTag(iConfig.getParameter<edm::InputTag>("inputCandCollection")),
0036 m_candsToken(consumes<reco::RecoChargedCandidateCollection>(m_candsTag)),
0037 m_previousCandTag(iConfig.getParameter<edm::InputTag>("previousCandTag")),
0038 m_previousCandToken(consumes<trigger::TriggerFilterObjectWithRefs>(m_previousCandTag)),
0039 m_minTrkHits(iConfig.getParameter<int>("minTrkHits")),
0040 m_minMuonHits(iConfig.getParameter<int>("minMuonHits")),
0041 m_minMuonStations(iConfig.getParameter<int>("minMuonStations")),
0042 m_maxNormalizedChi2(iConfig.getParameter<double>("maxNormalizedChi2")),
0043 m_allowedTypeMask(iConfig.getParameter<unsigned int>("allowedTypeMask")),
0044 m_requiredTypeMask(iConfig.getParameter<unsigned int>("requiredTypeMask")),
0045 m_trkMuonId(muon::SelectionType(iConfig.getParameter<unsigned int>("trkMuonId"))),
0046 m_minPt(iConfig.getParameter<double>("minPt")),
0047 m_minN(iConfig.getParameter<unsigned int>("minN")),
0048 m_maxAbsEta(iConfig.getParameter<double>("maxAbsEta")),
0049 m_l1MatchingdR(iConfig.getParameter<double>("L1MatchingdR")),
0050 m_l1MatchingdR2(m_l1MatchingdR * m_l1MatchingdR) {
0051 if (m_l1MatchingdR <= 0.) {
0052 throw cms::Exception("HLTMuonTrkFilterConfiguration")
0053 << "invalid value for parameter \"L1MatchingdR\" (must be > 0): " << m_l1MatchingdR;
0054 }
0055 }
0056
0057 void HLTMuonTrkFilter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0058 edm::ParameterSetDescription desc;
0059 makeHLTFilterDescription(desc);
0060 desc.add<edm::InputTag>("inputMuonCollection", edm::InputTag(""));
0061 desc.add<edm::InputTag>("inputCandCollection", edm::InputTag(""));
0062 desc.add<edm::InputTag>("previousCandTag", edm::InputTag(""));
0063 desc.add<int>("minTrkHits", -1);
0064 desc.add<int>("minMuonHits", -1);
0065 desc.add<int>("minMuonStations", -1);
0066 desc.add<double>("maxNormalizedChi2", 1e99);
0067 desc.add<unsigned int>("allowedTypeMask", 255);
0068 desc.add<unsigned int>("requiredTypeMask", 0);
0069 desc.add<unsigned int>("trkMuonId", 0);
0070 desc.add<double>("minPt", 24);
0071 desc.add<unsigned int>("minN", 1);
0072 desc.add<double>("maxAbsEta", 1e99);
0073 desc.add<double>("L1MatchingdR", 0.3);
0074 PropagateToMuonSetup::fillPSetDescription(desc);
0075 descriptions.add("hltMuonTrkFilter", desc);
0076 }
0077
0078 bool HLTMuonTrkFilter::hltFilter(edm::Event& iEvent,
0079 const edm::EventSetup& iSetup,
0080 trigger::TriggerFilterObjectWithRefs& filterproduct) const {
0081 auto const prop = propSetup_.init(iSetup);
0082
0083 edm::Handle<reco::MuonCollection> muons;
0084 iEvent.getByToken(m_muonsToken, muons);
0085 edm::Handle<reco::RecoChargedCandidateCollection> cands;
0086 iEvent.getByToken(m_candsToken, cands);
0087 if (saveTags())
0088 filterproduct.addCollectionTag(m_candsTag);
0089 if (cands->size() != muons->size())
0090 throw edm::Exception(edm::errors::Configuration)
0091 << "Both input collection must be aligned and represent same physical muon objects";
0092
0093 edm::Handle<trigger::TriggerFilterObjectWithRefs> previousLevelCands;
0094 std::vector<l1extra::L1MuonParticleRef> vl1cands;
0095 std::vector<l1extra::L1MuonParticleRef>::iterator vl1cands_begin;
0096 std::vector<l1extra::L1MuonParticleRef>::iterator vl1cands_end;
0097
0098 bool check_l1match = true;
0099 if (m_previousCandTag == edm::InputTag(""))
0100 check_l1match = false;
0101 if (check_l1match) {
0102 iEvent.getByToken(m_previousCandToken, previousLevelCands);
0103 previousLevelCands->getObjects(trigger::TriggerL1Mu, vl1cands);
0104 vl1cands_begin = vl1cands.begin();
0105 vl1cands_end = vl1cands.end();
0106 }
0107
0108 std::vector<unsigned int> filteredMuons;
0109 for (unsigned int i = 0; i < muons->size(); ++i) {
0110 const reco::Muon& muon(muons->at(i));
0111 if (check_l1match) {
0112 const reco::RecoChargedCandidateRef cand(cands, i);
0113 const reco::TrackRef tk = cand->track();
0114 auto etaForMatch = cand->eta();
0115 auto phiForMatch = cand->phi();
0116
0117 if (tk.isNonnull()) {
0118 auto const propagated = prop.extrapolate(*tk);
0119 if (propagated.isValid()) {
0120 etaForMatch = propagated.globalPosition().eta();
0121 phiForMatch = propagated.globalPosition().phi();
0122 }
0123 }
0124 bool matchl1 = false;
0125 for (auto l1cand = vl1cands_begin; l1cand != vl1cands_end; ++l1cand) {
0126 if (deltaR2(etaForMatch, phiForMatch, (*l1cand)->eta(), (*l1cand)->phi()) < m_l1MatchingdR2) {
0127 matchl1 = true;
0128 break;
0129 }
0130 }
0131 if (!matchl1)
0132 continue;
0133 }
0134 if ((muon.type() & m_allowedTypeMask) == 0)
0135 continue;
0136 if ((muon.type() & m_requiredTypeMask) != m_requiredTypeMask)
0137 continue;
0138 if (muon.numberOfMatchedStations() < m_minMuonStations)
0139 continue;
0140 if (!muon.innerTrack().isNull()) {
0141 if (muon.innerTrack()->numberOfValidHits() < m_minTrkHits)
0142 continue;
0143 }
0144 if (!muon.globalTrack().isNull()) {
0145 if (muon.globalTrack()->normalizedChi2() > m_maxNormalizedChi2)
0146 continue;
0147 if (muon.globalTrack()->hitPattern().numberOfValidMuonHits() < m_minMuonHits)
0148 continue;
0149 }
0150 if (muon.isTrackerMuon() && !muon::isGoodMuon(muon, m_trkMuonId))
0151 continue;
0152 if (muon.pt() < m_minPt)
0153 continue;
0154 if (std::abs(muon.eta()) > m_maxAbsEta)
0155 continue;
0156 filteredMuons.push_back(i);
0157 }
0158
0159 for (std::vector<unsigned int>::const_iterator itr = filteredMuons.begin(); itr != filteredMuons.end(); ++itr)
0160 filterproduct.addObject(trigger::TriggerMuon, reco::RecoChargedCandidateRef(cands, *itr));
0161
0162 return filteredMuons.size() >= m_minN;
0163 }
0164
0165
0166 #include "FWCore/Framework/interface/MakerMacros.h"
0167 DEFINE_FWK_MODULE(HLTMuonTrkFilter);