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