ra4_macros  bede988c286599a3a84b77a4d788ac0a971e89f9
plot_mj_roc_aux.cxx
Go to the documentation of this file.
1 // plot_mj_roc_aux: 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 #include "TStyle.h"
13 
14 #include "styles.hpp"
15 #include "utilities.hpp"
16 #include "plot_mj_roc_aux.hpp"
17 #include "utilities_macros.hpp"
18 
19 using namespace std;
20 
21 int main(){
22  TString bfolder("");
23  string hostname = execute("echo $HOSTNAME");
24  if(Contains(hostname, "cms") || Contains(hostname, "compute-"))
25  bfolder = "/net/cms2"; // In laptops, you can't create a /net folder
26 
27  TString folder=bfolder+"/cms2r0/babymaker/babies/2016_04_29/mc/merged_baseline/";
28  TString scan_folder=bfolder+"/cms2r0/babymaker/babies/2016_04_29/mc/T1tttt/skim_baseline/";
29 
30  // NTUPLES
31  vector<TString> v_t1t;
32  v_t1t.push_back(folder+"*T1tttt*1500_*-100_*");
33 
34  vector<TString> v_t1tc;
35  v_t1tc.push_back(folder+"*T1tttt*1200_*-800_*");
36 
37  vector<TString> v_t1t_1800_200;
38  v_t1t_1800_200.push_back(scan_folder+"*T1tttt*1800_*-200_*");
39 
40  vector<TString> v_t1t_1600_1000;
41  v_t1t_1600_1000.push_back(scan_folder+"*T1tttt*1600_*-1000_*");
42 
43  vector<TString> v_t1t_1400_1000;
44  v_t1t_1400_1000.push_back(scan_folder+"*T1tttt*1400_*-1000_*");
45 
46  vector<TString> v_tt;
47  v_tt.push_back(folder+"*TTJets*HT*");
48  v_tt.push_back(folder+"*TTJets*Lept*");
49 
51  TString lsp = "{#lower[-0.1]{#tilde{#chi}}#lower[0.2]{#scale[0.85]{^{0}}}#kern[-1.3]{#scale[0.85]{_{1}}}}";
52  TString t1t_label = "#tilde{g}#kern[0.2]{#tilde{g}}, #tilde{g}#rightarrowt#kern[0.18]{#bar{t}}#kern[0.18]"+lsp;
53  vector<sample_class> tt_t1t;
54  tt_t1t.push_back(sample_class(t1t_label+" (1500,100)", v_t1t));
55  tt_t1t.push_back(sample_class("t#bar{t}", v_tt));
56 
57  vector<sample_class> tt_t1tc;
58  tt_t1tc.push_back(sample_class(t1t_label+" (1200,800)", v_t1tc));
59  tt_t1tc.push_back(sample_class("t#bar{t}", v_tt));
60 
61  vector<sample_class> tt_t1t_1800_200;
62  tt_t1t_1800_200.push_back(sample_class(t1t_label+" (1800,200)", v_t1t_1800_200));
63  tt_t1t_1800_200.push_back(sample_class("t#bar{t}", v_tt));
64 
65  vector<sample_class> tt_t1t_1600_1000;
66  tt_t1t_1600_1000.push_back(sample_class(t1t_label+" (1600,1000)", v_t1t_1600_1000));
67  tt_t1t_1600_1000.push_back(sample_class("t#bar{t}", v_tt));
68 
69  vector<sample_class> tt_t1t_1400_1000;
70  tt_t1t_1400_1000.push_back(sample_class(t1t_label+" (1400,1000)", v_t1t_1400_1000));
71  tt_t1t_1400_1000.push_back(sample_class("t#bar{t}", v_tt));
72 
73 
75  int ht_col(1), mj_col(kAzure+2), col2(kGreen+1), col3(kRed+1), col4(kOrange+7);
76  int mj_style(8); float mj_size(2.);
77  vector<marker_class> mj_points, mj08_points, mj14_points, mj16_points, ht_points, met_points, nj_points;
78 
79  mj_points.push_back(marker_class(400, 4, mj_col, 29));
80  mj08_points.push_back(marker_class(400, 4, col2, 29));
81  mj14_points.push_back(marker_class(400, 4, col3, 29));
82  mj16_points.push_back(marker_class(400, 4, col4, 29));
83 
84 
85  ht_points.push_back(marker_class(1000, 4, ht_col, 29));
86  ht_points.push_back(marker_class(1500, mj_size, ht_col, mj_style));
87  //ht_points.push_back(marker_class(2000, mj_size, ht_col, mj_style));
88  //ht_points.push_back(marker_class(2500, mj_size, ht_col, mj_style));
89 
90  met_points.push_back(marker_class(400, 4, col2, 29));
91  met_points.push_back(marker_class(600, mj_size, col2, mj_style));
92  //met_points.push_back(marker_class(800, mj_size, col2, mj_style));
93 
94  nj_points.push_back(marker_class(6, mj_size, col3, mj_style));
95  nj_points.push_back(marker_class(9, 4, col3, 29));
96  nj_points.push_back(marker_class(11, mj_size, col3, mj_style));
97 
98  vector<var_class> mj_general;
99  mj_general.push_back(var_class("ht",4000,0,"H_{T}",ht_col,2,ht_points));
100  mj_general.push_back(var_class("met",1500,0,"E_{T}^{miss}",col2,1,met_points));
101  mj_general.push_back(var_class("njets30",15,0,"N_{jets}",col3,1,nj_points));
102  mj_general.push_back(var_class("mj_30",2000,0,"M_{J}",mj_col,1,mj_points));
103 
104  vector<var_class> mj_cands;
105  //mj_cands.push_back(var_class("ht",4000,0,"H_{T}",ht_col,2,ht_points));
106  mj_cands.push_back(var_class("mj_cands",2200,0,"M_{J} PFcands",col2,1));
107  mj_cands.push_back(var_class("mj_cands_trim",2200,0,"M_{J} PFcands trimmed",col3,1));
108  mj_cands.push_back(var_class("mj_10",2200,0,"M_{J} 10 GeV jets",col4,1));
109  mj_cands.push_back(var_class("mj_30", 2200,0,"M_{J} 30 GeV jets",mj_col,1,mj_points));
110 
111  vector<var_class> mj_sizes;
112  //mj_sizes.push_back(var_class("ht",4000,0,"H_{T}",ht_col,2,ht_points));
113  mj_sizes.push_back(var_class("mj08",2200,0,"M_{J} R=0.8",col2,1));
114  mj_sizes.push_back(var_class("mj",2200,0,"M_{J} R=1.2",mj_col,1,mj_points));
115  mj_sizes.push_back(var_class("mj14", 2200,0,"M_{J} R=1.4",col3,1,mj14_points));
116  mj_sizes.push_back(var_class("mj16",2200,0,"M_{J} R=1.6",col4,1,mj16_points));
117 
119  vector<TString> vs_sam, vs_vars;
120  vector<vector<sample_class>*> v_sam;
121  v_sam.push_back(&tt_t1t); vs_sam.push_back("tt_t1t");
122  v_sam.push_back(&tt_t1tc); vs_sam.push_back("tt_t1tc");
123  v_sam.push_back(&tt_t1t_1800_200); vs_sam.push_back("tt_t1t_1800_200");
124  v_sam.push_back(&tt_t1t_1600_1000); vs_sam.push_back("tt_t1t_1600_1000");
125  v_sam.push_back(&tt_t1t_1400_1000); vs_sam.push_back("tt_t1t_1400_1000");
126 
127  vector<vector<var_class>*> v_vars;
128  //v_vars.push_back(&mj_general); vs_vars.push_back("general");
129  // v_vars.push_back(&mj_cands); vs_vars.push_back("cands");
130  v_vars.push_back(&mj_sizes); vs_vars.push_back("size");
131 
132  vector<TString> v_cuts;
133  v_cuts.push_back("ht>500&&met>200&&njets>=6&&nbm>=1&&nleps==1&&stitch");
134 
135  for(unsigned ivar(0); ivar<v_vars.size(); ivar++){
136  for(unsigned icut(0); icut<v_cuts.size(); icut++){
137  for(unsigned isam(0); isam<v_sam.size(); isam++){
138  DrawROC(*(v_sam[isam]), *(v_vars[ivar]), v_cuts[icut], "mj_"+vs_sam[isam]+"_"+vs_vars[ivar]);
139  } // Loop over samples
140  } // Loop over cuts
141  } // Loop over variables
142 
143 }
144 
145 
146 
147 void DrawROC(vector<sample_class> samples, vector<var_class> vars, TString cuts, TString tag){
148  styles style("RA4"); style.setDefaultStyle();
149  TCanvas can;
150  const int nbins(1000);
151  vector<vector<TH1D> > histos;
152  TString hname, totcut;
153  TChain *chain[2];
154 
155  for(unsigned sam(0); sam < samples.size(); sam++){
156  // Loading chains
157  for(unsigned isam(0); isam < samples[sam].files.size(); isam++){
158  chain[sam] = new TChain("tree");
159  int nfiles = chain[sam]->Add(samples[sam].files[isam]);
160  if(nfiles==0) cout<<samples[sam].files[isam]<<" not found"<<endl;
161  }
162  histos.push_back(vector<TH1D>());
163 
164  // Projecting variables
165  for(unsigned var(0); var<vars.size(); var++){
166  float minh(vars[var].minx), maxh(vars[var].maxx);
167  if(minh > maxh){
168  minh = maxh;
169  maxh = vars[var].minx;
170  }
171  hname = "histo"; hname += sam; hname += var;
172  totcut = "weight*("+cuts+"&&"+samples[sam].cut+")";
173  histos[sam].push_back(TH1D(hname,"",nbins,minh,maxh));
174  chain[sam]->Project(hname, vars[var].varname, totcut);
175  } // Loop over variables
176  } // Loop over samples
177 
178  TH1D base_histo("base","",1,0.03,1.0);
179  base_histo.SetMinimum(0.0);
180  base_histo.SetMaximum(1.0);
181  base_histo.SetDirectory(0);
182  base_histo.Draw();
183  style.setTitles(&base_histo, samples[0].label+" efficiency", samples[1].label+" efficiency",
184  "#scale[0.8]{#font[62]{CMS}} #scale[0.6]{#font[52]{Supplementary (Simulation)}}", "#scale[0.8]{13 TeV}");
185 
186  // Legend
187  double legX = style.PadLeftMargin+0.03, legY = 1-style.PadTopMargin-0.02, legSingle = 0.064;
188  double legW = 0.2, legH = legSingle*vars.size();
189  TLegend leg(legX, legY-legH, legX+legW, legY);
190  leg.SetTextSize(0.057); leg.SetFillColor(0); leg.SetFillStyle(0); leg.SetBorderSize(0);
191  leg.SetTextFont(132);
192 
193  // Making individual graphs
194  TGraph graphs[100]; // Had to make it an array because a vector<TGraph> kept crashing
195  for(unsigned var(0); var<vars.size(); var++){
196  graphs[var] = MakeROC(histos[0][var], histos[1][var], vars[var].minx < vars[var].maxx, vars[var].cuts);
197  graphs[var].SetLineColor(vars[var].color);
198  graphs[var].SetLineStyle(vars[var].style);
199  graphs[var].SetLineWidth(5);
200  leg.AddEntry(&(graphs[var]), vars[var].title, "l");
201  graphs[var].Draw("lsame");
202  } // Loop over variables
203  leg.Draw();
204 
205  cuts.ReplaceAll(".","");
206  cuts.ReplaceAll("(",""); cuts.ReplaceAll("$",""); cuts.ReplaceAll(")","");
207  cuts.ReplaceAll("[",""); cuts.ReplaceAll("]","");
208  cuts.ReplaceAll("/","_"); cuts.ReplaceAll("*",""); cuts.ReplaceAll("&&","_");
209  cuts.ReplaceAll(">=","ge"); cuts.ReplaceAll("<=","se");
210  cuts.ReplaceAll(">","g"); cuts.ReplaceAll("<","s"); cuts.ReplaceAll("=","");
211  cuts.ReplaceAll("+","");
212  TString pname("plots/roc/roc_"+tag+"_"+cuts+".pdf");
213  can.Print(pname);
214  can.SetLogx(1);
215  can.SetLogy(1);
216  pname.ReplaceAll("roc_","log_roc_");
217  base_histo.SetMinimum(3e-4);
218  can.Print(pname);
219 
220  for(unsigned sam(0); sam < samples.size(); sam++)
221  chain[sam]->Delete();
222 }
223 
224 TGraph MakeROC(TH1D &good, TH1D &bad, const bool less_is_better, vector<marker_class> cuts){
225  const int nbins = good.GetNbinsX();
226  if(bad.GetNbinsX() != nbins) throw logic_error("Mismatched number of bins");
227 
228  TMarker marker;
229 
230  TGraph graph(0);
231  const double good_tot = good.Integral(0, nbins+1);
232  const double bad_tot = bad.Integral(0, nbins+1);
233  int inibin(0), endbin(nbins+1), dbin(1); unsigned icut(0);
234  if(less_is_better){
235  inibin = nbins+1;
236  endbin = 0;
237  dbin = -1;
238  }
239  for(int bin = inibin; bin*dbin<=endbin*dbin; bin+=dbin){
240  const double good_pass = good.Integral(min(endbin,bin), max(endbin,bin));
241  const double bad_pass = bad.Integral(min(endbin,bin), max(endbin,bin));
242  const double x = good_pass/good_tot;
243  const double y = bad_pass/bad_tot;
244  graph.SetPoint(graph.GetN(), x, y);
245 
246  // Plotting the stars
247  if(icut<cuts.size()){
248  float edge(good.GetXaxis()->GetBinUpEdge(bin));
249  if((edge>=cuts[icut].cut&&!less_is_better) || (edge<=cuts[icut].cut&&less_is_better)){
250  marker.SetMarkerStyle(cuts[icut].style);marker.SetMarkerColor(cuts[icut].color);
251  marker.SetMarkerSize(cuts[icut].size);
252  if(x>0.01 && y>0.0001) marker.DrawMarker(x,y);
253  icut++;
254  }
255  }
256  }
257  TString name(good.GetName());
258  name += "graph";
259  graph.SetName(name);
260  graph.SetTitle(name);
261 
262  return graph;
263 }
264 
265 var_class::var_class(TString ivarname, float iminx, float imaxx, TString ititle, int icolor,
266  int istyle, vector<marker_class> icuts){
267  varname = ivarname; minx = iminx; maxx = imaxx; title = ititle;
268  cuts = icuts;
269  color = icolor; style = istyle;
270 }
271 
272 sample_class::sample_class(TString ilabel, vector<TString> ifiles, TString icut){
273  files = ifiles; label = ilabel; cut = icut;
274 }
275 
276 marker_class::marker_class(float icut, float isize, int icolor, int istyle){
277  cut=icut; size=isize; color=icolor; style=istyle;
278 }
279 
void setDefaultStyle()
Definition: styles.cpp:36
bool Contains(const std::string &text, const std::string &pattern)
void DrawROC(vector< sample_class > samples, vector< var_class > vars, TString cuts, TString tag)
float PadTopMargin
Definition: styles.hpp:36
STL namespace.
int main()
TGraph MakeROC(TH1D &good, TH1D &bad, const bool less_is_better, vector< marker_class > cuts)
std::string execute(const std::string &cmd)
void setTitles(TH1 *h, TString xTitle="", TString yTitle="", TString Left="", TString Right="")
Definition: styles.cpp:173
float PadLeftMargin
Definition: styles.hpp:36
marker_class(float icut, float isize, int icolor, int istyle)
var_class(std::vector< sample_class > samples, TString ivarname, float iminx, float imaxx, TString ititle, int icolor, int istyle=1, std::vector< marker_class > icuts=std::vector< marker_class >())
sample_class(TString ilabel, std::vector< TString > ifiles, TString icut="1")