CMS 3D CMS Logo

METplusTrackMonitor.cc
Go to the documentation of this file.
2 
4 
6 
8 
11 
12 // -----------------------------
13 // constructors and destructor
14 // -----------------------------
15 
17  : folderName_(iConfig.getParameter<std::string>("FolderName")),
18  metToken_(consumes<reco::CaloMETCollection>(iConfig.getParameter<edm::InputTag>("met"))),
19  muonToken_(consumes<reco::MuonCollection>(iConfig.getParameter<edm::InputTag>("muons"))),
20  jetToken_(consumes<reco::PFJetCollection>(iConfig.getParameter<edm::InputTag>("jets"))),
21  vtxToken_(consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"))),
22  theTrigSummary_(consumes<trigger::TriggerEvent>(iConfig.getParameter<edm::InputTag>("trigSummary"))),
23  hltMetTag_(iConfig.getParameter<edm::InputTag>("hltMetFilter")),
24  hltMetCleanTag_(iConfig.getParameter<edm::InputTag>("hltMetCleanFilter")),
25  trackLegFilterTag_(iConfig.getParameter<edm::InputTag>("trackLegFilter")),
26  met_variable_binning_(
27  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double> >("metBinning")),
28  muonPt_variable_binning_(
29  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double> >("ptBinning")),
30  met_binning_(getHistoPSet(
31  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("metPSet"))),
32  ls_binning_(
33  getHistoPSet(iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("lsPSet"))),
34  pt_binning_(
35  getHistoPSet(iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("ptPSet"))),
36  eta_binning_(getHistoPSet(
37  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("etaPSet"))),
38  phi_binning_(getHistoPSet(
39  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("phiPSet"))),
40  num_genTriggerEventFlag_(new GenericTriggerEventFlag(
41  iConfig.getParameter<edm::ParameterSet>("numGenericTriggerEventPSet"), consumesCollector(), *this)),
42  den_genTriggerEventFlag_(new GenericTriggerEventFlag(
43  iConfig.getParameter<edm::ParameterSet>("denGenericTriggerEventPSet"), consumesCollector(), *this)),
44  metSelection_(iConfig.getParameter<std::string>("metSelection")),
45  muonSelection_(iConfig.getParameter<std::string>("muonSelection")),
46  jetSelection_(iConfig.getParameter<std::string>("jetSelection")),
47  vtxSelection_(iConfig.getParameter<std::string>("vtxSelection")),
48  nmuons_(iConfig.getParameter<unsigned>("nmuons")),
49  njets_(iConfig.getParameter<unsigned>("njets")),
50  leadJetEtaCut_(iConfig.getParameter<double>("leadJetEtaCut")),
51  requireLeadMatched_(iConfig.getParameter<bool>("requireLeadMatched")),
52  maxMatchDeltaR_(iConfig.getParameter<double>("maxMatchDeltaR")) {
55  metVsLS_.numerator = nullptr;
56  metVsLS_.denominator = nullptr;
57  metPhiME_.numerator = nullptr;
58  metPhiME_.denominator = nullptr;
59  deltaphimetj1ME_.numerator = nullptr;
60  deltaphimetj1ME_.denominator = nullptr;
61  metVsHltMet_.numerator = nullptr; // numerator only, only available from passed filter
62  metVsHltMetClean_.numerator = nullptr; // numerator only, only available from passed filter
63 
66  muonPtVsLS_.numerator = nullptr;
67  muonPtVsLS_.denominator = nullptr;
68  deltaphimetmuonME_.numerator = nullptr;
70  muonEtaVsPhi_.numerator = nullptr;
71  muonEtaVsPhi_.denominator = nullptr;
72 }
73 
75  edm::Run const& iRun,
76  edm::EventSetup const& iSetup) {
77  std::string histname, histtitle;
78 
79  std::string currentFolder = folderName_;
80  ibooker.setCurrentFolder(currentFolder);
81 
82  // MET leg histograms
83 
84  histname = "met_variable";
85  histtitle = "CaloMET";
86  bookME(ibooker, metME_variableBinning_, histname, histtitle, met_variable_binning_);
87  setMETitle(metME_variableBinning_, "CaloMET [GeV]", "events / [GeV]");
88 
89  histname = "metVsLS";
90  histtitle = "CaloMET vs LS";
91  bookME(ibooker,
92  metVsLS_,
93  histname,
94  histtitle,
100  setMETitle(metVsLS_, "LS", "CaloMET [GeV]");
101 
102  histname = "metPhi";
103  histtitle = "CaloMET phi";
104  bookME(ibooker, metPhiME_, histname, histtitle, phi_binning_.nbins, phi_binning_.xmin, phi_binning_.xmax);
105  setMETitle(metPhiME_, "CaloMET #phi", "events / 0.2 rad");
106 
107  histname = "deltaphi_metjet1";
108  histtitle = "dPhi(CaloMET, jet1)";
109  bookME(ibooker, deltaphimetj1ME_, histname, histtitle, phi_binning_.nbins, 0, phi_binning_.xmax);
110  setMETitle(deltaphimetj1ME_, "#Delta#phi (CaloMET, j1)", "events / 0.1 rad");
111 
112  histname = "metVsHltMet";
113  histtitle = "CaloMET vs hltMet";
114  bookME(ibooker,
115  metVsHltMet_,
116  histname,
117  histtitle,
124  setMETitle(metVsHltMet_, "hltMet (online) [GeV]", "CaloMET (offline) [GeV]");
125 
126  histname = "metVsHltMetClean";
127  histtitle = "CaloMET vs hltMetClean";
128  bookME(ibooker,
130  histname,
131  histtitle,
138  setMETitle(metVsHltMetClean_, "hltMetClean (online) [GeV]", "CaloMET (offline) [GeV]");
139 
140  // Track leg histograms
141 
142  histname = "muonPt_variable";
143  histtitle = "Muon PT";
144  bookME(ibooker, muonPtME_variableBinning_, histname, histtitle, muonPt_variable_binning_);
145  setMETitle(muonPtME_variableBinning_, "Muon p_{T} [GeV]", "events / [GeV]");
146 
147  histname = "muonEta";
148  histtitle = "Muon eta";
149  bookME(ibooker, muonEtaME_, histname, histtitle, eta_binning_.nbins, eta_binning_.xmin, eta_binning_.xmax);
150  setMETitle(muonEtaME_, "Muon #eta", "events / 0.2");
151 
152  histname = "deltaphi_muonmet";
153  histtitle = "dPhi(Muon, CaloMET)";
154  bookME(ibooker, deltaphimetmuonME_, histname, histtitle, phi_binning_.nbins, 0, phi_binning_.xmax);
155  setMETitle(deltaphimetmuonME_, "#Delta#phi (Muon, CaloMET)", "events / 0.1 rad");
156 
157  histname = "muonEtaVsPhi";
158  histtitle = "Muon eta vs phi";
159  bookME(ibooker,
161  histname,
162  histtitle,
169  setMETitle(muonEtaVsPhi_, "Muon #phi", "Muon #eta");
170 
171  histname = "muonPtVsLS";
172  histtitle = "Muon PT vs LS";
173  bookME(ibooker,
174  muonPtVsLS_,
175  histname,
176  histtitle,
181  pt_binning_.xmax);
182  setMETitle(muonPtVsLS_, "LS", "Muon p_{T} [GeV]");
183 
184  // Initialize the GenericTriggerEventFlag
186  num_genTriggerEventFlag_->initRun(iRun, iSetup);
188  den_genTriggerEventFlag_->initRun(iRun, iSetup);
189 }
190 
192  // Filter out events if Trigger Filtering is requested
193  if (den_genTriggerEventFlag_->on() && !den_genTriggerEventFlag_->accept(iEvent, iSetup))
194  return;
195 
197  iEvent.getByToken(metToken_, metHandle);
198  reco::CaloMET caloMet = metHandle->front();
199  if (!metSelection_(caloMet))
200  return;
201 
202  float met = caloMet.pt();
203  float metPhi = caloMet.phi();
204 
206  iEvent.getByToken(jetToken_, jetsHandle);
207  if (jetsHandle->size() < njets_)
208  return;
209  std::vector<reco::PFJet> jets;
210  for (auto const& j : *jetsHandle) {
211  if (jetSelection_(j))
212  jets.push_back(j);
213  }
214  if (jets.size() < njets_)
215  return;
216  if (njets_ > 0 && !(jets.empty()) && fabs(jets[0].eta()) > leadJetEtaCut_)
217  return;
218  float deltaphi_metjet1 = !(jets.empty()) ? fabs(deltaPhi(caloMet.phi(), jets[0].phi())) : 10.0;
219 
221  iEvent.getByToken(vtxToken_, primaryVertices);
222  if (primaryVertices->empty())
223  return;
224  const reco::Vertex* pv = nullptr;
225  for (auto const& v : *primaryVertices) {
226  if (!vtxSelection_(v))
227  continue;
228  pv = &v;
229  break;
230  }
231  if (pv == nullptr)
232  return;
233 
235  iEvent.getByToken(muonToken_, muonHandle);
236  if (muonHandle->size() < nmuons_)
237  return;
238  std::vector<reco::Muon> muons;
239  for (auto const& m : *muonHandle) {
240  bool passTightID =
241  muon::isTightMuon(m, *pv) &&
242  m.innerTrack()->hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::MISSING_INNER_HITS) == 0 &&
243  m.innerTrack()->hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS) == 0;
244  if (muonSelection_(m) && passTightID)
245  muons.push_back(m);
246  }
247  if (muons.size() < nmuons_)
248  return;
249 
250  // Filling MET leg histograms (denominator)
252  metPhiME_.denominator->Fill(metPhi);
253  deltaphimetj1ME_.denominator->Fill(deltaphi_metjet1);
254 
255  int ls = iEvent.id().luminosityBlock();
256  metVsLS_.denominator->Fill(ls, met);
257 
258  // Apply the selection for the MET leg numerator
260  iEvent.getByToken(theTrigSummary_, triggerSummary);
261  if (!triggerSummary.isValid()) {
262  edm::LogError("METplusTrackMonitor") << "Invalid collection: TriggerSummary"
263  << "\n";
264  return;
265  }
266 
268  bool passesHltMetFilter = getHLTObj(triggerSummary, hltMetTag_, hltMet);
269  bool passesHltMetCleanFilter = getHLTObj(triggerSummary, hltMetCleanTag_, hltMetClean);
270 
271  if (!passesHltMetFilter || !passesHltMetCleanFilter)
272  return;
273 
274  // Filling MET leg histograms (numerator)
276  metPhiME_.numerator->Fill(metPhi);
277  deltaphimetj1ME_.numerator->Fill(deltaphi_metjet1);
278  metVsLS_.numerator->Fill(ls, met);
279  metVsHltMet_.numerator->Fill(hltMet.pt(), met);
280  metVsHltMetClean_.numerator->Fill(hltMetClean.pt(), met);
281 
282  // Filling track leg histograms (denominator)
283  double leadMuonPt = !(muons.empty()) ? muons[0].pt() : -1.0;
284  double leadMuonEta = !(muons.empty()) ? muons[0].eta() : 10.0;
285  double leadMuonPhi = !(muons.empty()) ? muons[0].phi() : 10.0;
286  float deltaphi_metmuon = !(muons.empty()) ? fabs(deltaPhi(caloMet.phi(), muons[0].phi())) : 10.0;
287 
289  muonPtVsLS_.denominator->Fill(ls, leadMuonPt);
290  muonEtaME_.denominator->Fill(leadMuonEta);
291  deltaphimetmuonME_.denominator->Fill(deltaphi_metmuon);
292  muonEtaVsPhi_.denominator->Fill(leadMuonPhi, leadMuonEta);
293 
294  // Apply the selection for the track leg numerator
295  trigger::TriggerObject isoTrk;
296  bool passesTrackLegFilter = getHLTObj(triggerSummary, trackLegFilterTag_, isoTrk);
297 
298  // require track leg filter
299  if (!passesTrackLegFilter)
300  return;
301 
302  // if requested, require lead selected muon is matched to the track leg filter object
303  if (requireLeadMatched_ && !(muons.empty()) && deltaR(muons[0], isoTrk) < maxMatchDeltaR_)
304  return;
305 
306  // require the full HLT path is fired
307  if (num_genTriggerEventFlag_->on() && !num_genTriggerEventFlag_->accept(iEvent, iSetup))
308  return;
309 
310  // Filling track leg histograms (denominator)
312  muonPtVsLS_.numerator->Fill(ls, leadMuonPt);
313  muonEtaME_.numerator->Fill(leadMuonEta);
314  deltaphimetmuonME_.numerator->Fill(deltaphi_metmuon);
315  muonEtaVsPhi_.numerator->Fill(leadMuonPhi, leadMuonEta);
316 }
317 
320  desc.add<std::string>("FolderName", "HLT/MET");
321 
322  desc.add<edm::InputTag>("met", edm::InputTag("caloMet"));
323  desc.add<edm::InputTag>("jets", edm::InputTag("ak4PFJetsCHS"));
324  desc.add<edm::InputTag>("electrons", edm::InputTag("gedGsfElectrons"));
325  desc.add<edm::InputTag>("muons", edm::InputTag("muons"));
326  desc.add<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
327  desc.add<edm::InputTag>("trigSummary", edm::InputTag("hltTriggerSummaryAOD"));
328  desc.add<edm::InputTag>("hltMetFilter", edm::InputTag("hltMET105", "", "HLT"));
329  desc.add<edm::InputTag>("hltMetCleanFilter", edm::InputTag("hltMETClean65", "", "HLT"));
330  desc.add<edm::InputTag>("trackLegFilter", edm::InputTag("hltTrk50Filter", "", "HLT"));
331 
332  desc.add<std::string>("metSelection", "pt > 0");
333  desc.add<std::string>("jetSelection", "pt > 0");
334  desc.add<std::string>("muonSelection", "pt > 0");
335  desc.add<std::string>("vtxSelection", "!isFake");
336  desc.add<unsigned>("njets", 0);
337  desc.add<unsigned>("nmuons", 0);
338  desc.add<double>("leadJetEtaCut", 2.4);
339  desc.add<bool>("requireLeadMatched", true);
340  desc.add<double>("maxMatchDeltaR", 0.1);
341 
343  genericTriggerEventPSet.add<bool>("andOr");
344  genericTriggerEventPSet.add<edm::InputTag>("dcsInputTag", edm::InputTag("scalersRawToDigi"));
345  genericTriggerEventPSet.add<std::vector<int> >("dcsPartitions", {});
346  genericTriggerEventPSet.add<bool>("andOrDcs", false);
347  genericTriggerEventPSet.add<bool>("errorReplyDcs", true);
348  genericTriggerEventPSet.add<std::string>("dbLabel", "");
349  genericTriggerEventPSet.add<bool>("andOrHlt", true);
350  genericTriggerEventPSet.add<edm::InputTag>("hltInputTag", edm::InputTag("TriggerResults::HLT"));
351  genericTriggerEventPSet.add<std::vector<std::string> >("hltPaths", {});
352  genericTriggerEventPSet.add<std::string>("hltDBKey", "");
353  genericTriggerEventPSet.add<bool>("errorReplyHlt", false);
354  genericTriggerEventPSet.add<unsigned int>("verbosityLevel", 1);
355 
356  desc.add<edm::ParameterSetDescription>("numGenericTriggerEventPSet", genericTriggerEventPSet);
357  desc.add<edm::ParameterSetDescription>("denGenericTriggerEventPSet", genericTriggerEventPSet);
358 
364 
365  fillHistoPSetDescription(metPSet);
366  fillHistoPSetDescription(phiPSet);
367  fillHistoPSetDescription(ptPSet);
368  fillHistoPSetDescription(etaPSet);
369 
370  histoPSet.add<edm::ParameterSetDescription>("metPSet", metPSet);
371  histoPSet.add<edm::ParameterSetDescription>("phiPSet", phiPSet);
372  histoPSet.add<edm::ParameterSetDescription>("ptPSet", ptPSet);
373  histoPSet.add<edm::ParameterSetDescription>("etaPSet", etaPSet);
374 
375  std::vector<double> bins = {0., 20., 40., 60., 80., 90., 100., 110., 120., 130., 140., 150., 160.,
376  170., 180., 190., 200., 220., 240., 260., 280., 300., 350., 400., 450., 1000.};
377 
378  histoPSet.add<std::vector<double> >("metBinning", bins);
379  histoPSet.add<std::vector<double> >("ptBinning", bins);
380 
383  histoPSet.add<edm::ParameterSetDescription>("lsPSet", lsPSet);
384 
385  desc.add<edm::ParameterSetDescription>("histoPSet", histoPSet);
386 
387  descriptions.add("metPlusTrackMonitoring", desc);
388 }
389 
391  const edm::InputTag& filterTag,
392  trigger::TriggerObject& obj) const {
393  double leadingPt = -1.0;
394 
395  size_t filterIndex = trigSummary->filterIndex(filterTag);
397 
398  if (!(filterIndex >= trigSummary->sizeFilters())) {
399  const trigger::Keys& keys = trigSummary->filterKeys(filterIndex);
400  for (unsigned short key : keys) {
401  trigger::TriggerObject foundObject = triggerObjects[key];
402  if (foundObject.pt() > leadingPt) {
403  obj = foundObject;
404  leadingPt = obj.pt();
405  }
406  }
407  }
408 
409  return (leadingPt > 0.0);
410 }
411 
412 // Define this as a plug-in
edm::EDGetTokenT< reco::PFJetCollection > jetToken_
edm::InputTag hltMetCleanTag_
METplusTrackMonitor(const edm::ParameterSet &)
static void fillHistoLSPSetDescription(edm::ParameterSetDescription &pset)
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:146
bool getHLTObj(const edm::Handle< trigger::TriggerEvent > &trigSummary, const edm::InputTag &filterTag, trigger::TriggerObject &obj) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
const Keys & filterKeys(trigger::size_type index) const
Definition: TriggerEvent.h:118
trigger::size_type filterIndex(const edm::InputTag &filterTag) const
find index of filter in data-member vector from filter tag
Definition: TriggerEvent.h:132
double pt() const final
transverse momentum
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
Provides a code based selection for trigger and DCS information in order to have no failing filters i...
static void fillHistoPSetDescription(edm::ParameterSetDescription &pset)
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:39
edm::InputTag trackLegFilterTag_
void setMETitle(ObjME &me, const std::string &titleX, const std::string &titleY)
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
std::vector< double > muonPt_variable_binning_
edm::EDGetTokenT< reco::MuonCollection > muonToken_
void analyze(edm::Event const &iEvent, edm::EventSetup const &iSetup) override
void Fill(long long x)
Collection of Calo MET.
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:21
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::unique_ptr< GenericTriggerEventFlag > den_genTriggerEventFlag_
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:101
std::vector< double > met_variable_binning_
MonitorElement * denominator
MonitorElement * numerator
def pv(vc)
Definition: MetAnalyzer.py:7
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:70
std::unique_ptr< GenericTriggerEventFlag > num_genTriggerEventFlag_
StringCutObjectSelector< reco::CaloMET, true > metSelection_
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:75
StringCutObjectSelector< reco::PFJet, true > jetSelection_
def ls(path, rec=False)
Definition: eostools.py:349
StringCutObjectSelector< reco::Muon, true > muonSelection_
edm::EDGetTokenT< reco::VertexCollection > vtxToken_
std::vector< size_type > Keys
StringCutObjectSelector< reco::Vertex, true > vtxSelection_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< reco::CaloMETCollection > metToken_
edm::EventID id() const
Definition: EventBase.h:59
std::vector< PFJet > PFJetCollection
collection of PFJet objects
fixed size matrix
HLT enums.
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
double phi() const final
momentum azimuthal angle
void bookME(DQMStore::IBooker &, ObjME &me, const std::string &histname, const std::string &histtitle, unsigned nbins, double xmin, double xmax)
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< trigger::TriggerEvent > theTrigSummary_
Definition: Run.h:45