CMS 3D CMS Logo

HLTBTagHarvestingAnalyzer.cc
Go to the documentation of this file.
2 
4  // getParameter
5  mainFolder_ = iConfig.getParameter<std::string>("mainFolder");
6  hltPathNames_ = iConfig.getParameter<std::vector<std::string>>("HLTPathNames");
7  edm::ParameterSet mc = iConfig.getParameter<edm::ParameterSet>("mcFlavours");
8  m_mcLabels = mc.getParameterNamesForType<std::vector<unsigned int>>();
9  m_histoName = iConfig.getParameter<std::vector<std::string>>("histoName");
10  m_minTag = iConfig.getParameter<double>("minTag");
11 
12  HCALSpecialsNames[HEP17] = "HEP17";
13  HCALSpecialsNames[HEP18] = "HEP18";
14  HCALSpecialsNames[HEM17] = "HEM17";
15 }
16 
18 
19 // ------------ method called once each job just after ending the event loop
20 // ------------
22  using namespace edm;
24  std::string dqmFolder_hist;
25 
26  // for each hltPath and for each flavour, do the "b-tag efficiency vs jet pt"
27  // and "b-tag efficiency vs mistag rate" plots
28  for (unsigned int ind = 0; ind < hltPathNames_.size(); ind++) {
29  dqmFolder_hist = Form("%s/Discriminator/%s", mainFolder_.c_str(), hltPathNames_[ind].c_str());
30  std::string effDir = Form("%s/Discriminator/%s/efficiency", mainFolder_.c_str(), hltPathNames_[ind].c_str());
31  std::string relationsDir = Form("%s/Discriminator/%s/HEP17_HEM17", mainFolder_.c_str(), hltPathNames_[ind].c_str());
32  ibooker.setCurrentFolder(effDir);
33  TH1 *den = nullptr;
34  TH1 *num = nullptr;
35  std::map<std::string, TH1F> effics;
36  std::map<std::string, bool> efficsOK;
37  std::map<std::string, std::map<HCALSpecials, TH1F>> efficsmod;
38  std::map<std::string, std::map<HCALSpecials, bool>> efficsmodOK;
39  for (unsigned int i = 0; i < m_mcLabels.size(); ++i) {
40  bool isOK = false;
41  std::string label = m_histoName.at(ind) + "__"; //"JetTag__";
43  label += flavour;
44  isOK =
45  GetNumDenumerators(ibooker, igetter, dqmFolder_hist + "/" + label, dqmFolder_hist + "/" + label, num, den, 0);
46  if (isOK) {
47  // do the 'b-tag efficiency vs discr' plot
48  effics[flavour] = calculateEfficiency1D(ibooker, igetter, *num, *den, label + "_efficiency_vs_disc");
49  efficsOK[flavour] = isOK;
50  }
51  // for modules (HEP17 etc.)
52  for (auto j : HCALSpecialsNames) {
53  ibooker.setCurrentFolder(dqmFolder_hist + "/" + j.second + "/efficiency");
54  isOK = GetNumDenumerators(ibooker,
55  igetter,
56  dqmFolder_hist + "/" + j.second + "/" + label,
57  dqmFolder_hist + "/" + j.second + "/" + label,
58  num,
59  den,
60  0);
61  if (isOK) {
62  // do the 'b-tag efficiency vs discr' plot
63  efficsmod[flavour][j.first] =
64  calculateEfficiency1D(ibooker, igetter, *num, *den, label + "_efficiency_vs_disc");
65  efficsmodOK[flavour][j.first] = isOK;
66  }
67  }
68  ibooker.setCurrentFolder(effDir);
69  label = m_histoName.at(ind) + "___";
70  std::string labelEta = label;
71  std::string labelPhi = label;
72  label += flavour + "_disc_pT";
73  labelEta += flavour + "_disc_eta";
74  labelPhi += flavour + "_disc_phi";
75  isOK =
76  GetNumDenumerators(ibooker, igetter, dqmFolder_hist + "/" + label, dqmFolder_hist + "/" + label, num, den, 1);
77  if (isOK) {
78  // do the 'b-tag efficiency vs pT' plot
79  TH1F eff = calculateEfficiency1D(ibooker, igetter, *num, *den, label + "_efficiency_vs_pT");
80  }
81  isOK = GetNumDenumerators(
82  ibooker, igetter, dqmFolder_hist + "/" + labelEta, dqmFolder_hist + "/" + labelEta, num, den, 2);
83  if (isOK) {
84  // do the 'b-tag efficiency vs Eta' plot
85  TH1F eff = calculateEfficiency1D(ibooker, igetter, *num, *den, labelEta + "_efficiency_vs_eta");
86  }
87  isOK = GetNumDenumerators(
88  ibooker, igetter, dqmFolder_hist + "/" + labelPhi, dqmFolder_hist + "/" + labelPhi, num, den, 2);
89  if (isOK) {
90  // do the 'b-tag efficiency vs Phi' plot
91  TH1F eff = calculateEfficiency1D(ibooker, igetter, *num, *den, labelPhi + "_efficiency_vs_phi");
92  }
93 
95  ibooker.setCurrentFolder(relationsDir);
96  if (efficsmodOK[flavour][HEP17] && efficsmodOK[flavour][HEM17])
97  modulesrate(ibooker,
98  igetter,
99  &efficsmod[flavour][HEP17],
100  &efficsmod[flavour][HEM17],
101  m_histoName.at(ind) + "_" + flavour + "_HEP17_HEM17_effs_vs_disc_rate");
102  ibooker.setCurrentFolder(effDir);
103 
104  }
105 
107  if (efficsOK["b"] && efficsOK["c"])
108  mistagrate(ibooker, igetter, &effics["b"], &effics["c"], m_histoName.at(ind) + "_b_c_mistagrate");
109  if (efficsOK["b"] && efficsOK["light"])
110  mistagrate(ibooker, igetter, &effics["b"], &effics["light"], m_histoName.at(ind) + "_b_light_mistagrate");
111  if (efficsOK["b"] && efficsOK["g"])
112  mistagrate(ibooker, igetter, &effics["b"], &effics["g"], m_histoName.at(ind) + "_b_g_mistagrate");
113 
115  for (auto j : HCALSpecialsNames) {
116  ibooker.setCurrentFolder(dqmFolder_hist + "/" + j.second + "/efficiency");
117  if (efficsmodOK["b"][j.first] && efficsmodOK["c"][j.first])
118  mistagrate(ibooker,
119  igetter,
120  &efficsmod["b"][j.first],
121  &efficsmod["c"][j.first],
122  m_histoName.at(ind) + "_b_c_mistagrate");
123  if (efficsmodOK["b"][j.first] && efficsmodOK["light"][j.first])
124  mistagrate(ibooker,
125  igetter,
126  &efficsmod["b"][j.first],
127  &efficsmod["light"][j.first],
128  m_histoName.at(ind) + "_b_light_mistagrate");
129  if (efficsmodOK["b"][j.first] && efficsmodOK["g"][j.first])
130  mistagrate(ibooker,
131  igetter,
132  &efficsmod["b"][j.first],
133  &efficsmod["g"][j.first],
134  m_histoName.at(ind) + "_b_g_mistagrate");
135  }
136 
138  ibooker.setCurrentFolder(relationsDir);
139  bool isOK = false;
140  isOK = GetNumDenumerators(ibooker,
141  igetter,
142  dqmFolder_hist + "/HEP17/efficiency/" + m_histoName.at(ind) + "_b_c_mistagrate",
143  dqmFolder_hist + "/HEM17/efficiency/" + m_histoName.at(ind) + "_b_c_mistagrate",
144  num,
145  den,
146  3);
147  if (isOK)
148  modulesrate(ibooker, igetter, (TH1F *)num, (TH1F *)den, m_histoName.at(ind) + "_HEP17_HEM17_b_c_mistagrate");
149  isOK = GetNumDenumerators(ibooker,
150  igetter,
151  dqmFolder_hist + "/HEP17/efficiency/" + m_histoName.at(ind) + "_b_light_mistagrate",
152  dqmFolder_hist + "/HEM17/efficiency/" + m_histoName.at(ind) + "_b_light_mistagrate",
153  num,
154  den,
155  3);
156  if (isOK)
157  modulesrate(ibooker, igetter, (TH1F *)num, (TH1F *)den, m_histoName.at(ind) + "_HEP17_HEM17_b_light_mistagrate");
158  isOK = GetNumDenumerators(ibooker,
159  igetter,
160  dqmFolder_hist + "/HEP17/efficiency/" + m_histoName.at(ind) + "_b_g_mistagrate",
161  dqmFolder_hist + "/HEM17/efficiency/" + m_histoName.at(ind) + "_b_g_mistagrate",
162  num,
163  den,
164  3);
165  if (isOK)
166  modulesrate(ibooker, igetter, (TH1F *)num, (TH1F *)den, m_histoName.at(ind) + "_HEP17_HEM17_b_g_mistagrate");
167  }
168 }
169 
171  DQMStore::IGetter &igetter,
173  std::string den,
174  TH1 *&ptrnum,
175  TH1 *&ptrden,
176  int type) {
177  using namespace edm;
178  /*
179  possible types:
180  type =0 for eff_vs_discriminator
181  type =1 for eff_vs_pT
182  type =2 for eff_vs_eta or eff_vs_phi
183  type =3 for HEP17 / HEM17 mistagrate relation
184  */
185  MonitorElement *denME = nullptr;
186  MonitorElement *numME = nullptr;
187  denME = igetter.get(den);
188  numME = igetter.get(num);
190 
191  if (denME == nullptr || numME == nullptr) {
192  excp << "Plots not found:\n";
193  if (denME == nullptr)
194  excp << den << "\n";
195  if (numME == nullptr)
196  excp << num << "\n";
197  excp.raise();
198  }
199 
200  if (type == 0) // efficiency_vs_discr: fill "ptrnum" with the cumulative function of
201  // the DQM plots contained in "num" and "ptrden" with a flat function
202  {
203  TH1 *numH1 = numME->getTH1();
204  TH1 *denH1 = denME->getTH1();
205  ptrden = (TH1 *)denH1->Clone("denominator");
206  ptrnum = (TH1 *)numH1->Clone("numerator");
207 
208  ptrnum->SetBinContent(1, numH1->Integral());
209  ptrden->SetBinContent(1, numH1->Integral());
210  for (int j = 2; j <= numH1->GetNbinsX(); j++) {
211  ptrnum->SetBinContent(j, numH1->Integral() - numH1->Integral(1, j - 1));
212  ptrden->SetBinContent(j, numH1->Integral());
213  }
214  }
215 
216  if (type == 1) // efficiency_vs_pT: fill "ptrden" with projection of the plots
217  // contained in "den" and fill "ptrnum" with projection of the
218  // plots contained in "num", having btag>m_minTag
219  {
220  TH2F *numH2 = numME->getTH2F();
221  TH2F *denH2 = denME->getTH2F();
222 
224  TCutG *cutg_num = new TCutG("cutg_num", 4);
225  cutg_num->SetPoint(0, m_minTag, 0);
226  cutg_num->SetPoint(1, m_minTag, 9999);
227  cutg_num->SetPoint(2, 1.1, 9999);
228  cutg_num->SetPoint(3, 1.1, 0);
229  ptrnum = numH2->ProjectionY("numerator", 0, -1, "[cutg_num]");
230 
232  TCutG *cutg_den = new TCutG("cutg_den", 4);
233  cutg_den->SetPoint(0, -10.1, 0);
234  cutg_den->SetPoint(1, -10.1, 9999);
235  cutg_den->SetPoint(2, 1.1, 9999);
236  cutg_den->SetPoint(3, 1.1, 0);
237  ptrden = denH2->ProjectionY("denumerator", 0, -1, "[cutg_den]");
238  delete cutg_num;
239  delete cutg_den;
240  }
241 
242  if (type == 2) // efficiency_vs_eta: fill "ptrden" with projection of the
243  // plots contained in "den" and fill "ptrnum" with projection
244  // of the plots contained in "num", having btag>m_minTag
245  {
246  TH2F *numH2 = numME->getTH2F();
247  TH2F *denH2 = denME->getTH2F();
248 
250  TCutG *cutg_num = new TCutG("cutg_num", 4);
251  cutg_num->SetPoint(0, m_minTag, -10);
252  cutg_num->SetPoint(1, m_minTag, 10);
253  cutg_num->SetPoint(2, 1.1, 10);
254  cutg_num->SetPoint(3, 1.1, -10);
255  ptrnum = numH2->ProjectionY("numerator", 0, -1, "[cutg_num]");
256 
258  TCutG *cutg_den = new TCutG("cutg_den", 4);
259  cutg_den->SetPoint(0, -10.1, -10);
260  cutg_den->SetPoint(1, -10.1, 10);
261  cutg_den->SetPoint(2, 1.1, 10);
262  cutg_den->SetPoint(3, 1.1, -10);
263  ptrden = denH2->ProjectionY("denumerator", 0, -1, "[cutg_den]");
264  delete cutg_num;
265  delete cutg_den;
266  }
267 
268  if (type == 3) // mistagrate HEP17 / HEM17 relation: fill "ptrnum" with HEP17
269  // mistagrate and "ptrden" with HEM17 mistagrate
270  {
271  ptrden = denME->getTH1();
272  ptrnum = numME->getTH1();
273  }
274  return true;
275 }
276 
278  DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1F *num, TH1F *den, std::string effName) {
279  // do the efficiency_vs_mistag_rate plot
280  TH1F *eff;
281  eff = new TH1F(effName.c_str(), effName.c_str(), 100, 0, 1);
282  eff->SetTitle(effName.c_str());
283  eff->SetXTitle("b-effficiency");
284  eff->SetYTitle("mistag rate");
285  eff->SetOption("E");
286  eff->SetLineColor(2);
287  eff->SetLineWidth(2);
288  eff->SetMarkerStyle(20);
289  eff->SetMarkerSize(0.8);
290  eff->GetYaxis()->SetRangeUser(0.001, 1.001);
291  eff->GetXaxis()->SetRangeUser(-0.001, 1.001);
292  eff->SetStats(kFALSE);
293 
294  // for each bin in the discr -> find efficiency and mistagrate -> put them in
295  // a plot
296  for (int i = 1; i <= num->GetNbinsX(); i++) {
297  double beff = num->GetBinContent(i);
298  double miseff = den->GetBinContent(i);
299  double miseffErr = den->GetBinError(i);
300  int binX = eff->GetXaxis()->FindBin(beff);
301  if (eff->GetBinContent(binX) != 0)
302  continue;
303  eff->SetBinContent(binX, miseff);
304  eff->SetBinError(binX, miseffErr);
305  }
306  MonitorElement *me;
307  me = ibooker.book1D(effName, eff);
308  me->setEfficiencyFlag();
309 
310  delete eff;
311  return;
312 }
313 
315  DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1F *num, TH1F *den, std::string effName) {
316  // do the eff_vs_disc_HEP17 / eff_vs_disc_HEM17 plot
317  TH1F *eff = new TH1F(*num);
318  // eff = new TH1F(effName.c_str(),effName.c_str(),100,0,1);
319  eff->Divide(den);
320  eff->SetTitle(effName.c_str());
321  eff->SetXTitle(num->GetXaxis()->GetTitle());
322  eff->SetYTitle("");
323  eff->SetOption("E");
324  eff->SetLineColor(2);
325  eff->SetLineWidth(2);
326  eff->SetMarkerStyle(20);
327  eff->SetMarkerSize(0.8);
328  eff->GetYaxis()->SetRangeUser(0.001, 2.001);
329  // eff->GetXaxis()->SetRangeUser(-0.001,1.001);
330  eff->SetStats(kFALSE);
331 
332  MonitorElement *me;
333  me = ibooker.book1D(effName, eff);
334  me->setEfficiencyFlag();
335 
336  delete eff;
337  return;
338 }
339 
341  DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1 &num, TH1 &den, std::string effName) {
342  // calculate the efficiency as num/den ratio
343  TH1F eff;
344  if (num.GetXaxis()->GetXbins()->GetSize() == 0) {
345  eff = TH1F(effName.c_str(),
346  effName.c_str(),
347  num.GetXaxis()->GetNbins(),
348  num.GetXaxis()->GetXmin(),
349  num.GetXaxis()->GetXmax());
350  } else {
351  eff = TH1F(effName.c_str(), effName.c_str(), num.GetXaxis()->GetNbins(), num.GetXaxis()->GetXbins()->GetArray());
352  }
353  eff.SetTitle(effName.c_str());
354  eff.SetXTitle(num.GetXaxis()->GetTitle());
355  eff.SetYTitle("Efficiency");
356  eff.SetOption("PE");
357  eff.SetLineColor(2);
358  eff.SetLineWidth(2);
359  eff.SetMarkerStyle(20);
360  eff.SetMarkerSize(0.8);
361  eff.GetYaxis()->SetRangeUser(-0.001, 1.001);
362  for (int i = 1; i <= num.GetNbinsX(); i++) {
363  double d, n, err;
364  d = den.GetBinContent(i);
365  n = num.GetBinContent(i);
366  double e;
367  if (d != 0) {
368  e = n / d;
369  err = std::max(e - TEfficiency::ClopperPearson(d, n, 0.683, false),
370  TEfficiency::ClopperPearson(d, n, 0.683, true) - e);
371  // err = sqrt(e*(1-e)/d); //from binomial standard deviation
372  } else {
373  e = 0;
374  err = 0;
375  }
376  eff.SetBinContent(i, e);
377  eff.SetBinError(i, err);
378  }
379 
380  MonitorElement *me;
381  me = ibooker.book1D(effName, &eff);
382  me->setEfficiencyFlag();
383 
384  return eff;
385 }
386 
387 // define this as a plug-in
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
void dqmEndJob(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) override
TH1 * getTH1() const
void raise()
Definition: Exception.h:98
HLTBTagHarvestingAnalyzer(const edm::ParameterSet &)
std::map< HLTBTagHarvestingAnalyzer::HCALSpecials, std::string > HCALSpecialsNames
void modulesrate(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1F *num, TH1F *den, std::string effName)
char const * label
std::vector< std::string > m_histoName
TH1F calculateEfficiency1D(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1 &num, TH1 &den, std::string name)
void setEfficiencyFlag()
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
std::vector< std::string > m_mcLabels
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:106
TH2F * getTH2F() const
MonitorElement * get(std::string const &path)
Definition: DQMStore.cc:303
bool GetNumDenumerators(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, std::string num, std::string den, TH1 *&ptrnum, TH1 *&ptrden, int type)
std::vector< std::string > hltPathNames_
HLT enums.
void mistagrate(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter, TH1F *num, TH1F *den, std::string effName)