CMS 3D CMS Logo

HeavyFlavorHarvesting.cc
Go to the documentation of this file.
11 
12 #include "TH1F.h"
13 #include "TH2F.h"
14 #include "TH3F.h"
15 #include "RVersion.h"
16 
17 #include "TEfficiency.h"
18 
19 using namespace edm;
20 using namespace std;
21 
23 public:
25  ~HeavyFlavorHarvesting() override;
26  // virtual void endRun(const edm::Run &, const edm::EventSetup &) override;
27 private:
28  void calculateEfficiency(const ParameterSet& pset, DQMStore::IBooker&, DQMStore::IGetter&);
29  void calculateEfficiency1D(TH1* num, TH1* den, string name, DQMStore::IBooker&, DQMStore::IGetter&);
30  void calculateEfficiency2D(TH2F* num, TH2F* den, string name, DQMStore::IBooker&, DQMStore::IGetter&);
31 
34 
35 protected:
36  void dqmEndJob(DQMStore::IBooker&, DQMStore::IGetter&) override; //performed in the endJob
37 };
38 
40  : myDQMrootFolder(pset.getUntrackedParameter<string>("MyDQMrootFolder")),
41  efficiencies(pset.getUntrackedParameter<VParameterSet>("Efficiencies")) {}
42 
43 void HeavyFlavorHarvesting::dqmEndJob(DQMStore::IBooker& ibooker_, DQMStore::IGetter& igetter_) {
44  for (VParameterSet::const_iterator pset = efficiencies.begin(); pset != efficiencies.end(); pset++) {
45  calculateEfficiency(*pset, ibooker_, igetter_);
46  }
47 }
48 
50  DQMStore::IBooker& ibooker_,
51  DQMStore::IGetter& igetter_) {
52  //get hold of numerator and denominator histograms
53  vector<string> numDenEffMEnames = pset.getUntrackedParameter<vector<string> >("NumDenEffMEnames");
54  if (numDenEffMEnames.size() != 3) {
55  LogDebug("HLTriggerOfflineHeavyFlavor") << "NumDenEffMEnames must have three names" << endl;
56  return;
57  }
58  string denMEname = myDQMrootFolder + "/" + numDenEffMEnames[1];
59  string numMEname = myDQMrootFolder + "/" + numDenEffMEnames[0];
60  MonitorElement* denME = igetter_.get(denMEname);
61  MonitorElement* numME = igetter_.get(numMEname);
62  if (denME == nullptr || numME == nullptr) {
63  LogDebug("HLTriggerOfflineHeavyFlavor") << "Could not find MEs: " << denMEname << " or " << numMEname << endl;
64  return;
65  }
66  TH1* den = denME->getTH1();
67  TH1* num = numME->getTH1();
68  //check compatibility of the histograms
69  if (den->GetNbinsX() != num->GetNbinsX() || den->GetNbinsY() != num->GetNbinsY() ||
70  den->GetNbinsZ() != num->GetNbinsZ()) {
71  LogDebug("HLTriggerOfflineHeavyFlavor")
72  << "Monitoring elements " << numMEname << " and " << denMEname << "are incompatible" << endl;
73  return;
74  }
75  //figure out the directory and efficiency name
76  string effName = numDenEffMEnames[2];
77  string effDir = myDQMrootFolder;
78  string::size_type slashPos = effName.rfind('/');
79  if (string::npos != slashPos) {
80  effDir += "/" + effName.substr(0, slashPos);
81  effName.erase(0, slashPos + 1);
82  }
83  ibooker_.setCurrentFolder(effDir);
84  //calculate the efficiencies
85  int dimensions = num->GetDimension();
86  if (dimensions == 1) {
87  calculateEfficiency1D(num, den, effName, ibooker_, igetter_);
88  } else if (dimensions == 2) {
89  calculateEfficiency2D((TH2F*)num, (TH2F*)den, effName, ibooker_, igetter_);
90  TH1D* numX = ((TH2F*)num)->ProjectionX();
91  TH1D* denX = ((TH2F*)den)->ProjectionX();
92  calculateEfficiency1D(numX, denX, effName + "X", ibooker_, igetter_);
93  delete numX;
94  delete denX;
95  TH1D* numY = ((TH2F*)num)->ProjectionY();
96  TH1D* denY = ((TH2F*)den)->ProjectionY();
97  calculateEfficiency1D(numY, denY, effName + "Y", ibooker_, igetter_);
98  delete numY;
99  delete denY;
100  } else {
101  return;
102  }
103 }
104 
106  TH1* num, TH1* den, string effName, DQMStore::IBooker& ibooker_, DQMStore::IGetter& igetter_) {
107  TProfile* eff;
108  if (num->GetXaxis()->GetXbins()->GetSize() == 0) {
109  eff = new TProfile(effName.c_str(),
110  effName.c_str(),
111  num->GetXaxis()->GetNbins(),
112  num->GetXaxis()->GetXmin(),
113  num->GetXaxis()->GetXmax());
114  } else {
115  eff = new TProfile(
116  effName.c_str(), effName.c_str(), num->GetXaxis()->GetNbins(), num->GetXaxis()->GetXbins()->GetArray());
117  }
118  eff->SetTitle(effName.c_str());
119  eff->SetXTitle(num->GetXaxis()->GetTitle());
120  eff->SetYTitle("Efficiency");
121  eff->SetOption("PE");
122  eff->SetLineColor(2);
123  eff->SetLineWidth(2);
124  eff->SetMarkerStyle(20);
125  eff->SetMarkerSize(0.8);
126  eff->GetYaxis()->SetRangeUser(-0.001, 1.001);
127  eff->SetStats(kFALSE);
128  for (int i = 1; i <= num->GetNbinsX(); i++) {
129  double e, low, high;
130  if (int(den->GetBinContent(i)) > 0.)
131  e = double(num->GetBinContent(i)) / double(den->GetBinContent(i));
132  else
133  e = 0.;
134  low = TEfficiency::Wilson((double)den->GetBinContent(i), (double)num->GetBinContent(i), 0.683, false);
135  high = TEfficiency::Wilson((double)den->GetBinContent(i), (double)num->GetBinContent(i), 0.683, true);
136 
137  double err = e - low > high - e ? e - low : high - e;
138  //here is the trick to store info in TProfile:
139  eff->SetBinContent(i, e);
140  eff->SetBinEntries(i, 1);
141  eff->SetBinError(i, sqrt(e * e + err * err));
142  }
143  ibooker_.bookProfile(effName, eff);
144  delete eff;
145 }
146 
148  TH2F* num, TH2F* den, string effName, DQMStore::IBooker& ibooker_, DQMStore::IGetter& igetter_) {
149  TProfile2D* eff;
150  if (num->GetXaxis()->GetXbins()->GetSize() == 0 && num->GetYaxis()->GetXbins()->GetSize() == 0) {
151  eff = new TProfile2D(effName.c_str(),
152  effName.c_str(),
153  num->GetXaxis()->GetNbins(),
154  num->GetXaxis()->GetXmin(),
155  num->GetXaxis()->GetXmax(),
156  num->GetYaxis()->GetNbins(),
157  num->GetYaxis()->GetXmin(),
158  num->GetYaxis()->GetXmax());
159  } else if (num->GetXaxis()->GetXbins()->GetSize() != 0 && num->GetYaxis()->GetXbins()->GetSize() == 0) {
160  eff = new TProfile2D(effName.c_str(),
161  effName.c_str(),
162  num->GetXaxis()->GetNbins(),
163  num->GetXaxis()->GetXbins()->GetArray(),
164  num->GetYaxis()->GetNbins(),
165  num->GetYaxis()->GetXmin(),
166  num->GetYaxis()->GetXmax());
167  } else if (num->GetXaxis()->GetXbins()->GetSize() == 0 && num->GetYaxis()->GetXbins()->GetSize() != 0) {
168  eff = new TProfile2D(effName.c_str(),
169  effName.c_str(),
170  num->GetXaxis()->GetNbins(),
171  num->GetXaxis()->GetXmin(),
172  num->GetXaxis()->GetXmax(),
173  num->GetYaxis()->GetNbins(),
174  num->GetYaxis()->GetXbins()->GetArray());
175  } else {
176  eff = new TProfile2D(effName.c_str(),
177  effName.c_str(),
178  num->GetXaxis()->GetNbins(),
179  num->GetXaxis()->GetXbins()->GetArray(),
180  num->GetYaxis()->GetNbins(),
181  num->GetYaxis()->GetXbins()->GetArray());
182  }
183  eff->SetTitle(effName.c_str());
184  eff->SetXTitle(num->GetXaxis()->GetTitle());
185  eff->SetYTitle(num->GetYaxis()->GetTitle());
186  eff->SetZTitle("Efficiency");
187  eff->SetOption("colztexte");
188  eff->GetZaxis()->SetRangeUser(-0.001, 1.001);
189  eff->SetStats(kFALSE);
190  for (int i = 0; i < num->GetSize(); i++) {
191  double e, low, high;
192  if (int(den->GetBinContent(i)) > 0.)
193  e = double(num->GetBinContent(i)) / double(den->GetBinContent(i));
194  else
195  e = 0.;
196  low = TEfficiency::Wilson((double)den->GetBinContent(i), (double)num->GetBinContent(i), 0.683, false);
197  high = TEfficiency::Wilson((double)den->GetBinContent(i), (double)num->GetBinContent(i), 0.683, true);
198 
199  double err = e - low > high - e ? e - low : high - e;
200  //here is the trick to store info in TProfile:
201  eff->SetBinContent(i, e);
202  eff->SetBinEntries(i, 1);
203  eff->SetBinError(i, sqrt(e * e + err * err));
204  }
205  ibooker_.bookProfile2D(effName, eff);
206  delete eff;
207 }
208 
210 
211 //define this as a plug-in
#define LogDebug(id)
T getUntrackedParameter(std::string const &, T const &) const
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
void calculateEfficiency1D(TH1 *num, TH1 *den, string name, DQMStore::IBooker &, DQMStore::IGetter &)
uint16_t size_type
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const VParameterSet efficiencies
T sqrt(T t)
Definition: SSEVec.h:19
HeavyFlavorHarvesting(const edm::ParameterSet &pset)
void calculateEfficiency2D(TH2F *num, TH2F *den, string name, DQMStore::IBooker &, DQMStore::IGetter &)
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
HLT enums.
void calculateEfficiency(const ParameterSet &pset, DQMStore::IBooker &, DQMStore::IGetter &)
virtual TH1 * getTH1() const