CMS 3D CMS Logo

HLTMuonTrkL1TFilter.cc
Go to the documentation of this file.
2 
5 
7 
12 #include "HLTMuonTrkL1TFilter.h"
16 
25 
27 
29  m_muonsTag = iConfig.getParameter<edm::InputTag>("inputMuonCollection");
30  m_muonsToken = consumes<reco::MuonCollection>(m_muonsTag);
31  m_candsTag = iConfig.getParameter<edm::InputTag>("inputCandCollection");
32  m_candsToken = consumes<reco::RecoChargedCandidateCollection>(m_candsTag);
33  m_previousCandTag = iConfig.getParameter<edm::InputTag> ("previousCandTag");
34  m_previousCandToken = consumes<trigger::TriggerFilterObjectWithRefs>(m_previousCandTag);
35  m_minTrkHits = iConfig.getParameter<int>("minTrkHits");
36  m_minMuonHits = iConfig.getParameter<int>("minMuonHits");
37  m_minMuonStations = iConfig.getParameter<int>("minMuonStations");
38  m_maxNormalizedChi2 = iConfig.getParameter<double>("maxNormalizedChi2");
39  m_allowedTypeMask = iConfig.getParameter<unsigned int>("allowedTypeMask");
40  m_requiredTypeMask = iConfig.getParameter<unsigned int>("requiredTypeMask");
41  m_trkMuonId = muon::SelectionType(iConfig.getParameter<unsigned int>("trkMuonId"));
42  m_minPt = iConfig.getParameter<double>("minPt");
43  m_minN = iConfig.getParameter<unsigned int>("minN");
44  m_maxAbsEta = iConfig.getParameter<double>("maxAbsEta");
45 }
46 
47 void
51  desc.add<edm::InputTag>("inputMuonCollection",edm::InputTag(""));
52  desc.add<edm::InputTag>("inputCandCollection",edm::InputTag(""));
53  desc.add<edm::InputTag>("previousCandTag",edm::InputTag(""));
54  desc.add<int>("minTrkHits",-1);
55  desc.add<int>("minMuonHits",-1);
56  desc.add<int>("minMuonStations",-1);
57  desc.add<double>("maxNormalizedChi2",1e99);
58  desc.add<unsigned int>("allowedTypeMask",255);
59  desc.add<unsigned int>("requiredTypeMask",0);
60  desc.add<unsigned int>("trkMuonId",0);
61  desc.add<double>("minPt",24);
62  desc.add<unsigned int>("minN",1);
63  desc.add<double>("maxAbsEta",1e99);
64  descriptions.add("hltMuonTrkL1TFilter",desc);
65 }
66 
67 bool
69 {
71  iEvent.getByToken(m_muonsToken,muons);
73  iEvent.getByToken(m_candsToken,cands);
74  if ( saveTags() ) filterproduct.addCollectionTag(m_candsTag);
75  if ( cands->size() != muons->size() )
76  throw edm::Exception(edm::errors::Configuration) << "Both input collection must be aligned and represent same physical muon objects";
77 
79  std::vector<l1t::MuonRef> vl1cands;
80  std::vector<l1t::MuonRef>::iterator vl1cands_begin;
81  std::vector<l1t::MuonRef>::iterator vl1cands_end;
82 
83  bool check_l1match = true;
84  if (m_previousCandTag == edm::InputTag("")) check_l1match = false;
85  if (check_l1match) {
86  iEvent.getByToken(m_previousCandToken,previousLevelCands);
87  previousLevelCands->getObjects(trigger::TriggerL1Mu,vl1cands);
88  vl1cands_begin = vl1cands.begin();
89  vl1cands_end = vl1cands.end();
90  }
91 
92  std::vector<unsigned int> filteredMuons;
93  for ( unsigned int i=0; i<muons->size(); ++i ){
94  const reco::Muon& muon(muons->at(i));
95  // check for dR match to L1 muons
96  if (check_l1match) {
97  bool matchl1 = false;
98  for (auto l1cand = vl1cands_begin; l1cand != vl1cands_end; ++l1cand) {
99  if (deltaR(muon,**l1cand) < 0.3) {
100  matchl1 = true;
101  break;
102  }
103  }
104  if (!matchl1) continue;
105  }
106  if ( (muon.type() & m_allowedTypeMask) == 0 ) continue;
107  if ( (muon.type() & m_requiredTypeMask) != m_requiredTypeMask ) continue;
108  if ( muon.numberOfMatchedStations()<m_minMuonStations ) continue;
109  if ( !muon.innerTrack().isNull() ){
110  if (muon.innerTrack()->numberOfValidHits()<m_minTrkHits) continue;
111  }
112  if ( !muon.globalTrack().isNull() ){
113  if (muon.globalTrack()->normalizedChi2()>m_maxNormalizedChi2) continue;
114  if (muon.globalTrack()->hitPattern().numberOfValidMuonHits()<m_minMuonHits) continue;
115  }
116  if ( muon.isTrackerMuon() && !muon::isGoodMuon(muon,m_trkMuonId) ) continue;
117  if ( muon.pt() < m_minPt ) continue;
118  if ( std::abs(muon.eta()) > m_maxAbsEta ) continue;
119  filteredMuons.push_back(i);
120  }
121 
122  for ( std::vector<unsigned int>::const_iterator itr = filteredMuons.begin(); itr != filteredMuons.end(); ++itr )
124 
125  return filteredMuons.size()>=m_minN;
126 }
127 
128 // declare this class as a framework plugin
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T getParameter(std::string const &) const
unsigned int m_requiredTypeMask
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > m_previousCandToken
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
edm::EDGetTokenT< reco::MuonCollection > m_muonsToken
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
enum start value shifted to 81 so as to avoid clashes with PDG codes
muon::SelectionType m_trkMuonId
unsigned int m_allowedTypeMask
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
SelectionType
Selector type.
Definition: MuonSelectors.h:17
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
edm::InputTag m_previousCandTag
HLTMuonTrkL1TFilter(const edm::ParameterSet &)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool saveTags() const
Definition: HLTFilter.h:45
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > m_candsToken