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 
109  static hltPlot getPlotPSet(edm::ParameterSet pset);
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;
159  const MEbinning phi_binning_{N_PHI, -MAX_PHI, MAX_PHI};
160 
161  double MAX_CSV = 1.;
162  int N_CSV = 20;
163  const MEbinning csv_binning_{N_CSV, -MAX_CSV, MAX_CSV};
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;
175  const MEbinning phi_binning_hep17_{N_PHI_HEP17, MIN_PHI_HEP17, MAX_PHI_HEP17};
176  double MAX_ETA_HEP17 = 3.0;
177  double MIN_ETA_HEP17 = 1.3;
178  int N_ETA_HEP17 = 6;
179  const MEbinning eta_binning_hep17_{N_ETA_HEP17, MIN_ETA_HEP17, MAX_ETA_HEP17};
180 
181  const MEbinning eta_binning_hem17_{N_ETA_HEP17, -MAX_ETA_HEP17, MIN_ETA_HEP17};
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
296  iEvent.getByToken(triggerResultsToken_, triggerResults);
297  if (!triggerResults.isValid())
298  return;
299 
301  iEvent.getByToken(triggerEventToken_, triggerEvent);
302  if (!triggerEvent.isValid())
303  return;
304 
306  iEvent.getByToken(caloJetBTagsToken_, caloJetBTags);
307 
309  iEvent.getByToken(pfJetBTagsToken_, pfJetBTags);
310 
312  iEvent.getByToken(muCandidatesToken_, muCandidates);
313 
315  iEvent.getByToken(eleCandidatesToken_, eleCandidates);
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;
335  eventsPlot_->Fill(index);
336  }
337  const trigger::TriggerObjectCollection objects = triggerEvent->getObjects();
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].phi();
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 (abs(id) != abs(id2))
499  edm::LogInfo("HLTObjectsMonitor")
500  << plot.pathNAME << " " << plot.moduleNAME << " objects have different ID !?!" << abs(id)
501  << " and " << abs(id2);
502 
503  if ((id + id2) == 0) { // check di-object system charge and flavor
504 
505  TLorentzVector v2;
506  if (abs(id2) == 13) // check if it is a muon
507  v2.SetPtEtaPhiM(pt2, eta2, phi2, MASS_MU);
508  else
509  v2.SetPtEtaPhiM(pt2, eta2, phi2, 0);
510 
511  if (plot.doPlotDiMass) {
512  TLorentzVector v = v1 + v2;
513  plot.dimassME.first->Fill(v.M());
514  }
515 
516  if (plot.doPlotDZ) {
517  double dz = -99.;
518  if (abs(id) == 13)
519  dz = dzFinder(eta, phi, eta2, phi2, muCandidates, 0.1); // dRcut = 0.1
520  else
521  dz = dzFinder(eta, phi, eta2, phi2, eleCandidates, 0.1); // dRcut = 0.1
522  plot.dzME.first->Fill(dz);
523  }
524  }
525  }
526  kCnt1++;
527  }
528  kCnt0++;
529  }
530  }
531  }
532  }
533  }
534 }
535 
536 // ------------ method called when starting to processes a run ------------
537 void HLTObjectsMonitor::dqmBeginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
538  bool changed = true;
539  if (hltConfig_.init(iRun, iSetup, processName_, changed))
540  if (debug_)
541  std::cout << "[HLTObjectsMonitor::dqmBeginRun] extracting HLTconfig" << std::endl;
542 
543  //get path indicies from menu
544  std::string pathName_noVersion;
545  std::vector<std::string> triggerPaths = hltConfig_.triggerNames();
546 
547  if (debug_)
548  std::cout << "[HLTObjectsMonitor::dqmBeginRun] triggerPaths: " << triggerPaths.size() << " <--> "
549  << hltPlots_.size() << std::endl;
550 
551  for (const auto& pathName : triggerPaths) {
552  if (debug_)
553  std::cout << "[HLTObjectsMonitor::dqmBeginRun] " << pathName << std::endl;
554 
555  pathName_noVersion = hltConfig_.removeVersion(pathName);
556  // std::cout << "pathName: " << pathName << " --> " << pathName_noVersion << std::endl;
557  for (auto& plot : hltPlots_) {
558  if (plot.pathNAME == pathName_noVersion) {
560  // check that the index makes sense, otherwise force pathIDX = -1
561  if (plot.pathIDX <= 0 || plot.pathIDX == int(triggerPaths.size()))
562  plot.pathIDX = -1;
563  }
564  }
565  }
566 
567  if (debug_) {
568  for (const auto& plot : hltPlots_)
569  std::cout << "plot: " << plot.pathNAME << " --> pathIDX: " << plot.pathIDX << std::endl;
570  std::cout << "[HLTObjectsMonitor::dqmBeginRun] DONE" << std::endl;
571  }
572 }
573 
575  edm::Run const& iRun,
576  edm::EventSetup const& iSetup) {
577  if (debug_)
578  std::cout << "[HLTObjectsMonitor::bookHistograms]" << std::endl;
579 
580  ibooker.setCurrentFolder(TopFolder_);
581 
582  std::string name = "eventsPerPath_" + label_;
583  std::string title = " events per path";
584 
585  //We must avoid repeating the same pathNAME
586  {
587  std::unordered_map<std::string, int> uniqueNames;
588  for (auto const& p : hltPlots_) {
589  plotNamesToBins_[p.pathNAME] = -1;
590  }
591  int nbins = plotNamesToBins_.size();
592  eventsPlot_ = ibooker.book1D(name, title, nbins, -0.5, double(nbins) - 0.5);
593  eventsPlot_->setAxisTitle("HLT path");
594  int i = 0;
595  //keep the bin order the same as hltPlots_
596  for (auto const& p : hltPlots_) {
597  //only add a bin if this is the first time we've seen the name
598  if (-1 == plotNamesToBins_[p.pathNAME]) {
599  plotNamesToBins_[p.pathNAME] = ++i;
600  eventsPlot_->setBinLabel(i, p.pathNAME);
601  if (debug_)
602  std::cout << p.pathNAME << " --> bin: " << i << std::endl;
603  }
604  }
605  }
606 
607  for (auto& plot : hltPlots_) {
608  if (debug_)
609  std::cout << "booking plots for " << plot.label << std::endl;
610 
611  if (plot.pathIDX <= 0) {
612  LogDebug("HLTObjectsMonitor") << plot.pathNAME
613  << " is not available in the HLT menu ! no plots are going to be booked for it "
614  "(update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py)";
615  continue;
616  }
617  if (debug_)
618  std::cout << "booking histograms for " << plot.pathNAME << std::endl;
619 
620  {
621  if (plot.nME.second)
622  ibooker.setCurrentFolder(mainFolder_);
623  else
625 
626  name = plot.label + "_nobjects";
627  title = plot.pathNAME + " # objects";
628  plot.nME.first = ibooker.book1D(name, title, 20, -0.5, 19.5);
629  plot.nME.first->setAxisTitle(plot.xTITLE + " # objects");
630  }
631 
632  if (plot.ptME.second)
633  ibooker.setCurrentFolder(mainFolder_);
634  else
636 
637  name = plot.label + "_pt";
638  title = plot.pathNAME + " p_T";
639  int nbins = (plot.ptBINNING).size() - 1;
640  std::vector<float> fbinning((plot.ptBINNING).begin(), (plot.ptBINNING).end());
641  float* arr = &fbinning[0];
642  plot.ptME.first = ibooker.book1D(name, title, nbins, arr);
643  plot.ptME.first->setAxisTitle(plot.xTITLE + " p_{T} [GeV]");
644 
645  {
646  if (plot.phiME.second)
647  ibooker.setCurrentFolder(mainFolder_);
648  else
650 
651  name = plot.label + "_phi";
652  title = plot.pathNAME + " #phi";
653  int nbins = (plot.phiBINNING).size() - 1;
654  std::vector<float> fbinning((plot.phiBINNING).begin(), (plot.phiBINNING).end());
655  float* arr = &fbinning[0];
656  plot.phiME.first = ibooker.book1D(name, title, nbins, arr);
657  plot.phiME.first->setAxisTitle(plot.xTITLE + " #phi [rad]");
658  }
659 
660  if (plot.doPlotETA) {
661  if (plot.etaME.second)
662  ibooker.setCurrentFolder(mainFolder_);
663  else
665 
666  name = plot.label + "_eta";
667  title = plot.pathNAME + " #eta";
668  int nbins = (plot.etaBINNING).size() - 1;
669  std::vector<float> fbinning((plot.etaBINNING).begin(), (plot.etaBINNING).end());
670  float* arr = &fbinning[0];
671 
672  plot.etaME.first = ibooker.book1D(name, title, nbins, arr);
673  plot.etaME.first->setAxisTitle(plot.xTITLE + " #eta");
674  }
675 
676  if (plot.doPlotMASS) {
677  if (plot.massME.second)
678  ibooker.setCurrentFolder(mainFolder_);
679  else
681 
682  name = plot.label + "_mass";
683  title = plot.pathNAME + " mass";
684  int nbins = (plot.massBINNING).size() - 1;
685  std::vector<float> fbinning((plot.massBINNING).begin(), (plot.massBINNING).end());
686  float* arr = &fbinning[0];
687 
688  plot.massME.first = ibooker.book1D(name, title, nbins, arr);
689  plot.massME.first->setAxisTitle(plot.xTITLE + " mass [GeV]");
690  }
691 
692  if (plot.doPlotENERGY) {
693  if (plot.energyME.second)
694  ibooker.setCurrentFolder(mainFolder_);
695  else
697 
698  name = plot.label + "_energy";
699  title = plot.pathNAME + " energy";
700  int nbins = (plot.ptBINNING).size() - 1;
701  std::vector<float> fbinning((plot.ptBINNING).begin(), (plot.ptBINNING).end());
702  float* arr = &fbinning[0];
703 
704  plot.energyME.first = ibooker.book1D(name, title, nbins, arr);
705  plot.energyME.first->setAxisTitle(plot.xTITLE + " energy [GeV]");
706  }
707 
708  if (plot.doPlotCSV) {
709  if (plot.csvME.second)
710  ibooker.setCurrentFolder(mainFolder_);
711  else
713 
714  name = plot.label + "_csv";
715  title = plot.pathNAME + " CSV";
716 
717  plot.csvME.first = ibooker.book1D(name, title, csv_binning_.nbins, csv_binning_.xmin, csv_binning_.xmax);
718  plot.csvME.first->setAxisTitle(plot.xTITLE + " CSV discriminator");
719  }
720 
721  if (plot.doPlot2D) {
722  if (plot.etaVSphiME.second)
723  ibooker.setCurrentFolder(mainFolder_);
724  else
726 
727  name = plot.label + "_etaVSphi";
728  title = plot.pathNAME + " #eta vs #phi";
729  int nbinsX = (plot.etaBINNING).size() - 1;
730  std::vector<float> fbinningX((plot.etaBINNING).begin(), (plot.etaBINNING).end());
731  float* arrX = &fbinningX[0];
732  int nbinsY = (plot.phiBINNING).size() - 1;
733  ;
734  std::vector<float> fbinningY((plot.phiBINNING).begin(), (plot.phiBINNING).end());
735  float* arrY = &fbinningY[0];
736  plot.etaVSphiME.first = ibooker.book2D(name, title, nbinsX, arrX, nbinsY, arrY);
737  plot.etaVSphiME.first->setAxisTitle(plot.xTITLE + " #eta", 1);
738  plot.etaVSphiME.first->setAxisTitle(plot.xTITLE + " #phi", 2);
739  }
740 
741  if (plot.doPlotHEP17) {
742  if (plot.ptMEhep17.second)
743  ibooker.setCurrentFolder(mainFolder_);
744  else
746 
747  int nbins = (plot.ptBINNING).size() - 1;
748  std::vector<float> fbinning((plot.ptBINNING).begin(), (plot.ptBINNING).end());
749  float* arr = &fbinning[0];
750 
751  name = plot.label + "_pt_HEP17";
752  title = plot.pathNAME + " p_{T} HEP17";
753  plot.ptMEhep17.first = ibooker.book1D(name, title, nbins, arr);
754  plot.ptMEhep17.first->setAxisTitle(plot.xTITLE + " p_{T} [GeV]", 1);
755 
756  if (plot.ptMEhem17.second)
757  ibooker.setCurrentFolder(mainFolder_);
758  else
760 
761  name = plot.label + "_pt_HEM17";
762  title = plot.pathNAME + " p_{T} HEM17";
763  plot.ptMEhem17.first = ibooker.book1D(name, title, nbins, arr);
764  plot.ptMEhem17.first->setAxisTitle(plot.xTITLE + " p_{T} [GeV]", 1);
765  }
766 
767  if (plot.doPlotRazor) {
768  if (plot.mrME.second)
769  ibooker.setCurrentFolder(mainFolder_);
770  else
772 
773  name = plot.label + "_mr";
774  title = plot.pathNAME + " M_{R}";
775  plot.mrME.first = ibooker.book1D(name, title, 100, 0., 100.);
776  plot.mrME.first->setAxisTitle(plot.xTITLE + " M_{R} [GeV]", 1);
777 
778  if (plot.rsqME.second)
779  ibooker.setCurrentFolder(mainFolder_);
780  else
782 
783  name = plot.label + "_rsq";
784  title = plot.pathNAME + " RSQ";
785  plot.rsqME.first = ibooker.book1D(name, title, 100, 0., 100.);
786  plot.rsqME.first->setAxisTitle(plot.xTITLE + " RSQ [GeV]", 1);
787  }
788 
789  if (plot.doPlotDXY) {
790  if (plot.dxyME.second)
791  ibooker.setCurrentFolder(mainFolder_);
792  else
794 
795  name = plot.label + "_dxy";
796  title = plot.pathNAME + " d_{xy}";
797  int nbins = (plot.dxyBINNING).size() - 1;
798  std::vector<float> fbinning((plot.dxyBINNING).begin(), (plot.dxyBINNING).end());
799  float* arr = &fbinning[0];
800  plot.dxyME.first = ibooker.book1D(name, title, nbins, arr);
801  plot.dxyME.first->setAxisTitle(plot.xTITLE + " d_{xy} [cm]");
802  }
803 
804  if (plot.doPlotDZ) {
805  if (plot.dzME.second)
806  ibooker.setCurrentFolder(mainFolder_);
807  else
809 
810  name = plot.label + "_dz";
811  title = plot.pathNAME + " d_{z}";
812  int nbins = (plot.dzBINNING).size() - 1;
813  std::vector<float> fbinning((plot.dzBINNING).begin(), (plot.dzBINNING).end());
814  float* arr = &fbinning[0];
815  plot.dzME.first = ibooker.book1D(name, title, nbins, arr);
816  plot.dzME.first->setAxisTitle(plot.xTITLE + " d_{z} [cm]");
817  }
818 
819  if (plot.dRME.second)
820  ibooker.setCurrentFolder(mainFolder_);
821  else
823 
824  name = plot.label + "_dR";
825  title = plot.pathNAME + " di-object dR";
826  plot.dRME.first = ibooker.book1D(name, title, 50, 0., 5.);
827  plot.dRME.first->setAxisTitle(plot.xTITLE + " dR_{obj,obj}");
828 
829  if (plot.dRetaVSphiME.second)
830  ibooker.setCurrentFolder(mainFolder_);
831  else
833 
834  name = plot.label + "_dR_etaVSphi";
835  title = plot.pathNAME + " di-object dR in the #eta-#phi plane (of 1st obj)";
836  plot.dRetaVSphiME.first = ibooker.bookProfile2D(name, title, 60, -3., 3., 64, -3.2, 3.2, 0., 5.);
837  plot.dRetaVSphiME.first->setAxisTitle(plot.xTITLE + " #eta", 1);
838  plot.dRetaVSphiME.first->setAxisTitle(plot.xTITLE + " #phi", 2);
839  plot.dRetaVSphiME.first->setAxisTitle(plot.xTITLE + " dR_{obj,obj}", 3);
840 
841  if (plot.q1q2ME.second)
842  ibooker.setCurrentFolder(mainFolder_);
843  else
845 
846  name = plot.label + "_q1q2";
847  title = plot.pathNAME + " di-object q1xq2";
848  plot.q1q2ME.first = ibooker.book1D(name, title, 3, -1., 1.);
849  plot.q1q2ME.first->setAxisTitle(plot.xTITLE + " q_{obj1} x q_{obj2}");
850 
851  if (plot.doPlotDiMass) {
852  if (plot.dimassME.second)
853  ibooker.setCurrentFolder(mainFolder_);
854  else
856 
857  name = plot.label + "_dimass";
858  title = plot.pathNAME + " di-object mass";
859  int nbins = (plot.dimassBINNING).size() - 1;
860  std::vector<float> fbinning((plot.dimassBINNING).begin(), (plot.dimassBINNING).end());
861  float* arr = &fbinning[0];
862  plot.dimassME.first = ibooker.book1D(name, title, nbins, arr);
863  plot.dimassME.first->setAxisTitle(plot.xTITLE + " m_{obj,obj} [GeV]");
864  }
865  }
866 
867  if (debug_)
868  std::cout << "[HLTObjectsMonitor::bookHistograms] DONE" << std::endl;
869 }
870 
872  double phi,
875  double dRcut = 0.1) {
876  double dxy = -99.;
877  if (!candidates.isValid()) {
878  LogDebug("HLTObjectsMonitor") << "either " << muCandidates_ << " or " << eleCandidates_
879  << " is not valid ! please, update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py"
880  << " by switching OFF doPlotDXY or updating the InputTag collection";
881  return dxy;
882  }
883  if (!beamspot.isValid()) {
884  LogDebug("HLTObjectsMonitor") << beamSpot_
885  << " is not valid ! please, update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py"
886  << " by switching OFF doPlotDXY or updating the InputTag collection";
887  return dxy;
888  }
889 
890  bool matched = false;
891  for (reco::RecoChargedCandidateCollection::const_iterator candidate = candidates->begin();
892  candidate != candidates->end();
893  ++candidate) {
894  if (deltaR(eta, phi, candidate->eta(), candidate->phi()) < dRcut) {
895  matched = true;
896  dxy = (-(candidate->vx() - beamspot->x0()) * candidate->py() +
897  (candidate->vy() - beamspot->y0()) * candidate->px()) /
898  candidate->pt();
899  break;
900  }
901  }
902  if (!matched)
903  edm::LogWarning("HLTObjectsMonitor") << "trigger object does not match ( dR > " << dRcut
904  << ") to any of the candidates in either " << muCandidates_ << " or "
905  << eleCandidates_;
906 
907  return dxy;
908 }
909 
911  double phi1,
912  double eta2,
913  double phi2,
915  double dRcut = 0.1) {
916  double dz = -99.;
917  if (!candidates.isValid()) {
918  LogDebug("HLTObjectsMonitor") << "either " << muCandidates_ << " or " << eleCandidates_
919  << " is not valid ! please, update DQM/HLTEvF/python/HLTObjectsMonitor_cfi.py"
920  << " by switching OFF doPlotDZ or updating the InputTag collection";
921  return dz;
922  }
923 
924  const reco::RecoChargedCandidate* cand1;
925  const reco::RecoChargedCandidate* cand2;
926  bool matched1 = false;
927  bool matched2 = false;
928  for (reco::RecoChargedCandidateCollection::const_iterator candidate = candidates->begin();
929  candidate != candidates->end();
930  ++candidate) {
931  if (deltaR(eta1, phi1, candidate->eta(), candidate->phi()) < dRcut) {
932  matched1 = true;
933  cand1 = &*candidate;
934  if (debug_)
935  std::cout << "cand1: " << cand1->pt() << " " << cand1->eta() << " " << cand1->phi() << std::endl;
936  break;
937  }
938  }
939  if (!matched1) {
940  LogDebug("HLTObjectsMonitor") << "trigger object1 does not match ( dR > " << dRcut
941  << ") to any of the candidates in either " << muCandidates_ << " or "
942  << eleCandidates_;
943  return dz;
944  }
945 
946  for (reco::RecoChargedCandidateCollection::const_iterator candidate = candidates->begin();
947  candidate != candidates->end();
948  ++candidate) {
949  if (debug_) {
950  std::cout << "candidate: " << candidate->pt() << " cand1: " << cand1->pt() << std::endl;
951  std::cout << "candidate: " << candidate->eta() << " cand1: " << cand1->eta() << std::endl;
952  std::cout << "candidate: " << candidate->phi() << " cand1: " << cand1->phi() << std::endl;
953  }
954  if (&*candidate == cand1)
955  continue;
956 
957  if (deltaR(eta2, phi2, candidate->eta(), candidate->phi()) < dRcut) {
958  matched2 = true;
959  cand2 = &*candidate;
960  if (debug_)
961  std::cout << "cand2: " << cand2->pt() << " " << cand2->eta() << " " << cand2->phi() << std::endl;
962  break;
963  }
964  }
965  if (!matched2) {
966  LogDebug("HLTObjectsMonitor") << "trigger object2 does not match ( dR > " << dRcut
967  << ") to any of the candidates in either " << muCandidates_ << " or "
968  << eleCandidates_;
969  return dz;
970  }
971 
972  dz = cand1->vz() - cand2->vz();
973  return dz;
974 }
975 
976 //define this as a plug-in
#define LogDebug(id)
size
Write out results.
edm::EDGetTokenT< reco::JetTagCollection > pfJetBTagsToken_
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< double > phiBINNING
bool saveTags(const std::string &module) const
Is module an L3 filter (ie, tracked saveTags=true)
std::vector< hltPlot > hltPlots_
std::string pathNAME
double eta() const final
momentum pseudorapidity
edm::EDGetTokenT< edm::TriggerResults > triggerResultsToken_
std::pair< MonitorElement *, bool > energyME
std::unordered_map< std::string, int > plotNamesToBins_
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:146
const MEbinning csv_binning_
edm::InputTag muCandidates_
edm::EDGetTokenT< reco::JetTagCollection > caloJetBTagsToken_
std::vector< double > etaBINNING
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
std::vector< double > dimassBINNING
static hltPlot getPlotPSet(edm::ParameterSet pset)
std::string moduleNAME
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
std::pair< MonitorElement *, bool > csvME
bool accept() const
Has at least one path accepted the event?
std::pair< MonitorElement *, bool > ptME
const std::vector< std::string > & triggerNames() const
names of trigger paths
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
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
std::pair< MonitorElement *, bool > etaVSphiME
const_iterator end() const
double pt() const final
transverse momentum
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
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
double q2[4]
Definition: TauolaWrapper.h:88
static const std::string removeVersion(const std::string &trigger)
edm::InputTag beamSpot_
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
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
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
HLTObjectsMonitor(const edm::ParameterSet &)
edm::InputTag eleCandidates_
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:101
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
#define end
Definition: vmac.h:39
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")
Definition: DQMStore.cc:381
static std::string const triggerResults
Definition: EdmProvDump.cc:45
bool isValid() const
Definition: HandleBase.h:70
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
double vz() const override
z coordinate of vertex position
std::string label
std::vector< double > dzBINNING
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
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
double q1[4]
Definition: TauolaWrapper.h:87
std::vector< size_type > Keys
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
HLTConfigProvider hltConfig_
example_stream void bookHistograms(DQMStore::IBooker &,@example_stream edm::Run const &,@example_stream edm::EventSetup const &) override
edm::EDGetTokenT< std::vector< reco::RecoChargedCandidate > > muCandidatesToken_
std::pair< MonitorElement *, bool > dzME
bool isHEM17(double eta, double phi)
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_
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
std::pair< MonitorElement *, bool > dRetaVSphiME
std::vector< edm::ParameterSet > plotPSETS_
void analyze(const edm::Event &, const edm::EventSetup &) override
double y0() const
y coordinate
Definition: BeamSpot.h:63
double dzFinder(double, double, double, double, edm::Handle< reco::RecoChargedCandidateCollection >, double)
step
Definition: StallMonitor.cc:94
std::pair< MonitorElement *, bool > dRME
std::pair< MonitorElement *, bool > massME
static std::string const triggerPaths
Definition: EdmProvDump.cc:46
double phi() const final
momentum azimuthal angle
const_iterator begin() const
std::vector< double > dxyBINNING
Definition: vlib.h:198
edm::EDGetTokenT< trigger::TriggerEvent > triggerEventToken_
std::string xTITLE
std::vector< double > ptBINNING
Definition: Run.h:45
double x0() const
x coordinate
Definition: BeamSpot.h:61
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)