ra4_macros  bede988c286599a3a84b77a4d788ac0a971e89f9
plot_div_kappa.cxx
Go to the documentation of this file.
1 // plot_kappa: Plots kappa for the different fitting methods.
2 // Uncertainties found fluctuating yields with Gamma distributions
3 
4 #include <fstream>
5 #include <iostream>
6 #include <vector>
7 #include <ctime>
8 
9 #include <unistd.h>
10 #include <getopt.h>
11 
12 #include "TMath.h"
13 #include "TChain.h"
14 #include "TH1D.h"
15 #include "TCanvas.h"
16 #include "TLegend.h"
17 #include "TLine.h"
18 #include "TString.h"
19 #include "TLatex.h"
20 #include "TGraph.h"
21 #include "TGraphAsymmErrors.h"
22 
23 #include "styles.hpp"
24 #include "utilities.hpp"
25 #include "utilities_macros.hpp"
26 
27 namespace {
28  TString ntuple_date("2015_05_25");
29  TString lumi("10");
30  int method(3);
31  bool do_1ltt(false); // Kappa just for 1l ttbar
32  bool do_2ltt(false); // Kappa just for 2l ttbar
33  bool do_ttbar(true); // Include ttbar in kappa
34  bool do_other(true); // Include other in kappa
35  bool do_normalized(false); // Normalize kappa
36  TString plot_type=".eps";
37  unsigned iDivGlobal(4);
38  bool do_kappa(false);
39  bool do_mcprior(false);
40 }
41 
42 using namespace std;
43 
44 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
45  vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
46  vector<vector<double> > &vdx, vector<vector<double> > &vdy, vector<vector<double> > &vmx,
47  vector<vector<double> > &vmy, unsigned iDiv,
48  unsigned idata, TH1D &histo, vector<TString> &nbcuts);
49 
50 int main(int argc, char *argv[]){
51  float time_setup(0.), time_ntu(0.), time_gen(0.);
52  time_t begtime, endtime;
53  time(&begtime);
54 
55  int c(0);
56  while((c=getopt(argc, argv, "m:i:nkp"))!=-1){
57  switch(c){
58  case 'm':
59  method=atoi(optarg);
60  break;
61  case 'i':
62  iDivGlobal=static_cast<unsigned>(atoi(optarg));
63  break;
64  case 'n':
65  do_normalized = true;
66  break;
67  case 'k':
68  do_kappa = true;
69  break;
70  case 'p':
71  do_mcprior = true;
72  break;
73  default:
74  break;
75  }
76  }
77  styles style("RA4"); //style.LabelSize = 0.05;
78  style.setDefaultStyle();
79 
80  TString folder="/cms5r0/manuelf/archive/2015_05_25/divided/";
81  TString folder_ns="/cms5r0/ald77/archive/"+ntuple_date+"/";
82 
83  vector<TString> s_tt;
84  s_tt.push_back(folder+"*_TTJet*");
85  vector<TString> s_singlet;
86  s_singlet.push_back(folder+"*_T*channel*");
87  vector<TString> s_other;
88  s_other.push_back(folder+"*QCD_HT*");
89  s_other.push_back(folder+"*_ZJet*");
90  s_other.push_back(folder+"*DY*");
91  s_other.push_back(folder+"*WH_HToBB*");
92  s_other.push_back(folder+"*TTW*");
93  s_other.push_back(folder+"*TTZ*");
94  s_other.push_back(folder+"*_WJets*");
95 
96  // Reading ntuples
97  vector<sfeats> Samples;
98  if(do_1ltt) Samples.push_back(sfeats(s_tt, "t#bar{t}, 1 l", ra4::c_tt_1l, 1,"ntruleps==1"));
99  else {
100  if(do_2ltt) Samples.push_back(sfeats(s_tt, "t#bar{t}, 2 l", ra4::c_tt_2l,1,"ntruleps>=2"));
101  else {
102  if(do_ttbar) Samples.push_back(sfeats(s_tt, "t#bar{t}, 2 l", ra4::c_tt_2l,1));
103  if(do_other){
104  Samples.push_back(sfeats(s_singlet, "Single t", ra4::c_singlet));
105  Samples.push_back(sfeats(s_other, "Other", ra4::c_other, 1));
106  }
107  }
108  }
109  // Adding non-skimmed samples
110  vector<int> ra4_sam, ra4_sam_ns;
111  unsigned nsam(Samples.size());
112  for(unsigned sam(0); sam < nsam; sam++){
113  ra4_sam.push_back(sam);
114  ra4_sam_ns.push_back(nsam+sam);
115  vector<TString> sam_files = Samples[sam].file;
116  for(unsigned ifile(0); ifile < sam_files.size(); ifile++)
117  sam_files[ifile].ReplaceAll(folder, folder_ns);
118  // Samples.push_back(sfeats(sam_files, Samples[sam].label, Samples[sam].color, Samples[sam].style,
119  // Samples[sam].cut));
120  } // Loop over samples
121 
122  // Reading ntuples
123  unsigned nDiv(10);
124  TString name;
125  vector<vector<TChain *> >chain;
126  for(unsigned div(0); div < nDiv; div++){
127  chain.push_back(vector<TChain *>());
128  for(unsigned sam(0); sam < Samples.size(); sam++){
129  chain[div].push_back(new TChain("tree"));
130  for(unsigned insam(0); insam < Samples[sam].file.size(); insam++){
131  name = Samples[sam].file[insam]+"_";
132  name += div+1; name += "of"; name += nDiv; name += ".root";
133  chain[div][sam]->Add(name);
134  //cout<<"Added "<<name<<" with "<<chain[div][sam]->GetEntries()<<" entries"<<endl;
135  }
136  }
137  } // Loop over number of divisions
138 
139 
140 
141  TString mjthresh("400");
142  if(method==1) mjthresh = "600";
143  float mSigma, pSigma;
144  vector<float> powersk, powersn;
145  vector<TString> cuts;
146  cuts.push_back("mt<=140&&mj<="+mjthresh); // R1
147  cuts.push_back("mt<=140&&mj>"+mjthresh); // R2
148  cuts.push_back("mt>140&&mj<="+mjthresh); // R3
149  cuts.push_back("mt>140&&mj>"+mjthresh); // R4
150 
151  if(do_kappa){
152  powersn.push_back(1);
153  powersn.push_back(-1);
154  powersn.push_back(-1);
155  powersn.push_back(1);
156  } else {
157  powersn.push_back(-1);
158  powersn.push_back(1);
159  powersn.push_back(1);
160  //powersn.push_back(1);
161  }
162 
163 
164  TString baseline("(nmus+nels)==1&&ht>500&&met>200&&njets>=7&&nbm>=1");
165  vector<TString> metcuts, njcuts, nbcuts, metnames;
166  // metcuts.push_back("met>100&&met<=200");
167  // metcuts.push_back("met>200&&met<=300");
168  // metcuts.push_back("met>300&&met<=400");
169  metcuts.push_back("met>200&&met<=400");
170  metcuts.push_back("met>400");
171  njcuts.push_back("njets<=8");
172  njcuts.push_back("njets>=9");
173  nbcuts.push_back("nbm==1");
174  if(method==1 || method==2) nbcuts.push_back("nbm>=2");
175  else {
176  nbcuts.push_back("nbm==2");
177  nbcuts.push_back("nbm>=3");
178  nbcuts.push_back("nbm>=2");
179  }
180  for(unsigned imet(0); imet<metcuts.size(); imet++){
181  metnames.push_back(metcuts[imet]);
182  metnames[imet].ReplaceAll("met>","");
183  metnames[imet].ReplaceAll("met<=","");
184  metnames[imet].ReplaceAll("&&","-");
185  if(!metnames[imet].Contains("-")) metnames[imet] += "+";
186  metnames[imet] = "#splitline{MET}{"+metnames[imet]+"}";
187  }
188 
189  float minh(0), maxh(10), wtot(maxh-minh);
190  float wnj(wtot/static_cast<float>(njcuts.size()));
191  float wmet(wnj/static_cast<float>(metcuts.size()));
192  float wnb(wmet/static_cast<float>(nbcuts.size()+4));
193  if(method==3) wnb = wmet/static_cast<float>(nbcuts.size()+4-1);
194  // These vectors have indices vx[4][nbsize][njsize*metsize]
195  // The first index is: 0 -> k MC, 1 -> k data, 2 -> N4 MC, 3 -> N4 data
196  vector<vector<vector<double> > > vx, vy, vexl, vexh, veyl, veyh;
197  vector<vector<vector<double> > > vdx, vdy, vmx, vmy;
198  unsigned nData(1);
199  for(unsigned idata(0); idata<nData; idata++){
200  vx.push_back (vector<vector<double> >());
201  vy.push_back (vector<vector<double> >());
202  vexl.push_back(vector<vector<double> >());
203  vexh.push_back(vector<vector<double> >());
204  veyl.push_back(vector<vector<double> >());
205  veyh.push_back(vector<vector<double> >());
206  for(unsigned inb(0); inb<nbcuts.size(); inb++){
207  vx[idata].push_back (vector<double>());
208  vy[idata].push_back (vector<double>());
209  vexl[idata].push_back(vector<double>());
210  vexh[idata].push_back(vector<double>());
211  veyl[idata].push_back(vector<double>());
212  veyh[idata].push_back(vector<double>());
213  }
214  vdx.push_back (vector<vector<double> >());
215  vdy.push_back (vector<vector<double> >());
216  vmx.push_back(vector<vector<double> >());
217  vmy.push_back(vector<vector<double> >());
218  for(unsigned inb(0); inb<nbcuts.size(); inb++){
219  vdx[idata].push_back (vector<double>());
220  vdy[idata].push_back (vector<double>());
221  vmx[idata].push_back(vector<double>());
222  vmy[idata].push_back(vector<double>());
223  }
224  }
225 
226  time(&endtime); time_setup = difftime(endtime, begtime);
227  time(&begtime);
228 
229  TString totcut("");
230  for(unsigned inj(0); inj<njcuts.size(); inj++){
231  for(unsigned imet(0); imet<metcuts.size(); imet++){
232  for(unsigned inb(0); inb<nbcuts.size(); inb++){
233  if(method==3 && ((imet==0&&inb==3) || (imet==1&& (inb==1||inb==2)))) continue;
234  vector<vector<vector<float> > > entries, weights;
235  for(unsigned div(0); div < nDiv; div++){
236  entries.push_back(vector<vector<float> >());
237  weights.push_back(vector<vector<float> >());
238  // totcut = lumi+"*weight*("+baseline+"&&"+nbcuts[inb]+"&&"+metcuts[imet]+"&&"+cuts[obs];
239  // if(method==1 || obs%2==1) totcut += "&&"+njcuts[inj];
240  // totcut += ")";
241  // cout << totcut<<endl;
242  for(unsigned obs(0); obs < powersn.size(); obs++) {
243  entries[div].push_back(vector<float>());
244  weights[div].push_back(vector<float>());
245  for(unsigned sam(0); sam < ra4_sam.size(); sam++) {
246  totcut = (lumi+"*weight*("+baseline+"&&"+nbcuts[inb]+"&&"+metcuts[imet]+"&&"+cuts[obs]+
247  "&&"+Samples[ra4_sam[sam]].cut);
248  if(method==1 || obs%2==1 || powersk.size()<3) totcut += "&&"+njcuts[inj];
249  totcut += ")";
250  //cout << totcut<<endl;
251  double yield(0.), sigma(0.), avWeight(1.);
252  int Nentries(0);
253  Nentries = getYieldErr(*chain[div][ra4_sam[sam]], totcut, yield, sigma);
254  if(yield<0) entries[div][obs].push_back(0);
255  else entries[div][obs].push_back(Nentries);
256  if(Nentries==0){ // If no entries, find averate weight in signal bin
257  totcut = (lumi+"*weight*("+baseline+"&&"+cuts[obs]+")");
258  Nentries = getYieldErr(*chain[div][ra4_sam[sam]], totcut, yield, sigma);
259  // If no entries, find averate weight in baseline region
260  if(Nentries==0){
261  totcut = (lumi+"*weight*("+baseline+")");
262  Nentries = getYieldErr(*chain[div][ra4_sam[sam]], totcut, yield, sigma);
263  }
264  // cout<<obs<<","<<sam<<": sigma "<<sigma<<", Nentries "<<Nentries<<", yield "<<yield
265  // <<", sigma*sqrt(N) "<<sigma*sqrt(Nentries)<<endl;
266  //avWeight = sigma/sqrt(Nentries);
267  }
268  avWeight = fabs(yield/static_cast<double>(Nentries));
269  weights[div][obs].push_back(avWeight);
270  //cout<<obs<<","<<sam<<": entries "<<entries[obs][sam]<<", weight "<<avWeight<<", yield "<<yield<<endl;
271  } // Loop over samples
272  } // Loop over number of observables going into kappa
273  } // Loop over divisions;
274 
275  time(&endtime); time_ntu += difftime(endtime, begtime);
276  time(&begtime);
277  for(unsigned idata(0); idata<nData; idata++){
278  double kappa(0), fixk(1);
279  if(idata<2) kappa = calcKappa(entries[iDivGlobal], weights[iDivGlobal], powersn,
280  mSigma, pSigma, (idata%2)==1);
281  else kappa = calcKappa(entries[iDivGlobal], weights[iDivGlobal], powersn,
282  mSigma, pSigma, (idata%2)==1);
283  float xpoint = inj*wnj+imet*wmet+(inb+2)*wnb;
284  if(method==3 && inb==3) xpoint = inj*wnj+imet*wmet+(inb)*wnb;
285  if(do_normalized && kappa>0) fixk = kappa;
286  kappa /= fixk;
287  mSigma /= fixk;
288  pSigma /= fixk;
289  vx[idata][inb].push_back(xpoint);
290  vy[idata][inb].push_back(kappa);
291  vexl[idata][inb].push_back(0);
292  vexh[idata][inb].push_back(0);
293  veyl[idata][inb].push_back(mSigma);
294  veyh[idata][inb].push_back(pSigma);
295  vector<float> averobs(powersn.size(),0);
296  for(unsigned div(0); div < nDiv; div++){
297  if(div==iDivGlobal) continue;
298  kappa = 1;
299  for(unsigned obs(0); obs < powersn.size(); obs++) {
300  float observed(0);
301  for(unsigned sam(0); sam < ra4_sam.size(); sam++) {
302  observed += entries[div][obs][sam]*weights[div][obs][sam];
303  }
304  averobs[obs] += observed;
305  if(observed>0 || powersn[obs]>=0) kappa *= pow(observed, powersn[obs]);
306  }
307  kappa /= fixk;
308  vdx[idata][inb].push_back(xpoint);
309  vdy[idata][inb].push_back(kappa);
310  } // Loop over divisions;
311  kappa = 1;
312  for(unsigned obs(0); obs < powersn.size(); obs++) {
313  averobs[obs] /= static_cast<float>(nDiv-1);
314  if(averobs[obs]>0 || powersn[obs]>=0) kappa *= pow(averobs[obs], powersn[obs]);
315  }
316  kappa /= fixk;
317  vmx[idata][inb].push_back(xpoint);
318  vmy[idata][inb].push_back(kappa);
319 
320  } // Loop over MC and data
321  time(&endtime); time_gen += difftime(endtime, begtime);
322  time(&begtime);
323  } // Loop over nb cuts
324  } // Loop over met cuts
325  } // Loop over nj cuts
326 
327 
328  // int digits(1), digper(0);
329  // vector<unsigned> ind(nbcuts.size(),0);
330  // TString pname = "txt/kappa_method", cutname; pname += method;
331  // if(do_1ltt) pname += "_1ltt";
332  // else {
333  // if(do_2ltt) pname += "_2ltt";
334  // else {
335  // if(do_ttbar) pname += "_tt";
336  // if(do_other) pname += "_other";
337  // }
338  // }
339  // pname += ".tex";
340  // ifstream header("txt/header.tex");
341  // ifstream footer("txt/footer.tex");
342  // ofstream file(pname);
343  // file<<header.rdbuf();
344  // /////////////////////// TABLE ///////////////////////////
345  // file << "{\\renewcommand{\\arraystretch}{1.4}"<<endl;
346  // file << "\n\\begin{tabular}[tbp!]{ l | rc | rc | r}\\hline\\hline\n";
347  // file << " \\multicolumn{1}{c|}{${\\cal L} = "<<lumi<<"$ fb$^{-1}$} ";
348  // file << " & $N_{\\rm R2}\\frac{N_{\\rm R3}}{N_{\\rm R1}}$ & Data stat. [\\%] \n";
349  // file << "& $\\kappa^{\\rm MC}$ & MC stat. [\\%] & \\multicolumn{1}{c}{$\\hat{N}_{\\rm R4}$} \\\\ \\hline\n";
350  // for(unsigned inj(0); inj<njcuts.size(); inj++){
351  // for(unsigned imet(0); imet<metcuts.size(); imet++){
352  // for(unsigned inb(1); inb<nbcuts.size(); inb++){
353  // if(method==3 && (imet==0&&inb==3 || imet==1&&(inb==1||inb==2))) continue;
354  // cutname = "$"+njcuts[inj]+", "+metcuts[imet];
355  // if(method==3) cutname += ", "+nbcuts[inb];
356  // cutname += "$";
357  // cutname.ReplaceAll("njets","n_{\\rm j}");
358  // cutname.ReplaceAll("<=","\\leq "); cutname.ReplaceAll(">=","\\geq ");
359  // cutname.ReplaceAll("met","{\\rm MET}"); cutname.ReplaceAll("nbm","n_b");
360  // cutname.ReplaceAll("==","=");
361  // float Kappa(vy[0][inb][ind[inb]]), N4(vy[2][inb][ind[inb]]);
362  // float epKappa(veyh[0][inb][ind[inb]]), emKappa(veyl[0][inb][ind[inb]]);
363  // float epN4(veyh[2][inb][ind[inb]]), emN4(veyl[2][inb][ind[inb]]);
364  // file << cutname << " \t& $" <<RoundNumber(N4,digits)<<"^{+"<<RoundNumber(epN4,digits)
365  // <<"}_{-"<<RoundNumber(emN4,digits)<<"}$ & ${}^{+"<<RoundNumber(epN4*100,digper,N4)
366  // <<"}_{-"<<RoundNumber(emN4*100,digper,N4)<<"}$ & $"
367  // <<RoundNumber(Kappa,digits+1)<<"^{+"<<RoundNumber(epKappa,digits+1)
368  // <<"}_{-"<<RoundNumber(emKappa,digits+1)<<"}$ & ${}^{+"<<RoundNumber(epKappa*100,digper,Kappa)
369  // <<"}_{-"<<RoundNumber(emKappa*100,digper,Kappa)<<"}$ & $"
370  // <<RoundNumber(N4*Kappa,digits)<<"^{+"<<RoundNumber(epN4*Kappa,digits)
371  // <<"+"<<RoundNumber(N4*epKappa,digits)<<"}_{-"<<RoundNumber(emN4*Kappa,digits)
372  // <<"-"<<RoundNumber(N4*emKappa,digits)<<"}$ \\\\"<<endl;
373  // ind[inb]++;
374  // } // Loop over nb cuts
375  // } // Loop over met cuts
376  // if(inj==0) file<<"\\hline"<<endl;
377  // } // Loop over nj cuts
378 
379 
380  // file<< "\\hline\\hline\n\\end{tabular}"<<endl<<endl;
381  // /////////////////////// TABLE ///////////////////////////
382  // file<<footer.rdbuf();
383  // file.close();
384  // cout<<endl<<"Written "<<pname<<endl;
385 
386 
387  TH1D histo("histo",cuts2title(baseline),njcuts.size()*metcuts.size(), minh, maxh);
388  for(unsigned inj(0); inj<njcuts.size(); inj++)
389  for(unsigned imet(0); imet<metcuts.size(); imet++)
390  histo.GetXaxis()->SetBinLabel(1+imet+inj*metcuts.size(), metnames[imet]);
391  for(unsigned idata(0); idata<nData; idata++)
392  plotKappa(vx[idata], vy[idata], vexl[idata], vexh[idata], veyl[idata], veyh[idata],
393  vdx[idata], vdy[idata], vmx[idata], vmy[idata], iDivGlobal, idata, histo, nbcuts);
394 
395 
396  time(&endtime); time_setup += difftime(endtime, begtime);
397  time(&begtime);
398  cout<<endl<<"Total time: set up "<<time_setup<<" s, finding yields "<<time_ntu
399  <<" s, toys "<<time_gen<<" s"<<endl<<endl;
400 }
401 
402 void plotKappa(vector<vector<double> > &vx, vector<vector<double> > &vy, vector<vector<double> > &vexl,
403  vector<vector<double> > &vexh, vector<vector<double> > &veyl, vector<vector<double> > &veyh,
404  vector<vector<double> > &vdx, vector<vector<double> > &vdy, vector<vector<double> > &vmx, vector<vector<double> > &vmy, unsigned iDiv,
405  unsigned idata, TH1D &histo, vector<TString> &nbcuts){
406 
407  bool do_data((idata%2)==1), do_pred(idata>=2);
408  do_pred = !do_kappa;
409  styles style("RA4"); //style.LabelSize = 0.05;
410  style.setDefaultStyle();
411  float max_axis(2.2), max_kappa(0.);
412  unsigned nbsize(vx.size());
413  float minh(histo.GetBinLowEdge(1)), maxh(histo.GetBinLowEdge(histo.GetNbinsX()+1));
414  float wtot(maxh-minh);
415  for(unsigned inb(0); inb<nbsize; inb++){
416  for(unsigned ik(0); ik<vy.size(); ik++){
417  if(vy[inb][ik] > max_kappa) max_kappa = vy[inb][ik];
418  if(vy[inb][ik] > max_axis && vy[inb][ik]-veyl[inb][ik] < max_axis && !do_pred) {
419  veyl[inb][ik] = max_axis-(vy[inb][ik]-veyl[inb][ik]);
420  vy[inb][ik] = max_axis;
421  }
422  }
423  }
424  if(do_pred) max_axis = max_kappa*1.3;
425  if(do_normalized) max_axis = 2.3;
426  TCanvas can;
427  TLine line; line.SetLineColor(28); line.SetLineWidth(4); line.SetLineStyle(2);
428  histo.Draw();
429  TString ytitle("#kappa^{MC}");
430  if(do_pred) ytitle = "N_{2}#timesN_{3}/N_{1}";
431  if(do_data) ytitle += " (data uncert.)";
432  else ytitle += " (MC uncert.)";
433  if(do_normalized) ytitle = "Normalized "+ytitle;
434  histo.SetYTitle(ytitle);
435  histo.SetMaximum(max_axis);
436  style.moveYAxisLabel(&histo, max_axis, false);
437  if(!(do_pred && !do_normalized)) line.DrawLine(minh, 1, maxh, 1);
438  line.SetLineColor(1); line.SetLineWidth(2);
439  line.DrawLine(minh+wtot/2., 0, minh+wtot/2, max_axis);
440 
441  double legX(style.PadLeftMargin+0.03), legY(0.902), legSingle = 0.052;
442  if(do_pred) legX = 0.62;
443  double legW = 0.29, legH = legSingle*nbsize;
444  if(nbsize>3) legH = legSingle*((nbsize+1)/2);
445  TLegend leg(legX, legY-legH, legX+legW, legY);
446  leg.SetTextSize(style.LegendSize); leg.SetFillColor(0);
447  leg.SetFillStyle(0); leg.SetBorderSize(0);
448  leg.SetTextFont(style.nFont);
449  if(nbsize>3) leg.SetNColumns(2);
450  TGraphAsymmErrors graph[20];
451  TGraph graphd[20], graphm[20];
452  int colors[] = {2,4,kMagenta+2, kGreen+3}, styles[] = {20, 21, 22, 23};
453  for(unsigned inb(0); inb<nbsize; inb++){
454  graph[inb] = TGraphAsymmErrors(vx[inb].size(), &(vx[inb][0]), &(vy[inb][0]),
455  &(vexl[inb][0]), &(vexh[inb][0]), &(veyl[inb][0]), &(veyh[inb][0]));
456  graph[inb].SetMarkerStyle(styles[inb]); graph[inb].SetMarkerSize(1.4);
457  graph[inb].SetMarkerColor(colors[inb]); graph[inb].SetLineColor(colors[inb]);graph[inb].SetLineWidth(4);
458  graph[inb].Draw("p same");
459  graphd[inb] = TGraph(vdx[inb].size(), &(vdx[inb][0]), &(vdy[inb][0]));
460  graphd[inb].SetMarkerStyle(34); graphd[inb].SetMarkerSize(1.2);
461  graphd[inb].SetMarkerColor(kCyan+2); graphd[inb].SetLineColor(colors[inb]);
462  graphd[inb].Draw("p same");
463  graphm[inb] = TGraph(vmx[inb].size(), &(vmx[inb][0]), &(vmy[inb][0]));
464  graphm[inb].SetMarkerStyle(20); graphm[inb].SetMarkerSize(1.3);
465  graphm[inb].SetMarkerColor(1); graphm[inb].SetLineColor(colors[inb]);
466  graphm[inb].Draw("p same");
467  nbcuts[inb].ReplaceAll("nbm","n_{b}");
468  nbcuts[inb].ReplaceAll("=="," = ");
469  nbcuts[inb].ReplaceAll(">="," #geq ");
470  leg.AddEntry(&graph[inb], nbcuts[inb], "p");
471  }
472  leg.Draw();
473  TLatex label; label.SetNDC(kTRUE);label.SetTextAlign(22);
474  label.DrawLatex(0.37,0.03,"7 #leq n_{j} #leq 8");
475  label.DrawLatex(0.73,0.03,"n_{j} #geq 9");
476 
477  TString pname = "plots/kappa_method"; pname += method;
478  pname += "_div"; pname += iDiv;
479  if(do_1ltt) pname += "_1ltt";
480  else {
481  if(do_2ltt) pname += "_2ltt";
482  else {
483  if(do_ttbar) pname += "_tt";
484  if(do_other) pname += "_other";
485  }
486  }
487  if(do_data) pname += "_data";
488  else pname += "_mc";
489  if(do_normalized) pname += "_norm";
490  pname += plot_type;
491  if(do_pred || !do_kappa) pname.ReplaceAll("kappa","npred");
492  can.SaveAs(pname);
493 
494 }
495 
long getYieldErr(TChain &tree, TString cut, double &yield, double &uncertainty)
void setDefaultStyle()
Definition: styles.cpp:36
bool Contains(const std::string &text, const std::string &pattern)
TString cuts2title(TString title)
STL namespace.
void moveYAxisLabel(TH1 *h, float maxi, bool isLog=false)
Definition: styles.cpp:96
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, vector< vector< double > > &vdx, vector< vector< double > > &vdy, vector< vector< double > > &vmx, vector< vector< double > > &vmy, unsigned iDiv, unsigned idata, TH1D &histo, vector< TString > &nbcuts)
float LegendSize
Definition: styles.hpp:35
tuple kappa
Definition: parse_card.py:264
int nFont
Definition: styles.hpp:33
float PadLeftMargin
Definition: styles.hpp:36
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)