CMS 3D CMS Logo

MuIsoValidation.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 // MuIsoValidation.cc
3 // Package: Muon Isolation Validation
4 // Class: MuIsoValidation
5 //
6 /*
7 
8 
9  Description: Muon Isolation Validation class
10 
11  Implementation: This code will accept a data set and generate plots of
12  various quantities relevent to the Muon Isolation module. We will
13  be using the IsoDeposit class, *not* the MuonIsolation struct.
14 
15  The sequence of events is...
16  * initalize statics (which variables to plot, axis limtis, etc.)
17  * run over events
18  * for each event, run over the muons in that event
19  *record IsoDeposit data
20  * transfer data to histograms, profile plots
21  * save histograms to a root file
22 
23  Easy-peasy.
24 
25 */
26 //
27 // Original Author: "C. Jess Riedel", UC Santa Barbara
28 // Created: Tue Jul 17 15:58:24 CDT 2007
29 //
30 
31 //Class header file
33 
34 //System included files
35 #include <memory>
36 #include <string>
37 #include <typeinfo>
38 #include <utility>
39 
40 //Root included files
41 #include "TH1.h"
42 #include "TH2.h"
43 #include "TProfile.h"
44 
45 //Event framework included files
49 
50 //Other included files
52 
53 //Using declarations
54 using std::pair;
55 using std::string;
56 using std::vector;
57 
58 //
59 //-----------------Constructors---------------------
60 //
62  iConfig = ps;
63 
64  // rootfilename = iConfig.getUntrackedParameter<string>("rootfilename"); // comment out for inclusion
65  requireCombinedMuon = iConfig.getUntrackedParameter<bool>("requireCombinedMuon");
67  //subDirName = iConfig.getParameter<std::string>("@module_label");
68 
69  //dirName += subDirName;
70 
71  //--------Initialize tags-------
72  Muon_Tag = iConfig.getUntrackedParameter<edm::InputTag>("Global_Muon_Label");
73  Muon_Token = consumes<edm::View<reco::Muon> >(Muon_Tag);
74 
75  //-------Initialize counters----------------
76  nEvents = 0;
77  nIncMuons = 0;
78  // nCombinedMuons = 0;
79 
80  InitStatics();
81 
82  //Set up DAQ
83  subsystemname_ = iConfig.getUntrackedParameter<std::string>("subSystemFolder", "YourSubsystem");
84 
85  //------"allocate" space for the data vectors-------
86  h_1D.resize(NUM_VARS);
87  cd_plots.resize(NUM_VARS);
88  p_2D.resize(NUM_VARS, vector<MonitorElement*>(NUM_VARS));
89 }
90 
91 //
92 //----------Destructor-----------------
93 //
95  //Deallocate memory
96 }
97 
98 //
99 //------------Methods-----------------------
100 //
102  //-----------Initialize primatives-----------
103  S_BIN_WIDTH = 1.0; //in GeV
104  L_BIN_WIDTH = 2.0; //in GeV
106  NUM_LOG_BINS = 15;
107  LOG_BINNING_RATIO = 1.1; //ratio by which each bin is wider than the last for log binning
108  //i.e. bin widths are (x), (r*x), (r^2*x), ..., (r^(nbins)*x)
109 
110  //-------Initialize Titles---------
111  title_sam = ""; //"[Sample b-jet events] ";
112  title_cone = ""; //" [in R=0.3 IsoDeposit Cone]";
113  //The above two pieces of info will be printed on the title of the whole page,
114  //not for each individual histogram
115  title_cd = "C.D. of ";
116 
117  //-------"Allocate" memory for vectors
118  main_titles.resize(NUM_VARS);
119  axis_titles.resize(NUM_VARS);
120  names.resize(NUM_VARS);
121  param.resize(NUM_VARS, vector<double>(3));
122  isContinuous.resize(NUM_VARS);
123  cdCompNeeded.resize(NUM_VARS);
124 
125  //-----Titles of the plots-----------
126  main_titles[0] = "Total Tracker Momentum";
127  main_titles[1] = "Total EM Cal Energy";
128  main_titles[2] = "Total Had Cal Energy";
129  main_titles[3] = "Total HO Cal Energy";
130  main_titles[4] = "Number of Tracker Tracks";
131  main_titles[5] = "Number of Jets around Muon";
132  main_titles[6] = "Tracker p_{T} within veto cone";
133  main_titles[7] = "EM E_{T} within veto cone";
134  main_titles[8] = "Had E_{T} within veto cone";
135  main_titles[9] = "HO E_{T} within veto cone";
136  main_titles[10] = "Muon p_{T}";
137  main_titles[11] = "Muon #eta";
138  main_titles[12] = "Muon #phi";
139  main_titles[13] = "Average Momentum per Track ";
140  main_titles[14] = "Weighted Energy";
141  main_titles[15] = "PF Sum of Charged Hadron Pt";
142  main_titles[16] = "PF Sum of Total Hadron Pt";
143  main_titles[17] = "PF Sum of E,Mu Pt";
144  main_titles[18] = "PF Sum of Neutral Hadron Et";
145  main_titles[19] = "PF Sum of Photon Et";
146  main_titles[20] = "PF Sum of Pt from non-PV";
147 
148  //------Titles on the X or Y axis------------
149  axis_titles[0] = "#Sigma p_{T} (GeV)";
150  axis_titles[1] = "#Sigma E_{T}^{EM} (GeV)";
151  axis_titles[2] = "#Sigma E_{T}^{Had} (GeV)";
152  axis_titles[3] = "#Sigma E_{T}^{HO} (GeV)";
153  axis_titles[4] = "N_{Tracks}";
154  axis_titles[5] = "N_{Jets}";
155  axis_titles[6] = "#Sigma p_{T,veto} (GeV)";
156  axis_titles[7] = "#Sigma E_{T,veto}^{EM} (GeV)";
157  axis_titles[8] = "#Sigma E_{T,veto}^{Had} (GeV)";
158  axis_titles[9] = "#Sigma E_{T,veto}^{HO} (GeV)";
159  axis_titles[10] = "p_{T,#mu} (GeV)";
160  axis_titles[11] = "#eta_{#mu}";
161  axis_titles[12] = "#phi_{#mu}";
162  axis_titles[13] = "#Sigma p_{T} / N_{Tracks} (GeV)";
163  axis_titles[14] = "(1.5) X #Sigma E_{T}^{EM} + #Sigma E_{T}^{Had}";
164  axis_titles[15] = "#Sigma p_{T}^{PFHadCha} (GeV)";
165  axis_titles[16] = "#Sigma p_{T}^{PFTotCha} (GeV)";
166  axis_titles[17] = "#Sigma p_{T}^{PFEMu} (GeV)";
167  axis_titles[18] = "#Sigma E_{T}^{PFHadNeu} (GeV)";
168  axis_titles[19] = "#Sigma E_{T}^{PFPhot} (GeV)";
169  axis_titles[20] = "#Sigma p_{T}^{PFPU} (GeV)";
170 
171  //-----------Names given for the root file----------
172  names[0] = "sumPt";
173  names[1] = "emEt";
174  names[2] = "hadEt";
175  names[3] = "hoEt";
176  names[4] = "nTracks";
177  names[5] = "nJets";
178  names[6] = "trackerVetoPt";
179  names[7] = "emVetoEt";
180  names[8] = "hadVetoEt";
181  names[9] = "hoVetoEt";
182  names[10] = "muonPt";
183  names[11] = "muonEta";
184  names[12] = "muonPhi";
185  names[13] = "avgPt";
186  names[14] = "weightedEt";
187  names[15] = "PFsumChargedHadronPt";
188  names[16] = "PFsumChargedTotalPt";
189  names[17] = "PFsumEMuPt";
190  names[18] = "PFsumNeutralHadronEt";
191  names[19] = "PFsumPhotonEt";
192  names[20] = "PFsumPUPt";
193 
194  //----------Parameters for binning of histograms---------
195  //param[var][0] is the number of bins
196  //param[var][1] is the low edge of the low bin
197  //param[var][2] is the high edge of the high bin
198  //
199  // maximum value------,
200  // |
201  // V
202  param[0][0] = (int)(20.0 / S_BIN_WIDTH);
203  param[0][1] = 0.0;
204  param[0][2] = param[0][0] * S_BIN_WIDTH;
205  param[1][0] = (int)(20.0 / S_BIN_WIDTH);
206  param[1][1] = 0.0;
207  param[1][2] = param[1][0] * S_BIN_WIDTH;
208  param[2][0] = (int)(20.0 / S_BIN_WIDTH);
209  param[2][1] = 0.0;
210  param[2][2] = param[2][0] * S_BIN_WIDTH;
211  param[3][0] = 20;
212  param[3][1] = 0.0;
213  param[3][2] = 2.0;
214  param[4][0] = 16;
215  param[4][1] = -0.5;
216  param[4][2] = param[4][0] - 0.5;
217  param[5][0] = 4;
218  param[5][1] = -0.5;
219  param[5][2] = param[5][0] - 0.5;
220  param[6][0] = (int)(40.0 / S_BIN_WIDTH);
221  param[6][1] = 0.0;
222  param[6][2] = param[6][0] * S_BIN_WIDTH;
223  param[7][0] = 20;
224  param[7][1] = 0.0;
225  param[7][2] = 10.0;
226  param[8][0] = (int)(20.0 / S_BIN_WIDTH);
227  param[8][1] = 0.0;
228  param[8][2] = param[8][0] * S_BIN_WIDTH;
229  param[9][0] = 20;
230  param[9][1] = 0.0;
231  param[9][2] = 5.0;
232  param[10][0] = (int)(40.0 / S_BIN_WIDTH);
233  param[10][1] = 0.0;
234  param[10][2] = param[10][0] * S_BIN_WIDTH;
235  param[11][0] = 24;
236  param[11][1] = -2.4;
237  param[11][2] = 2.4;
238  param[12][0] = 32;
239  param[12][1] = -3.2;
240  param[12][2] = 3.2;
241  param[13][0] = (int)(15.0 / S_BIN_WIDTH);
242  param[13][1] = 0.0;
243  param[13][2] = param[13][0] * S_BIN_WIDTH;
244  param[14][0] = (int)(20.0 / S_BIN_WIDTH);
245  param[14][1] = 0.0;
246  param[14][2] = param[14][0] * S_BIN_WIDTH;
247  param[15][0] = (int)(20.0 / S_BIN_WIDTH);
248  param[15][1] = 0.0;
249  param[15][2] = param[15][0] * S_BIN_WIDTH;
250  param[16][0] = (int)(20.0 / S_BIN_WIDTH);
251  param[15][1] = 0.0;
252  param[16][2] = param[16][0] * S_BIN_WIDTH;
253  param[17][0] = (int)(20.0 / S_BIN_WIDTH) + 1;
254  param[17][1] = -S_BIN_WIDTH;
255  param[17][2] = param[17][0] * S_BIN_WIDTH;
256  param[18][0] = (int)(20.0 / S_BIN_WIDTH);
257  param[18][1] = 0.0;
258  param[18][2] = param[18][0] * S_BIN_WIDTH;
259  param[19][0] = (int)(20.0 / S_BIN_WIDTH);
260  param[19][1] = 0.0;
261  param[19][2] = param[19][0] * S_BIN_WIDTH;
262  param[20][0] = (int)(20.0 / S_BIN_WIDTH);
263  param[20][1] = 0.0;
264  param[20][2] = param[20][0] * S_BIN_WIDTH;
265 
266  //--------------Is the variable continuous (i.e. non-integer)?-------------
267  //---------(Log binning will only be used for continuous variables)--------
268  isContinuous[0] = 1;
269  isContinuous[1] = 1;
270  isContinuous[2] = 1;
271  isContinuous[3] = 1;
272  isContinuous[4] = 0;
273  isContinuous[5] = 0;
274  isContinuous[6] = 1;
275  isContinuous[7] = 1;
276  isContinuous[8] = 1;
277  isContinuous[9] = 1;
278  isContinuous[10] = 1;
279  isContinuous[11] = 1;
280  isContinuous[12] = 1;
281  isContinuous[13] = 1;
282  isContinuous[14] = 1;
283  isContinuous[15] = 1;
284  isContinuous[16] = 1;
285  isContinuous[17] = 1;
286  isContinuous[18] = 1;
287  isContinuous[19] = 1;
288  isContinuous[20] = 1;
289 
290  //----Should the cumulative distribution be calculated for this variable?-----
291  cdCompNeeded[0] = 1;
292  cdCompNeeded[1] = 1;
293  cdCompNeeded[2] = 1;
294  cdCompNeeded[3] = 1;
295  cdCompNeeded[4] = 1;
296  cdCompNeeded[5] = 1;
297  cdCompNeeded[6] = 1;
298  cdCompNeeded[7] = 1;
299  cdCompNeeded[8] = 1;
300  cdCompNeeded[9] = 1;
301  cdCompNeeded[10] = 0;
302  cdCompNeeded[11] = 0;
303  cdCompNeeded[12] = 0;
304  cdCompNeeded[13] = 1;
305  cdCompNeeded[14] = 1;
306  cdCompNeeded[15] = 1;
307  cdCompNeeded[16] = 1;
308  cdCompNeeded[17] = 1;
309  cdCompNeeded[18] = 1;
310  cdCompNeeded[19] = 1;
311  cdCompNeeded[20] = 1;
312 }
313 
314 // ------------ method called for each event ------------
316  ++nEvents;
317  edm::LogInfo("Tutorial") << "\nInvestigating event #" << nEvents << "\n";
318 
319  // Get Muon Collection
320  edm::Handle<edm::View<reco::Muon> > muonsHandle; //
321  iEvent.getByToken(Muon_Token, muonsHandle);
322 
323  //Fill event entry in histogram of number of muons
324  edm::LogInfo("Tutorial") << "Number of Muons: " << muonsHandle->size();
325  theMuonData = muonsHandle->size();
327 
328  //Fill historgams concerning muon isolation
329  uint iMuon = 0;
330  for (MuonIterator muon = muonsHandle->begin(); muon != muonsHandle->end(); ++muon, ++iMuon) {
331  ++nIncMuons;
332  if (requireCombinedMuon) {
333  if (muon->combinedMuon().isNull())
334  continue;
335  }
336  RecordData(muon);
337  FillHistos();
338  }
339 }
340 
341 //---------------Record data for a signle muon's data---------------------
343  theData[0] = muon->isolationR03().sumPt;
344  theData[1] = muon->isolationR03().emEt;
345  theData[2] = muon->isolationR03().hadEt;
346  theData[3] = muon->isolationR03().hoEt;
347 
348  theData[4] = muon->isolationR03().nTracks;
349  theData[5] = muon->isolationR03().nJets;
350  theData[6] = muon->isolationR03().trackerVetoPt;
351  theData[7] = muon->isolationR03().emVetoEt;
352  theData[8] = muon->isolationR03().hadVetoEt;
353  theData[9] = muon->isolationR03().hoVetoEt;
354 
355  theData[10] = muon->pt();
356  theData[11] = muon->eta();
357  theData[12] = muon->phi();
358 
359  // make sure nTracks != 0 before filling this one
360  if (theData[4] != 0)
361  theData[13] = (double)theData[0] / (double)theData[4];
362  else
363  theData[13] = -99;
364 
365  theData[14] = 1.5 * theData[1] + theData[2];
366 
367  // Now PF isolation
368  theData[15] = -99.;
369  theData[16] = -99.;
370  theData[17] = -99.;
371  theData[18] = -99.;
372  theData[19] = -99.;
373  theData[20] = -99.;
374  if (muon->isPFMuon() && muon->isPFIsolationValid()) {
375  theData[15] = muon->pfIsolationR03().sumChargedHadronPt;
376  theData[16] = muon->pfIsolationR03().sumChargedParticlePt;
377  theData[17] = muon->pfIsolationR03().sumChargedParticlePt - muon->pfIsolationR03().sumChargedHadronPt;
378  theData[18] = muon->pfIsolationR03().sumNeutralHadronEt;
379  theData[19] = muon->pfIsolationR03().sumPhotonEt;
380  theData[20] = muon->pfIsolationR03().sumPUPt;
381  }
382 }
383 
385  ibooker.setCurrentFolder(dirName);
386  //---initialize number of muons histogram---
387  h_nMuons = ibooker.book1D("nMuons", title_sam + "Number of Muons", 20, 0., 20.);
388  h_nMuons->setAxisTitle("Number of Muons", XAXIS);
389  h_nMuons->setAxisTitle("Fraction of Events", YAXIS);
390 
391  //---Initialize 1D Histograms---
392  for (int var = 0; var < NUM_VARS; var++) {
393  h_1D[var] = ibooker.book1D(names[var],
395  (int)param[var][0],
396  param[var][1],
397  param[var][2],
398  [](TH1* th1) { th1->Sumw2(); });
399  h_1D[var]->setAxisTitle(axis_titles[var], XAXIS);
400  h_1D[var]->setAxisTitle("Fraction of Muons", YAXIS);
401 
402  if (cdCompNeeded[var]) {
403  cd_plots[var] = ibooker.book1D(names[var] + "_cd",
405  (int)param[var][0],
406  param[var][1],
407  param[var][2],
408  [](TH1* th1) { th1->Sumw2(); });
409  cd_plots[var]->setAxisTitle(axis_titles[var], XAXIS);
410  cd_plots[var]->setAxisTitle("Fraction of Muons", YAXIS);
411  }
412  } //Finish 1D
413 
414  //---Initialize 2D Histograms---
415  for (int var1 = 0; var1 < NUM_VARS; var1++) {
416  for (int var2 = 0; var2 < NUM_VARS; var2++) {
417  if (var1 == var2)
418  continue;
419 
420  //Monitor elements is weird and takes y axis parameters as well
421  //as x axis parameters for a 1D profile plot
422  p_2D[var1][var2] = ibooker.bookProfile(names[var1] + "_" + names[var2],
423  title_sam + main_titles[var2] + " <vs> " + main_titles[var1] + title_cone,
424  (int)param[var1][0],
425  param[var1][1],
426  param[var1][2],
427  (int)param[var2][0], //documentation says this is disregarded
428  param[var2][1], //does this do anything?
429  param[var2][2], //does this do anything?
430  " ", //profile errors = spread/sqrt(num_datums)
431  [&](TProfile* tprof) {
432  if (LOG_BINNING_ENABLED && isContinuous[var1]) {
433  Double_t* bin_edges = new Double_t[NUM_LOG_BINS + 1];
434  // nbins+1 because there is one more edge than there are bins
435  MakeLogBinsForProfile(bin_edges, param[var1][1], param[var1][2]);
436  tprof->SetBins(NUM_LOG_BINS, bin_edges);
437  delete[] bin_edges;
438  }
439  });
440 
441  p_2D[var1][var2]->setAxisTitle(axis_titles[var1], XAXIS);
442  p_2D[var1][var2]->setAxisTitle(axis_titles[var2], YAXIS);
443  }
444  } //Finish 2D
445 
446  //avg pT not defined for zero tracks.
447  //MonitorElement is inflxible and won't let me change the
448  //number of bins! I guess all I'm doing here is changing
449  //range of the x axis when it is printed, not the actual
450  //bins that are filled
451  p_2D[4][9]->setAxisRange(0.5, 15.5, XAXIS);
452 }
453 
454 void MuIsoValidation::MakeLogBinsForProfile(Double_t* bin_edges, const double min, const double max) {
455  const double& r = LOG_BINNING_RATIO;
456  const int& nbins = NUM_LOG_BINS;
457 
458  const double first_bin_width = (r > 1.0) ? //so we don't divide by zero
459  (max - min) * (1 - r) / (1 - pow(r, nbins))
460  : (max - min) / nbins;
461 
462  bin_edges[0] = min;
463  bin_edges[1] = min + first_bin_width;
464  for (int n = 2; n < nbins; ++n) {
465  bin_edges[n] = bin_edges[n - 1] + (bin_edges[n - 1] - bin_edges[n - 2]) * r;
466  }
467  bin_edges[nbins] = max;
468 }
469 
471  //----------Fill 1D histograms---------------
472  for (int var = 0; var < NUM_VARS; var++) {
473  h_1D[var]->Fill(theData[var]);
474  if (cdCompNeeded[var])
475  cd_plots[var]->Fill(theData[var]); //right now, this is a regular PDF (just like h_1D)
476  } //Finish 1D
477 
478  //----------Fill 2D histograms---------------
479  for (int var1 = 0; var1 < NUM_VARS; ++var1) {
480  for (int var2 = 0; var2 < NUM_VARS; ++var2) {
481  if (var1 == var2)
482  continue;
483  //change below to regular int interating!
484  // h_2D[var1][var2]->Fill(theData[var1], theData[var2]);
485  p_2D[var1][var2]->Fill(theData[var1], theData[var2]);
486  }
487  } //Finish 2D
488 }
489 
490 //define this as a plug-in
void RecordData(MuonIterator muon)
void analyze(const edm::Event &, const edm::EventSetup &) override
std::vector< int > isContinuous
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
std::vector< std::string > names
std::string title_cd
edm::View< reco::Muon >::const_iterator MuonIterator
std::vector< std::string > main_titles
double theData[NUM_VARS]
constexpr int pow(int x)
Definition: conifer.h:24
MuIsoValidation(const edm::ParameterSet &)
std::vector< std::vector< MonitorElement * > > p_2D
std::vector< MonitorElement * > h_1D
edm::EDGetTokenT< edm::View< reco::Muon > > Muon_Token
MonitorElement * h_nMuons
edm::ParameterSet iConfig
T getUntrackedParameter(std::string const &, T const &) const
void Fill(long long x)
int iEvent
Definition: GenABIO.cc:224
std::string title_sam
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int, double lowY, double highY, char const *option="s", FUNC onbooking=NOOP())
Definition: DQMStore.h:399
std::vector< MonitorElement * > cd_plots
std::string dirName
std::string title_cone
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static const int NUM_VARS
~MuIsoValidation() override
Log< level::Info, false > LogInfo
std::vector< std::vector< double > > param
void MakeLogBinsForProfile(Double_t *bin_edges, const double min, const double max)
std::vector< std::string > axis_titles
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
edm::InputTag Muon_Tag
Definition: Run.h:45
std::string subsystemname_
std::vector< int > cdCompNeeded
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)