ra4_macros  bede988c286599a3a84b77a4d788ac0a971e89f9
plot_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 <ctime>
5 #include <fstream>
6 #include <getopt.h>
7 #include <iostream>
8 #include <unistd.h>
9 #include <vector>
10 
11 #include "TCanvas.h"
12 #include "TChain.h"
13 #include "TGraphAsymmErrors.h"
14 #include "TH1D.h"
15 #include "TLatex.h"
16 #include "TLegend.h"
17 #include "TMath.h"
18 #include "TLine.h"
19 #include "TString.h"
20 
21 #include "styles.hpp"
22 #include "utilities.hpp"
23 #include "utilities_macros.hpp"
24 
25 namespace {
26  TString ntuple_date("2015_10_19");
27  TString lumi("2.1");
28  int method(3);
29  int nrep = 100000; // Fluctuations of Gamma distribution
30  bool do_2l(false); // Calculate dilepton closure stat uncertainty
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(false); // Include other in kappa
35  bool t_other(false); // Merges single t and other
36  TString plot_type=".pdf";
37  bool do_sigma_avError(true);
38 }
39 
40 using namespace std;
41 
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;
48  time(&begtime);
49 
50  int c(0);
51  while((c=getopt(argc, argv, "m:n:toj12"))!=-1){
52  switch(c){
53  case 'm':
54  method=atoi(optarg);
55  break;
56  case 'n':
57  nrep=atoi(optarg);
58  break;
59  case 't':
60  do_ttbar = true;
61  break;
62  case '1':
63  do_1ltt = true;
64  break;
65  case '2':
66  do_2ltt = true;
67  break;
68  case 'o':
69  do_other = true;
70  break;
71  default:
72  break;
73  }
74  }
75 
76  TString folder="/afs/cern.ch/user/m/manuelf/work/babies/"+ntuple_date+"/mc/skim_1lht500met200/";
77 
78  vector<TString> s_tt, s_bkg;
79  if(do_ttbar){
80  s_tt.push_back(folder+"*_TTJets*Lept*");
81  s_tt.push_back(folder+"*_TTJets*HT*");
82  }
83  if(do_other){
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*");
93  }
94  // Reading ntuples
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));
99  if(do_other) Samples.push_back(sfeats(s_bkg, "Other", 46, 1));
100 
101  vector<int> ra4_sam;
102  unsigned nsam(Samples.size());
103  for(unsigned sam(0); sam < nsam; sam++){
104  ra4_sam.push_back(sam);
105  }
106 
107  // Reading ntuples
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]);
113  // cout<<"Label: "<<Samples[sam].label<<" Chains: "<<chain[sam]->GetNtrees()<<" Entries: "<<chain[sam]->GetEntries()<<endl;
114  }
115 
116  TString mjthresh("400");
117  if(method==1) mjthresh = "600";
118  float mSigma, pSigma;
119  vector<float> powersk, powersn;
120  vector<TString> cuts;
121  if(!do_2l){
122  powersk.push_back(1); cuts.push_back("mt<=140&&mj<="+mjthresh); // R1
123  powersk.push_back(-1); cuts.push_back("mt<=140&&mj>"+mjthresh); // R2
124  powersk.push_back(-1); cuts.push_back("mt>140&&mj<="+mjthresh); // R3
125  powersk.push_back(1); cuts.push_back("mt>140&&mj>"+mjthresh); // R4
126  } else {
127  powersk.push_back(-1); cuts.push_back("mj<="+mjthresh); // R3
128  powersk.push_back(1); cuts.push_back("mj>"+mjthresh); // R4
129  }
130 
131  powersn.push_back(-1);
132  powersn.push_back(1);
133  powersn.push_back(1);
134 
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");
140  if(!do_2l){
141  njcuts.push_back("njets<=8");
142  njcuts.push_back("njets>=9");
143  } else {
144  njcuts.push_back("njets<=7");
145  njcuts.push_back("njets>=8");
146  }
147  if(!do_2l){
148  nbcuts.push_back("nbm==1");
149  if(method==1)
150  nbcuts.push_back("nbm>=2");
151  else {
152  nbcuts.push_back("nbm==2");
153  nbcuts.push_back("nbm>=3");
154  nbcuts.push_back("nbm>=2");
155  }
156  }
157 
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]+"}";
165  }
166 
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);
172  // These vectors have indices vx[4][nbsize][njsize*metsize]
173  // The first index is: 0 -> k MC, 1 -> k data, 2 -> N4 MC, 3 -> N4 data
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>());
189  }
190  }
191 
192  time(&endtime); time_setup = difftime(endtime, begtime);
193  time(&begtime);
194 
195  TString totcut("");
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>());
205  // cout << totcut<<endl;
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);
210  //cout<<"Cut: "<<totcut<<endl;
211  if(method==1 || obs%2==1) totcut += "&&"+njcuts[inj]+"&&"+nbcuts[inb];
212  totcut += ")";
213  //cout << totcut<<endl;
214  double yield(0.), sigma(0.), avWeight(1.);
215  int Nentries(0);
216  Nentries = getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
217  // Zero-ing out the single t, not adding its uncertainty
218  if(Samples[ra4_sam[sam]].label=="Single t"){
219  if(yield>0) yield_singlet = yield;
220  continue;
221  }
222  if(Samples[ra4_sam[sam]].label=="Other") yield += yield_singlet;
223  if(yield<=0) entries[obs].push_back(0);
224  else {
225  if(do_sigma_avError) entries[obs].push_back(yield*yield/pow(sigma,2));
226  else entries[obs].push_back(Nentries);
227  }
228  if(Nentries==0){ // If no entries, find average weight in signal bin
229  totcut = (lumi+"*weight*("+baseline+"&&"+cuts[obs]+")");
230  Nentries = getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
231  // If no entries, find average weight in baseline region
232  if(Nentries==0){
233  totcut = (lumi+"*weight*("+baseline+")");
234  Nentries = getYieldErr(*chain[ra4_sam[sam]], totcut, yield, sigma);
235  }
236  }
237  if(do_sigma_avError) avWeight = sigma*sigma/yield;
238  else avWeight = fabs(yield/static_cast<double>(Nentries));
239  weights[obs].push_back(avWeight);
240  // cout<<obs<<","<<sam<<": entries "<<entries[obs][sam]<<", weight "<<avWeight<<", yield "<<yield<<endl;
241  } // Loop over samples
242  } // Loop over number of observables going into kappa
243 
244  time(&endtime); time_ntu += difftime(endtime, begtime);
245  time(&begtime);
246  for(unsigned idata(0); idata<4; idata++){
247  if(do_2l && idata>=2) continue;
248  double kappa(0);
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);
259  } // Loop over MC and data
260  time(&endtime); time_gen += difftime(endtime, begtime);
261  time(&begtime);
262  } // Loop over nb cuts
263  } // Loop over met cuts
264  } // Loop over nj cuts
265 
266 
267  vector<unsigned> ind(nbcuts.size(),0);
268  if(do_2l) {
269  for(unsigned inj(0); inj<njcuts.size(); inj++){
270  for(unsigned imet(0); imet<metcuts.size(); imet++){
271  unsigned inb(0);
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)));
277 
278  metcuts[imet].ReplaceAll("met>200&&","");
279  TString cutname = njcuts[inj]+", "+metcuts[imet];
280  if(method==3) cutname += ", "+nbcuts[inb];
281  // cutname.ReplaceAll("njets","n_{\\rm j}");
282  // cutname.ReplaceAll("<=","\\leq "); cutname.ReplaceAll(">=","\\geq ");
283  // cutname.ReplaceAll("met","{\\rm MET}"); cutname.ReplaceAll("nbm","n_b");
284  // cutname.ReplaceAll("==","=");
285 
286  cout<<endl<<cutname<<": Data +"<<RoundNumber(epData*100,1,Data)<<"% -"<<RoundNumber(emData*100,1,Data)
287  <<"%\t MC +"<<RoundNumber(epMC*100,1,MC)<<"% -"<<RoundNumber(emMC*100,1,MC)
288  <<"% \t Total +"<<RoundNumber(epTotal*100,1)<<"% -"<<RoundNumber(emTotal*100,1)<<endl;
289  ind[inb]++;
290  }
291  } // Loop over nj cuts
292  return 0;
293  }
294 
295  int digits(1), digper(0);
296  TString pname = "txt/kappa_method", cutname; pname += method;
297  if(do_1ltt) pname += "_1ltt";
298  else {
299  if(do_2ltt) pname += "_2ltt";
300  else {
301  if(do_ttbar) pname += "_tt";
302  if(do_other) {
303  pname += "_other";
304  if(t_other) pname += "t";
305  }
306  }
307  }
308  pname += ".tex";
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];
326  cutname += "$";
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]]);
334  file << cutname << " \t& $" <<RoundNumber(N4,digits)<<"^{+"<<RoundNumber(epN4,digits)
335  <<"}_{-"<<RoundNumber(emN4,digits)<<"}$ & ${}^{+"<<RoundNumber(epN4*100,digper,N4)
336  <<"}_{-"<<RoundNumber(emN4*100,digper,N4)<<"}$ & $"
337  <<RoundNumber(Kappa,digits+1)<<"^{+"<<RoundNumber(epKappa,digits+1)
338  <<"}_{-"<<RoundNumber(emKappa,digits+1)<<"}$ & ${}^{+"<<RoundNumber(epKappa*100,digper,Kappa)
339  <<"}_{-"<<RoundNumber(emKappa*100,digper,Kappa)<<"}$ & $"
340  <<RoundNumber(N4*Kappa,digits)<<"^{+"<<RoundNumber(epN4*Kappa,digits)
341  <<"+"<<RoundNumber(N4*epKappa,digits)<<"}_{-"<<RoundNumber(emN4*Kappa,digits)
342  <<"-"<<RoundNumber(N4*emKappa,digits)<<"}$ \\\\"<<endl;
343  ind[inb]++;
344  } // Loop over nb cuts
345  } // Loop over met cuts
346  if(inj==0) file<<"\\hline"<<endl;
347  } // Loop over nj cuts
348 
349 
350  file<< "\\hline\\hline\n\\end{tabular}"<<endl<<endl;
352  file<<footer.rdbuf();
353  file.close();
354  cout<<endl<<"Written "<<pname<<endl;
355 
356 
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);
363 
364 
365  time(&endtime); time_setup += difftime(endtime, begtime);
366  time(&begtime);
367  cout<<endl<<"Total time: set up "<<time_setup<<" s, finding yields "<<time_ntu
368  <<" s, toys "<<time_gen<<" s"<<endl<<endl;
369 }
370 
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){
374 
375  bool do_data((idata%2)==1), do_pred(idata>=2);
376  TString stylename = "RA4";
377  styles style(stylename);
378  style.setDefaultStyle();
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;
389  }
390  }
391  }
392  if(do_pred) max_axis = max_kappa*1.3;
393  TCanvas can;
394  TLine line; line.SetLineColor(28); line.SetLineWidth(4); line.SetLineStyle(2);
395  histo.Draw();
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);
402  style.moveYAxisLabel(&histo, max_axis, false);
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);
406 
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");
428  }
429  leg.Draw();
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");
433 
434  TString pname = "plots/kappa_method"; pname += method;
435  if(do_1ltt) pname += "_1ltt";
436  else {
437  if(do_2ltt) pname += "_2ltt";
438  else {
439  if(do_ttbar) pname += "_tt";
440  if(do_other) {
441  pname += "_other";
442  if(t_other) pname += "t";
443  }
444  }
445  }
446  if(do_data) pname += "_data";
447  else pname += "_mc";
448  pname += plot_type;
449  if(do_pred) pname.ReplaceAll("kappa","npred");
450  can.SaveAs(pname);
451 
452 }
long getYieldErr(TChain &tree, TString cut, double &yield, double &uncertainty)
void setDefaultStyle()
Definition: styles.cpp:36
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)
Definition: plot_kappa.cxx:371
TString cuts2title(TString title)
STL namespace.
void moveYAxisLabel(TH1 *h, float maxi, bool isLog=false)
Definition: styles.cpp:96
float LegendSize
Definition: styles.hpp:35
tuple kappa
Definition: parse_card.py:264
TString RoundNumber(double num, int decimals, double denom=1.)
Definition: utilities.cpp:191
int nFont
Definition: styles.hpp:33
tuple file
Definition: parse_card.py:238
float PadLeftMargin
Definition: styles.hpp:36
int main(int argc, char *argv[])
Definition: plot_kappa.cxx:45
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)