55 if (seta.length() < 2)
61 std::string spt = std::to_string(
int(ptmin)) +
"_" + std::to_string(
int(ptmax));
84 std::vector<std::string> sME_genjets = iget_.
getMEs();
85 std::for_each(sME_genjets.begin(), sME_genjets.end(), [&](
auto&
s) {
s.insert(0,
genjetDir.c_str()); });
89 std::vector<std::string> sME_response = iget_.
getMEs();
90 std::for_each(sME_response.begin(), sME_response.end(), [&](
auto&
s) {
s.insert(0,
jetResponseDir); });
95 double ptBinsArray[
ptBins.size()];
102 std::vector<MonitorElement*> vME_presponse;
103 std::vector<MonitorElement*> vME_preso;
104 std::vector<MonitorElement*> vME_preso_rms;
116 std::vector<std::string>::const_iterator it =
std::find(sME_genjets.begin(), sME_genjets.end(), stitle);
117 if (it == sME_genjets.end())
119 me = iget_.
get(stitle);
120 h_genjet_pt = (TH1F*)me->
getTH1F();
123 sprintf(ctitle,
"Jet pT response, %4.1f<|#eta|<%4.1f",
etaBins[ieta - 1],
etaBins[ieta]);
124 TH1F* h_presponse =
new TH1F(stitle.c_str(), ctitle,
nPtBins, ptBinsArray);
127 sprintf(ctitle,
"Jet pT resolution, %4.1f<|#eta|<%4.1f",
etaBins[ieta - 1],
etaBins[ieta]);
128 TH1F* h_preso =
new TH1F(stitle.c_str(), ctitle,
nPtBins, ptBinsArray);
130 stitle =
"preso_eta" +
seta(
etaBins[ieta]) +
"_rms";
131 sprintf(ctitle,
"Jet pT resolution using RMS, %4.1f<|#eta|<%4.1f",
etaBins[ieta - 1],
etaBins[ieta]);
132 TH1F* h_preso_rms =
new TH1F(stitle.c_str(), ctitle,
nPtBins, ptBinsArray);
134 for (
unsigned int ipt = 0; ipt <
ptBins.size() - 1; ++ipt) {
136 std::vector<std::string>::const_iterator it =
std::find(sME_response.begin(), sME_response.end(), stitle);
137 if (it == sME_response.end())
139 me = iget_.
get(stitle);
143 double resp = 1.0, resp_err = 0.0, reso = 0.0, reso_err = 0.0;
146 h_presponse->SetBinContent(ipt + 1, resp);
147 h_presponse->SetBinError(ipt + 1, resp_err);
148 h_preso->SetBinContent(ipt + 1, reso);
149 h_preso->SetBinError(ipt + 1, reso_err);
152 double std = h_resp->GetStdDev();
153 double std_error = h_resp->GetStdDevError();
157 double mean_error = 0.0;
159 if (h_resp->GetMean() > 0) {
160 mean = h_resp->GetMean();
161 mean_error = h_resp->GetMeanError();
167 err =
getRespUnc(std, std_error, mean, mean_error);
170 h_preso_rms->SetBinContent(ipt + 1, std);
171 h_preso_rms->SetBinError(ipt + 1, err);
176 me = ibook_.
book1D(stitle.c_str(), h_presponse);
177 vME_presponse.push_back(me);
180 me = ibook_.
book1D(stitle.c_str(), h_preso);
181 vME_preso.push_back(me);
183 stitle =
"preso_eta" +
seta(
etaBins[ieta]) +
"_rms";
184 me = ibook_.
book1D(stitle.c_str(), h_preso_rms);
185 vME_preso_rms.push_back(me);
193 for (std::vector<MonitorElement*>::const_iterator
i = vME_presponse.begin();
i != vME_presponse.end(); ++
i)
195 for (std::vector<MonitorElement*>::const_iterator
i = vME_preso.begin();
i != vME_preso.end(); ++
i)
196 (*i)->getTH1F()->Print();
197 for (std::vector<MonitorElement*>::const_iterator
i = vME_preso_rms.begin();
i != vME_preso_rms.end(); ++
i)
198 (*i)->getTH1F()->Print();
218 bool doPlots =
false;
220 double ptlow =
ptBins[ptbinlow];
221 double pthigh =
ptBins[ptbinlow + 1];
225 double rmswidth = hreso->GetStdDev();
226 double rmsmean = hreso->GetMean();
227 double fitlow = rmsmean - 1.5 * rmswidth;
228 fitlow =
TMath::Max(recoptcut / ptlow, fitlow);
229 double fithigh = rmsmean + 1.5 * rmswidth;
231 TF1* fg =
new TF1(
"mygaus",
"gaus", fitlow, fithigh);
232 TF1* fg2 =
new TF1(
"fg2",
"TMath::Gaus(x,[0],[1],true)*[2]", fitlow, fithigh);
234 hreso->Fit(
"mygaus",
"RQN");
236 fg2->SetParameter(0, fg->GetParameter(1));
237 fg2->SetParameter(1, fg->GetParameter(2));
240 float ngenjet = h_genjet_pt->GetBinContent(ptbinlow + 1);
245 fg2->FixParameter(2, ngenjet * 3. / 100.);
247 hreso->Fit(
"fg2",
"RQN");
249 fitlow = fg2->GetParameter(0) - 1.5 * fg2->GetParameter(1);
251 fithigh = fg2->GetParameter(0) + 1.5 * fg2->GetParameter(1);
253 fg2->SetRange(fitlow, fithigh);
255 hreso->Fit(
"fg2",
"RQ");
260 fg2->SetLineColor(kGreen + 2);
262 hreso->GetXaxis()->SetRangeUser(0, 2);
265 if (doPlots & (hreso->GetEntries() > 0)) {
266 TCanvas* cfit =
new TCanvas(Form(
"respofit_%i",
int(ptlow)),
"respofit", 600, 600);
267 hreso->Draw(
"ehist");
271 Form(
"debug/respo_smartfit_%04d_%i_eta%s.pdf", (
int)ptlow, (
int)pthigh,
seta(
etaBins[ietahigh]).c_str()));
274 resp = fg2->GetParameter(0);
275 resp_err = fg2->GetParError(0);
281 reso = fg2->GetParameter(1) / resp;
282 reso_err = fg2->GetParError(1) / resp;
284 reso_err =
getRespUnc(reso, reso_err, resp, resp_err);
289 if (0 == width || 0 == mean)
291 return TMath::Sqrt(
pow(width_err, 2) /
pow(width, 2) +
pow(mean_err, 2) /
pow(mean, 2)) *
width;
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
T getParameter(std::string const &) const
PFJetDQMPostProcessor(const edm::ParameterSet &)
virtual TH1F * getTH1F() const
std::string jetResponseDir
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
std::string spt(double ptmin, double ptmax)
#define DEFINE_FWK_MODULE(type)
std::vector< std::string > getMEs()
std::vector< double > etaBins
void fitResponse(TH1F *hreso, TH1F *h_genjet_pt, int ptbinlow, int ietahigh, double recoptcut, double &resp, double &resp_err, double &reso, double &reso_err)
std::vector< double > ptBins
std::string seta(double eta)
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
~PFJetDQMPostProcessor() override
MonitorElement * get(std::string const &path)
Power< A, B >::type pow(const A &a, const B &b)
double getRespUnc(double width, double width_err, double mean, double mean_err)
void setCurrentFolder(std::string const &fullpath)