13 #include "TGraphAsymmErrors.h" 42 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
43 vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
44 unsigned idata, TH1D &histo, vector<TString> &nbcuts);
45 int main(
int argc,
char *argv[]){
46 float time_setup(0.), time_ntu(0.), time_gen(0.);
47 time_t begtime, endtime;
51 while((c=getopt(argc, argv,
"m:n:toj12"))!=-1){
76 TString folder=
"/afs/cern.ch/user/m/manuelf/work/babies/"+
ntuple_date+
"/mc/skim_1lht500met200/";
78 vector<TString> s_tt, s_bkg;
80 s_tt.push_back(folder+
"*_TTJets*Lept*");
81 s_tt.push_back(folder+
"*_TTJets*HT*");
84 s_bkg.push_back(folder+
"*_WJetsToLNu*");
85 s_bkg.push_back(folder+
"*_TTWJets*");
86 s_bkg.push_back(folder+
"*_TTZTo*");
87 s_bkg.push_back(folder+
"*_ST_*");
88 s_bkg.push_back(folder+
"*DYJetsToLL*");
89 s_bkg.push_back(folder+
"*_QCD_HT*");
90 s_bkg.push_back(folder+
"*ttHJetTobb*");
91 s_bkg.push_back(folder+
"*_WWTo*");
92 s_bkg.push_back(folder+
"*ggZH_HToBB*");
95 vector<sfeats> Samples;
96 if(
do_1ltt) Samples.push_back(
sfeats(s_tt,
"t#bar{t}",46,1,
"ntruleps==1"));
97 else if(
do_2ltt) Samples.push_back(
sfeats(s_tt,
"t#bar{t}",46,1,
"ntruleps==2"));
98 else Samples.push_back(
sfeats(s_tt,
"t#bar{t}",46,1));
102 unsigned nsam(Samples.size());
103 for(
unsigned sam(0); sam < nsam; sam++){
104 ra4_sam.push_back(sam);
108 vector<TChain *> chain;
109 for(
unsigned sam(0); sam < Samples.size(); sam++){
110 chain.push_back(
new TChain(
"tree"));
111 for(
unsigned insam(0); insam < Samples[sam].file.size(); insam++)
112 chain[sam]->Add(Samples[sam].
file[insam]);
117 if(
method==1) mjthresh =
"600";
118 float mSigma, pSigma;
119 vector<float> powersk, powersn;
120 vector<TString> cuts;
122 powersk.push_back(1); cuts.push_back(
"mt<=140&&mj<="+mjthresh);
123 powersk.push_back(-1); cuts.push_back(
"mt<=140&&mj>"+mjthresh);
124 powersk.push_back(-1); cuts.push_back(
"mt>140&&mj<="+mjthresh);
125 powersk.push_back(1); cuts.push_back(
"mt>140&&mj>"+mjthresh);
127 powersk.push_back(-1); cuts.push_back(
"mj<="+mjthresh);
128 powersk.push_back(1); cuts.push_back(
"mj>"+mjthresh);
131 powersn.push_back(-1);
132 powersn.push_back(1);
133 powersn.push_back(1);
135 TString baseline(
"ht>500&&met>200&&nbm>=1&&nleps==1&&njets>=6");
136 if(
do_2l) baseline =
"nleps==2&&ht>500&&met>200&&njets>=5&&nbm>=1";
137 vector<TString> metcuts, njcuts, nbcuts, metnames;
138 metcuts.push_back(
"met>200&&met<=400");
139 metcuts.push_back(
"met>400");
141 njcuts.push_back(
"njets<=8");
142 njcuts.push_back(
"njets>=9");
144 njcuts.push_back(
"njets<=7");
145 njcuts.push_back(
"njets>=8");
148 nbcuts.push_back(
"nbm==1");
150 nbcuts.push_back(
"nbm>=2");
152 nbcuts.push_back(
"nbm==2");
153 nbcuts.push_back(
"nbm>=3");
154 nbcuts.push_back(
"nbm>=2");
158 for(
unsigned imet(0); imet<metcuts.size(); imet++){
159 metnames.push_back(metcuts[imet]);
160 metnames[imet].ReplaceAll(
"met>",
"");
161 metnames[imet].ReplaceAll(
"met<=",
"");
162 metnames[imet].ReplaceAll(
"&&",
"-");
163 if(!metnames[imet].
Contains(
"-")) metnames[imet] +=
"+";
164 metnames[imet] =
"#splitline{MET}{"+metnames[imet]+
"}";
167 float minh(0), maxh(10), wtot(maxh-minh);
168 float wnj(wtot/static_cast<float>(njcuts.size()));
169 float wmet(wnj/static_cast<float>(metcuts.size()));
170 float wnb(wmet/static_cast<float>(nbcuts.size()+4));
171 if(
method==3) wnb = wmet/
static_cast<float>(nbcuts.size()+4-1);
174 vector<vector<vector<double> > > vx, vy, vexl, vexh, veyl, veyh;
175 for(
unsigned idata(0); idata<4; idata++){
176 vx.push_back (vector<vector<double> >());
177 vy.push_back (vector<vector<double> >());
178 vexl.push_back(vector<vector<double> >());
179 vexh.push_back(vector<vector<double> >());
180 veyl.push_back(vector<vector<double> >());
181 veyh.push_back(vector<vector<double> >());
182 for(
unsigned inb(0); inb<nbcuts.size(); inb++){
183 vx[idata].push_back (vector<double>());
184 vy[idata].push_back (vector<double>());
185 vexl[idata].push_back(vector<double>());
186 vexh[idata].push_back(vector<double>());
187 veyl[idata].push_back(vector<double>());
188 veyh[idata].push_back(vector<double>());
192 time(&endtime); time_setup = difftime(endtime, begtime);
196 for(
unsigned inj(0); inj<njcuts.size(); inj++){
197 for(
unsigned imet(0); imet<metcuts.size(); imet++){
198 for(
unsigned inb(0); inb<nbcuts.size(); inb++){
199 if(
method==3 && ((imet==0&&inb==3) || (imet==1&& (inb==1||inb==2))))
if(!
do_2l)
continue;
200 vector<vector<float> > entries;
201 vector<vector<float> > weights;
202 for(
unsigned obs(0); obs < powersk.size(); obs++) {
203 entries.push_back(vector<float>());
204 weights.push_back(vector<float>());
206 float yield_singlet(0);
207 for(
unsigned sam(0); sam < ra4_sam.size(); sam++) {
208 totcut = (
lumi+
"*weight*("+baseline+
"&&"+metcuts[imet]+
"&&"+cuts[obs]+
209 "&&"+Samples[ra4_sam[sam]].cut);
211 if(
method==1 || obs%2==1) totcut +=
"&&"+njcuts[inj]+
"&&"+nbcuts[inb];
214 double yield(0.), sigma(0.), avWeight(1.);
216 Nentries =
getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
218 if(Samples[ra4_sam[sam]].label==
"Single t"){
219 if(yield>0) yield_singlet = yield;
222 if(Samples[ra4_sam[sam]].label==
"Other") yield += yield_singlet;
223 if(yield<=0) entries[obs].push_back(0);
226 else entries[obs].push_back(Nentries);
229 totcut = (
lumi+
"*weight*("+baseline+
"&&"+cuts[obs]+
")");
230 Nentries =
getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
233 totcut = (
lumi+
"*weight*("+baseline+
")");
234 Nentries =
getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
238 else avWeight = fabs(yield/static_cast<double>(Nentries));
239 weights[obs].push_back(avWeight);
244 time(&endtime); time_ntu += difftime(endtime, begtime);
246 for(
unsigned idata(0); idata<4; idata++){
247 if(
do_2l && idata>=2)
continue;
249 if(idata<2) kappa =
calcKappa(entries, weights, powersk, mSigma, pSigma, (idata%2)==1,
true);
250 else kappa =
calcKappa(entries, weights, powersn, mSigma, pSigma, (idata%2)==1,
true);
251 float xpoint = inj*wnj+imet*wmet+(inb+2)*wnb;
252 if(
method==3 && inb==3) xpoint = inj*wnj+imet*wmet+(inb)*wnb;
253 vx[idata][inb].push_back(xpoint);
254 vy[idata][inb].push_back(kappa);
255 vexl[idata][inb].push_back(0);
256 vexh[idata][inb].push_back(0);
257 veyl[idata][inb].push_back(mSigma);
258 veyh[idata][inb].push_back(pSigma);
260 time(&endtime); time_gen += difftime(endtime, begtime);
267 vector<unsigned> ind(nbcuts.size(),0);
269 for(
unsigned inj(0); inj<njcuts.size(); inj++){
270 for(
unsigned imet(0); imet<metcuts.size(); imet++){
272 if(
method==3 && ((imet==0&&inb==3) || (imet==1&& (inb==1||inb==2))))
continue;
273 float MC(vy[0][inb][ind[inb]]), Data(vy[1][inb][ind[inb]]);
274 float epMC(veyh[0][inb][ind[inb]]), emMC(veyl[0][inb][ind[inb]]);
275 float epData(veyh[1][inb][ind[inb]]), emData(veyl[1][inb][ind[inb]]);
276 float epTotal(sqrt(pow(epMC/MC,2)+pow(epData/Data,2))), emTotal(sqrt(pow(emMC/MC,2)+pow(emData/Data,2)));
278 metcuts[imet].ReplaceAll(
"met>200&&",
"");
279 TString cutname = njcuts[inj]+
", "+metcuts[imet];
280 if(
method==3) cutname +=
", "+nbcuts[inb];
295 int digits(1), digper(0);
296 TString pname =
"txt/kappa_method", cutname; pname +=
method;
309 ifstream header(
"txt/header.tex");
310 ifstream footer(
"txt/footer.tex");
311 ofstream
file(pname);
312 file<<header.rdbuf();
314 file <<
"{\\renewcommand{\\arraystretch}{1.4}}"<<endl;
315 file <<
"\n\\begin{tabular}[tbp!]{ l | rc | rc | r}\\hline\\hline\n";
316 file <<
" \\multicolumn{1}{c|}{${\\cal L} = "<<
lumi<<
"$ fb$^{-1}$} ";
317 file <<
" & $N_{\\rm R2}\\frac{N_{\\rm R3}}{N_{\\rm R1}}$ & Data stat. [\\%] \n";
318 file <<
"& $\\kappa^{\\rm MC}$ & MC stat. [\\%] & \\multicolumn{1}{c}{$\\hat{N}_{\\rm R4}$} \\\\ \\hline\n";
319 for(
unsigned inj(0); inj<njcuts.size(); inj++){
320 for(
unsigned imet(0); imet<metcuts.size(); imet++){
321 for(
unsigned inb(1); inb<nbcuts.size(); inb++){
322 if(
method==3 && ((imet==0&&inb==3) || (imet==1&& (inb==1||inb==2))))
continue;
323 metcuts[imet].ReplaceAll(
"met>200&&",
"");
324 cutname =
"$"+njcuts[inj]+
", "+metcuts[imet];
325 if(
method==3) cutname +=
", "+nbcuts[inb];
327 cutname.ReplaceAll(
"njets",
"n_{\\rm j}");
328 cutname.ReplaceAll(
"<=",
"\\leq "); cutname.ReplaceAll(
">=",
"\\geq ");
329 cutname.ReplaceAll(
"met",
"{\\rm MET}"); cutname.ReplaceAll(
"nbm",
"n_b");
330 cutname.ReplaceAll(
"==",
"=");
331 float Kappa(vy[0][inb][ind[inb]]), N4(vy[3][inb][ind[inb]]);
332 float epKappa(veyh[0][inb][ind[inb]]), emKappa(veyl[0][inb][ind[inb]]);
333 float epN4(veyh[3][inb][ind[inb]]), emN4(veyl[3][inb][ind[inb]]);
336 <<
"}_{-"<<
RoundNumber(emN4*100,digper,N4)<<
"}$ & $" 339 <<
"}_{-"<<
RoundNumber(emKappa*100,digper,Kappa)<<
"}$ & $" 342 <<
"-"<<
RoundNumber(N4*emKappa,digits)<<
"}$ \\\\"<<endl;
346 if(inj==0) file<<
"\\hline"<<endl;
350 file<<
"\\hline\\hline\n\\end{tabular}"<<endl<<endl;
352 file<<footer.rdbuf();
354 cout<<endl<<
"Written "<<pname<<endl;
357 TH1D histo(
"histo",
cuts2title(baseline),njcuts.size()*metcuts.size(), minh, maxh);
358 for(
unsigned inj(0); inj<njcuts.size(); inj++)
359 for(
unsigned imet(0); imet<metcuts.size(); imet++)
360 histo.GetXaxis()->SetBinLabel(1+imet+inj*metcuts.size(), metnames[imet]);
361 for(
unsigned idata(0); idata<4; idata++)
362 plotKappa(vx[idata], vy[idata], vexl[idata], vexh[idata], veyl[idata], veyh[idata], idata, histo, nbcuts);
365 time(&endtime); time_setup += difftime(endtime, begtime);
367 cout<<endl<<
"Total time: set up "<<time_setup<<
" s, finding yields "<<time_ntu
368 <<
" s, toys "<<time_gen<<
" s"<<endl<<endl;
371 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
372 vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
373 unsigned idata, TH1D &histo, vector<TString> &nbcuts){
375 bool do_data((idata%2)==1), do_pred(idata>=2);
376 TString stylename =
"RA4";
379 float max_axis(3.2), max_kappa(0.);
380 unsigned nbsize(vx.size());
381 float minh(histo.GetBinLowEdge(1)), maxh(histo.GetBinLowEdge(histo.GetNbinsX()+1));
382 float wtot(maxh-minh);
383 for(
unsigned inb(0); inb<nbsize; inb++){
384 for(
unsigned ik(0); ik<vy.size(); ik++){
385 if(vy[inb][ik] > max_kappa) max_kappa = vy[inb][ik];
386 if(vy[inb][ik] > max_axis && vy[inb][ik]-veyl[inb][ik] < max_axis && !do_pred) {
387 veyl[inb][ik] = max_axis-(vy[inb][ik]-veyl[inb][ik]);
388 vy[inb][ik] = max_axis;
392 if(do_pred) max_axis = max_kappa*1.3;
394 TLine line; line.SetLineColor(28); line.SetLineWidth(4); line.SetLineStyle(2);
396 TString ytitle(
"#kappa^{MC}");
397 if(do_pred) ytitle =
"N_{2}#timesN_{3}/N_{1}";
398 if(do_data) ytitle +=
" (data uncert.)";
399 else ytitle +=
" (MC uncert.)";
400 histo.SetYTitle(ytitle);
401 histo.SetMaximum(max_axis);
403 if(!do_pred) line.DrawLine(minh, 1, maxh, 1);
404 line.SetLineColor(1); line.SetLineWidth(2);
405 line.DrawLine(minh+wtot/2., 0, minh+wtot/2, max_axis);
407 double legX(style.
PadLeftMargin+0.03), legY(0.902), legSingle = 0.052;
408 if(do_pred) legX = 0.62;
409 double legW = 0.29, legH = legSingle*nbsize;
410 if(nbsize>3) legH = legSingle*((nbsize+1)/2);
411 TLegend
leg(legX, legY-legH, legX+legW, legY);
412 leg.SetTextSize(style.
LegendSize); leg.SetFillColor(0);
413 leg.SetFillStyle(0); leg.SetBorderSize(0);
414 leg.SetTextFont(style.
nFont);
415 if(nbsize>3) leg.SetNColumns(2);
416 TGraphAsymmErrors
graph[20];
417 int colors[] = {2,4,kMagenta+2, kGreen+3},
styles[] = {20, 21, 22, 23};
418 for(
unsigned inb(0); inb<nbsize; inb++){
419 graph[inb] = TGraphAsymmErrors(vx[inb].size(), &(vx[inb][0]), &(vy[inb][0]),
420 &(vexl[inb][0]), &(vexh[inb][0]), &(veyl[inb][0]), &(veyh[inb][0]));
421 graph[inb].SetMarkerStyle(styles[inb]); graph[inb].SetMarkerSize(1.4);
422 graph[inb].SetMarkerColor(colors[inb]); graph[inb].SetLineColor(colors[inb]);
423 graph[inb].Draw(
"p same");
424 nbcuts[inb].ReplaceAll(
"nbm",
"n_{b}");
425 nbcuts[inb].ReplaceAll(
"==",
" = ");
426 nbcuts[inb].ReplaceAll(
">=",
" #geq ");
427 leg.AddEntry(&graph[inb], nbcuts[inb],
"p");
430 TLatex label; label.SetNDC(kTRUE);label.SetTextAlign(22);
431 label.DrawLatex(0.37,0.03,
"7 #leq n_{j} #leq 8");
432 label.DrawLatex(0.73,0.03,
"n_{j} #geq 9");
434 TString pname =
"plots/kappa_method"; pname +=
method;
446 if(do_data) pname +=
"_data";
449 if(do_pred) pname.ReplaceAll(
"kappa",
"npred");
long getYieldErr(TChain &tree, TString cut, double &yield, double &uncertainty)
TString ntuple_date("2015_10_19")
bool Contains(const std::string &text, const std::string &pattern)
void plotKappa(vector< vector< double > > &vx, vector< vector< double > > &vy, vector< vector< double > > &vexl, vector< vector< double > > &vexh, vector< vector< double > > &veyl, vector< vector< double > > &veyh, unsigned idata, TH1D &histo, vector< TString > &nbcuts)
TString cuts2title(TString title)
void moveYAxisLabel(TH1 *h, float maxi, bool isLog=false)
TString RoundNumber(double num, int decimals, double denom=1.)
bool do_sigma_avError(true)
int main(int argc, char *argv[])
double calcKappa(std::vector< std::vector< float > > &entries, std::vector< std::vector< float > > &weights, std::vector< float > &powers, float &mSigma, float &pSigma, bool do_data=false, bool verbose=false, bool do_plot=false, int nrep=100000)