CMS 3D CMS Logo

DiDispStaMuonMonitor.cc
Go to the documentation of this file.
2 
3 // -----------------------------
4 // constructors and destructor
5 // -----------------------------
6 
8  : folderName_(iConfig.getParameter<std::string>("FolderName")),
9  muonToken_(consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("muons"))),
10  muonPt_variable_binning_(
11  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("muonPtBinning")),
12  muonPt_binning_(getHistoPSet(
13  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("muonPtPSet"))),
14  muonEta_binning_(getHistoPSet(
15  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("muonEtaPSet"))),
16  muonPhi_binning_(getHistoPSet(
17  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("muonPhiPSet"))),
18  muonDxy_binning_(getHistoPSet(
19  iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("muonDxyPSet"))),
20  ls_binning_(
21  getHistoPSet(iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("lsPSet"))),
22  num_genTriggerEventFlag_(new GenericTriggerEventFlag(
23  iConfig.getParameter<edm::ParameterSet>("numGenericTriggerEventPSet"), consumesCollector(), *this)),
24  den_genTriggerEventFlag_(new GenericTriggerEventFlag(
25  iConfig.getParameter<edm::ParameterSet>("denGenericTriggerEventPSet"), consumesCollector(), *this)),
26  muonSelectionGeneral_(
27  iConfig.getParameter<edm::ParameterSet>("muonSelection").getParameter<std::string>("general")),
28  muonSelectionPt_(iConfig.getParameter<edm::ParameterSet>("muonSelection").getParameter<std::string>("pt")),
29  muonSelectionDxy_(iConfig.getParameter<edm::ParameterSet>("muonSelection").getParameter<std::string>("dxy")),
30  nmuons_(iConfig.getParameter<unsigned int>("nmuons")) {
31  muonPtME_.numerator = nullptr;
32  muonPtME_.denominator = nullptr;
33  muonPtNoDxyCutME_.numerator = nullptr;
37  muonPtVsLS_.numerator = nullptr;
38  muonPtVsLS_.denominator = nullptr;
39  muonEtaME_.numerator = nullptr;
40  muonEtaME_.denominator = nullptr;
41  muonPhiME_.numerator = nullptr;
42  muonPhiME_.denominator = nullptr;
43  muonDxyME_.numerator = nullptr;
44  muonDxyME_.denominator = nullptr;
45 
46  subMuonPtME_.numerator = nullptr;
47  subMuonPtME_.denominator = nullptr;
50  subMuonEtaME_.numerator = nullptr;
51  subMuonEtaME_.denominator = nullptr;
52  subMuonPhiME_.numerator = nullptr;
53  subMuonPhiME_.denominator = nullptr;
54  subMuonDxyME_.numerator = nullptr;
55  subMuonDxyME_.denominator = nullptr;
56 }
57 
59 
61  return MEbinning{
62  pset.getParameter<unsigned int>("nbins"),
63  pset.getParameter<double>("xmin"),
64  pset.getParameter<double>("xmax"),
65  };
66 }
67 
69  return MEbinning{pset.getParameter<unsigned int>("nbins"), 0., double(pset.getParameter<unsigned int>("nbins"))};
70 }
71 
73  const std::string& titleX,
74  const std::string& titleY,
75  bool bookDen) {
76  me.numerator->setAxisTitle(titleX, 1);
77  me.numerator->setAxisTitle(titleY, 2);
78  if (bookDen) {
79  me.denominator->setAxisTitle(titleX, 1);
80  me.denominator->setAxisTitle(titleY, 2);
81  }
82 }
83 
86  const std::string& histname,
87  const std::string& histtitle,
88  int nbins,
89  double min,
90  double max) {
91  me.numerator = ibooker.book1D(histname + "_numerator", histtitle + " (numerator)", nbins, min, max);
92  me.denominator = ibooker.book1D(histname + "_denominator", histtitle + " (denominator)", nbins, min, max);
93 }
96  const std::string& histname,
97  const std::string& histtitle,
98  const std::vector<double>& binning) {
99  int nbins = binning.size() - 1;
100  std::vector<float> fbinning(binning.begin(), binning.end());
101  float* arr = &fbinning[0];
102  me.numerator = ibooker.book1D(histname + "_numerator", histtitle + " (numerator)", nbins, arr);
103  me.denominator = ibooker.book1D(histname + "_denominator", histtitle + " (denominator)", nbins, arr);
104 }
107  const std::string& histname,
108  const std::string& histtitle,
109  int nbinsX,
110  double xmin,
111  double xmax,
112  double ymin,
113  double ymax,
114  bool bookDen) {
115  me.numerator =
116  ibooker.bookProfile(histname + "_numerator", histtitle + " (numerator)", nbinsX, xmin, xmax, ymin, ymax);
117  if (bookDen)
118  me.denominator =
119  ibooker.bookProfile(histname + "_denominator", histtitle + " (denominator)", nbinsX, xmin, xmax, ymin, ymax);
120 }
123  const std::string& histname,
124  const std::string& histtitle,
125  int nbinsX,
126  double xmin,
127  double xmax,
128  int nbinsY,
129  double ymin,
130  double ymax) {
131  me.numerator =
132  ibooker.book2D(histname + "_numerator", histtitle + " (numerator)", nbinsX, xmin, xmax, nbinsY, ymin, ymax);
133  me.denominator =
134  ibooker.book2D(histname + "_denominator", histtitle + " (denominator)", nbinsX, xmin, xmax, nbinsY, ymin, ymax);
135 }
138  const std::string& histname,
139  const std::string& histtitle,
140  const std::vector<double>& binningX,
141  const std::vector<double>& binningY) {
142  int nbinsX = binningX.size() - 1;
143  std::vector<float> fbinningX(binningX.begin(), binningX.end());
144  float* arrX = &fbinningX[0];
145  int nbinsY = binningY.size() - 1;
146  std::vector<float> fbinningY(binningY.begin(), binningY.end());
147  float* arrY = &fbinningY[0];
148 
149  me.numerator = ibooker.book2D(histname + "_numerator", histtitle + " (numerator)", nbinsX, arrX, nbinsY, arrY);
150  me.denominator = ibooker.book2D(histname + "_denominator", histtitle + " (denominator)", nbinsX, arrX, nbinsY, arrY);
151 }
152 
154  edm::Run const& iRun,
155  edm::EventSetup const& iSetup) {
156  std::string histname, histtitle;
157  bool bookDen;
158 
159  std::string currentFolder = folderName_;
160  ibooker.setCurrentFolder(currentFolder);
161 
162  histname = "muonPt";
163  histtitle = "muonPt";
164  bookDen = true;
165  bookME(ibooker, muonPtME_, histname, histtitle, muonPt_binning_.nbins, muonPt_binning_.xmin, muonPt_binning_.xmax);
166  setTitle(muonPtME_, "DisplacedStandAlone Muon p_{T} [GeV]", "Events / [GeV]", bookDen);
167 
168  histname = "muonPtNoDxyCut";
169  histtitle = "muonPtNoDxyCut";
170  bookDen = true;
171  bookME(ibooker,
173  histname,
174  histtitle,
178  setTitle(muonPtNoDxyCutME_, "DisplacedStandAlone Muon p_{T} [GeV] without Dxy cut", "Events / [GeV]", bookDen);
179 
180  histname = "muonPt_variable";
181  histtitle = "muonPt";
182  bookDen = true;
183  bookME(ibooker, muonPtME_variableBinning_, histname, histtitle, muonPt_variable_binning_);
184  setTitle(muonPtME_variableBinning_, "DisplacedStandAlone Muon p_{T} [GeV]", "Events / [GeV]", bookDen);
185 
186  histname = "muonPtVsLS";
187  histtitle = "muonPt vs LS";
188  bookDen = true;
189  bookME(ibooker,
190  muonPtVsLS_,
191  histname,
192  histtitle,
198  bookDen);
199  setTitle(muonPtVsLS_, "LS", "DisplacedStandAlone Muon p_{T} [GeV]", bookDen);
200 
201  histname = "muonEta";
202  histtitle = "muonEta";
203  bookDen = true;
204  bookME(
205  ibooker, muonEtaME_, histname, histtitle, muonEta_binning_.nbins, muonEta_binning_.xmin, muonEta_binning_.xmax);
206  setTitle(muonEtaME_, "DisplacedStandAlone Muon #eta", "Events", bookDen);
207 
208  histname = "muonPhi";
209  histtitle = "muonPhi";
210  bookDen = true;
211  bookME(
212  ibooker, muonPhiME_, histname, histtitle, muonPhi_binning_.nbins, muonPhi_binning_.xmin, muonPhi_binning_.xmax);
213  setTitle(muonPhiME_, "DisplacedStandAlone Muon #phi", "Events", bookDen);
214 
215  histname = "muonDxy";
216  histtitle = "muonDxy";
217  bookDen = true;
218  bookME(
219  ibooker, muonDxyME_, histname, histtitle, muonDxy_binning_.nbins, muonDxy_binning_.xmin, muonDxy_binning_.xmax);
220  setTitle(muonDxyME_, "DisplacedStandAlone Muon #dxy", "Events", bookDen);
221 
222  //-----------------------
223  // |
224  //-----------------------
225 
226  if (nmuons_ > 1) {
227  histname = "subMuonPt";
228  histtitle = "subMuonPt";
229  bookDen = true;
230  bookME(
231  ibooker, subMuonPtME_, histname, histtitle, muonPt_binning_.nbins, muonPt_binning_.xmin, muonPt_binning_.xmax);
232  setTitle(subMuonPtME_, "Subleading DisplacedStandAlone Muon p_{T} [GeV]", "Events / [GeV]", bookDen);
233 
234  histname = "subMuonPt_variable";
235  histtitle = "subMuonPt";
236  bookDen = true;
237  bookME(ibooker, subMuonPtME_variableBinning_, histname, histtitle, muonPt_variable_binning_);
238  setTitle(
239  subMuonPtME_variableBinning_, "Subleading DisplacedStandAlone Muon p_{T} [GeV]", "Events / [GeV]", bookDen);
240 
241  histname = "subMuonEta";
242  histtitle = "subMuonEta";
243  bookDen = true;
244  bookME(ibooker,
246  histname,
247  histtitle,
251  setTitle(subMuonEtaME_, "Subleading DisplacedStandAlone Muon #eta", "Events", bookDen);
252 
253  histname = "subMuonPhi";
254  histtitle = "subMuonPhi";
255  bookDen = true;
256  bookME(ibooker,
258  histname,
259  histtitle,
263  setTitle(subMuonPhiME_, "Subleading DisplacedStandAlone Muon #phi", "Events", bookDen);
264 
265  histname = "subMuonDxy";
266  histtitle = "subMuonDxy";
267  bookDen = true;
268  bookME(ibooker,
270  histname,
271  histtitle,
275  setTitle(subMuonDxyME_, "Subleading DisplacedStandAlone Muon #dxy", "Events", bookDen);
276  }
277 
278  // Initialize the GenericTriggerEventFlag
280  num_genTriggerEventFlag_->initRun(iRun, iSetup);
282  den_genTriggerEventFlag_->initRun(iRun, iSetup);
283 }
284 
286  // Filter out events if Trigger Filtering is requested
287  if (den_genTriggerEventFlag_->on() && !den_genTriggerEventFlag_->accept(iEvent, iSetup))
288  return;
289 
290  int ls = iEvent.id().luminosityBlock();
291 
293  iEvent.getByToken(muonToken_, DSAHandle);
294  if ((unsigned int)(DSAHandle->size()) < nmuons_)
295  return;
296  std::vector<edm::Ptr<reco::Track>> dsaMuonPtrs_{}; // = DSAHandle->ptrs();
297  for (size_t i(0); i != DSAHandle->size(); ++i) {
298  dsaMuonPtrs_.emplace_back(DSAHandle, i);
299  }
300  std::vector<edm::Ptr<reco::Track>> muons{}, muonsCutOnPt{}, muonsCutOnDxy{}, muonsCutOnPtAndDxy{};
301 
302  // general selection
303  auto selectGeneral_([this](edm::Ptr<reco::Track> const& m) -> bool { return muonSelectionGeneral_(*m); });
304  std::copy_if(dsaMuonPtrs_.begin(), dsaMuonPtrs_.end(), back_inserter(muons), selectGeneral_);
305  if ((unsigned int)(muons.size()) < nmuons_)
306  return;
307 
308  // sort by pt
309  auto ptSorter_ = [](edm::Ptr<reco::Track> const& lhs, edm::Ptr<reco::Track> const& rhs) -> bool {
310  return lhs->pt() > rhs->pt();
311  };
312  std::sort(muons.begin(), muons.end(), ptSorter_);
313 
314  // cut on pt
315  auto selectOnPt_([this](edm::Ptr<reco::Track> const& m) -> bool { return muonSelectionPt_(*m); });
316  std::copy_if(muons.begin(), muons.end(), back_inserter(muonsCutOnPt), selectOnPt_);
317  // cut on dxy
318  auto selectOnDxy_([this](edm::Ptr<reco::Track> const& m) -> bool { return muonSelectionDxy_(*m); });
319  std::copy_if(muons.begin(), muons.end(), back_inserter(muonsCutOnDxy), selectOnDxy_);
320  // cut on pt and dxy
321  auto selectOnPtAndDxy_(
322  [this](edm::Ptr<reco::Track> const& m) -> bool { return muonSelectionPt_(*m) && muonSelectionDxy_(*m); });
323  std::copy_if(muons.begin(), muons.end(), back_inserter(muonsCutOnPtAndDxy), selectOnPtAndDxy_);
324 
325  std::sort(muonsCutOnPt.begin(), muonsCutOnPt.end(), ptSorter_);
326  std::sort(muonsCutOnDxy.begin(), muonsCutOnDxy.end(), ptSorter_);
327  std::sort(muonsCutOnPtAndDxy.begin(), muonsCutOnPtAndDxy.end(), ptSorter_);
328 
329  // --------------------------------
330  // filling histograms (denominator)
331  // --------------------------------
332  if (muonsCutOnDxy.size() >= nmuons_) {
333  // pt has cut on dxy
334  muonPtME_.denominator->Fill(muonsCutOnDxy[0]->pt());
336  muonPtME_variableBinning_.denominator->Fill(muonsCutOnDxy[0]->pt());
337  muonPtVsLS_.denominator->Fill(ls, muonsCutOnDxy[0]->pt());
338  if (nmuons_ > 1) {
339  subMuonPtME_.denominator->Fill(muonsCutOnDxy[1]->pt());
340  subMuonPtME_variableBinning_.denominator->Fill(muonsCutOnDxy[1]->pt());
341  }
342  }
343  if (muonsCutOnPtAndDxy.size() >= nmuons_) {
344  // eta, phi have cut on pt and dxy
345  muonEtaME_.denominator->Fill(muonsCutOnPtAndDxy[0]->eta());
346  muonPhiME_.denominator->Fill(muonsCutOnPtAndDxy[0]->phi());
347  if (nmuons_ > 1) {
348  subMuonEtaME_.denominator->Fill(muonsCutOnPtAndDxy[1]->eta());
349  subMuonPhiME_.denominator->Fill(muonsCutOnPtAndDxy[1]->phi());
350  }
351  }
352  if (muonsCutOnPt.size() >= nmuons_) {
353  // dxy has cut on pt
354  muonDxyME_.denominator->Fill(muonsCutOnPt[0]->dxy());
355  if (nmuons_ > 1) {
356  subMuonDxyME_.denominator->Fill(muonsCutOnPt[1]->dxy());
357  }
358  }
359 
360  // --------------------------------
361  // filling histograms (numerator)
362  // --------------------------------
363  if (num_genTriggerEventFlag_->on() && !num_genTriggerEventFlag_->accept(iEvent, iSetup))
364  return;
365 
366  if (muonsCutOnDxy.size() >= nmuons_) {
367  // pt has cut on dxy
368  muonPtME_.numerator->Fill(muonsCutOnDxy[0]->pt());
370  muonPtME_variableBinning_.numerator->Fill(muonsCutOnDxy[0]->pt());
371  muonPtVsLS_.numerator->Fill(ls, muonsCutOnDxy[0]->pt());
372  if (nmuons_ > 1) {
373  subMuonPtME_.numerator->Fill(muonsCutOnDxy[1]->pt());
374  subMuonPtME_variableBinning_.numerator->Fill(muonsCutOnDxy[1]->pt());
375  }
376  }
377  if (muonsCutOnPtAndDxy.size() >= nmuons_) {
378  // eta, phi have cut on pt and dxy
379  muonEtaME_.numerator->Fill(muonsCutOnPtAndDxy[0]->eta());
380  muonPhiME_.numerator->Fill(muonsCutOnPtAndDxy[0]->phi());
381  if (nmuons_ > 1) {
382  subMuonEtaME_.numerator->Fill(muonsCutOnPtAndDxy[1]->eta());
383  subMuonPhiME_.numerator->Fill(muonsCutOnPtAndDxy[1]->phi());
384  }
385  }
386  if (muonsCutOnPt.size() >= nmuons_) {
387  // dxy has cut on pt
388  muonDxyME_.numerator->Fill(muonsCutOnPt[0]->dxy());
389  if (nmuons_ > 1) {
390  subMuonDxyME_.numerator->Fill(muonsCutOnPt[1]->dxy());
391  }
392  }
393 }
394 
396  pset.add<unsigned int>("nbins", 200);
397  pset.add<double>("xmin", -0.5);
398  pset.add<double>("xmax", 19999.5);
399 }
400 
402  pset.add<unsigned int>("nbins", 2000);
403 }
404 
407  desc.add<std::string>("FolderName", "HLT/EXO/DiDispStaMuon");
408 
409  desc.add<edm::InputTag>("muons", edm::InputTag("displacedStandAloneMuons"));
410  desc.add<unsigned int>("nmuons", 2);
411 
413  muonSelection.add<std::string>("general", "pt > 0");
414  muonSelection.add<std::string>("pt", "");
415  muonSelection.add<std::string>("dxy", "pt > 0");
416  desc.add<edm::ParameterSetDescription>("muonSelection", muonSelection);
417 
419  genericTriggerEventPSet.add<bool>("andOr");
420  genericTriggerEventPSet.add<edm::InputTag>("dcsInputTag", edm::InputTag("scalersRawToDigi"));
421  genericTriggerEventPSet.add<std::vector<int>>("dcsPartitions", {});
422  genericTriggerEventPSet.add<bool>("andOrDcs", false);
423  genericTriggerEventPSet.add<bool>("errorReplyDcs", true);
424  genericTriggerEventPSet.add<std::string>("dbLabel", "");
425  genericTriggerEventPSet.add<bool>("andOrHlt", true);
426  genericTriggerEventPSet.add<edm::InputTag>("hltInputTag", edm::InputTag("TriggerResults::HLT"));
427  genericTriggerEventPSet.add<std::vector<std::string>>("hltPaths", {});
428  genericTriggerEventPSet.add<std::string>("hltDBKey", "");
429  genericTriggerEventPSet.add<bool>("errorReplyHlt", false);
430  genericTriggerEventPSet.add<unsigned int>("verbosityLevel", 1);
431 
432  desc.add<edm::ParameterSetDescription>("numGenericTriggerEventPSet", genericTriggerEventPSet);
433  desc.add<edm::ParameterSetDescription>("denGenericTriggerEventPSet", genericTriggerEventPSet);
434 
441  fillHistoPSetDescription(muonPtPSet);
442  fillHistoPSetDescription(muonEtaPSet);
443  fillHistoPSetDescription(muonPhiPSet);
444  fillHistoPSetDescription(muonDxyPSet);
445  fillHistoPSetDescription(lsPSet);
446  histoPSet.add<edm::ParameterSetDescription>("muonPtPSet", muonPtPSet);
447  histoPSet.add<edm::ParameterSetDescription>("muonEtaPSet", muonEtaPSet);
448  histoPSet.add<edm::ParameterSetDescription>("muonPhiPSet", muonPhiPSet);
449  histoPSet.add<edm::ParameterSetDescription>("muonDxyPSet", muonDxyPSet);
450  histoPSet.add<edm::ParameterSetDescription>("lsPSet", lsPSet);
451  std::vector<double> bins = {0., 20., 40., 60., 80., 90., 100., 110., 120., 130., 140., 150., 160.,
452  170., 180., 190., 200., 220., 240., 260., 280., 300., 350., 400., 450., 1000.};
453  histoPSet.add<std::vector<double>>("muonPtBinning", bins);
454 
455  desc.add<edm::ParameterSetDescription>("histoPSet", histoPSet);
456 
457  descriptions.add("DiDispStaMuonMonitoring", desc);
458 }
459 
460 // Define this as a plug-in
DiDispStaMuonME subMuonPtME_
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
~DiDispStaMuonMonitor() override
void setTitle(DiDispStaMuonME &me, const std::string &titleX, const std::string &titleY, bool bookDen)
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
DiDispStaMuonME subMuonEtaME_
std::vector< double > muonPt_variable_binning_
static MEbinning getHistoPSet(const edm::ParameterSet &pset)
DiDispStaMuonME muonPtNoDxyCutME_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
static MEbinning getHistoLSPSet(const edm::ParameterSet &pset)
static void fillHistoLSPSetDescription(edm::ParameterSetDescription &pset)
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
Provides a code based selection for trigger and DCS information in order to have no failing filters i...
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:39
void Fill(long long x)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
DiDispStaMuonME subMuonDxyME_
std::unique_ptr< GenericTriggerEventFlag > num_genTriggerEventFlag_
void analyze(edm::Event const &iEvent, edm::EventSetup const &iSetup) override
StringCutObjectSelector< reco::Track, true > muonSelectionDxy_
StringCutObjectSelector< reco::Track, true > muonSelectionGeneral_
double pt() const
track transverse momentum
Definition: TrackBase.h:602
void bookME(DQMStore::IBooker &, DiDispStaMuonME &me, const std::string &histname, const std::string &histtitle, int nbins, double xmin, double xmax)
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, char const *option="s")
Definition: DQMStore.cc:333
DiDispStaMuonMonitor(const edm::ParameterSet &)
T min(T a, T b)
Definition: MathUtil.h:58
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::unique_ptr< GenericTriggerEventFlag > den_genTriggerEventFlag_
def ls(path, rec=False)
Definition: eostools.py:349
static void fillHistoPSetDescription(edm::ParameterSetDescription &pset)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
StringCutObjectSelector< reco::Track, true > muonSelectionPt_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::EventID id() const
Definition: EventBase.h:59
fixed size matrix
HLT enums.
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
DiDispStaMuonME subMuonPtME_variableBinning_
edm::EDGetTokenT< reco::TrackCollection > muonToken_
DiDispStaMuonME subMuonPhiME_
Definition: Run.h:45
DiDispStaMuonME muonPtME_variableBinning_
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)