10 #include "TDirectory.h" 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*");
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*");
32 v_tt.push_back(
"archive/ra4skim/*TT*");
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
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"));
86 int mini_style(8);
float mini_size(2);
87 vector<marker_class> mus_std, mus_new, els_std, cuts_miniso;
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));
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));
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));
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));
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));
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"};
135 TString htcuts[] = {
"1",
"ht>=750&&ht<1000",
"ht>=750&&ht<1500"};
136 TString metcuts[] = {
"1",
"met>=200&&met<600"};
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");
234 void DrawROC(vector<sample_class> samples, vector<var_class> vars, TString cuts, TString tag){
236 const int nbins(1000);
237 vector<vector<TH1D> > histos;
238 TString hname, totcut;
241 for(
unsigned sam(0); sam < samples.size(); sam++){
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]);
247 histos.push_back(vector<TH1D>());
250 for(
unsigned var(0); var<vars.size(); var++){
251 float minh(vars[var].minx), maxh(vars[var].maxx);
254 maxh = vars[var].minx;
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);
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);
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);
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");
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");
312 for(
unsigned sam(0); sam < samples.size(); sam++)
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");
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);
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);
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);
349 TString name(good.GetName());
352 graph.SetTitle(name);
358 int istyle, vector<marker_class> icuts){
359 varname = ivarname; minx = iminx; maxx = imaxx; title = ititle;
361 color = icolor; style = istyle;
365 files = ifiles; label = ilabel; cut = icut;
369 cut=icut; size=isize; color=icolor; style=istyle;
TGraph MakeROC(TH1D &good, TH1D &bad, const bool less_is_better, vector< marker_class > cuts)
void DrawROC(vector< sample_class > samples, vector< var_class > vars, TString cuts, TString tag)
var_class(TString ivarname, float iminx, float imaxx, TString ititle, int icolor, int istyle=1, std::vector< marker_class > icuts=std::vector< marker_class >())
marker_class(float icut, float isize, int icolor, int istyle)
sample_class(TString ilabel, std::vector< TString > ifiles, TString icut="1")