susy_cfa  b611ccad937ea179f86a1f5663960264616c0a20
plot_roc.cxx
Go to the documentation of this file.
1 // plot_roc: Macro that plots ROC curves
2 
3 #include <stdexcept>
4 #include <iostream>
5 
6 #include "TChain.h"
7 #include "TCanvas.h"
8 #include "TLegend.h"
9 #include "TLine.h"
10 #include "TDirectory.h"
11 #include "TMarker.h"
12 
13 #include "styles.hpp"
14 #include "utilities.hpp"
15 #include "plot_roc.hpp"
16 
17 using namespace std;
18 
19 int main(){
20  styles style("1Dtitle"); style.setDefaultStyle();
21 
22  // NTUPLES
23  vector<TString> v_t1;
24  v_t1.push_back("archive/ra4skim/*T1tttt*1500_*PU20*");
25  vector<TString> v_t1c;
26  v_t1c.push_back("archive/ra4skim/*T1tttt*1200_*PU20*");
27  vector<TString> v_t2;
28  v_t2.push_back("archive/ra4skim/*T2tt*850_*PU20*");
29  vector<TString> v_t1pu40;
30  v_t1pu40.push_back("archive/ra4skim/*T1tttt*1500_*PU40*");
31  vector<TString> v_tt;
32  v_tt.push_back("archive/ra4skim/*TT*");
33 
35  vector<sample_class> mus_tt;
36  mus_tt.push_back(sample_class("tt truth-matched prompt #mu", v_tt, "mus_tru_tm&&mus_sigid"));
37  mus_tt.push_back(sample_class("tt non-truth-matched #mu", v_tt, "!mus_tru_tm&&mus_sigid"));
38 
39  vector<sample_class> mus_tt_t1;
40  mus_tt_t1.push_back(sample_class("T1tttt(1500,100) truth-matched prompt #mu", v_t1, "mus_tru_tm&&mus_sigid"));
41  mus_tt_t1.push_back(sample_class("tt non-truth-matched #mu", v_tt, "!mus_tru_tm&&mus_sigid"));
42 
43  vector<sample_class> mus_t1pu20;
44  mus_t1pu20.push_back(sample_class("T1tttt(1500,100) truth-matched prompt #mu", v_t1, "mus_tru_tm&&mus_sigid"));
45  mus_t1pu20.push_back(sample_class("T1tttt(1500,100) non-TM #mu", v_t1, "!mus_tru_tm&&mus_sigid"));
46 
47  vector<sample_class> mus_t1cpu20;
48  mus_t1cpu20.push_back(sample_class("T1tttt(1200,800) truth-matched prompt #mu", v_t1c, "mus_tru_tm&&mus_sigid"));
49  mus_t1cpu20.push_back(sample_class("T1tttt(1200,800) non-TM #mu", v_t1c, "!mus_tru_tm&&mus_sigid"));
50 
51  vector<sample_class> mus_t2pu20;
52  mus_t2pu20.push_back(sample_class("T2tt(850,100) truth-matched prompt #mu", v_t2, "mus_tru_tm&&mus_sigid"));
53  mus_t2pu20.push_back(sample_class("T2tt(850,100) non-TM #mu", v_t2, "!mus_tru_tm&&mus_sigid"));
54 
55  vector<sample_class> mus_t1pu40;
56  mus_t1pu40.push_back(sample_class("T1tttt(1500,100) PU40 truth-matched prompt #mu", v_t1pu40, "mus_tru_tm&&mus_sigid"));
57  mus_t1pu40.push_back(sample_class("T1tttt(1500,100) PU40 non-TM #mu", v_t1pu40, "!mus_tru_tm&&mus_sigid"));
58 
60 
61  vector<sample_class> els_tt;
62  els_tt.push_back(sample_class("tt truth-matched prompt e", v_tt, "els_tru_tm&&els_sigid&&els_ispf"));
63  els_tt.push_back(sample_class("tt non-truth-matched e", v_tt, "!els_tru_tm&&els_sigid&&els_ispf"));
64 
65  vector<sample_class> els_tt_t1;
66  els_tt_t1.push_back(sample_class("T1tttt(1500,100) truth-matched prompt e", v_t1, "els_tru_tm&&els_sigid&&els_ispf"));
67  els_tt_t1.push_back(sample_class("tt non-truth-matched e", v_tt, "!els_tru_tm&&els_sigid&&els_ispf"));
68 
69  vector<sample_class> els_t1cpu20;
70  els_t1cpu20.push_back(sample_class("T1tttt(1200,800) truth-matched prompt e", v_t1c, "els_tru_tm&&els_sigid&&els_ispf"));
71  els_t1cpu20.push_back(sample_class("T1tttt(1200,800) non-TM e", v_t1c, "!els_tru_tm&&els_sigid&&els_ispf"));
72 
73  vector<sample_class> els_t1pu20;
74  els_t1pu20.push_back(sample_class("T1tttt(1500,100) truth-matched prompt e", v_t1, "els_tru_tm&&els_sigid&&els_ispf"));
75  els_t1pu20.push_back(sample_class("T1tttt(1500,100) non-TM e", v_t1, "!els_tru_tm&&els_sigid&&els_ispf"));
76 
77  vector<sample_class> els_t2pu20;
78  els_t2pu20.push_back(sample_class("T2tt(850,100) truth-matched prompt e", v_t2, "els_tru_tm&&els_sigid&&els_ispf"));
79  els_t2pu20.push_back(sample_class("T2tt(850,100) non-TM e", v_t2, "!els_tru_tm&&els_sigid&&els_ispf"));
80 
81  vector<sample_class> els_t1pu40;
82  els_t1pu40.push_back(sample_class("T1tttt(1500,100) PU40 truth-matched prompt e", v_t1pu40, "els_tru_tm&&els_sigid&&els_ispf"));
83  els_t1pu40.push_back(sample_class("T1tttt(1500,100) PU40 non-TM e", v_t1pu40, "!els_tru_tm&&els_sigid&&els_ispf"));
84 
85  // Markers to be plot on curves: 29 is a star, 8 a circle
86  int mini_style(8); float mini_size(2);
87  vector<marker_class> mus_std, mus_new, els_std, cuts_miniso;
88  els_std.push_back(marker_class(0.22, 4, 28, 29));
89  mus_std.push_back(marker_class(0.12, 4, 1, 29));
90  mus_new.push_back(marker_class(0.2, 4, 28, 29));
91  cuts_miniso.push_back(marker_class(0.4, mini_size, 4, mini_style));
92  cuts_miniso.push_back(marker_class(0.2, mini_size, 4, mini_style));
93  cuts_miniso.push_back(marker_class(0.1, mini_size, 4, mini_style));
94  cuts_miniso.push_back(marker_class(0.05, mini_size, 4, mini_style));
95 
97  vector<var_class> mus_vars;
98  mus_vars.push_back(var_class("mus_reliso_r04",0,10,"Rel. Iso. (R=0.4)",1,1,mus_std));
99  mus_vars.push_back(var_class("mus_reliso_r03",0,10,"Rel. Iso. (R=0.3)",28,1));
100  mus_vars.push_back(var_class("mus_reliso_r02",0,10,"Rel. Iso. (R=0.2)",kMagenta+2));
101  mus_vars.push_back(var_class("mus_reliso_r015",0,10,"Rel. Iso. (R=0.15)",3));
102  mus_vars.push_back(var_class("mus_reliso_r01",0,10,"Rel. Iso. (R=0.1)",2));
103  mus_vars.push_back(var_class("min(mus_reliso_r02,mus_miniso_tr10)",0,10,"Mini Iso. (0.05<R<0.2)",4,1,cuts_miniso));
104 
105  vector<var_class> els_vars;
106  els_vars.push_back(var_class("els_reliso_r04",0,10,"Rel. Iso. (R=0.4)",1));
107  els_vars.push_back(var_class("els_reliso_r03",0,10,"Rel. Iso. (R=0.3)",28,1,els_std));
108  els_vars.push_back(var_class("els_reliso_r02",0,10,"Rel. Iso. (R=0.2)",kMagenta+2));
109  els_vars.push_back(var_class("els_reliso_r015",0,10,"Rel. Iso. (R=0.15)",3));
110  els_vars.push_back(var_class("els_reliso_r01",0,10,"Rel. Iso. (R=0.1)",2));
111  els_vars.push_back(var_class("min(els_reliso_r02,els_miniso_tr10)",0,10,"Mini Iso. (0.05<R<0.2)",4,1,cuts_miniso));
112 
113  vector<var_class> mus_vars_ptrel;
114  mus_vars_ptrel.push_back(var_class("mus_reliso_r04",0,10,"Rel. Iso. (R=0.4)",1,1,mus_std));
115  mus_vars_ptrel.push_back(var_class("min(mus_reliso_r02,mus_miniso_tr10)",0,10,"Mini Iso. (0.05<R<0.2)",4,1,cuts_miniso));
116  mus_vars_ptrel.push_back(var_class("mus_ptrel_0+(mus_reliso_r04<0.3)*9999.",500,0,
117  "p_{T}^{rel} || Rel. Iso. (R=0.4) < 0.3",1,2));
118  mus_vars_ptrel.push_back(var_class("mus_ptrel_0+(min(mus_reliso_r02,mus_miniso_tr10)<0.3)*9999.",500,0,
119  "p_{T}^{rel} || Mini Iso. < 0.3",4,2));
120 
121  vector<var_class> els_vars_ptrel;
122  els_vars_ptrel.push_back(var_class("els_reliso_r03",0,10,"Rel. Iso. (R=0.3)",28,1,els_std));
123  els_vars_ptrel.push_back(var_class("min(els_reliso_r02,els_miniso_tr10)",0,10,"Mini Iso. (0.05<R<0.2)",4,1,cuts_miniso));
124  els_vars_ptrel.push_back(var_class("els_ptrel_0+(els_reliso_r03<0.1)*9999.",500,0,
125  "p_{T}^{rel} || Rel. Iso. (R=0.3) < 0.1",28,2));
126  els_vars_ptrel.push_back(var_class("els_ptrel_0+(min(els_reliso_r02,els_miniso_tr10)<0.1)*9999.",500,0,
127  "p_{T}^{rel} || Mini Iso. < 0.1",4,2));
128 
130 
131  TString mus_ptcuts[] = {"mus_pt>=20","mus_pt>=20&&mus_pt<50","mus_pt>=50&&mus_pt<100","mus_pt>=100&&mus_pt<200","mus_pt>=200"};
132  TString els_ptcuts[] = {"els_pt>=20","els_pt>=20&&els_pt<50","els_pt>=50&&els_pt<100","els_pt>=100&&els_pt<200","els_pt>=200"};
133  //TString htcuts[] = {"1","ht<250","ht>=250&&ht<500","ht>=500&&ht<750","ht>=750&&ht<1000"};
134  //TString metcuts[] = {"1","met<100","met>=100&&met<200","met>=200&&met<300","met>=300&&met<400"};
135  TString htcuts[] = {"1","ht>=750&&ht<1000","ht>=750&&ht<1500"};
136  TString metcuts[] = {"1","met>=200&&met<600"};
137  TString cuts;
138  for(int iht(0); iht<3; iht++){
139  for(int imet(0); imet<2; imet++){
140  for(int ipt(0); ipt<5; ipt++){
141  cuts = mus_ptcuts[ipt]+"&&"+htcuts[iht]+"&&"+metcuts[imet];
142  DrawROC(mus_tt, mus_vars, cuts, "mus_tt");
143  DrawROC(mus_t1pu20, mus_vars, cuts, "mus_t1");
144  DrawROC(mus_tt, mus_vars_ptrel, cuts, "mus_tt_ptrel");
145  DrawROC(mus_t1pu20, mus_vars_ptrel, cuts, "mus_t1_ptrel");
146  cuts = els_ptcuts[ipt]+"&&"+htcuts[iht]+"&&"+metcuts[imet];
147  DrawROC(els_tt, els_vars, cuts, "els_tt");
148  DrawROC(els_t1pu20, els_vars, cuts, "els_t1");
149  DrawROC(els_tt, els_vars_ptrel, cuts, "els_tt_ptrel");
150  DrawROC(els_t1pu20, els_vars_ptrel, cuts, "els_t1_ptrel");
151 
152  }
153  }
154  }
155  // pT bins
156  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>20&&mus_pt<50&&ht>750&&met>250", "mus_isott_t1");
157  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>50&&mus_pt<100&&ht>750&&met>250", "mus_isott_t1");
158  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>100&&mus_pt<200&&ht>750&&met>250", "mus_isott_t1");
159  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>200&&ht>750&&met>250", "mus_isott_t1");
160  // // Signal points, full pT range
161  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isott_t1");
162  // DrawROC(mus_t2pu20, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isot2");
163  // DrawROC(mus_t1cpu20, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isott_t1c");
164  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isott");
165  // // PU comparison
166  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>20&&ht>750&&met>250&&ntrupv<20", "mus_isopu20");
167  // DrawROC(mus_t1pu40, mus_vars, "mus_pt>20&&ht>750&&met>250&&ntrupv>30", "mus_isopu40");
168 
169  // // pT bins
170  // DrawROC(els_tt_t1, els_vars, "els_pt>20&&els_pt<50&&ht>750&&met>250", "els_isott_t1");
171  // DrawROC(els_tt_t1, els_vars, "els_pt>50&&els_pt<100&&ht>750&&met>250", "els_isott_t1");
172  // DrawROC(els_tt_t1, els_vars, "els_pt>100&&els_pt<200&&ht>750&&met>250", "els_isott_t1");
173  // DrawROC(els_tt_t1, els_vars, "els_pt>200&&ht>750&&met>250", "els_isott_t1");
174  // // Signal points, full pT range
175  // DrawROC(els_tt_t1, els_vars, "els_pt>20&&ht>750&&met>250", "els_isott_t1");
176  // DrawROC(els_t2pu20, els_vars, "els_pt>20&&ht>750&&met>250", "els_isot2");
177  // DrawROC(els_t1cpu20, els_vars, "els_pt>20&&ht>750&&met>250", "els_isott_t1c");
178  // DrawROC(els_tt_t1, els_vars, "els_pt>20&&ht>750&&met>250", "els_isott");
179  // // PU comparison
180  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht>750&&met>250&&ntrupv<20", "els_isopu20");
181  // DrawROC(els_t1pu40, els_vars, "els_pt>20&&ht>750&&met>250&&ntrupv>30", "els_isopu40");
182 
183  //DrawROC(mus_tt, mus_vars, "mus_pt>20&&met<80", "mus_tt");
184  //DrawROC(mus_tt, mus_vars, "mus_pt>20&&met>120", "mus_tt");
185  //DrawROC(mus_tt, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_tt");
186  //DrawROC(mus_tt, mus_vars, "mus_pt>20&&els_pt<50", "mus_tt");
187  // DrawROC(mus_tt, mus_vars, "mus_pt>50&&els_pt<100", "mus_tt");
188  // DrawROC(mus_tt, mus_vars, "mus_pt>100&&els_pt<200", "mus_tt");
189  //DrawROC(els_tt, els_vars, "els_pt>20&&ht>750&&met>250", "els_tt");
190 
191 
192  // HT bins
193  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&ht<1000&&met>250", "mus_isot1");
194  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&ht>=1000&&ht<2000&&met>250", "mus_isot1");
195  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&ht>=2000&&ht<3000&&met>250", "mus_isot1");
196  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&ht>=4000&&met>250", "mus_isot1");
197  // // HT bins
198  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht<1000&&met>250", "els_isot1");
199  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht>=1000&&ht<2000&&met>250", "els_isot1");
200  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht>=2000&&ht<3000&&met>250", "els_isot1");
201  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht>=4000&&met>250", "els_isot1");
202  // // pT bins
203  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&mus_pt<50&&ht>750&&met>250", "mus_isot1");
204  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>50&&mus_pt<100&&ht>750&&met>250", "mus_isot1");
205  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>100&&mus_pt<200&&ht>750&&met>250", "mus_isot1");
206  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>200&&ht>750&&met>250", "mus_isot1");
207  // // Signal points, full pT range
208  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isot1");
209  // DrawROC(mus_t2pu20, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isot2");
210  // DrawROC(mus_t1cpu20, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isot1c");
211  // DrawROC(mus_tt_t1, mus_vars, "mus_pt>20&&ht>750&&met>250", "mus_isott");
212  // // PU comparison
213  // DrawROC(mus_t1pu20, mus_vars, "mus_pt>20&&ht>750&&met>250&&ntrupv<20", "mus_isopu20");
214  // DrawROC(mus_t1pu40, mus_vars, "mus_pt>20&&ht>750&&met>250&&ntrupv>30", "mus_isopu40");
215 
216  // // pT bins
217  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&els_pt<50&&ht>750&&met>250", "els_isot1");
218  // DrawROC(els_t1pu20, els_vars, "els_pt>50&&els_pt<100&&ht>750&&met>250", "els_isot1");
219  // DrawROC(els_t1pu20, els_vars, "els_pt>100&&els_pt<200&&ht>750&&met>250", "els_isot1");
220  // DrawROC(els_t1pu20, els_vars, "els_pt>200&&ht>750&&met>250", "els_isot1");
221  // // Signal points, full pT range
222  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht>750&&met>250", "els_isot1");
223  // DrawROC(els_t2pu20, els_vars, "els_pt>20&&ht>750&&met>250", "els_isot2");
224  // DrawROC(els_t1cpu20, els_vars, "els_pt>20&&ht>750&&met>250", "els_isot1c");
225  // DrawROC(els_tt_t1, els_vars, "els_pt>20&&ht>750&&met>250", "els_isott");
226  // // PU comparison
227  // DrawROC(els_t1pu20, els_vars, "els_pt>20&&ht>750&&met>250&&ntrupv<20", "els_isopu20");
228  // DrawROC(els_t1pu40, els_vars, "els_pt>20&&ht>750&&met>250&&ntrupv>30", "els_isopu40");
229 
230  // DrawROC(els_tt_t1, els_vars, "els_pt>20&&ht>750&&met>250", "els_isott");
231 
232 }
233 
234 void DrawROC(vector<sample_class> samples, vector<var_class> vars, TString cuts, TString tag){
235  TCanvas can;
236  const int nbins(1000);
237  vector<vector<TH1D> > histos;
238  TString hname, totcut;
239  TChain *chain[2];
240 
241  for(unsigned sam(0); sam < samples.size(); sam++){
242  // Loading chains
243  for(unsigned isam(0); isam < samples[sam].files.size(); isam++){
244  chain[sam] = new TChain("tree");
245  chain[sam]->Add(samples[sam].files[isam]);
246  }
247  histos.push_back(vector<TH1D>());
248 
249  // Projecting variables
250  for(unsigned var(0); var<vars.size(); var++){
251  float minh(vars[var].minx), maxh(vars[var].maxx);
252  if(minh > maxh){
253  minh = maxh;
254  maxh = vars[var].minx;
255  }
256  hname = "histo"; hname += sam; hname += var;
257  totcut = "weight*("+cuts+"&&"+samples[sam].cut+")";
258  histos[sam].push_back(TH1D(hname,"",nbins,minh,maxh));
259  chain[sam]->Project(hname, vars[var].varname, totcut);
260  } // Loop over variables
261  } // Loop over samples
262 
263  TString title(cuts);
264  if(title=="1") title = "";
265  title.ReplaceAll("&&1",""); title.ReplaceAll("nvmus10==0&&nvels10==0", "0 leptons");
266  title.ReplaceAll("els_pt","p^{e}_{T}");title.ReplaceAll("mus_pt","p^{#mu}_{T}");
267  title.ReplaceAll("mj_30", "M_{J}");
268  title.ReplaceAll(">=", " #geq ");
269  title.ReplaceAll(">", " > "); title.ReplaceAll("<", " < "); title.ReplaceAll("&&", ", ");
270  title.ReplaceAll("met", "MET"); title.ReplaceAll("ht", "H_{T}"); title.ReplaceAll("mt", "m_{T}");
271  title.ReplaceAll("nleps==1", "1 lepton"); title.ReplaceAll("ntrupv","n^{true}_{PV}");
272  title.ReplaceAll("njets30","n_{jets}^{30}"); title.ReplaceAll("nbm30","n_{b}^{30}");
273  title.ReplaceAll("njets","n_{jets}"); title.ReplaceAll("nbm","n_{b}");
274  title.ReplaceAll("mindphin_metje","min#Delta#phi_{N}");
275  title.ReplaceAll("nbl","n_{b,l}");
276  TH1D base_histo("base",title,1,0.5,1.0);
277  base_histo.SetXTitle(samples[0].label+" efficiency");
278  base_histo.SetYTitle(samples[1].label+" rejection rate");
279  base_histo.SetMinimum(0.0);
280  base_histo.SetMaximum(1.0);
281  base_histo.SetDirectory(0);
282  base_histo.Draw();
283 
284  // Legend
285  double legX = 0.13, legY = 0.15, legSingle = 0.064;
286  double legW = 0.12, legH = legSingle*vars.size();
287  TLegend leg(legX, legY, legX+legW, legY+legH);
288  leg.SetTextSize(0.055); leg.SetFillColor(0); leg.SetFillStyle(0); leg.SetBorderSize(0);
289  leg.SetTextFont(132);
290 
291  // Making individual graphs
292  TGraph graphs[100]; // Had to make it an array because a vector<TGraph> kept crashing
293  for(unsigned var(0); var<vars.size(); var++){
294  graphs[var] = MakeROC(histos[0][var], histos[1][var], vars[var].minx < vars[var].maxx, vars[var].cuts);
295  graphs[var].SetLineColor(vars[var].color);
296  graphs[var].SetLineStyle(vars[var].style);
297  graphs[var].SetLineWidth(3);
298  leg.AddEntry(&(graphs[var]), vars[var].title, "l");
299  graphs[var].Draw("lsame");
300  } // Loop over variables
301  leg.Draw();
302 
303  cuts.ReplaceAll(".","");
304  cuts.ReplaceAll("(",""); cuts.ReplaceAll("$",""); cuts.ReplaceAll(")","");
305  cuts.ReplaceAll("[",""); cuts.ReplaceAll("]","");
306  cuts.ReplaceAll("/","_"); cuts.ReplaceAll("*",""); cuts.ReplaceAll("&&","_");
307  cuts.ReplaceAll(">",""); cuts.ReplaceAll("<",""); cuts.ReplaceAll("=","");
308  cuts.ReplaceAll("+","");
309  TString pname("eps/roc_"+tag+"_"+cuts+".eps");
310  can.Print(pname);
311 
312  for(unsigned sam(0); sam < samples.size(); sam++)
313  chain[sam]->Delete();
314 }
315 
316 TGraph MakeROC(TH1D &good, TH1D &bad, const bool less_is_better, vector<marker_class> cuts){
317  const int nbins = good.GetNbinsX();
318  if(bad.GetNbinsX() != nbins) throw logic_error("Mismatched number of bins");
319 
320  TMarker marker;
321 
322  TGraph graph(0);
323  const double good_tot = good.Integral(0, nbins+1);
324  const double bad_tot = bad.Integral(0, nbins+1);
325  int inibin(0), endbin(nbins+1), dbin(1); unsigned icut(0);
326  if(less_is_better){
327  inibin = nbins+1;
328  endbin = 0;
329  dbin = -1;
330  }
331  for(int bin = inibin; bin*dbin<=endbin*dbin; bin+=dbin){
332  const double good_pass = good.Integral(min(endbin,bin), max(endbin,bin));
333  const double bad_pass = bad.Integral(min(endbin,bin), max(endbin,bin));
334  const double x = good_pass/good_tot;
335  const double y = 1.0-bad_pass/bad_tot;
336  graph.SetPoint(graph.GetN(), x, y);
337 
338  // Plotting the stars
339  if(icut<cuts.size()){
340  float edge(good.GetBinLowEdge(bin));
341  if((edge>=cuts[icut].cut&&!less_is_better) || (edge<=cuts[icut].cut&&less_is_better)){
342  marker.SetMarkerStyle(cuts[icut].style);marker.SetMarkerColor(cuts[icut].color);
343  marker.SetMarkerSize(cuts[icut].size);
344  marker.DrawMarker(x,y);
345  icut++;
346  }
347  }
348  }
349  TString name(good.GetName());
350  name += "graph";
351  graph.SetName(name);
352  graph.SetTitle(name);
353 
354  return graph;
355 }
356 
357 var_class::var_class(TString ivarname, float iminx, float imaxx, TString ititle, int icolor,
358  int istyle, vector<marker_class> icuts){
359  varname = ivarname; minx = iminx; maxx = imaxx; title = ititle;
360  cuts = icuts;
361  color = icolor; style = istyle;
362 }
363 
364 sample_class::sample_class(TString ilabel, vector<TString> ifiles, TString icut){
365  files = ifiles; label = ilabel; cut = icut;
366 }
367 
368 marker_class::marker_class(float icut, float isize, int icolor, int istyle){
369  cut=icut; size=isize; color=icolor; style=istyle;
370 }
371 
string files
Definition: data_combine.py:33
int main()
Definition: plot_roc.cxx:19
void setDefaultStyle()
Definition: styles.cpp:36
TGraph MakeROC(TH1D &good, TH1D &bad, const bool less_is_better, vector< marker_class > cuts)
Definition: plot_roc.cxx:316
STL namespace.
void Delete(T &vec)
void DrawROC(vector< sample_class > samples, vector< var_class > vars, TString cuts, TString tag)
Definition: plot_roc.cxx:234
var_class(TString ivarname, float iminx, float imaxx, TString ititle, int icolor, int istyle=1, std::vector< marker_class > icuts=std::vector< marker_class >())
Definition: plot_roc.cxx:357
marker_class(float icut, float isize, int icolor, int istyle)
Definition: plot_roc.cxx:368
sample_class(TString ilabel, std::vector< TString > ifiles, TString icut="1")
Definition: plot_roc.cxx:364