CMS 3D CMS Logo

MuonME0DigisHarvestor.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 
4 // user include files
11 #include "TGraphAsymmErrors.h"
12 
16 
21 
23 
27 
29 
31  dbe_path_ = std::string("MuonME0DigisV/ME0DigisTask/");
32 }
33 
35 
36 TProfile *MuonME0DigisHarvestor::ComputeEff(TH1F *num, TH1F *denum, std::string nameHist) {
37  std::string name = "eff_" + nameHist;
38  std::string title = "Digi Efficiency" + std::string(num->GetTitle());
39  TProfile *efficHist = new TProfile(name.c_str(),
40  title.c_str(),
41  denum->GetXaxis()->GetNbins(),
42  denum->GetXaxis()->GetXmin(),
43  denum->GetXaxis()->GetXmax());
44 
45  for (int i = 1; i <= denum->GetNbinsX(); i++) {
46  double nNum = num->GetBinContent(i);
47  double nDenum = denum->GetBinContent(i);
48  if (nDenum == 0 || nNum == 0) {
49  continue;
50  }
51  if (nNum > nDenum) {
52  double temp = nDenum;
53  nDenum = nNum;
54  nNum = temp;
55  edm::LogWarning("MuonME0DigisHarvestor")
56  << "Alert! specific bin's num is bigger than denum " << i << " " << nNum << " " << nDenum;
57  }
58  const double effVal = nNum / nDenum;
59  efficHist->SetBinContent(i, effVal);
60  efficHist->SetBinEntries(i, 1);
61  efficHist->SetBinError(i, 0);
62  const double errLo = TEfficiency::ClopperPearson((int)nDenum, (int)nNum, 0.683, false);
63  const double errUp = TEfficiency::ClopperPearson((int)nDenum, (int)nNum, 0.683, true);
64  const double errVal = (effVal - errLo > errUp - effVal) ? effVal - errLo : errUp - effVal;
65  efficHist->SetBinError(i, sqrt(effVal * effVal + errVal * errVal));
66  }
67  return efficHist;
68 }
69 
71  DQMStore::IBooker &ibooker, DQMStore::IGetter &ig, std::string nameHist, TH1F *num, TH1F *den) {
72  if (num != nullptr && den != nullptr) {
73  TProfile *profile = ComputeEff(num, den, nameHist);
74 
75  TString x_axis_title = TString(num->GetXaxis()->GetTitle());
76  TString title = TString::Format("Digi Efficiency;%s;Eff.", x_axis_title.Data());
77 
78  profile->SetTitle(title.Data());
79  ibooker.bookProfile(profile->GetName(), profile);
80 
81  delete profile;
82 
83  } else {
84  edm::LogWarning("MuonME0DigisHarvestor") << "Can not find histograms";
85  if (num == nullptr)
86  edm::LogWarning("MuonME0DigisHarvestor") << "num not found";
87  if (den == nullptr)
88  edm::LogWarning("MuonME0DigisHarvestor") << "den not found";
89  }
90  return;
91 }
92 
93 TH1F *MuonME0DigisHarvestor::ComputeBKG(TH1F *hist1, TH1F *hist2, std::string nameHist) {
94  std::string name = "rate_" + nameHist;
95  hist1->SetName(name.c_str());
96  for (int bin = 1; bin <= hist1->GetNbinsX(); ++bin) {
97  double R_min = hist1->GetBinCenter(bin) - 0.5 * hist1->GetBinWidth(bin);
98  double R_max = hist1->GetBinCenter(bin) + 0.5 * hist1->GetBinWidth(bin);
99 
100  double Area = TMath::Pi() * (R_max * R_max - R_min * R_min);
101  hist1->SetBinContent(bin, (hist1->GetBinContent(bin)) / Area);
102  hist1->SetBinError(bin, (hist1->GetBinError(bin)) / Area);
103  }
104 
105  int nEvts = hist2->GetEntries();
106  float scale = 6 * 2 * nEvts * 3 * 25e-9; // New redigitizer saves hits only in the BX range: [-1,+1], so the
107  // number of background hits has to be divided by 3
108  hist1->Scale(1.0 / scale);
109  return hist1;
110 }
111 
113  DQMStore::IBooker &ibooker, DQMStore::IGetter &ig, std::string nameHist, TH1F *hist1, TH1F *hist2) {
114  if (hist1 != nullptr && hist2 != nullptr) {
115  TH1F *rate = ComputeBKG(hist1, hist2, nameHist);
116 
117  TString x_axis_title = TString(hist1->GetXaxis()->GetTitle());
118  TString origTitle = TString(hist1->GetTitle());
119  TString title = TString::Format((origTitle + ";%s;Rate [Hz/cm^{2}]").Data(), x_axis_title.Data());
120 
121  rate->SetTitle(title.Data());
122  ibooker.book1D(rate->GetName(), rate);
123 
124  } else {
125  edm::LogWarning("MuonME0DigisHarvestor") << "Can not find histograms";
126  if (hist1 == nullptr)
127  edm::LogWarning("MuonME0DigisHarvestor") << "num not found";
128  if (hist2 == nullptr)
129  edm::LogWarning("MuonME0DigisHarvestor") << "den not found";
130  }
131  return;
132 }
133 
136 
137  const char *l_suffix[6] = {"_l1", "_l2", "_l3", "_l4", "_l5", "_l6"};
138  const char *r_suffix[2] = {"-1", "1"};
139 
140  TString eta_label_den_tot = TString(dbe_path_) + "me0_strip_dg_den_eta_tot";
141  TString eta_label_num_tot = TString(dbe_path_) + "me0_strip_dg_num_eta_tot";
142  if (ig.get(eta_label_num_tot.Data()) != nullptr && ig.get(eta_label_den_tot.Data()) != nullptr) {
143  TH1F *num_vs_eta_tot = (TH1F *)ig.get(eta_label_num_tot.Data())->getTH1F()->Clone();
144  num_vs_eta_tot->Sumw2();
145  TH1F *den_vs_eta_tot = (TH1F *)ig.get(eta_label_den_tot.Data())->getTH1F()->Clone();
146  den_vs_eta_tot->Sumw2();
147 
148  ProcessBooking(ibooker, ig, "me0_strip_dg_eta_tot", num_vs_eta_tot, den_vs_eta_tot);
149 
150  delete num_vs_eta_tot;
151  delete den_vs_eta_tot;
152 
153  } else
154  edm::LogWarning("MuonME0DigisHarvestor")
155  << "Can not find histograms: " << eta_label_num_tot << " or " << eta_label_den_tot;
156 
157  for (int i = 0; i < 2; i++) {
158  for (int j = 0; j < 6; j++) {
159  TString eta_label_den = TString(dbe_path_) + "me0_strip_dg_den_eta" + r_suffix[i] + l_suffix[j];
160  TString eta_label_num = TString(dbe_path_) + "me0_strip_dg_num_eta" + r_suffix[i] + l_suffix[j];
161 
162  if (ig.get(eta_label_num.Data()) != nullptr && ig.get(eta_label_den.Data()) != nullptr) {
163  TH1F *num_vs_eta = (TH1F *)ig.get(eta_label_num.Data())->getTH1F()->Clone();
164  num_vs_eta->Sumw2();
165  TH1F *den_vs_eta = (TH1F *)ig.get(eta_label_den.Data())->getTH1F()->Clone();
166  den_vs_eta->Sumw2();
167 
168  std::string r_s = r_suffix[i];
169  std::string l_s = l_suffix[j];
170  std::string name = "me0_strip_dg_eta" + r_s + l_s;
171  ProcessBooking(ibooker, ig, name, num_vs_eta, den_vs_eta);
172 
173  delete num_vs_eta;
174  delete den_vs_eta;
175 
176  } else
177  edm::LogWarning("MuonME0DigisHarvestor")
178  << "Can not find histograms: " << eta_label_num << " " << eta_label_den;
179  }
180  }
181 
182  TString label_eleBkg = TString(dbe_path_) + "me0_strip_dg_bkgElePos_radius";
183  TString label_neuBkg = TString(dbe_path_) + "me0_strip_dg_bkgNeutral_radius";
184  TString label_totBkg = TString(dbe_path_) + "me0_strip_dg_bkg_radius_tot";
185  TString label_evts = TString(dbe_path_) + "num_evts";
186 
187  if (ig.get(label_evts.Data()) != nullptr) {
188  TH1F *numEvts = (TH1F *)ig.get(label_evts.Data())->getTH1F()->Clone();
189 
190  if (ig.get(label_eleBkg.Data()) != nullptr) {
191  TH1F *eleBkg = (TH1F *)ig.get(label_eleBkg.Data())->getTH1F()->Clone();
192  eleBkg->Sumw2();
193  ProcessBookingBKG(ibooker, ig, "me0_strip_dg_elePosBkg_rad", eleBkg, numEvts);
194 
195  delete eleBkg;
196  }
197  if (ig.get(label_neuBkg.Data()) != nullptr) {
198  TH1F *neuBkg = (TH1F *)ig.get(label_neuBkg.Data())->getTH1F()->Clone();
199  neuBkg->Sumw2();
200  ProcessBookingBKG(ibooker, ig, "me0_strip_dg_neuBkg_rad", neuBkg, numEvts);
201 
202  delete neuBkg;
203  }
204  if (ig.get(label_totBkg.Data()) != nullptr) {
205  TH1F *totBkg = (TH1F *)ig.get(label_totBkg.Data())->getTH1F()->Clone();
206  totBkg->Sumw2();
207  ProcessBookingBKG(ibooker, ig, "me0_strip_dg_totBkg_rad", totBkg, numEvts);
208 
209  delete totBkg;
210  }
211 
212  delete numEvts;
213  }
214 }
215 
216 // define this as a plug-in
const double Pi
void ProcessBookingBKG(DQMStore::IBooker &ibooker, DQMStore::IGetter &ig, std::string nameHist, TH1F *hist, TH1F *hist2)
TH1F * ComputeBKG(TH1F *hist1, TH1F *hist2, std::string nameHist)
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
~MuonME0DigisHarvestor() override
destructor
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
MuonME0DigisHarvestor(const edm::ParameterSet &)
constructor
TProfile * ComputeEff(TH1F *num, TH1F *denum, std::string nameHist)
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
T sqrt(T t)
Definition: SSEVec.h:19
const int nEvts
virtual MonitorElement * get(std::string const &fullpath) const
Definition: DQMStore.cc:673
void ProcessBooking(DQMStore::IBooker &, DQMStore::IGetter &, std::string nameHist, TH1F *num, TH1F *den)
double rate(double x)
Definition: Constants.cc:3
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98