CMS 3D CMS Logo

HLTObjectsMonitor.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 #include <sys/time.h>
4 #include <cstdlib>
5 #include <unordered_map>
6 
7 // user include files
12 
21 
23 
24 //for collections
26 
35 
38 
39 #include "TLorentzVector.h"
40 
41 struct hltPlot {
43 
44  std::pair<MonitorElement*, bool> nME;
45  std::pair<MonitorElement*, bool> etaME;
46  std::pair<MonitorElement*, bool> phiME;
47  std::pair<MonitorElement*, bool> ptME;
48  std::pair<MonitorElement*, bool> massME;
49  std::pair<MonitorElement*, bool> energyME;
50  std::pair<MonitorElement*, bool> csvME;
51  std::pair<MonitorElement*, bool> etaVSphiME;
52  std::pair<MonitorElement*, bool> ptMEhep17;
53  std::pair<MonitorElement*, bool> ptMEhem17; // in harvesting step ratio
54  std::pair<MonitorElement*, bool> mrME;
55  std::pair<MonitorElement*, bool> rsqME;
56  std::pair<MonitorElement*, bool> dxyME;
57  std::pair<MonitorElement*, bool> dzME;
58  std::pair<MonitorElement*, bool> dimassME;
59  std::pair<MonitorElement*, bool> dRME;
60  std::pair<MonitorElement*, bool> dRetaVSphiME;
61  std::pair<MonitorElement*, bool> q1q2ME;
62 
65  int pathIDX;
67 
69  std::vector<double> etaBINNING;
70  std::vector<double> ptBINNING;
71  std::vector<double> phiBINNING;
72  std::vector<double> massBINNING;
73  std::vector<double> dxyBINNING;
74  std::vector<double> dzBINNING;
75  std::vector<double> dimassBINNING;
76 
77  bool doPlot2D;
78  bool doPlotETA;
79  bool doPlotMASS;
82  bool doPlotCSV;
83  bool doCALO;
84  bool doPF;
86  bool doPlotDXY;
87  bool doPlotDZ;
89 };
90 //
91 // class declaration
92 //
93 
94 //using namespace edm;
95 using std::unordered_map;
96 
98 public:
99  explicit HLTObjectsMonitor(const edm::ParameterSet&);
100  ~HLTObjectsMonitor() override = default;
101 
102  // static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
103 
104 private:
105  void analyze(const edm::Event&, const edm::EventSetup&) override;
106  void bookHistograms(DQMStore::IBooker& i, edm::Run const&, edm::EventSetup const&) override;
107  void dqmBeginRun(edm::Run const&, edm::EventSetup const&) override;
108 
110  void getPSet();
111  bool isHEP17(double eta, double phi);
112  bool isHEM17(double eta, double phi);
113 
114  double dxyFinder(
116  double dzFinder(double, double, double, double, edm::Handle<reco::RecoChargedCandidateCollection>, double);
117  // ----------member data ---------------------------
118 
122  std::vector<edm::ParameterSet> plotPSETS_;
123 
125 
127  std::vector<hltPlot> hltPlots_;
128  std::unordered_map<std::string, int> plotNamesToBins_;
129 
130  bool debug_;
131 
134 
137 
140 
143 
148 
149  const double MASS_MU = .105658;
150 
151  struct MEbinning {
152  int nbins;
153  double xmin;
154  double xmax;
155  };
156 
157  double MAX_PHI = 3.2;
158  int N_PHI = 64;
160 
161  double MAX_CSV = 1.;
162  int N_CSV = 20;
164 
165  std::vector<double> phi_variable_binning_;
166 
167  /*
168  HEP17 covers
169  - phi between 310° and 330° (-50° to -30°, or -0.87 t.52 rad)
170  - eta between +1.3 and +3.0 (positive side only)
171 */
172  double MAX_PHI_HEP17 = -0.52;
173  double MIN_PHI_HEP17 = -0.87;
174  int N_PHI_HEP17 = 7;
176  double MAX_ETA_HEP17 = 3.0;
177  double MIN_ETA_HEP17 = 1.3;
178  int N_ETA_HEP17 = 6;
180 
182 };
183 
184 //
185 // constants, enums and typedefs
186 //
187 
188 //
189 // static data member definitions
190 //
192  return hltPlot{std::make_pair<MonitorElement*, bool>(nullptr, false),
193  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_eta")),
194  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_phi")),
195  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_pt")),
196  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_mass")),
197  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_energy")),
198  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_csv")),
199  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_etaVSphi")),
200  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_pt_HEP17")),
201  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_pt_HEM17")),
202  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_MR")),
203  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_RSQ")),
204  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_dxy")),
205  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_dz")),
206  std::make_pair<MonitorElement*, bool>(nullptr, pset.getParameter<bool>("displayInPrimary_dimass")),
207  std::make_pair<MonitorElement*, bool>(nullptr, false),
208  std::make_pair<MonitorElement*, bool>(nullptr, false),
209  std::make_pair<MonitorElement*, bool>(nullptr, false),
210  pset.getParameter<std::string>("label"),
211  pset.getParameter<std::string>("pathNAME"),
212  -1,
213  pset.getParameter<std::string>("moduleNAME"),
214  pset.getParameter<std::string>("xTITLE"),
215  pset.getParameter<std::vector<double>>("etaBINNING"),
216  pset.getParameter<std::vector<double>>("ptBINNING"),
217  pset.getParameter<std::vector<double>>("phiBINNING"),
218  pset.getParameter<std::vector<double>>("massBINNING"),
219  pset.getParameter<std::vector<double>>("dxyBINNING"),
220  pset.getParameter<std::vector<double>>("dzBINNING"),
221  pset.getParameter<std::vector<double>>("dimassBINNING"),
222  pset.getUntrackedParameter<bool>("doPlot2D", false),
223  pset.getUntrackedParameter<bool>("doPlotETA", true),
224  pset.getUntrackedParameter<bool>("doPlotMASS", false),
225  pset.getUntrackedParameter<bool>("doPlotENERGY", false),
226  pset.getUntrackedParameter<bool>("doPlotHEP17", true),
227  pset.getUntrackedParameter<bool>("doPlotCSV", false),
228  pset.getUntrackedParameter<bool>("doCALO", false),
229  pset.getUntrackedParameter<bool>("doPF", false),
230  pset.getUntrackedParameter<bool>("doPlotRazor", false),
231  pset.getUntrackedParameter<bool>("doPlotDXY", false),
232  pset.getUntrackedParameter<bool>("doPlotDZ", false),
233  pset.getUntrackedParameter<bool>("doPlotDiMass", false)};
234 }
235 
237  for (const auto& pset : plotPSETS_)
238  hltPlots_.push_back(getPlotPSet(pset));
239 }
240 
241 bool HLTObjectsMonitor::isHEP17(double eta, double phi) {
242  if ((eta >= MIN_ETA_HEP17 && eta <= MAX_ETA_HEP17) && (phi >= MIN_PHI_HEP17 && phi <= MAX_PHI_HEP17))
243  return true;
244  else
245  return false;
246 }
247 bool HLTObjectsMonitor::isHEM17(double eta, double phi) {
248  if ((eta >= -MAX_ETA_HEP17 && eta <= -MIN_ETA_HEP17) && (phi >= MIN_PHI_HEP17 && phi <= MAX_PHI_HEP17))
249  return true;
250  else
251  return false;
252 }
253 //
254 // constructors and destructor
255 //
257  : TopFolder_(iConfig.getParameter<std::string>("TopFolder")),
258  label_(iConfig.getParameter<std::string>("label")),
259  processName_(iConfig.getParameter<std::string>("processName")),
260  plotPSETS_(iConfig.getParameter<std::vector<edm::ParameterSet>>("plots")),
261  debug_(iConfig.getUntrackedParameter<bool>("debug", false)),
262  triggerResultsToken_(consumes<edm::TriggerResults>(iConfig.getParameter<edm::InputTag>("TriggerResults"))),
263  triggerEventToken_(consumes<trigger::TriggerEvent>(iConfig.getParameter<edm::InputTag>("TriggerSummary"))),
264  beamSpot_(iConfig.getParameter<edm::InputTag>("beamspot")),
265  beamSpotToken_(consumes<reco::BeamSpot>(beamSpot_)),
266  caloJetBTagsToken_(consumes<reco::JetTagCollection>(iConfig.getParameter<edm::InputTag>("caloJetBTags"))),
267  pfJetBTagsToken_(consumes<reco::JetTagCollection>(iConfig.getParameter<edm::InputTag>("pfJetBTags"))),
268  muCandidates_(iConfig.getParameter<edm::InputTag>("muCandidates")),
269  muCandidatesToken_(consumes<std::vector<reco::RecoChargedCandidate>>(muCandidates_)),
270  eleCandidates_(iConfig.getParameter<edm::InputTag>("eleCandidates")),
271  eleCandidatesToken_(consumes<std::vector<reco::RecoChargedCandidate>>(eleCandidates_)) {
272  getPSet();
273 
274  //now do what ever initialization is needed
275  mainFolder_ = TopFolder_ + "/MainShifter";
276  backupFolder_ = TopFolder_ + "/Backup";
277 
278  //set Token(s)
279 
280  double step = 2 * MAX_PHI / double(N_PHI);
281  for (int i = 0; i <= N_PHI; i++)
282  phi_variable_binning_.push_back(-MAX_PHI + step * i);
283 }
284 
285 //
286 // member functions
287 //
288 
289 // ------------ method called for each event ------------
291  // if ( debug_ )
292  // std::cout << "[HLTObjectsMonitor::analyze]" << std::endl;
293 
294  // access trigger results
297  if (!triggerResults.isValid())
298  return;
299 
302  if (!triggerEvent.isValid())
303  return;
304 
307 
309  iEvent.getByToken(pfJetBTagsToken_, pfJetBTags);
310 
313 
316 
318  iEvent.getByToken(beamSpotToken_, beamspot);
319 
320  // loop over path
321  int ibin = -1;
322  std::vector<bool> plottedPathIndices(plotNamesToBins_.size(), false);
323  for (auto& plot : hltPlots_) {
324  ibin++;
325  if (plot.pathIDX <= 0)
326  continue;
327 
328  if (triggerResults->accept(plot.pathIDX)) {
329  //We only want to fill this once per pathNAME per event
330  auto index = plotNamesToBins_[plot.pathNAME];
331  if (not plottedPathIndices[index]) {
332  plottedPathIndices[index] = true;
333  if (debug_)
334  std::cout << plot.pathNAME << " --> bin: " << ibin << std::endl;
336  }
338  if (hltConfig_.saveTags(plot.moduleNAME)) {
339  if (debug_)
340  std::cout << "objects: " << objects.size() << std::endl;
341 
342  bool moduleFOUND = false;
343  std::vector<std::string> moduleNames = hltConfig_.moduleLabels(plot.pathIDX);
344  for (const auto& module : moduleNames) {
345  if (module == plot.moduleNAME)
346  moduleFOUND = true;
347  }
348  if (debug_)
349  std::cout << plot.moduleNAME << (moduleFOUND ? "" : "NOT") << " found in the list of modules" << std::endl;
350 
351  if (debug_)
352  for (const auto& module : moduleNames) {
353  unsigned int idx = triggerEvent->filterIndex(edm::InputTag(module, "", processName_));
354  std::cout << "module: " << module;
355  if (idx < triggerEvent->sizeFilters())
356  std::cout << " --> " << idx;
357  std::cout << std::endl;
358  }
359  //
360  // trigger accepted and collection w/ objects is available
362  unsigned int moduleIDX = triggerEvent->filterIndex(moduleName);
363  if (debug_)
364  std::cout << "moduleNAME: " << plot.moduleNAME << " --> " << moduleIDX << std::endl;
365 
366  if (moduleIDX >= triggerEvent->sizeFilters()) {
367  LogDebug("HLTObjectsMonitor")
368  << plot.pathNAME << " " << plot.moduleNAME
369  << " is not available ! please, fix update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py";
370  return;
371  }
372 
373  const trigger::Keys& keys = triggerEvent->filterKeys(moduleIDX);
374  if (debug_)
375  std::cout << "keys: " << keys.size() << std::endl;
376 
377  plot.nME.first->Fill(keys.size());
378 
379  double MR = 0.;
380  double RSQ = 0.;
381  for (const auto& key : keys) {
382  double pt = objects[key].pt();
383  double eta = objects[key].eta();
384  double phi = objects[key].phi();
385  double mass = objects[key].mass();
386  double energy = objects[key].energy();
387  int id = objects[key].id();
388  if (debug_)
389  std::cout << "object ID " << id << " mass: " << mass << std::endl;
390 
391  // single-object plots
392  plot.ptME.first->Fill(pt);
393  if (plot.doPlotETA)
394  plot.etaME.first->Fill(eta);
395  plot.phiME.first->Fill(phi);
396 
397  if (plot.doPlotCSV) {
398  if (plot.doCALO) {
399  if (!caloJetBTags.isValid())
400  plot.csvME.first->Fill(-10.);
401  else {
402  for (auto it = caloJetBTags->begin(); it != caloJetBTags->end(); ++it) {
403  double dR = deltaR(eta, phi, it->first->eta(), it->first->phi());
404  if (debug_)
405  std::cout << "[HLTObjectsMonitor::analyze] deltaR: " << dR << " matched ? "
406  << (dR <= 0.4 ? "YEAP" : "NOPE") << std::endl;
407  plot.csvME.first->Fill(it->second);
408  }
409  }
410 
411  } else if (plot.doPF) {
412  if (!pfJetBTags.isValid())
413  plot.csvME.first->Fill(-10.);
414  else {
415  for (auto it = pfJetBTags->begin(); it != pfJetBTags->end(); ++it) {
416  double dR = deltaR(eta, phi, it->first->eta(), it->first->phi());
417  if (debug_)
418  std::cout << "[HLTObjectsMonitor::analyze] deltaR: " << dR << " matched ? "
419  << (dR <= 0.4 ? "YEAP" : "NOPE") << std::endl;
420  plot.csvME.first->Fill(it->second);
421  }
422  }
423  }
424  }
425  if (plot.doPlotMASS)
426  plot.massME.first->Fill(mass);
427  if (plot.doPlotENERGY)
428  plot.energyME.first->Fill(energy);
429  if (plot.doPlot2D)
430  plot.etaVSphiME.first->Fill(eta, phi);
431  if (plot.doPlotHEP17) {
432  if (isHEP17(eta, phi))
433  plot.ptMEhep17.first->Fill(pt);
434  if (isHEM17(eta, phi))
435  plot.ptMEhem17.first->Fill(pt);
436  }
437 
438  if (id == 0) { //the MET object containing MR and Rsq will show up with ID = 0
439  MR = objects[key].px(); //razor variables stored in dummy reco::MET objects
440  RSQ = objects[key].py();
441  }
442 
443  if (plot.doPlotDXY) {
444  double dxy = -99.;
445  if (abs(id) == 13)
446  dxy = dxyFinder(eta, phi, muCandidates, beamspot, 0.1); // dRcut = 0.1
447  else
448  dxy = dxyFinder(eta, phi, eleCandidates, beamspot, 0.1); // dRcut = 0.1
449  plot.dxyME.first->Fill(dxy);
450  }
451  } // end loop on keys
452  if (plot.doPlotRazor) {
453  plot.mrME.first->Fill(MR);
454  plot.rsqME.first->Fill(RSQ);
455  }
456 
457  if (keys.size() < 2) {
458  if (plot.doPlotDiMass || plot.doPlotDZ)
459  LogDebug("HLTObjectsMonitor") << plot.pathNAME << " " << plot.moduleNAME << " # objects is (" << keys.size()
460  << ") less than 2 ! you probably want to either change the moduleNAME or "
461  "switch off di-object system plots (doPlotDZ: "
462  << plot.doPlotDZ << " doPlotDiMass: " << plot.doPlotDiMass
463  << ") in DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py)";
464  } else {
465  for (const auto& key : keys) {
466  double pt = objects[key].pt();
467  double eta = objects[key].eta();
468  double phi = objects[key].phi();
469  int id = objects[key].id();
470 
471  unsigned int kCnt0 = 0;
472 
473  TLorentzVector v1;
474  if (abs(id) == 13) // check if it is a muon
475  v1.SetPtEtaPhiM(pt, eta, phi, MASS_MU);
476  else
477  v1.SetPtEtaPhiM(pt, eta, phi, 0);
478 
479  unsigned int kCnt1 = 0;
480  for (const auto& key1 : keys) {
481  if (key != key1 &&
482  kCnt1 > kCnt0) { // avoid filling hists with same objs && avoid double counting separate objs
483 
484  double pt2 = objects[key1].pt();
485  double eta2 = objects[key1].eta();
486  double phi2 = objects[key1].phi();
487  int id2 = objects[key1].id();
488 
489  double dR = deltaR(eta, phi, eta2, phi2);
490  plot.dRME.first->Fill(dR);
491  plot.dRetaVSphiME.first->Fill(eta, phi, dR);
492 
493  int q1 = (id == 0 ? 0 : id / abs(id));
494  int q2 = (id2 == 0 ? 0 : id2 / abs(id2));
495  int q1q2 = q1 * q2;
496  plot.q1q2ME.first->Fill(q1q2);
497 
498  if ((id + id2) == 0) { // check di-object system charge and flavor
499 
500  TLorentzVector v2;
501  if (abs(id2) == 13) // check if it is a muon
502  v2.SetPtEtaPhiM(pt2, eta2, phi2, MASS_MU);
503  else
504  v2.SetPtEtaPhiM(pt2, eta2, phi2, 0);
505 
506  if (plot.doPlotDiMass) {
507  TLorentzVector v = v1 + v2;
508  plot.dimassME.first->Fill(v.M());
509  }
510 
511  if (plot.doPlotDZ) {
512  double dz = -99.;
513  if (abs(id) == 13)
514  dz = dzFinder(eta, phi, eta2, phi2, muCandidates, 0.1); // dRcut = 0.1
515  else
516  dz = dzFinder(eta, phi, eta2, phi2, eleCandidates, 0.1); // dRcut = 0.1
517  plot.dzME.first->Fill(dz);
518  }
519  }
520  }
521  kCnt1++;
522  }
523  kCnt0++;
524  }
525  }
526  }
527  }
528  }
529 }
530 
531 // ------------ method called when starting to processes a run ------------
532 void HLTObjectsMonitor::dqmBeginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
533  bool changed = true;
534  if (hltConfig_.init(iRun, iSetup, processName_, changed))
535  if (debug_)
536  std::cout << "[HLTObjectsMonitor::dqmBeginRun] extracting HLTconfig" << std::endl;
537 
538  //get path indicies from menu
539  std::string pathName_noVersion;
540  std::vector<std::string> triggerPaths = hltConfig_.triggerNames();
541 
542  if (debug_)
543  std::cout << "[HLTObjectsMonitor::dqmBeginRun] triggerPaths: " << triggerPaths.size() << " <--> "
544  << hltPlots_.size() << std::endl;
545 
546  for (const auto& pathName : triggerPaths) {
547  if (debug_)
548  std::cout << "[HLTObjectsMonitor::dqmBeginRun] " << pathName << std::endl;
549 
550  pathName_noVersion = hltConfig_.removeVersion(pathName);
551  // std::cout << "pathName: " << pathName << " --> " << pathName_noVersion << std::endl;
552  for (auto& plot : hltPlots_) {
553  if (plot.pathNAME == pathName_noVersion) {
555  // check that the index makes sense, otherwise force pathIDX = -1
556  if (plot.pathIDX <= 0 || plot.pathIDX == int(triggerPaths.size()))
557  plot.pathIDX = -1;
558  }
559  }
560  }
561 
562  if (debug_) {
563  for (const auto& plot : hltPlots_)
564  std::cout << "plot: " << plot.pathNAME << " --> pathIDX: " << plot.pathIDX << std::endl;
565  std::cout << "[HLTObjectsMonitor::dqmBeginRun] DONE" << std::endl;
566  }
567 }
568 
570  edm::Run const& iRun,
571  edm::EventSetup const& iSetup) {
572  if (debug_)
573  std::cout << "[HLTObjectsMonitor::bookHistograms]" << std::endl;
574 
575  ibooker.setCurrentFolder(TopFolder_);
576 
577  std::string name = "eventsPerPath_" + label_;
578  std::string title = " events per path";
579 
580  //We must avoid repeating the same pathNAME
581  {
582  std::unordered_map<std::string, int> uniqueNames;
583  for (auto const& p : hltPlots_) {
584  plotNamesToBins_[p.pathNAME] = -1;
585  }
586  int nbins = plotNamesToBins_.size();
587  eventsPlot_ = ibooker.book1D(name, title, nbins, -0.5, double(nbins) - 0.5);
588  eventsPlot_->setAxisTitle("HLT path");
589  int i = 0;
590  //keep the bin order the same as hltPlots_
591  for (auto const& p : hltPlots_) {
592  //only add a bin if this is the first time we've seen the name
593  if (-1 == plotNamesToBins_[p.pathNAME]) {
594  plotNamesToBins_[p.pathNAME] = ++i;
595  eventsPlot_->setBinLabel(i, p.pathNAME);
596  if (debug_)
597  std::cout << p.pathNAME << " --> bin: " << i << std::endl;
598  }
599  }
600  }
601 
602  for (auto& plot : hltPlots_) {
603  if (debug_)
604  std::cout << "booking plots for " << plot.label << std::endl;
605 
606  if (plot.pathIDX <= 0) {
607  LogDebug("HLTObjectsMonitor") << plot.pathNAME
608  << " is not available in the HLT menu ! no plots are going to be booked for it "
609  "(update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py)";
610  continue;
611  }
612  if (debug_)
613  std::cout << "booking histograms for " << plot.pathNAME << std::endl;
614 
615  {
616  if (plot.nME.second)
617  ibooker.setCurrentFolder(mainFolder_);
618  else
620 
621  name = plot.label + "_nobjects";
622  title = plot.pathNAME + " # objects";
623  plot.nME.first = ibooker.book1D(name, title, 20, -0.5, 19.5);
624  plot.nME.first->setAxisTitle(plot.xTITLE + " # objects");
625  }
626 
627  if (plot.ptME.second)
628  ibooker.setCurrentFolder(mainFolder_);
629  else
631 
632  name = plot.label + "_pt";
633  title = plot.pathNAME + " p_T";
634  int nbins = (plot.ptBINNING).size() - 1;
635  std::vector<float> fbinning((plot.ptBINNING).begin(), (plot.ptBINNING).end());
636  float* arr = &fbinning[0];
637  plot.ptME.first = ibooker.book1D(name, title, nbins, arr);
638  plot.ptME.first->setAxisTitle(plot.xTITLE + " p_{T} [GeV]");
639 
640  {
641  if (plot.phiME.second)
642  ibooker.setCurrentFolder(mainFolder_);
643  else
645 
646  name = plot.label + "_phi";
647  title = plot.pathNAME + " #phi";
648  int nbins = (plot.phiBINNING).size() - 1;
649  std::vector<float> fbinning((plot.phiBINNING).begin(), (plot.phiBINNING).end());
650  float* arr = &fbinning[0];
651  plot.phiME.first = ibooker.book1D(name, title, nbins, arr);
652  plot.phiME.first->setAxisTitle(plot.xTITLE + " #phi [rad]");
653  }
654 
655  if (plot.doPlotETA) {
656  if (plot.etaME.second)
657  ibooker.setCurrentFolder(mainFolder_);
658  else
660 
661  name = plot.label + "_eta";
662  title = plot.pathNAME + " #eta";
663  int nbins = (plot.etaBINNING).size() - 1;
664  std::vector<float> fbinning((plot.etaBINNING).begin(), (plot.etaBINNING).end());
665  float* arr = &fbinning[0];
666 
667  plot.etaME.first = ibooker.book1D(name, title, nbins, arr);
668  plot.etaME.first->setAxisTitle(plot.xTITLE + " #eta");
669  }
670 
671  if (plot.doPlotMASS) {
672  if (plot.massME.second)
673  ibooker.setCurrentFolder(mainFolder_);
674  else
676 
677  name = plot.label + "_mass";
678  title = plot.pathNAME + " mass";
679  int nbins = (plot.massBINNING).size() - 1;
680  std::vector<float> fbinning((plot.massBINNING).begin(), (plot.massBINNING).end());
681  float* arr = &fbinning[0];
682 
683  plot.massME.first = ibooker.book1D(name, title, nbins, arr);
684  plot.massME.first->setAxisTitle(plot.xTITLE + " mass [GeV]");
685  }
686 
687  if (plot.doPlotENERGY) {
688  if (plot.energyME.second)
689  ibooker.setCurrentFolder(mainFolder_);
690  else
692 
693  name = plot.label + "_energy";
694  title = plot.pathNAME + " energy";
695  int nbins = (plot.ptBINNING).size() - 1;
696  std::vector<float> fbinning((plot.ptBINNING).begin(), (plot.ptBINNING).end());
697  float* arr = &fbinning[0];
698 
699  plot.energyME.first = ibooker.book1D(name, title, nbins, arr);
700  plot.energyME.first->setAxisTitle(plot.xTITLE + " energy [GeV]");
701  }
702 
703  if (plot.doPlotCSV) {
704  if (plot.csvME.second)
705  ibooker.setCurrentFolder(mainFolder_);
706  else
708 
709  name = plot.label + "_csv";
710  title = plot.pathNAME + " CSV";
711 
713  plot.csvME.first->setAxisTitle(plot.xTITLE + " CSV discriminator");
714  }
715 
716  if (plot.doPlot2D) {
717  if (plot.etaVSphiME.second)
718  ibooker.setCurrentFolder(mainFolder_);
719  else
721 
722  name = plot.label + "_etaVSphi";
723  title = plot.pathNAME + " #eta vs #phi";
724  int nbinsX = (plot.etaBINNING).size() - 1;
725  std::vector<float> fbinningX((plot.etaBINNING).begin(), (plot.etaBINNING).end());
726  float* arrX = &fbinningX[0];
727  int nbinsY = (plot.phiBINNING).size() - 1;
728  ;
729  std::vector<float> fbinningY((plot.phiBINNING).begin(), (plot.phiBINNING).end());
730  float* arrY = &fbinningY[0];
731  plot.etaVSphiME.first = ibooker.book2D(name, title, nbinsX, arrX, nbinsY, arrY);
732  plot.etaVSphiME.first->setAxisTitle(plot.xTITLE + " #eta", 1);
733  plot.etaVSphiME.first->setAxisTitle(plot.xTITLE + " #phi", 2);
734  }
735 
736  if (plot.doPlotHEP17) {
737  if (plot.ptMEhep17.second)
738  ibooker.setCurrentFolder(mainFolder_);
739  else
741 
742  int nbins = (plot.ptBINNING).size() - 1;
743  std::vector<float> fbinning((plot.ptBINNING).begin(), (plot.ptBINNING).end());
744  float* arr = &fbinning[0];
745 
746  name = plot.label + "_pt_HEP17";
747  title = plot.pathNAME + " p_{T} HEP17";
748  plot.ptMEhep17.first = ibooker.book1D(name, title, nbins, arr);
749  plot.ptMEhep17.first->setAxisTitle(plot.xTITLE + " p_{T} [GeV]", 1);
750 
751  if (plot.ptMEhem17.second)
752  ibooker.setCurrentFolder(mainFolder_);
753  else
755 
756  name = plot.label + "_pt_HEM17";
757  title = plot.pathNAME + " p_{T} HEM17";
758  plot.ptMEhem17.first = ibooker.book1D(name, title, nbins, arr);
759  plot.ptMEhem17.first->setAxisTitle(plot.xTITLE + " p_{T} [GeV]", 1);
760  }
761 
762  if (plot.doPlotRazor) {
763  if (plot.mrME.second)
764  ibooker.setCurrentFolder(mainFolder_);
765  else
767 
768  name = plot.label + "_mr";
769  title = plot.pathNAME + " M_{R}";
770  plot.mrME.first = ibooker.book1D(name, title, 100, 0., 100.);
771  plot.mrME.first->setAxisTitle(plot.xTITLE + " M_{R} [GeV]", 1);
772 
773  if (plot.rsqME.second)
774  ibooker.setCurrentFolder(mainFolder_);
775  else
777 
778  name = plot.label + "_rsq";
779  title = plot.pathNAME + " RSQ";
780  plot.rsqME.first = ibooker.book1D(name, title, 100, 0., 100.);
781  plot.rsqME.first->setAxisTitle(plot.xTITLE + " RSQ [GeV]", 1);
782  }
783 
784  if (plot.doPlotDXY) {
785  if (plot.dxyME.second)
786  ibooker.setCurrentFolder(mainFolder_);
787  else
789 
790  name = plot.label + "_dxy";
791  title = plot.pathNAME + " d_{xy}";
792  int nbins = (plot.dxyBINNING).size() - 1;
793  std::vector<float> fbinning((plot.dxyBINNING).begin(), (plot.dxyBINNING).end());
794  float* arr = &fbinning[0];
795  plot.dxyME.first = ibooker.book1D(name, title, nbins, arr);
796  plot.dxyME.first->setAxisTitle(plot.xTITLE + " d_{xy} [cm]");
797  }
798 
799  if (plot.doPlotDZ) {
800  if (plot.dzME.second)
801  ibooker.setCurrentFolder(mainFolder_);
802  else
804 
805  name = plot.label + "_dz";
806  title = plot.pathNAME + " d_{z}";
807  int nbins = (plot.dzBINNING).size() - 1;
808  std::vector<float> fbinning((plot.dzBINNING).begin(), (plot.dzBINNING).end());
809  float* arr = &fbinning[0];
810  plot.dzME.first = ibooker.book1D(name, title, nbins, arr);
811  plot.dzME.first->setAxisTitle(plot.xTITLE + " d_{z} [cm]");
812  }
813 
814  if (plot.dRME.second)
815  ibooker.setCurrentFolder(mainFolder_);
816  else
818 
819  name = plot.label + "_dR";
820  title = plot.pathNAME + " di-object dR";
821  plot.dRME.first = ibooker.book1D(name, title, 50, 0., 5.);
822  plot.dRME.first->setAxisTitle(plot.xTITLE + " dR_{obj,obj}");
823 
824  if (plot.dRetaVSphiME.second)
825  ibooker.setCurrentFolder(mainFolder_);
826  else
828 
829  name = plot.label + "_dR_etaVSphi";
830  title = plot.pathNAME + " di-object dR in the #eta-#phi plane (of 1st obj)";
831  plot.dRetaVSphiME.first = ibooker.bookProfile2D(name, title, 60, -3., 3., 64, -3.2, 3.2, 0., 5.);
832  plot.dRetaVSphiME.first->setAxisTitle(plot.xTITLE + " #eta", 1);
833  plot.dRetaVSphiME.first->setAxisTitle(plot.xTITLE + " #phi", 2);
834  plot.dRetaVSphiME.first->setAxisTitle(plot.xTITLE + " dR_{obj,obj}", 3);
835 
836  if (plot.q1q2ME.second)
837  ibooker.setCurrentFolder(mainFolder_);
838  else
840 
841  name = plot.label + "_q1q2";
842  title = plot.pathNAME + " di-object q1xq2";
843  plot.q1q2ME.first = ibooker.book1D(name, title, 3, -1., 1.);
844  plot.q1q2ME.first->setAxisTitle(plot.xTITLE + " q_{obj1} x q_{obj2}");
845 
846  if (plot.doPlotDiMass) {
847  if (plot.dimassME.second)
848  ibooker.setCurrentFolder(mainFolder_);
849  else
851 
852  name = plot.label + "_dimass";
853  title = plot.pathNAME + " di-object mass";
854  int nbins = (plot.dimassBINNING).size() - 1;
855  std::vector<float> fbinning((plot.dimassBINNING).begin(), (plot.dimassBINNING).end());
856  float* arr = &fbinning[0];
857  plot.dimassME.first = ibooker.book1D(name, title, nbins, arr);
858  plot.dimassME.first->setAxisTitle(plot.xTITLE + " m_{obj,obj} [GeV]");
859  }
860  }
861 
862  if (debug_)
863  std::cout << "[HLTObjectsMonitor::bookHistograms] DONE" << std::endl;
864 }
865 
867  double phi,
870  double dRcut = 0.1) {
871  double dxy = -99.;
872  if (!candidates.isValid()) {
873  LogDebug("HLTObjectsMonitor") << "either " << muCandidates_ << " or " << eleCandidates_
874  << " is not valid ! please, update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py"
875  << " by switching OFF doPlotDXY or updating the InputTag collection";
876  return dxy;
877  }
878  if (!beamspot.isValid()) {
879  LogDebug("HLTObjectsMonitor") << beamSpot_
880  << " is not valid ! please, update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py"
881  << " by switching OFF doPlotDXY or updating the InputTag collection";
882  return dxy;
883  }
884 
885  bool matched = false;
886  for (reco::RecoChargedCandidateCollection::const_iterator candidate = candidates->begin();
887  candidate != candidates->end();
888  ++candidate) {
889  if (deltaR(eta, phi, candidate->eta(), candidate->phi()) < dRcut) {
890  matched = true;
891  dxy = (-(candidate->vx() - beamspot->x0()) * candidate->py() +
892  (candidate->vy() - beamspot->y0()) * candidate->px()) /
893  candidate->pt();
894  break;
895  }
896  }
897  if (!matched)
898  edm::LogWarning("HLTObjectsMonitor") << "trigger object does not match ( dR > " << dRcut
899  << ") to any of the candidates in either " << muCandidates_ << " or "
900  << eleCandidates_;
901 
902  return dxy;
903 }
904 
906  double phi1,
907  double eta2,
908  double phi2,
910  double dRcut = 0.1) {
911  double dz = -99.;
912  if (!candidates.isValid()) {
913  LogDebug("HLTObjectsMonitor") << "either " << muCandidates_ << " or " << eleCandidates_
914  << " is not valid ! please, update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py"
915  << " by switching OFF doPlotDZ or updating the InputTag collection";
916  return dz;
917  }
918 
919  const reco::RecoChargedCandidate* cand1;
920  const reco::RecoChargedCandidate* cand2;
921  bool matched1 = false;
922  bool matched2 = false;
923  for (reco::RecoChargedCandidateCollection::const_iterator candidate = candidates->begin();
924  candidate != candidates->end();
925  ++candidate) {
926  if (deltaR(eta1, phi1, candidate->eta(), candidate->phi()) < dRcut) {
927  matched1 = true;
928  cand1 = &*candidate;
929  if (debug_)
930  std::cout << "cand1: " << cand1->pt() << " " << cand1->eta() << " " << cand1->phi() << std::endl;
931  break;
932  }
933  }
934  if (!matched1) {
935  LogDebug("HLTObjectsMonitor") << "trigger object1 does not match ( dR > " << dRcut
936  << ") to any of the candidates in either " << muCandidates_ << " or "
937  << eleCandidates_;
938  return dz;
939  }
940 
941  for (reco::RecoChargedCandidateCollection::const_iterator candidate = candidates->begin();
942  candidate != candidates->end();
943  ++candidate) {
944  if (debug_) {
945  std::cout << "candidate: " << candidate->pt() << " cand1: " << cand1->pt() << std::endl;
946  std::cout << "candidate: " << candidate->eta() << " cand1: " << cand1->eta() << std::endl;
947  std::cout << "candidate: " << candidate->phi() << " cand1: " << cand1->phi() << std::endl;
948  }
949  if (&*candidate == cand1)
950  continue;
951 
952  if (deltaR(eta2, phi2, candidate->eta(), candidate->phi()) < dRcut) {
953  matched2 = true;
954  cand2 = &*candidate;
955  if (debug_)
956  std::cout << "cand2: " << cand2->pt() << " " << cand2->eta() << " " << cand2->phi() << std::endl;
957  break;
958  }
959  }
960  if (!matched2) {
961  LogDebug("HLTObjectsMonitor") << "trigger object2 does not match ( dR > " << dRcut
962  << ") to any of the candidates in either " << muCandidates_ << " or "
963  << eleCandidates_;
964  return dz;
965  }
966 
967  dz = cand1->vz() - cand2->vz();
968  return dz;
969 }
970 
971 //define this as a plug-in
size
Write out results.
edm::EDGetTokenT< reco::JetTagCollection > pfJetBTagsToken_
std::vector< double > phiBINNING
std::vector< hltPlot > hltPlots_
std::string pathNAME
MonitorElement * bookProfile2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, double lowZ, double highZ, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:476
edm::EDGetTokenT< edm::TriggerResults > triggerResultsToken_
std::pair< MonitorElement *, bool > energyME
double pt() const final
transverse momentum
std::unordered_map< std::string, int > plotNamesToBins_
const MEbinning csv_binning_
double vz() const override
z coordinate of vertex position
edm::InputTag muCandidates_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
edm::EDGetTokenT< reco::JetTagCollection > caloJetBTagsToken_
std::vector< double > etaBINNING
std::vector< double > dimassBINNING
static hltPlot getPlotPSet(edm::ParameterSet pset)
std::string moduleNAME
std::pair< MonitorElement *, bool > csvME
std::pair< MonitorElement *, bool > ptME
const MEbinning phi_binning_hep17_
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
std::pair< MonitorElement *, bool > etaVSphiME
std::pair< MonitorElement *, bool > ptMEhem17
std::pair< MonitorElement *, bool > q1q2ME
std::pair< MonitorElement *, bool > phiME
JetFloatAssociation::Container JetTagCollection
Definition: JetTag.h:17
dqm::reco::MonitorElement MonitorElement
const MEbinning eta_binning_hep17_
static const std::string removeVersion(const std::string &trigger)
edm::InputTag beamSpot_
void Fill(long long x)
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< std::vector< reco::RecoChargedCandidate > > eleCandidatesToken_
bool isHEP17(double eta, double phi)
int iEvent
Definition: GenABIO.cc:224
bool saveTags(const std::string &module) const
Is module an L3 filter (ie, tracked saveTags=true)
const MEbinning phi_binning_
HLTObjectsMonitor(const edm::ParameterSet &)
edm::InputTag eleCandidates_
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
double dxyFinder(double, double, edm::Handle< reco::RecoChargedCandidateCollection >, edm::Handle< reco::BeamSpot >, double)
std::pair< MonitorElement *, bool > etaME
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
~HLTObjectsMonitor() override=default
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
static std::string const triggerResults
Definition: EdmProvDump.cc:47
virtual void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
std::vector< double > massBINNING
std::pair< MonitorElement *, bool > rsqME
std::string label
std::vector< double > dzBINNING
std::pair< MonitorElement *, bool > mrME
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:75
std::pair< MonitorElement *, bool > ptMEhep17
std::vector< size_type > Keys
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
HLTConfigProvider hltConfig_
const MEbinning eta_binning_hem17_
edm::EDGetTokenT< std::vector< reco::RecoChargedCandidate > > muCandidatesToken_
std::pair< MonitorElement *, bool > dzME
bool isHEM17(double eta, double phi)
const std::vector< std::string > & triggerNames() const
names of trigger paths
std::pair< MonitorElement *, bool > dimassME
std::pair< MonitorElement *, bool > dxyME
std::pair< MonitorElement *, bool > nME
fixed size matrix
std::vector< double > phi_variable_binning_
HLT enums.
MonitorElement * eventsPlot_
std::pair< MonitorElement *, bool > dRetaVSphiME
std::vector< edm::ParameterSet > plotPSETS_
void analyze(const edm::Event &, const edm::EventSetup &) override
double dzFinder(double, double, double, double, edm::Handle< reco::RecoChargedCandidateCollection >, double)
step
Definition: StallMonitor.cc:98
std::pair< MonitorElement *, bool > dRME
std::pair< MonitorElement *, bool > massME
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
double phi() const final
momentum azimuthal angle
static std::string const triggerPaths
Definition: EdmProvDump.cc:48
std::vector< double > dxyBINNING
edm::EDGetTokenT< trigger::TriggerEvent > triggerEventToken_
std::string xTITLE
std::vector< double > ptBINNING
Definition: Run.h:45
#define LogDebug(id)
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
double eta() const final
momentum pseudorapidity