Back to home page

Project CMSSW displayed by LXR

 
 

    


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     // check for dR match to L1 muons
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 // declare this class as a framework plugin
0142 #include "FWCore/Framework/interface/MakerMacros.h"
0143 DEFINE_FWK_MODULE(HLTMuonTrkL1TkMuFilter);