ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.13
Committed: Wed Apr 18 10:28:20 2012 UTC (13 years ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.12: +1 -1 lines
Log Message:
also doing diboson plots for main variable now

File Contents

# Content
1 #include <iostream>
2 #include <vector>
3 #include <sys/stat.h>
4
5 #include <TCut.h>
6 #include <TROOT.h>
7 #include <TCanvas.h>
8 #include <TMath.h>
9 #include <TColor.h>
10 #include <TPaveText.h>
11 #include <TRandom.h>
12 #include <TH1.h>
13 #include <TH2.h>
14 #include <TF1.h>
15 #include <TSQLResult.h>
16 #include <TProfile.h>
17 #include <TLegendEntry.h>
18
19 using namespace std;
20
21 using namespace PlottingSetup;
22
23 void todo() {
24 dout << "My to do list: " << endl;
25 dout << " - ExperimentalModule::Poisson_ratio_plot : Get the second part to work!" << endl;
26 dout << " - compare_onpeak_offpeak_signal_distributions: Implement this function ... " << endl;
27 dout << "Info : The trigger requirement is currently set to " << (const char*) passtrig << endl;
28 dout << "Info : The pt requirement is currently set to " << (const char*) passtrig << endl;
29 dout << "Info : The mll requirement is currently set to " << (const char*) cutmass << endl;
30 dout << "Info : The lepton requirement is currently set to " << (const char*) leptoncut << endl;
31 }
32
33 void find_peaks(float &MCPeak,float &MCPeakError, float &DataPeak, float &DataPeakError, float &MCSigma, float &DataSigma, stringstream &result, bool doPUreweighting = true )
34 {
35 // Temporarily switch off PU reweighting, if asked
36 TCut weightbackup=cutWeight;
37 if ( !doPUreweighting ) cutWeight="1.0";
38
39 TCanvas *tempcan = new TCanvas("tempcan","Temporary canvas for peak finding preparations");
40 TH1F *rawJZBeemmMC = allsamples.Draw("rawJZBeemmMC",jzbvariablemc,100,-50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc, luminosity);
41 TH1F *rawJZBeemmData = allsamples.Draw("rawJZBeemmData",jzbvariabledata,100, -50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
42 TH1F *rawJZBemMC = allsamples.Draw("rawJZBemMC",jzbvariablemc,100,-50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,mc, luminosity);
43 TH1F *rawJZBemData = allsamples.Draw("rawJZBemData",jzbvariabledata,100, -50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
44 TH1F *rawttbarjzbeemmMC;
45
46 if(method==doKM) {
47 //we only need this histo for the KM fitting...
48 rawttbarjzbeemmMC = allsamples.Draw("rawttbarjzbeemmMC",jzbvariablemc,100, -50,50, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample("TTJet"));
49 MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
50 DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
51 }
52 else {
53 TH1F *reducedMC = (TH1F*)rawJZBeemmMC->Clone();
54 TH1F *reducedData = (TH1F*)rawJZBeemmData->Clone();
55 reducedMC->Add(rawJZBemMC,-1);
56 reducedData->Add(rawJZBemData,-1);
57 //this is Kostas' way of doing it - we subtract em to get rid of some of the ttbar contribution (in reality, of flavor-symmetric contribution)
58 MCPeak=find_peak(reducedMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
59 DataPeak=find_peak(reducedData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
60
61 }
62
63 // Revert to original PU reweighting
64 if ( !doPUreweighting ) cutWeight = weightbackup;
65
66 // MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
67 // DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
68 dout << "We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- ?? (not impl.)" << endl;
69 result << "We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- ?? (not impl.)" << endl;
70 dout << "We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- ?? (not impl.)" << endl;
71 result << "We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- ?? (not impl.)" << endl;
72 delete tempcan;
73 }
74
75 void make_special_obs_pred_mll_plot(string mcjzb, float jzbthreshold) {
76 float min=70.0;
77 float max=115.0;
78 if(!PlottingSetup::RestrictToMassPeak) {
79 min=10;
80 max=150;
81 }
82 int nbins=int((max-min)/5);
83
84 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
85
86 stringstream largerzeroS;
87 largerzeroS << "(" << mcjzb << ">" << jzbthreshold << ")";
88 TCut largerzero(largerzeroS.str().c_str());
89
90 stringstream smallerzeroS;
91 smallerzeroS << "(" << mcjzb << "<-" << jzbthreshold << ")";
92 TCut smallerzero(smallerzeroS.str().c_str());
93
94 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzero,data,luminosity);
95 THStack mcRcorrJZBeemm = allsamples.DrawStack("mcRcorrJZBeemm","mll",nbins,min,max, "m_{ll} [GeV}", "events", cutmass&&cutOSSF&&cutnJets&&largerzero,mc,luminosity);
96 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&smallerzero,data,luminosity);
97 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&largerzero,data,luminosity);
98 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&smallerzero,data,luminosity);
99
100 TH1F *RcorrJZBSBem;
101 TH1F *LcorrJZBSBem;
102 TH1F *RcorrJZBSBeemm;
103 TH1F *LcorrJZBSBeemm;
104
105 TH1F *RcorrJZBeemmNoS;
106
107 if(PlottingSetup::RestrictToMassPeak) {
108 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&largerzero,data, luminosity);
109 LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&smallerzero,data, luminosity);
110 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&largerzero,data, luminosity);
111 LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&smallerzero,data, luminosity);
112 }
113
114 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
115 if(PlottingSetup::RestrictToMassPeak) {
116 Bpred->Add(RcorrJZBem,1.0/3.);
117 Bpred->Add(LcorrJZBem,-1.0/3.);
118 Bpred->Add(RcorrJZBSBem,1.0/3.);
119 Bpred->Add(LcorrJZBSBem,-1.0/3.);
120 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
121 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
122 } else {
123 Bpred->Add(RcorrJZBem,1.0);
124 Bpred->Add(LcorrJZBem,-1.0);
125 }
126
127 Bpred->SetLineColor(kRed);
128
129 RcorrJZBeemm->Draw();
130 mcRcorrJZBeemm.Draw("same");
131 Bpred->Draw("histo,same");
132 RcorrJZBeemm->Draw("same");
133
134 TLegend *leg = allsamples.allbglegend();
135 leg->SetX1(0.58);
136 leg->AddEntry(RcorrJZBeemm,"observed (data)","l");
137 leg->AddEntry(Bpred,"predicted (data)","l");
138 leg->Draw("same");
139
140 stringstream saveas;
141 saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold;
142 CompleteSave(ckin,saveas.str());
143
144 delete RcorrJZBeemm;
145 delete LcorrJZBeemm;
146 delete RcorrJZBem;
147 delete LcorrJZBem;
148 if(PlottingSetup::RestrictToMassPeak) {
149 delete RcorrJZBSBeemm;
150 delete LcorrJZBSBeemm;
151 delete RcorrJZBSBem;
152 delete LcorrJZBSBem;
153 }
154 delete Bpred;
155 delete ckin;
156 }
157
158 void make_special_mll_plot(int nbins, float min, float max, bool logscale,string xlabel) {
159
160 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
161
162 TH1F *datahistoOSSF = allsamples.Draw("datahistoOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,data,luminosity);
163 THStack mcstackOSSF = allsamples.DrawStack("mcstackOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,mc,luminosity);
164 TH1F *datahistoOSOF = allsamples.Draw("datahistoOSOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&cutnJets&&basiccut,data,luminosity);
165
166 if(logscale) ckin->SetLogy(1);
167 datahistoOSSF->SetMarkerSize(DataMarkerSize);
168 datahistoOSSF->GetXaxis()->SetTitle(xlabel.c_str());
169 datahistoOSSF->GetXaxis()->CenterTitle();
170 datahistoOSSF->GetYaxis()->SetTitle("events");
171 datahistoOSSF->GetYaxis()->CenterTitle();
172 datahistoOSOF->SetMarkerSize(DataMarkerSize);
173 datahistoOSSF->SetMarkerSize(DataMarkerSize);
174 datahistoOSSF->Draw();
175
176 mcstackOSSF.Draw("same");
177 datahistoOSSF->Draw("same");
178
179 datahistoOSOF->SetMarkerColor(TColor::GetColor("#FE642E"));
180 datahistoOSOF->SetLineColor(kRed);
181 datahistoOSOF->SetMarkerStyle(21);
182 datahistoOSOF->Draw("same");
183
184 // Try to re-arrange legend...
185 TLegend *bgleg = allsamples.allbglegend("",datahistoOSSF);
186 TLegend *kinleg = make_legend();
187 kinleg->AddEntry(datahistoOSSF,"SF (data)","p");
188 kinleg->AddEntry(datahistoOSOF,"OF (data)","p");
189 TIter next(bgleg->GetListOfPrimitives());
190 TObject* obj;
191 // Copy the nice bkgd legend skipping the "data"
192 while ( obj = next() )
193 if ( strcmp(((TLegendEntry*)obj)->GetObject()->GetName(),"datahistoOSSF") )
194 kinleg->GetListOfPrimitives()->Add(obj);
195
196 kinleg->Draw();
197 CompleteSave(ckin,"kin/mll_ossf_osof_distribution");
198
199 delete datahistoOSOF;
200 delete datahistoOSSF;
201 delete ckin;
202 }
203
204
205 void draw_ratio_plot(TH1* hdata, THStack& hmc, float ymin=0.5, float ymax=1.5) {
206
207 // Make a histogram from stack
208 TIter next(hmc.GetHists());
209 TObject* obj;
210 TH1* hratio = NULL;
211 while ( obj = next() ) {
212 if ( !hratio ) {
213 hratio = (TH1*)obj->Clone();
214 hratio->SetName("hratio");
215 } else hratio->Add( (TH1*)obj );
216 }
217 hratio->Divide(hdata);
218 hratio->SetMaximum(ymax);
219 hratio->SetMinimum(ymin);
220 hratio->SetMarkerStyle(2);
221 hratio->SetLineWidth(1);
222 hratio->GetYaxis()->SetLabelSize(0.08);
223 hratio->GetXaxis()->SetLabelSize(0.0);
224
225 TPad* rpad = new TPad("rpad","",0.15,0.73,0.4,0.88);
226 rpad->SetTopMargin(0.0);
227 rpad->SetBottomMargin(0.0);
228 rpad->SetRightMargin(0.0);
229 rpad->Draw();
230 rpad->cd();
231 // hratio->GetXaxis()->SetNdivisions(0);
232 hratio->GetYaxis()->SetNdivisions(502,false);
233 hratio->Draw("e1x0");
234
235 TF1* oneline = new TF1("","1.0",0,1000);
236 oneline->SetLineColor(kBlue);
237 oneline->SetLineStyle(1);
238 oneline->SetLineWidth(1);
239 oneline->Draw("same");
240 }
241
242 float lastrange_min=0;
243 float lastrange_max=0;
244
245 void make_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
246 string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
247 // TCut basiccut("(pfJetGoodNum>=2&&pfJetGoodID[0])&&(pfJetGoodNum>=2&&pfJetGoodID[1])&&(passed_triggers||!is_data)");
248 TCut ibasiccut=basiccut;
249 bool draw_separation_lines=false;
250
251 if(isPF) ibasiccut=basiccut&&"pfjzb[0]>-998";
252
253 if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
254
255 //Step 1: Adapt the variable (if we're dealing with PF we need to adapt the variable!)
256 if(isPF) {
257 if(variable=="mll") variable="pfmll[0]";
258 if(variable=="jetpt[0]") variable="pfJetGoodPt[0]";
259 if(variable=="jeteta[0]") variable="pfJetGoodEta[0]";
260 if(variable=="pt") variable="pfpt[0]";
261 if(variable=="pt1") variable="pfpt1[0]";
262 if(variable=="pt2") variable="pfpt2[0]";
263 if(variable=="eta1") variable="pfeta1[0]";
264 if(variable=="jzb[1]") variable="pfjzb[0]";
265 //if(variable=="pfJetGoodNum") variable="pfJetGoodNum"; // pointless.
266 }
267
268 //Step 2: Refine the cut
269 TCut cut;
270 cut=cutmass&&cutOSSF&&cutnJets&&ibasiccut;
271 if(filename=="nJets") cut=cutmass&&cutOSSF&&ibasiccut;
272 if(filename=="nJets_nocuts_except_mll_ossf") cut=cutmass&&cutOSSF;
273 if(filename=="mll") {
274 cut=cutOSSF&&cutnJets&&ibasiccut;
275 draw_separation_lines=true;
276 }
277 if(filename=="mll_ee") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==0";
278 if(filename=="mll_osof") {
279 cut=cutOSOF&&cutnJets&&ibasiccut;
280 draw_separation_lines=true;
281 }
282 if(filename=="mll_mm") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==1";
283 if(Contains(filename,"mll_aboveJZB100")) cut=cutOSSF&&cutnJets&&ibasiccut;
284 if(Contains(filename,"mll_osof_aboveJZB")) cut=cutOSOF&&cutnJets&&ibasiccut;
285 if(filename=="mll_inclusive"||filename=="mll_inclusive_highrange") cut=cutOSSF;
286 if(filename=="mll_inclusive_osof") cut=cutOSOF;
287 if(filename=="mll_inclusive_ee") cut=cutOSSF&&"id1==0";
288 if(filename=="mll_inclusive_mm") cut=cutOSSF&&"id1==1";
289 if(filename=="pfJetGoodEta_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
290 if(filename=="pfJetGoodPt_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
291
292 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
293 ckin->SetLogy(logscale);
294 TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
295 datahisto->SetMarkerSize(DataMarkerSize);
296 THStack mcstack = allsamples.DrawStack("mcstack",variable,nbins,min,max, xlabel, "events",cut,mc,luminosity);
297 if(variable=="pfJetGoodPt[0]") datahisto->SetMaximum(10*datahisto->GetMaximum());
298 if(variable=="pt") datahisto->SetMaximum(10*datahisto->GetMaximum());
299 if(filename=="mll_inclusive") datahisto->SetMinimum(1);
300 if(filename=="mll_osof") datahisto->SetMaximum(10*datahisto->GetMaximum());
301 if(filename=="mll_osof") datahisto->SetMinimum(9);
302
303 datahisto->SetMaximum(5.3*datahisto->GetMaximum());
304 datahisto->Draw("e1");
305 ckin->Update();
306 if(loadlastminmax) {
307 datahisto->SetMinimum(lastrange_min);
308 datahisto->SetMaximum(lastrange_max);
309 if(logscale) {
310 datahisto->SetMinimum(pow(10,lastrange_min));
311 datahisto->SetMaximum(pow(10,lastrange_max));
312 }
313 }
314
315 mcstack.Draw("same");
316 datahisto->Draw("same,e1");
317 TLegend *kinleg = allsamples.allbglegend();
318 kinleg->Draw();
319 if(filename=="mll_osof") {
320 kinleg->SetHeader("Opposite flavor");
321 kinleg->SetX1(0.58);
322 }
323 if(filename=="mll") {
324 kinleg->SetHeader("Same flavor");
325 kinleg->SetX1(0.58);
326 }
327 TText* write_cut = write_cut_on_canvas(decipher_cut(cut,basicqualitycut));
328 write_cut->Draw();
329 TText* write_variable = write_text(0.99,0.01,variable);
330 write_variable->SetTextAlign(31);
331 write_variable->SetTextSize(0.02);
332
333 TLine *lowerboundary;
334 TLine *upperboundary;
335
336 if(RestrictToMassPeak&&draw_separation_lines) {
337 Color_t linecolor=kBlue;
338 float linemin=pow(10,ckin->GetUymin());
339 if(filename=="mll_osof") linemin=pow(10,lastrange_min);
340 lowerboundary = new TLine(71,linemin,71,datahisto->GetMaximum());
341 upperboundary = new TLine(111,linemin,111,datahisto->GetMaximum());
342 lowerboundary->SetLineColor(linecolor);
343 lowerboundary->SetLineStyle(2);
344 upperboundary->SetLineColor(linecolor);
345 upperboundary->SetLineStyle(2);
346 }
347
348 lastrange_min=ckin->GetUymin();
349 lastrange_max=ckin->GetUymax();
350
351
352 if ( plotratio ) {
353 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
354 kinpad->cd();
355 kinpad->SetLogy(logscale);
356 datahisto->Draw("e1");
357 mcstack.Draw("same");
358 datahisto->Draw("same,e1");
359 datahisto->Draw("same,axis");
360 if(RestrictToMassPeak&&draw_separation_lines) {
361 lowerboundary->Draw("same");
362 upperboundary->Draw("same");
363 }
364
365 kinleg->Draw();
366 write_cut->Draw();
367 DrawPrelim();
368 string saveas="kin/"+filename;
369 if(isPF) saveas="kin/"+filename+"__PF";
370 save_with_ratio(datahisto,mcstack,kinpad->cd(),saveas);
371 // if(isPF) CompleteSave(with_ratio,"kin/"+filename+"__PF_withratio");
372 // else CompleteSave(with_ratio,"kin/"+filename+"_withratio");
373 // delete with_ratio;
374 } else {
375 if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
376 else CompleteSave(ckin,"kin/"+filename);
377 }
378 datahisto->Delete();
379 delete ckin;
380 }
381
382 void make_JES_plot() {
383
384 int nbins=10;
385 float min=-0.5;
386 float max = 9.5;
387 bool logscale=true;
388 string xlabel="nJets";
389 TCut cut=cutmass&&cutOSSF&&basiccut;
390
391 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
392 ckin->SetLogy(logscale);
393 TH1F *datahisto = allsamples.Draw("datahisto","pfJetGoodNum",nbins,min,max, xlabel, "events",cut,data,luminosity);
394 datahisto->SetMarkerSize(DataMarkerSize);
395 THStack mcstack = allsamples.DrawStack("mcstack","pfJetGoodNum",nbins,min,max, xlabel, "events",cut,mc,luminosity);
396 TH1F *JESup = allsamples.Draw("JESup","pfJetGoodNum315",nbins,min,max, xlabel, "events",cut,mc,luminosity);
397 TH1F *JESdn = allsamples.Draw("JESdn","pfJetGoodNum285",nbins,min,max, xlabel, "events",cut,mc,luminosity);
398
399 datahisto->SetMinimum(1);
400 datahisto->SetMaximum(5.3*datahisto->GetMaximum()); // in line with kinematic plots style
401
402 float xs[nbins],ys[nbins],exs[nbins],eys[nbins];
403 for(int i=1;i<JESup->GetNbinsX();i++) {
404 float up=JESup->GetBinContent(i);
405 float dn=JESdn->GetBinContent(i);
406 xs[i]=JESup->GetBinCenter(i);
407 ys[i]=0.5*(up+dn);
408 exs[i]=0.5*JESup->GetBinWidth(i);
409 eys[i]=0.5*TMath::Abs(up-dn);
410 }
411
412 TGraphAsymmErrors *JESunc = new TGraphAsymmErrors(nbins, xs,ys,exs,exs,eys,eys);
413 JESunc->SetFillColor(TColor::GetColor("#00ADE1"));
414 JESunc->SetFillStyle(3002);
415 datahisto->Draw("e1");
416 mcstack.Draw("same");
417 JESunc->Draw("2");
418 datahisto->Draw("same,e1");
419 TLegend *kinleg = allsamples.allbglegend();
420 kinleg->AddEntry(JESunc,"JES uncertainty","f");
421 kinleg->Draw();
422 CompleteSave(ckin,"Systematics/JES");
423 datahisto->Delete();
424 delete ckin;
425
426 }
427
428 void do_kinematic_plots(string mcjzb, string datajzb, bool doPF=false)
429 {
430 bool dolog=true;
431 bool nolog=false;
432 if(doPF) write_warning(__FUNCTION__,"Please use caution when trying to produce PF plots; not all versions of the JZB trees have these variables!");
433 float mll_low=40;
434 float mll_hi=160;
435 if(!PlottingSetup::RestrictToMassPeak) {
436 mll_low=10;
437 mll_hi=210;
438 }
439 /*
440 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll",doPF,true);
441 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof",doPF,true,true);
442 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee",doPF,true);
443 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm",doPF,true);
444 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive",doPF,true);
445 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_ee",doPF,true);
446 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_mm",doPF,true);
447 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_osof",doPF,true);
448 make_kin_plot("mll","",(int)((350-mll_low)),mll_low,350,dolog,"m_{ll} [GeV]","mll_inclusive_highrange",doPF);/*
449 make_kin_plot("numVtx","",(int)(30.5-(-0.5)),-0.5,30.5,nolog,"N(Vtx)","numVtx",doPF);
450 make_kin_plot("jetpt[0]","",40,0,200,dolog,"leading jet p_{T} [GeV]","pfJetGoodPt_0",doPF);
451 make_kin_plot("jeteta[0]","",40,-5,5,nolog,"leading jet #eta","pfJetGoodEta_0",doPF);
452 make_kin_plot("pt","",50,0,400,dolog,"Z p_{T} [GeV]","Zpt",doPF);
453 make_kin_plot("pt1","",50,0,100,nolog,"p_{T} [GeV]","pt1",doPF);
454 make_kin_plot("pt2","",50,0,100,nolog,"p_{T} [GeV]","pt2",doPF);
455 make_kin_plot("eta1","",40,-5,5,nolog,"#eta_{l}","eta",doPF);
456 make_kin_plot("jzb[1]","",100,-150,150,dolog,"JZB [GeV]","jzb_ossf",doPF);
457 make_kin_plot("pfJetGoodNum","",8,0.5,8.5,dolog,"nJets","nJets",doPF);
458 make_kin_plot("pfJetGoodNum","",8,0.5,8.5,dolog,"nJets","nJets_nocuts_except_mll_ossf",doPF);*//*
459 if(!doPF) make_special_mll_plot((int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]");
460 stringstream jzbcut;
461 jzbcut << "((is_data&&("<<datajzb<<")>100)||(!is_data&&("<<mcjzb<<")>100))";
462 make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_aboveJZB100",doPF,true);
463 make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof_aboveJZB100",doPF,true);
464 make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_aboveJZB100",doPF,true);
465 make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof_aboveJZB100",doPF,true);
466 stringstream jzbcut2;
467 jzbcut2 << "((is_data&&("<<datajzb<<")>150)||(!is_data&&("<<mcjzb<<")>150))";
468 make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_aboveJZB150",doPF,true);
469 make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof_aboveJZB150",doPF,true);
470 stringstream jzbcut3;
471 jzbcut3 << "((is_data&&("<<datajzb<<")>50)||(!is_data&&("<<mcjzb<<")>50))";
472 make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_aboveJZB50",doPF,true); make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof_aboveJZB50",doPF,true,true);
473 */
474 make_special_obs_pred_mll_plot(mcjzb,50);
475 make_special_obs_pred_mll_plot(mcjzb,100);
476 make_special_obs_pred_mll_plot(mcjzb,150);
477 make_special_obs_pred_mll_plot(mcjzb,200);
478 make_special_obs_pred_mll_plot(mcjzb,250);
479 }
480
481 void make_comp_plot( string var, string xlabel, string filename, float jzbcut, string mcjzb, string datajzb,
482 int nbins, float xmin, float xmax, bool log,
483 float ymin=0, float ymax=0, bool leftJustified=false ) {
484 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- WATCH OUT: the argument in the function changed!
485
486 TCut weightbackup=cutWeight;//backing up the correct weight (restoring below!)
487 if(weightbackup==TCut("1.0")||weightbackup==TCut("1")) write_warning(__FUNCTION__,"WATCH OUT THE WEIGHT HAS POSSIBLY NOT BEEN RESET!!!! PLEASE CHANGE LINE "+any2string(__LINE__));
488 if(var=="numVtx") cutWeight=TCut("1.0");
489 TCut jzbData[]= { TCut(TString(datajzb+">"+any2string(jzbcut))),TCut(TString(datajzb+"<-"+any2string(jzbcut))) };
490 TCut jzbMC[] = { TCut(TString(mcjzb+">"+any2string(jzbcut))),TCut(TString(mcjzb+"<-"+any2string(jzbcut))) };
491
492 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- below: the next ~20 lines changed!
493 int nRegions=4;
494 if(!PlottingSetup::RestrictToMassPeak) {
495 nRegions=2;
496 }
497
498 string sRegions[] = { "SFZP","OFZP","SFSB","OFSB" };
499 TCut kRegions[] = { cutOSSF&&cutnJets&&cutmass, cutOSOF&&cutnJets&&cutmass,
500 cutOSSF&&cutnJets&&sidebandcut, cutOSOF&&cutnJets&&sidebandcut };
501
502 //find ymax
503 TH1F *Refdatahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[0]&&jzbData[0],data,luminosity);
504 ymax=int((Refdatahisto->GetMaximum()+2*TMath::Sqrt(Refdatahisto->GetMaximum()))*1.2+0.5);
505 delete Refdatahisto;
506
507 for ( int iregion=0; iregion<nRegions; ++iregion )
508 for ( int ijzb=0; ijzb<2; ++ijzb ) {
509 TCanvas *ccomp = new TCanvas("ccomp","Comparison plot",600,400);
510 ccomp->SetLogy(log);
511 TH1F *datahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity);
512 TH1F *lm4histo = signalsamples.Draw("lm4histo", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity,signalsamples.FindSample("LM4"));
513 THStack mcstack = allsamples.DrawStack("mcstack",var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb], mc, luminosity);
514 datahisto->SetMarkerSize(DataMarkerSize);
515 if (ymax>ymin) datahisto->SetMaximum(ymax);
516 lm4histo->SetLineStyle(2);
517 datahisto->Draw("e1");
518 mcstack.Draw("same");
519 datahisto->Draw("same,e1");
520 // lm4histo->Draw("hist,same");
521 TLegend *kinleg = allsamples.allbglegend((sRegions[iregion]+(ijzb?"neg":"pos")).c_str());
522 if ( leftJustified ) {
523 Float_t w = kinleg->GetX2()-kinleg->GetX1();
524 kinleg->SetX1(0.2);
525 kinleg->SetX2(0.2+w);
526 }
527 // kinleg->AddEntry(lm4histo,"LM4","l");
528 kinleg->Draw();
529 TText* write_variable = write_text(0.99,0.01,var);
530 write_variable->SetTextAlign(31);
531 write_variable->SetTextSize(0.02);
532 ccomp->RedrawAxis();
533 CompleteSave(ccomp,"compare/JZBcut_at_"+any2string(jzbcut)+"/"+filename+"/"+filename+sRegions[iregion]+(ijzb?"neg":"pos"));
534 delete datahisto;
535 delete ccomp;
536 delete lm4histo;
537 }
538 cutWeight=weightbackup;
539 }
540
541
542 void region_comparison_plots(string mcjzb, string datajzb, vector<float> jzb_cuts) {
543 dout << "Creating comparison plots for signal and control regions" << endl;
544 // Compare a few quantities in the signal region and all 7 control regions
545
546 switch_overunderflow(true); // switching overflow/underflow bins on
547
548
549 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- the arguments changed
550 for(int ijzb=0;ijzb<jzb_cuts.size();ijzb++) {
551 float jzbcut=jzb_cuts[ijzb]; // Comparison plots are done for this JZB cut
552 float mll_low=50;float mll_high=170;
553 if(!PlottingSetup::RestrictToMassPeak) {
554 mll_high=200;
555 mll_low=50;
556 }
557 make_comp_plot("mll","m_{ll} [GeV]","mll",jzbcut,mcjzb,datajzb,30,mll_low,mll_high,false,0,16.);
558 make_comp_plot("met[4]","pfMET [GeV]","pfmet",jzbcut,mcjzb,datajzb,18,0,360,false,0,16.);
559 make_comp_plot("pfJetGoodNum","#(jets)","njets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
560 make_comp_plot("pt","Z p_{T} [GeV]","Zpt",jzbcut,mcjzb,datajzb,26,0,525,false,0.,21.);
561 make_comp_plot("numVtx","#(prim. vertices)","nvtx",jzbcut,mcjzb,datajzb,20,0.,20.,false,0,16.);
562 make_comp_plot("TMath::Abs(dphi)","#Delta#phi(leptons)","dphilep",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
563 make_comp_plot("TMath::Abs(dphi_sumJetVSZ[1])","#Delta#phi(Z,jets)","dphiZjets",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
564 }
565
566 switch_overunderflow(false); // switching overflow/underflow bins off
567 }
568
569
570
571 void do_kinematic_PF_plots(string mcjzb, string datajzb)
572 {
573 do_kinematic_plots(mcjzb,datajzb,true);
574 }
575
576 void signal_bg_comparison()
577 {
578 TCanvas *can = new TCanvas("can","Signal Background Comparison Canvas");
579 can->SetLogy(1);
580
581 int sbg_nbins=130;
582 float sbg_min=-500; //-110;
583 float sbg_max=800; //jzbHigh;
584
585 float simulatedlumi=luminosity;//in pb please - adjust to your likings
586
587 TH1F *JZBplotZJETs = allsamples.Draw("JZBplotZJETs",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/DY"));
588 TH1F *JZBplotLM4;
589 if(PlottingSetup::RestrictToMassPeak) JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM4"));
590 else JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM3"));
591 TH1F *JZBplotTtbar = allsamples.Draw("JZBplotTtbar",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("TTJets"));
592
593 JZBplotTtbar->SetLineColor(allsamples.GetColor("TTJet"));
594 JZBplotZJETs->SetFillColor(allsamples.GetColor("DY"));
595 JZBplotZJETs->SetLineColor(kBlack);
596 JZBplotLM4->SetLineStyle(2);
597 JZBplotZJETs->SetMaximum(JZBplotZJETs->GetMaximum()*5);
598 JZBplotZJETs->SetMinimum(1);
599
600 JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
601 JZBplotTtbar->SetMinimum(0.01);
602 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
603 JZBplotTtbar->DrawClone("histo");
604 JZBplotZJETs->Draw("histo,same");
605 JZBplotTtbar->SetFillColor(0);
606 JZBplotTtbar->DrawClone("histo,same");
607 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
608 JZBplotLM4->Draw("histo,same");
609
610
611 TLegend *signal_bg_comparison_leg2 = make_legend("",0.55,0.75,false);
612 signal_bg_comparison_leg2->AddEntry(JZBplotZJETs,"Z+Jets","f");
613 signal_bg_comparison_leg2->AddEntry(JZBplotTtbar,"t#bar{t}","f");
614 if(PlottingSetup::RestrictToMassPeak) signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM4","f");
615 else signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM3","f");
616 signal_bg_comparison_leg2->Draw();
617 DrawMCPrelim(simulatedlumi);
618 CompleteSave(can,"jzb_bg_vs_signal_distribution");
619
620 // Define illustrative set of SMS points
621 TCut kSMS1("MassGlu==250&&MassLSP==75");
622 TCut kSMS2("MassGlu==800&&MassLSP==200");
623 TCut kSMS3("MassGlu==1050&&MassLSP==850");
624 TCut kSMS4("MassGlu==1200&&MassLSP==100");
625
626 //If the scan samples haven't been loaded yet, this is a good point to load them (all of them!)
627 if((scansample.collection).size()<2) define_SMS_sample(false, allsamples, signalsamples, scansample, true); // loading ALL zones for the scans, not only the basic one.
628
629
630 TH1F *JZBplotSMS1 = scansample.Draw("JZBplotSMS1",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS1,mc,simulatedlumi,scansample.FindSample("t"));
631 JZBplotSMS1->Scale(JZBplotLM4->Integral()/JZBplotSMS1->Integral());
632
633 TH1F *JZBplotSMS2 = scansample.Draw("JZBplotSMS2",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS2,mc,simulatedlumi,scansample.FindSample("t"));
634 JZBplotSMS2->Scale(JZBplotLM4->Integral()/JZBplotSMS2->Integral());
635
636 TH1F *JZBplotSMS3 = scansample.Draw("JZBplotSMS3",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS3,mc,simulatedlumi,scansample.FindSample("t"));
637 JZBplotSMS3->Scale(JZBplotLM4->Integral()/JZBplotSMS3->Integral());
638
639 TH1F *JZBplotSMS4 = scansample.Draw("JZBplotSMS4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS4,mc,simulatedlumi,scansample.FindSample("t"));
640 JZBplotSMS4->Scale(JZBplotLM4->Integral()/JZBplotSMS4->Integral());
641
642 // Draw all plots overlaid
643 JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
644 JZBplotTtbar->SetMinimum(0.01);
645 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
646 JZBplotTtbar->DrawClone("histo");
647 JZBplotZJETs->Draw("histo,same");
648 JZBplotTtbar->SetFillColor(0);
649 JZBplotTtbar->DrawClone("histo,same");
650 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
651
652 JZBplotSMS1->SetLineColor(kRed+1);
653 JZBplotSMS2->SetLineColor(kBlue+1);
654 JZBplotSMS3->SetLineColor(kRed+1);
655 JZBplotSMS4->SetLineColor(kBlue+1);
656 JZBplotSMS3->SetLineStyle(2);
657 JZBplotSMS4->SetLineStyle(2);
658
659 JZBplotSMS1->Draw("histo,same");
660 JZBplotSMS2->Draw("histo,same");
661 JZBplotSMS3->Draw("histo,same");
662 JZBplotSMS4->Draw("histo,same");
663 JZBplotLM4->SetLineColor(kGreen);JZBplotLM4->Draw("histo,same");
664 TLegend *signal_bg_comparison_leg6 = make_legend("",0.55,0.55,false);
665 signal_bg_comparison_leg6->AddEntry(JZBplotZJETs,"Z+Jets","f");
666 signal_bg_comparison_leg6->AddEntry(JZBplotTtbar,"t#bar{t}","f");
667 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"","");
668 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"SMS parameters","");
669 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"(250,75) [GeV]","f");
670 signal_bg_comparison_leg6->AddEntry(JZBplotSMS2,"(800,200) [GeV]","f");
671 signal_bg_comparison_leg6->AddEntry(JZBplotSMS3,"(1050,850) [GeV]","f");
672 signal_bg_comparison_leg6->AddEntry(JZBplotSMS4,"(1200,100) [GeV]","f");
673 signal_bg_comparison_leg6->AddEntry(JZBplotLM4,"LM4","f");
674 signal_bg_comparison_leg6->Draw();
675 DrawMCPrelim(simulatedlumi);
676 CompleteSave(can,"jzb_bg_vs_signal_distribution_SMS__summary");
677
678 while((scansample.collection).size() > 1) scansample.RemoveLastSample();
679
680 }
681
682 vector<TF1*> do_cb_fit_to_plot(TH1F *histo, float Sigma, float doingfitacrosstheboard=false) {
683 TF1 *BpredFunc = new TF1("BpredFunc",InvCrystalBall,0,1000,5);
684 BpredFunc->SetParameter(0,histo->GetBinContent(1));
685 if(doingfitacrosstheboard) BpredFunc->SetParameter(0,histo->GetMaximum());
686 BpredFunc->SetParameter(1,0.);
687 if(method==1) BpredFunc->SetParameter(2,10*Sigma);//KM
688 else BpredFunc->SetParameter(2,Sigma);//Gaussian based methods
689 if(method==-99) BpredFunc->SetParameter(2,2.0*Sigma);//Kostas
690 BpredFunc->SetParameter(3,1.8);
691 BpredFunc->SetParameter(4,2.5);
692 histo->Fit(BpredFunc,"QN0");
693 BpredFunc->SetLineColor(kBlue);
694
695 TF1 *BpredFuncP = new TF1("BpredFuncP",InvCrystalBallP,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
696 TF1 *BpredFuncN = new TF1("BpredFuncN",InvCrystalBallN,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
697
698 BpredFuncP->SetParameters(BpredFunc->GetParameters());
699 BpredFuncP->SetLineColor(kBlue);
700 BpredFuncP->SetLineStyle(2);
701
702 BpredFuncN->SetParameters(BpredFunc->GetParameters());
703 BpredFuncN->SetLineColor(kBlue);
704 BpredFuncN->SetLineStyle(2);
705
706 vector<TF1*> functions;
707 functions.push_back(BpredFuncN);
708 functions.push_back(BpredFunc);
709 functions.push_back(BpredFuncP);
710 return functions;
711 }
712
713
714 TF1* do_logpar_fit_to_plot(TH1F *osof) {
715 TCanvas *logpar_fit_can = new TCanvas("logpar_fit_can","Fit canvas for LogPar");
716 TF1 *logparfunc = new TF1("logparfunc",LogParabola,0,300,3);
717 TF1 *logparfunc2 = new TF1("logparfunc2",LogParabola,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
718 TF1 *logparfuncN = new TF1("logparfuncN",LogParabolaN,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
719 TF1 *logparfuncP = new TF1("logparfuncP",LogParabolaP,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
720 osof->SetMinimum(0);
721 osof->Fit(logparfunc,"QR");
722 osof->Draw();
723 logparfunc->SetLineWidth(2);
724 logparfunc2->SetParameters(logparfunc->GetParameters());
725 logparfuncN->SetParameters(logparfunc->GetParameters());
726 logparfuncP->SetParameters(logparfunc->GetParameters());
727 stringstream fitinfo;
728 fitinfo << "#Chi^{2} / NDF : " << logparfunc->GetChisquare() << " / " << logparfunc->GetNDF();
729 TText *writefitinfo = write_text(0.8,0.8,fitinfo.str());
730 writefitinfo->SetTextSize(0.03);
731 DrawPrelim();
732 writefitinfo->Draw();
733 logparfunc->Draw("same");
734 logparfunc2->Draw("same");
735 logparfuncN->SetLineStyle(2);
736 logparfuncP->SetLineStyle(2);
737 logparfuncN->Draw("same");
738 logparfuncP->Draw("same");
739 CompleteSave(logpar_fit_can,"MakingOfBpredFunction/Bpred_Data_LogPar_Fit_To_TTbarPred");
740 delete logpar_fit_can;
741 return logparfunc2;
742 }
743
744 vector<TF1*> do_extended_fit_to_plot(TH1F *prediction, TH1F *Tprediction, TH1F *ossf, TH1F *osof,int isdata) {
745 /* there are mainly two background contributions: Z+Jets (a) and ttbar (b). So:
746 a) The case is clear - we take the OSSF prediction - OSOF prediction, and fit a crystal ball function to it. We then extract the CB parameters.
747 b) For ttbar, we use the OSOF distribution and look at the [10,100] GeV JZB range, and fit our log parabola. We then extract the LP parameters.
748 Once we have these two components, we use the combined parameters to get the final function and we're done.
749 */
750 //Step 1: take the OSSF prediction - OSOF prediction, and fit a crystal ball function to it
751 TH1F *step1cb = (TH1F*)ossf->Clone("step1cb");
752 step1cb->Add(osof,-1);
753 vector<TF1*> functions = do_cb_fit_to_plot(step1cb,PlottingSetup::JZBPeakWidthData);
754 TF1 *zjetscrystalball = functions[1];
755
756 //Step 2: use the OSOF distribution and look at the [10,100] GeV JZB range, and fit our log parabola
757 // TH1F *ttbarprediction=(TH1F*)prediction->Clone("ttbarprediction");
758 // ttbarprediction->Add(ossf,-1);//without the Z+Jets estimate, this is really just the ttbar estimate!
759 // the line above is not necessary anymore as we're now looking at a prediction without Z+Jets, and not multiplied with (1.0/3)
760 TF1 *ttbarlogpar = do_logpar_fit_to_plot(Tprediction);
761 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
762 if(PlottingSetup::RestrictToMassPeak) ttbarlogpar->SetParameter(0,1.0/3*ttbarlogpar->GetParameter(0));//correcting for the fact that we didn't multiply with (1.0/3);
763
764
765 TF1 *ttbarlogparP = new TF1("ttbarlogparP",LogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
766 TF1 *ttbarlogparN = new TF1("ttbarlogparN",LogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
767
768 //and now fuse the two!
769 TF1 *kmlp = new TF1("kmlp", CrystalBallPlusLogParabola, 0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
770 TF1 *kmlpP= new TF1("kmlpP",CrystalBallPlusLogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
771 TF1 *kmlpN= new TF1("kmlpN",CrystalBallPlusLogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
772 double kmlp_pars[10];
773 for(int i=0;i<5;i++) kmlp_pars[i]=zjetscrystalball->GetParameter(i);
774 for(int i=0;i<3;i++) kmlp_pars[5+i]=ttbarlogpar->GetParameter(i);
775 ttbarlogparP->SetParameters(ttbarlogpar->GetParameters());
776 ttbarlogparN->SetParameters(ttbarlogpar->GetParameters());
777 kmlp->SetParameters(kmlp_pars);
778 prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
779 /*
780 if you want to start from scratch (without the partial fitting and only fitting the whole thing, some good start values could be :
781 */
782 kmlp_pars[0]=kmlp->GetParameter(0);
783 kmlp_pars[1]=3.6198;
784 kmlp_pars[2]=16.4664;
785 kmlp_pars[3]=1.92253;
786 kmlp_pars[4]=3.56099;
787 kmlp_pars[5]=5.83;
788 kmlp_pars[6]=0.000757479;
789 kmlp_pars[7]=95.6157;
790 kmlp_pars[8]=0;
791 kmlp_pars[9]=0;
792 kmlp->SetParameters(kmlp_pars);
793 /**/
794 prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
795
796 kmlpP->SetParameters(kmlp->GetParameters());
797 kmlpN->SetParameters(kmlp->GetParameters());
798
799 // now that we're done, let's save all of this so we can have a look at it afterwards.
800 TCanvas *can = new TCanvas("can","Prediction Fit Canvas");
801 can->SetLogy(1);
802 prediction->SetMarkerColor(kRed);
803 prediction->Draw();
804
805 kmlp->SetLineColor(TColor::GetColor("#04B404"));
806 kmlpP->SetLineColor(TColor::GetColor("#04B404"));
807 kmlpN->SetLineColor(TColor::GetColor("#04B404"));
808 kmlp->Draw("same");
809 kmlpN->SetLineStyle(2);
810 kmlpP->SetLineStyle(2);
811 kmlpN->Draw("same");
812 kmlpP->Draw("same");
813
814 ttbarlogpar->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
815 ttbarlogpar->Draw("same");
816 ttbarlogparP->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
817 ttbarlogparN->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
818 ttbarlogparP->SetLineStyle(2);
819 ttbarlogparN->SetLineStyle(2);
820 ttbarlogparP->Draw("same");
821 ttbarlogparN->Draw("same");
822
823 functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
824
825 TLegend *analyticalBpredLEG = make_legend("",0.5,0.55);
826 analyticalBpredLEG->AddEntry(prediction,"predicted","p");
827 analyticalBpredLEG->AddEntry(functions[1],"Crystal Ball fit","l");
828 analyticalBpredLEG->AddEntry(functions[0],"1#sigma Crystal Ball fit","l");
829 analyticalBpredLEG->AddEntry(ttbarlogparN,"TTbar fit","l");
830 analyticalBpredLEG->AddEntry(ttbarlogpar,"1#sigma TTbar fit","l");
831 analyticalBpredLEG->AddEntry(kmlp,"Combined function","l");
832 analyticalBpredLEG->AddEntry(kmlpN,"1#sigma combined function","l");
833 analyticalBpredLEG->Draw("same");
834
835 if(isdata==0) CompleteSave(can,"MakingOfBpredFunction/Bpred_MC_Analytical_Function_Composition");
836 if(isdata==1) CompleteSave(can,"MakingOfBpredFunction/Bpred_data_Analytical_Function_Composition");
837 if(isdata==2) CompleteSave(can,"MakingOfBpredFunction/Bpred_MCBnS_Analytical_Function_Composition");
838 delete can;
839
840 //and finally: prep return functions
841 vector<TF1*> return_functions;
842 return_functions.push_back(kmlpN);
843 return_functions.push_back(kmlp);
844 return_functions.push_back(kmlpP);
845
846 return_functions.push_back(ttbarlogparN);
847 return_functions.push_back(ttbarlogpar);
848 return_functions.push_back(ttbarlogparP);
849
850 return_functions.push_back(functions[0]);
851 return_functions.push_back(functions[1]);
852 return_functions.push_back(functions[2]);
853
854 return return_functions;
855 }
856
857 void do_prediction_plot(string jzb, TCanvas *globalcanvas, float sigma, float high, int use_data, bool overlay_signal = false,string subdir="" )
858 {
859 // note: sigma is not used ATM
860 switch_overunderflow(true);
861 bool is_data=false;
862 bool use_signal=false;
863 if(use_data==1) is_data=true;
864 if(use_data==2) use_signal=true;
865 int nbins=50;//100;
866 if(is_data) nbins=50;
867 float low=0;
868 float hi=500;
869
870 stringstream largerzeroS;
871 largerzeroS << "("<<jzb<<">0)";
872 TCut largerzero(largerzeroS.str().c_str());
873 stringstream smallerzeroS;
874 smallerzeroS << "("<<jzb<<"<0)";
875 TCut smallerzero(smallerzeroS.str().c_str());
876
877 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
878 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
879 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
880 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
881 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
882
883 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
884 blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
885 blankback->GetXaxis()->CenterTitle();
886 blankback->GetYaxis()->CenterTitle();
887
888 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
889 TH1F *RcorrJZBSBem;
890 TH1F *LcorrJZBSBem;
891 TH1F *RcorrJZBSBeemm;
892 TH1F *LcorrJZBSBeemm;
893
894 TH1F *RcorrJZBeemmNoS;
895
896 //these are for the ratio
897
898 TH1F *JRcorrJZBeemm = allsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
899 TH1F *JLcorrJZBeemm = allsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
900 TH1F *JRcorrJZBem = allsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
901 TH1F *JLcorrJZBem = allsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
902
903 TH1F *JRcorrJZBSBem;
904 TH1F *JLcorrJZBSBem;
905 TH1F *JRcorrJZBSBeemm;
906 TH1F *JLcorrJZBSBeemm;
907
908 if(use_data==2 || overlay_signal) RcorrJZBeemmNoS = allsamples.Draw("RcorrJZBeemmNoS",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzero,is_data, luminosity,false);
909
910
911 if(PlottingSetup::RestrictToMassPeak) {
912 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
913 LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
914 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
915 LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
916
917 //these are for the ratio
918 JRcorrJZBSBem = allsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
919 JLcorrJZBSBem = allsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
920 JRcorrJZBSBeemm = allsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&largerzero,is_data, luminosity,use_signal);
921 JLcorrJZBSBeemm = allsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&smallerzero,is_data, luminosity,use_signal);
922 }
923
924 TH1F *lm4RcorrJZBeemm;
925 if(overlay_signal || use_data == 2 || use_data == 1) lm4RcorrJZBeemm = allsamples.Draw("lm4RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzero,is_data, luminosity,allsamples.FindSample("LM"));
926
927 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
928
929 TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
930 TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
931
932 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
933 TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
934 if(PlottingSetup::RestrictToMassPeak) {
935 Bpred->Add(RcorrJZBem,1.0/3.);
936 Bpred->Add(LcorrJZBem,-1.0/3.);
937 Bpred->Add(RcorrJZBSBem,1.0/3.);
938 Bpred->Add(LcorrJZBSBem,-1.0/3.);
939 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
940 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
941
942 TTbarpred->Scale(1.0/3);
943 Zjetspred->Add(LcorrJZBem,-1.0/3.);
944 Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
945 TTbarpred->Add(RcorrJZBSBem,1.0/3.);
946 Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
947 TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
948
949 //these are for the ratio
950 JBpred->Add(JRcorrJZBem,1.0/3.);
951 JBpred->Add(JLcorrJZBem,-1.0/3.);
952 JBpred->Add(JRcorrJZBSBem,1.0/3.);
953 JBpred->Add(JLcorrJZBSBem,-1.0/3.);
954 JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
955 JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
956 } else {
957 Bpred->Add(RcorrJZBem,1.0);
958 Bpred->Add(LcorrJZBem,-1.0);
959
960 Zjetspred->Add(LcorrJZBem,-1.0);
961
962 //these are for the ratio
963 JBpred->Add(JRcorrJZBem,1.0);
964 JBpred->Add(JLcorrJZBem,-1.0);
965 }
966
967
968
969 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
970 TH1F *Tpred = (TH1F*)RcorrJZBem->Clone("Bpred");
971 Tpred->Add(LcorrJZBem,-1.0);
972 if(PlottingSetup::RestrictToMassPeak) {
973 Tpred->Add(RcorrJZBSBem,1.0);
974 Tpred->Add(LcorrJZBSBem,-1.0);
975 Tpred->Add(RcorrJZBSBeemm,1.0);
976 Tpred->Add(LcorrJZBSBeemm,-1.0);
977 }
978
979 globalcanvas->cd();
980 globalcanvas->SetLogy(1);
981
982 RcorrJZBeemm->SetMarkerStyle(20);
983 RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
984 RcorrJZBeemm->SetMinimum(0.1);
985
986 Bpred->SetLineColor(kRed);
987 Bpred->SetStats(0);
988
989 int versok=false;
990 if(gROOT->GetVersionInt()>=53000) versok=true;
991
992
993 if ( overlay_signal || use_data==2 ) lm4RcorrJZBeemm->SetLineColor(TColor::GetColor("#088A08"));
994 RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
995
996 TLegend *legBpred = make_legend("",0.6,0.55);
997 TLegend *legBpred2 = make_legend("",0.6,0.55);
998
999
1000 vector<TF1*> analytical_function;
1001 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1002 kinpad->cd();
1003 kinpad->SetLogy(1);
1004
1005 string Bpredsaveas="Bpred_Data";
1006 blankback->SetMaximum(5*RcorrJZBeemm->GetMaximum());
1007 blankback->SetMinimum(0.1);
1008 if(use_data!=1) blankback->SetMinimum(0.1);
1009 blankback->Draw();
1010 if(use_data==1)
1011 {
1012 analytical_function = do_extended_fit_to_plot(Bpred,Tpred,LcorrJZBeemm,LcorrJZBem,is_data);
1013 kinpad->cd();//necessary because the extended fit function creates its own canvas
1014 RcorrJZBeemm->Draw("e1x0,same");
1015
1016 Bpred->Draw("hist,same");
1017 analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
1018 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1019 lm4RcorrJZBeemm->Draw("hist,same");
1020 legBpred->AddEntry(RcorrJZBeemm,"observed","p");
1021 legBpred->AddEntry(Bpred,"predicted","l");
1022 legBpred->AddEntry(analytical_function[1],"predicted fit","l");
1023 legBpred->AddEntry(analytical_function[2],"stat. uncert.","l");
1024 if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1025 legBpred->Draw();
1026 DrawPrelim();
1027
1028 //this plot shows what the prediction is composed of
1029 TPad *predcomppad = new TPad("predcomppad","predcomppad",0,0,1,1);
1030 float CurrentBpredLineWidth=Bpred->GetLineWidth();
1031 Bpred->SetLineWidth(2);
1032 predcomppad->cd();
1033 predcomppad->SetLogy(1);
1034
1035 TH1F *jzbnegative = (TH1F*)LcorrJZBeemm->Clone("jzbnegative");
1036 TH1F *sidebandsemu = (TH1F*)Bpred->Clone("sidebandsemu");
1037 sidebandsemu->Add(jzbnegative,-1);
1038
1039 jzbnegative->SetFillColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
1040 jzbnegative->SetLineColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
1041 sidebandsemu->SetLineColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
1042 sidebandsemu->SetFillColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
1043
1044 THStack predcomposition("predcomposition","prediction composition");
1045 predcomposition.Add(sidebandsemu);
1046 predcomposition.Add(jzbnegative);
1047 blankback->Draw();
1048 RcorrJZBeemm->Draw("e1x0,same");
1049 predcomposition.Draw("histo,same");//
1050 Bpred->Draw("hist,same");
1051 // analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
1052 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1053 // TH1F *lm4RcorrJZBeemmC = (TH1F*)lm4RcorrJZBeemm->Clone("lm4RcorrJZBeemmC");
1054 // lm4RcorrJZBeemmC->SetLineColor(kOrange+1);
1055 lm4RcorrJZBeemm->SetLineColor(kOrange+1);
1056 // lm4RcorrJZBeemmC->Draw("histo,same");
1057 lm4RcorrJZBeemm->SetLineWidth(2);
1058 lm4RcorrJZBeemm->Draw("histo,same");
1059 DrawPrelim();
1060 TLegend *speciallegBpred = make_legend("",0.45,0.55);
1061 speciallegBpred->AddEntry(RcorrJZBeemm,"Data","pl");
1062 speciallegBpred->AddEntry(Bpred,"Total background","l");
1063 speciallegBpred->AddEntry(jzbnegative,"JZB<0 (data)","f");
1064 speciallegBpred->AddEntry(sidebandsemu,"Sidebands/e#mu (data)","f");
1065 // speciallegBpred->AddEntry(lm4RcorrJZBeemmC,"LM4","l");
1066 speciallegBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1067 speciallegBpred->Draw();
1068 save_with_ratio(JRcorrJZBeemm,JBpred,predcomppad,subdir+"Bpred_Data_____PredictionComposition",true,use_data!=1,"data/pred");
1069
1070 TCanvas *specialcanv = new TCanvas("specialcanv","specialcanv");
1071 THStack kostack = allsamples.DrawStack("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,!is_data, luminosity,use_signal);
1072 blankback->Draw();
1073 kostack.Draw("same");
1074 Bpred->Draw("hist,same");
1075 analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
1076 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1077 legBpred->Draw();
1078 DrawPrelim();
1079 CompleteSave(specialcanv,subdir+"Bpred_Data_____PredictionCompositioninMC");
1080 Bpred->SetLineWidth((int)CurrentBpredLineWidth);
1081
1082 delete speciallegBpred;
1083 delete Zjetspred;
1084 delete TTbarpred;
1085
1086 kinpad->cd();
1087 }
1088 if(use_data==0) {
1089 RcorrJZBeemm->Draw("e1x0,same");
1090 Bpred->Draw("hist,same");
1091 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1092 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
1093 legBpred->AddEntry(Bpred,"MC predicted","l");
1094 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
1095 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
1096 if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1097 legBpred->Draw();
1098 DrawMCPrelim();
1099 Bpredsaveas="Bpred_MC";
1100 // CompleteSave(globalcanvas,"Bpred_MC"); // done below in save_with_ratio
1101 }
1102 if(use_data==2) {
1103 RcorrJZBeemm->Draw("e1x0,same");
1104 Bpred->Draw("hist,same");
1105 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1106 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
1107 legBpred->AddEntry(Bpred,"MC predicted","l");
1108 legBpred2->AddEntry(RcorrJZBeemm,"MC true","p");
1109 legBpred2->AddEntry(Bpred,"MC predicted","l");
1110 {
1111 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
1112 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
1113 legBpred->Draw();
1114 DrawMCPrelim();
1115 Bpredsaveas="Bpred_MCwithS";
1116 // CompleteSave(globalcanvas,"Bpred_MCwithS"); // done below in save_with_ratio
1117 }
1118 {
1119 RcorrJZBeemmNoS->SetLineStyle(2);
1120 legBpred2->AddEntry(RcorrJZBeemmNoS,"MC B","l");
1121 legBpred2->AddEntry(lm4RcorrJZBeemm,"MC S","l");
1122 legBpred2->Draw();
1123 RcorrJZBeemmNoS->SetLineColor(TColor::GetColor("#61210B"));
1124 RcorrJZBeemmNoS->Draw("histo,same");
1125 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1126 lm4RcorrJZBeemm->Draw("histo,same");
1127 DrawMCPrelim();
1128 Bpredsaveas="Bpred_MCwithS__plus";
1129 // CompleteSave(globalcanvas,"Bpred_MCwithS__plus"); // done below in save_with_ratio
1130 }
1131 }
1132
1133
1134 //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
1135 string ytitle("ratio");
1136 if ( use_data==1 ) ytitle = "data/pred";
1137 //save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,Bpredsaveas,true,use_data!=1,ytitle);
1138 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,subdir+Bpredsaveas,true,false,ytitle);//not extending the y range anymore up to 4
1139
1140
1141 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1142 /// The part below is meaningless for the offpeak analysis (it's a comparison of the different estimates but there is but one estimate!)
1143 if(PlottingSetup::RestrictToMassPeak) {
1144 TH1F *Bpredem = (TH1F*)LcorrJZBeemm->Clone("Bpredem");
1145 Bpredem->Add(RcorrJZBem);
1146 Bpredem->Add(LcorrJZBem,-1);
1147 TH1F *BpredSBem = (TH1F*)LcorrJZBeemm->Clone("BpredSBem");
1148 BpredSBem->Add(RcorrJZBSBem);
1149 Bpred->Add(LcorrJZBSBem,-1);
1150 TH1F *BpredSBeemm = (TH1F*)LcorrJZBeemm->Clone("BpredSBeemm");
1151 BpredSBeemm->Add(RcorrJZBSBeemm);
1152 BpredSBeemm->Add(LcorrJZBSBeemm,-1.0);
1153 globalcanvas->cd();
1154 globalcanvas->SetLogy(1);
1155
1156 RcorrJZBeemm->SetMarkerStyle(20);
1157 RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
1158 blankback->Draw();
1159 RcorrJZBeemm->Draw("e1x0,same");
1160 RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
1161
1162 Bpredem->SetLineColor(kRed+1);
1163 Bpredem->SetStats(0);
1164 Bpredem->Draw("hist,same");
1165
1166 BpredSBem->SetLineColor(kGreen+2);//TColor::GetColor("#0B6138"));
1167 BpredSBem->SetLineStyle(2);
1168 BpredSBem->Draw("hist,same");
1169
1170 BpredSBeemm->SetLineColor(kBlue+1);
1171 BpredSBeemm->SetLineStyle(3);
1172 BpredSBeemm->Draw("hist,same");
1173 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1174
1175 TLegend *legBpredc = make_legend("",0.6,0.55);
1176 if(use_data==1)
1177 {
1178 legBpredc->AddEntry(RcorrJZBeemm,"observed","p");
1179 legBpredc->AddEntry(Bpredem,"OFZP","l");
1180 legBpredc->AddEntry(BpredSBem,"OFSB","l");
1181 legBpredc->AddEntry(BpredSBeemm,"SFSB","l");
1182 legBpredc->Draw();
1183 CompleteSave(globalcanvas,subdir+"Bpred_Data_comparison");
1184 }
1185 if(use_data==0) {
1186 legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
1187 legBpredc->AddEntry(Bpredem,"MC OFZP","l");
1188 legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
1189 legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
1190 legBpredc->Draw();
1191 CompleteSave(globalcanvas,subdir+"Bpred_MC_comparison");
1192 }
1193 if(use_data==2) {
1194 legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
1195 legBpredc->AddEntry(Bpredem,"MC OFZP","l");
1196 legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
1197 legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
1198 if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1199 legBpredc->Draw();
1200 CompleteSave(globalcanvas,subdir+"Bpred_MCwithS_comparison");
1201 }
1202 }
1203
1204 delete RcorrJZBeemm;
1205 delete LcorrJZBeemm;
1206 delete RcorrJZBem;
1207 delete LcorrJZBem;
1208
1209 delete JRcorrJZBeemm;
1210 delete JLcorrJZBeemm;
1211 delete JRcorrJZBem;
1212 delete JLcorrJZBem;
1213
1214 delete blankback;
1215
1216 if(PlottingSetup::RestrictToMassPeak) {
1217 delete RcorrJZBSBem;
1218 delete LcorrJZBSBem;
1219 delete RcorrJZBSBeemm;
1220 delete LcorrJZBSBeemm;
1221
1222 delete JRcorrJZBSBem;
1223 delete JLcorrJZBSBem;
1224 delete JRcorrJZBSBeemm;
1225 delete JLcorrJZBSBeemm;
1226 }
1227 if(overlay_signal || use_data==2) delete lm4RcorrJZBeemm;
1228 switch_overunderflow(false);
1229 }
1230
1231 void do_prediction_plots(string mcjzb, string datajzb, float DataSigma, float MCSigma, bool overlay_signal ) {
1232 TCanvas *globalcanvas = new TCanvas("globalcanvas","Prediction Canvas");
1233 do_prediction_plot(datajzb,globalcanvas,DataSigma,jzbHigh ,data,overlay_signal);
1234 do_prediction_plot(mcjzb,globalcanvas,MCSigma,jzbHigh ,mc,overlay_signal);
1235 do_prediction_plot(mcjzb,globalcanvas,MCSigma,jzbHigh ,mcwithsignal,overlay_signal);
1236 }
1237
1238 void do_ratio_plot(int is_data,vector<float> binning, string jzb, TCanvas *can, float high=-9999) {
1239 bool do_data=0;
1240 bool dosignal=0;
1241 if(is_data==1) do_data=1;
1242 if(is_data==2) dosignal=1;
1243 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1244 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1245 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1246 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1247
1248 TH1F *RcorrJZBSBem;
1249 TH1F *LcorrJZBSBem;
1250 TH1F *RcorrJZBSBeemm;
1251 TH1F *LcorrJZBSbeemm;
1252
1253 if(PlottingSetup::RestrictToMassPeak) {
1254 RcorrJZBSBem = allsamples.Draw("RcorrJZBSbem",jzb.c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1255 LcorrJZBSBem = allsamples.Draw("LcorrJZBSbem",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1256 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSbeemm",jzb.c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1257 LcorrJZBSbeemm = allsamples.Draw("LcorrJZBSbeemm",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1258 }
1259
1260
1261
1262
1263 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1264 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
1265 if(PlottingSetup::RestrictToMassPeak) {
1266 Bpred->Add(RcorrJZBem,1.0/3);
1267 Bpred->Add(LcorrJZBem,-1.0/3);
1268 Bpred->Add(RcorrJZBSBem,1.0/3);
1269 Bpred->Add(LcorrJZBSBem,-1.0/3);
1270 Bpred->Add(RcorrJZBSBeemm,1.0/3);
1271 Bpred->Add(LcorrJZBSbeemm,-1.0/3);
1272 } else {
1273 Bpred->Add(RcorrJZBem,1.0);
1274 Bpred->Add(LcorrJZBem,-1.0);
1275 }
1276
1277 can->cd();
1278 can->SetLogy(0);
1279 Bpred->SetLineColor(kRed);
1280 Bpred->SetStats(0);
1281 if(high>0) Bpred->GetXaxis()->SetRangeUser(0,high);
1282 TH1F *JZBratioforfitting=(TH1F*)RcorrJZBeemm->Clone("JZBratioforfitting");
1283 JZBratioforfitting->Divide(Bpred);
1284 TGraphAsymmErrors *JZBratio = histRatio(RcorrJZBeemm,Bpred,is_data,binning,false);
1285
1286
1287 JZBratio->SetTitle("");
1288 JZBratio->GetYaxis()->SetRangeUser(0.0,9.0);
1289 // if(is_data==1) JZBratio->GetXaxis()->SetRangeUser(0,jzbHigh );
1290
1291 TF1 *pol0 = new TF1("pol0","[0]",0,1000);
1292 TF1 *pol0d = new TF1("pol0","[0]",0,1000);
1293 // straightline_fit->SetParameter(0,1);
1294 JZBratioforfitting->Fit(pol0,"Q0R","",0,30);
1295 pol0d->SetParameter(0,pol0->GetParameter(0));
1296
1297 JZBratio->GetYaxis()->SetTitle("Observed/Predicted");
1298 JZBratio->GetXaxis()->SetTitle("JZB [GeV]");
1299 if ( high>0 ) JZBratio->GetXaxis()->SetRangeUser(0.0,high);
1300 JZBratio->GetYaxis()->SetNdivisions(519);
1301 JZBratio->GetYaxis()->SetRangeUser(0.0,4.0);
1302 JZBratio->GetYaxis()->CenterTitle();
1303 JZBratio->GetXaxis()->CenterTitle();
1304 JZBratio->SetMarkerSize(DataMarkerSize);
1305 JZBratio->Draw("AP");
1306 /////----------------------------
1307 TPaveText *writeresult = new TPaveText(0.15,0.78,0.49,0.91,"blNDC");
1308 writeresult->SetFillStyle(4000);
1309 writeresult->SetFillColor(kWhite);
1310 writeresult->SetTextFont(42);
1311 writeresult->SetTextSize(0.03);
1312 writeresult->SetTextAlign(12);
1313 ostringstream jzb_agreement_data_text;
1314 jzb_agreement_data_text<< setprecision(2) << "mean =" << pol0->GetParameter(0) << " #pm " << setprecision(1) << pol0->GetParError(0);
1315 if(is_data==1) fitresultconstdata=pol0->GetParameter(0);// data
1316 if(is_data==0) fitresultconstmc=pol0->GetParameter(0); // monte carlo, no signal
1317 /* if(is_data) writeresult->AddText("Data closure test");
1318 else writeresult->AddText("MC closure test");
1319 */
1320 writeresult->AddText(jzb_agreement_data_text.str().c_str());
1321 // writeresult->Draw("same");
1322 // pol0d->Draw("same");
1323 TF1 *topline = new TF1("","1.5",0,1000);
1324 TF1 *bottomline = new TF1("","0.5",0,1000);
1325 topline->SetLineColor(kBlue);
1326 topline->SetLineStyle(2);
1327 bottomline->SetLineColor(kBlue);
1328 bottomline->SetLineStyle(2);
1329 // topline->Draw("same");
1330 // bottomline->Draw("same");
1331 TF1 *oneline = new TF1("","1.0",0,1000);
1332 oneline->SetLineColor(kBlue);
1333 oneline->SetLineStyle(1);
1334 oneline->Draw("same");
1335 TLegend *phony_leg = make_legend("ratio",0.6,0.55,false);//this line is just to have the default CMS Preliminary (...) on the canvas as well.
1336 if(is_data==1) DrawPrelim();
1337 else DrawMCPrelim();
1338 TLegend *leg = new TLegend(0.55,0.75,0.89,0.89);
1339 leg->SetTextFont(42);
1340 leg->SetTextSize(0.04);
1341 // if(is_data==1) leg->SetHeader("Ratio (data)");
1342 // else leg->SetHeader("Ratio (MC)");
1343
1344 TString MCtitle("MC ");
1345 if (is_data==1) MCtitle = "";
1346
1347 leg->SetFillStyle(4000);
1348 leg->SetFillColor(kWhite);
1349 leg->SetTextFont(42);
1350 // leg->AddEntry(topline,"+20\% sys envelope","l");
1351 leg->AddEntry(JZBratio,MCtitle+"obs / "+MCtitle+"pred","p");
1352 leg->AddEntry(oneline,"ratio = 1","l");
1353 // leg->AddEntry(pol0d,"fit in [0,30] GeV","l");
1354 // leg->AddEntry(bottomline,"#pm50% envelope","l");
1355
1356
1357 //leg->Draw("same"); // no longer drawing legend
1358
1359 if(is_data==1) CompleteSave(can, "jzb_ratio_data");
1360 if(is_data==0) CompleteSave(can, "jzb_ratio_mc");
1361 if(is_data==2) CompleteSave(can, "jzb_ratio_mc_BandS");//special case, MC with signal!
1362
1363 delete RcorrJZBeemm;
1364 delete LcorrJZBeemm;
1365 delete RcorrJZBem;
1366 delete LcorrJZBem;
1367
1368 delete RcorrJZBSBem;
1369 delete LcorrJZBSBem;
1370 delete RcorrJZBSBeemm;
1371 delete LcorrJZBSbeemm;
1372 }
1373
1374 void do_ratio_plots(string mcjzb,string datajzb,vector<float> ratio_binning) {
1375 TCanvas *globalc = new TCanvas("globalc","Ratio Plot Canvas");
1376 globalc->SetLogy(0);
1377
1378 do_ratio_plot(mc,ratio_binning,mcjzb,globalc, jzbHigh );
1379 do_ratio_plot(data,ratio_binning,datajzb,globalc, jzbHigh );
1380 do_ratio_plot(mcwithsignal,ratio_binning,mcjzb,globalc, jzbHigh );
1381 }
1382
1383 string give_jzb_expression(float peak, int type) {
1384 stringstream val;
1385 if(type==data) {
1386 if(peak<0) val << jzbvariabledata << "+" << TMath::Abs(peak);
1387 if(peak>0) val << jzbvariabledata << "-" << TMath::Abs(peak);
1388 if(peak==0) val << jzbvariabledata;
1389 }
1390 if(type==mc) {
1391 if(peak<0) val << jzbvariablemc << "+" << TMath::Abs(peak);
1392 if(peak>0) val << jzbvariablemc << "-" << TMath::Abs(peak);
1393 if(peak==0) val << jzbvariablemc;
1394 }
1395 return val.str();
1396 }
1397
1398
1399 void lepton_comparison_plots() {
1400 Float_t ymin = 1.e-5, ymax = 0.25;
1401 TCanvas *can = new TCanvas("can","Lepton Comparison Canvas");
1402 can->SetLogy(1);
1403 TH1F *eemc = allsamples.Draw("eemc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",mc, luminosity,allsamples.FindSample("/DY"));
1404 TH1F *mmmc = allsamples.Draw("mmmc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",mc, luminosity,allsamples.FindSample("/DY"));
1405 eemc->SetLineColor(kBlue);
1406 mmmc->SetLineColor(kRed);
1407 eemc->SetMinimum(0.1);
1408 eemc->SetMaximum(10*eemc->GetMaximum());
1409 eemc->Draw("histo");
1410 mmmc->Draw("histo,same");
1411 TLegend *leg = make_legend();
1412 leg->AddEntry(eemc,"ZJets->ee (MC)","l");
1413 leg->AddEntry(mmmc,"ZJets->#mu#mu (MC)","l");
1414 leg->Draw("same");
1415 CompleteSave(can, "lepton_comparison/mll_effratio_mc");
1416
1417 TH1F *eed = allsamples.Draw("eed","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
1418 TH1F *mmd = allsamples.Draw("mmd","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
1419 eed->SetLineColor(kBlue);
1420 mmd->SetLineColor(kRed);
1421 eed->SetMinimum(0.1);
1422 eed->SetMaximum(10*eed->GetMaximum());
1423 eed->Draw("histo");
1424 mmd->Draw("histo,same");
1425 TLegend *leg2 = make_legend();
1426 leg2->AddEntry(eed,"ZJets->ee (data)","l");
1427 leg2->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
1428 leg2->Draw();
1429 CompleteSave(can, "lepton_comparison/mll_effratio_data");
1430
1431 TH1F *jeed = allsamples.Draw("jeed",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
1432 TH1F *jmmd = allsamples.Draw("jmmd",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
1433 TH1F *jeemmd = allsamples.Draw("jeemmd",jzbvariabledata,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
1434 dout << "ee : " << jeed->GetMean() << "+/-" << jeed->GetMeanError() << endl;
1435 dout << "ee : " << jmmd->GetMean() << "+/-" << jmmd->GetMeanError() << endl;
1436 dout << "eemd : " << jeemmd->GetMean() << "+/-" << jeemmd->GetMeanError() << endl;
1437 jeemmd->SetLineColor(kBlack);
1438 jeemmd->SetMarkerStyle(25);
1439 jeed->SetLineColor(kBlue);
1440 jmmd->SetLineColor(kRed);
1441 jeed->SetMinimum(0.1);
1442 jeed->SetMaximum(10*eed->GetMaximum());
1443 TH1* njeemmd = jeemmd->DrawNormalized();
1444 njeemmd->SetMinimum(ymin);
1445 njeemmd->SetMaximum(ymax);
1446
1447 jeed->DrawNormalized("histo,same");
1448 jmmd->DrawNormalized("histo,same");
1449 jeemmd->DrawNormalized("same");
1450 TLegend *jleg2 = make_legend(" ");
1451 jleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
1452 jleg2->AddEntry(jeed,"ee","l");
1453 jleg2->AddEntry(jmmd,"#mu#mu","l");
1454 jleg2->Draw();
1455 CompleteSave(can,"lepton_comparison/jzb_effratio_data");
1456
1457 TPad *eemmpad = new TPad("eemmpad","eemmpad",0,0,1,1);
1458 eemmpad->cd();
1459 eemmpad->SetLogy(1);
1460 jeed->Draw("histo");
1461 jmmd->Draw("histo,same");
1462 TLegend *eemmlegend = make_legend(" ");
1463 eemmlegend->AddEntry(jeed,"ee","l");
1464 eemmlegend->AddEntry(jmmd,"#mu#mu","l");
1465 eemmlegend->Draw();
1466 DrawPrelim();
1467 save_with_ratio(jeed,jmmd,eemmpad->cd(),"lepton_comparison/jzb_Comparing_ee_mm_data");
1468
1469 TH1F *zjeed = allsamples.Draw("zjeed",jzbvariablemc, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&"(id1==0)",mc, luminosity,allsamples.FindSample("/DY"));
1470 TH1F *zjmmd = allsamples.Draw("zjmmd",jzbvariablemc, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&"(id1==1)",mc, luminosity,allsamples.FindSample("/DY"));
1471 TH1F *zjeemmd = allsamples.Draw("zjeemmd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets, mc, luminosity,allsamples.FindSample("/DY"));
1472 dout << "Z+Jets ee : " << zjeed->GetMean() << "+/-" << zjeed->GetMeanError() << endl;
1473 dout << "Z+Jets ee : " << zjmmd->GetMean() << "+/-" << zjmmd->GetMeanError() << endl;
1474 dout << "Z+Jets eemd : " << zjeemmd->GetMean() << "+/-" << zjeemmd->GetMeanError() << endl;
1475 zjeemmd->SetLineColor(kBlack);
1476 zjeemmd->SetMarkerStyle(25);
1477 zjeed->SetLineColor(kBlue);
1478 zjmmd->SetLineColor(kRed);
1479 zjeed->SetMinimum(0.1);
1480 zjeed->SetMaximum(10*eed->GetMaximum());
1481
1482 TH1* nzjeemmd = zjeemmd->DrawNormalized();
1483 nzjeemmd->SetMinimum(ymin);
1484 nzjeemmd->SetMaximum(ymax);
1485 zjeed->DrawNormalized("histo,same");
1486 zjmmd->DrawNormalized("histo,same");
1487 zjeemmd->DrawNormalized("same");
1488 TLegend *zjleg2 = make_legend("Z+jets MC");
1489 zjleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
1490 zjleg2->AddEntry(jeed,"ee","l");
1491 zjleg2->AddEntry(jmmd,"#mu#mu","l");
1492 zjleg2->Draw();
1493 CompleteSave(can,"lepton_comparison/jzb_effratio_ZJets");
1494
1495 TH1F *ld = allsamples.Draw("ld","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
1496 ld->DrawNormalized("e1");
1497 eed->DrawNormalized("histo,same");
1498 mmd->DrawNormalized("histo,same");
1499 TLegend *leg3 = make_legend();
1500 leg3->AddEntry(ld,"ZJets->ll (data)","p");
1501 leg3->AddEntry(eed,"ZJets->ee (data)","l");
1502 leg3->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
1503 leg3->Draw();
1504 CompleteSave(can,"lepton_comparison/mll_effratio_data__all_compared");
1505 /*
1506 TH1F *jzbld = allsamples.Draw("jzbld",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1507 TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1508 */
1509 TH1F *jzbld = allsamples.Draw("jzbld",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1510 TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1511 jzbld->SetMarkerColor(kBlack);
1512 jzbld->SetMarkerStyle(26);
1513 jzbemd->SetMarkerStyle(25);
1514 jzbemd->SetMarkerColor(kRed);
1515 jzbemd->SetLineColor(kRed);
1516 jzbld->SetMinimum(0.35);
1517 jzbld->Draw("e1");
1518 jzbemd->Draw("e1,same");
1519 TLegend *leg4 = make_legend();
1520 leg4->AddEntry(jzbld,"SFZP","p");
1521 leg4->AddEntry(jzbemd,"OFZP","p");
1522 leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
1523 leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
1524 leg4->Draw();
1525 CompleteSave(can,"lepton_comparison/jzb_eemumu_emu_data");
1526
1527 TH1F *ttbarjzbld = allsamples.Draw("ttbarjzbld",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
1528 TH1F *ttbarjzbemd = allsamples.Draw("ttbarjzbemd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
1529 ttbarjzbld->SetLineColor(allsamples.GetColor("TTJet"));
1530 ttbarjzbemd->SetLineColor(allsamples.GetColor("TTJet"));
1531 ttbarjzbld->Draw("histo");
1532 ttbarjzbemd->SetLineStyle(2);
1533 ttbarjzbemd->Draw("histo,same");
1534 TLegend *leg5 = make_legend();
1535 leg5->AddEntry(ttbarjzbld,"t#bar{t}->(ee or #mu#mu)","l");
1536 leg5->AddEntry(ttbarjzbemd,"t#bar{t}->e#mu","l");
1537 leg5->Draw();
1538 CompleteSave(can,"lepton_comparison/ttbar_emu_mc");
1539
1540 }
1541
1542 bool is_OF(TCut cut) {
1543 string scut = (const char*) cut;
1544 if((int)scut.find("id1!=id2")>-1) return true;
1545 if((int)scut.find("id1==id2")>-1) return false;
1546 return false;
1547 }
1548
1549 bool is_ZP(TCut cut) {
1550 string scut = (const char*) cut;
1551 if((int)scut.find("91")>-1) return true;
1552 return false;
1553 }
1554
1555
1556 void draw_pure_jzb_histo(TCut cut,string datavariable, string mcvariable, string savename, TCanvas *can,vector<float> binning) {
1557 TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
1558 jzbpad->cd();
1559 jzbpad->SetLogy(1);
1560 string xlabel="JZB [GeV]";
1561
1562 TH1F *datahisto = allsamples.Draw("datahisto",datavariable,binning, xlabel, "events",cut,data,luminosity);
1563 THStack mcstack = allsamples.DrawStack("mcstack",mcvariable,binning, xlabel, "events",cut,mc,luminosity);
1564
1565 datahisto->SetMinimum(0.1);
1566 datahisto->SetMarkerSize(DataMarkerSize);
1567 datahisto->Draw("e1");
1568 mcstack.Draw("same");
1569 datahisto->Draw("same,e1");
1570
1571 TLegend *leg;
1572 if(is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("OFZP",datahisto);
1573 else if(!is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("SFZP",datahisto);
1574 else if( is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("OFSB",datahisto);
1575 else if(!is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("SFSB",datahisto);
1576 else {
1577 std::cerr << "Unable to decode cut: " << cut.GetTitle() << std::endl;
1578 exit(-1);
1579 }
1580 leg->Draw();
1581 string write_cut = decipher_cut(cut,"");
1582 TText *writeline1 = write_cut_on_canvas(write_cut.c_str());
1583 writeline1->SetTextSize(0.035);
1584 writeline1->Draw();
1585 if(!Contains(savename,"Dibosons")) save_with_ratio(datahisto,mcstack,jzbpad->cd(),("jzb/"+savename));
1586 else save_with_ratio(datahisto,mcstack,jzbpad->cd(),savename);
1587 TPad *jzbpad2 = new TPad("jzbpad2","jzbpad2",0,0,1,1);
1588 jzbpad2->cd();
1589 jzbpad2->SetLogy(1);
1590 datahisto->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
1591 datahisto->SetMinimum(0.1);
1592 datahisto->SetMarkerSize(DataMarkerSize);
1593 datahisto->Draw("e1");
1594 mcstack.Draw("same");
1595 datahisto->Draw("same,e1");
1596 leg->SetHeader("");
1597 leg->Draw();
1598 writeline1->SetTextSize(0.035);
1599 writeline1->Draw();
1600 DrawPrelim();
1601 if(!Contains(savename,"Dibosons")) save_with_ratio(datahisto,mcstack,jzbpad2->cd(),("jzb/PositiveSideOnly/"+savename+""));
1602 else save_with_ratio(datahisto,mcstack,jzbpad2->cd(),(savename+"__PosOnly"));
1603 datahisto->Delete();
1604 mcstack.Delete();
1605 }
1606
1607 Double_t GausR(Double_t *x, Double_t *par) {
1608 return gRandom->Gaus(x[0],par[0]);
1609 }
1610
1611 void produce_stretched_jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1612 TCanvas *dican = new TCanvas("dican","JZB Plots Canvas");
1613 float max=jzbHigh ;
1614 float min=-120;
1615 int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
1616 int coarserbins=int(nbins/2.0);
1617 int rebinnedbins=int(nbins/4.0);
1618
1619 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
1620 for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
1621 for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
1622 for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
1623
1624 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP",dican,binning);
1625 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP",dican,binning);
1626 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_SFZP",dican,binning);
1627 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_SFZP",dican,binning);
1628 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_OFZP",dican,binning);
1629 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_OFZP",dican,binning);
1630 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB",dican,binning);
1631 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB",dican,binning);
1632
1633 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP_coarse",dican,coarse_binning);
1634 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP_coarse",dican,coarse_binning);
1635 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB_coarse",dican,coarse_binning);
1636 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB_coarse",dican,coarse_binning);
1637
1638 delete dican;
1639 }
1640
1641
1642 void diboson_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1643 vector<int> SamplesToBeModified = allsamples.FindSampleBySampleName("WW/WZ/ZZ");
1644
1645 if(SamplesToBeModified.size()==0 || SamplesToBeModified[0]==-1) {
1646 write_error(__FUNCTION__,"Could not find any diboson samples - aborting diboson plots");
1647 return;
1648 }
1649
1650 float stretchfactor = 100.0;
1651 vector<string> labels;
1652
1653
1654 dout << "Going to increase the cross section for diboson samples ... " << endl;
1655 for(int i=0;i<SamplesToBeModified.size();i++) {
1656 float origxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
1657 (allsamples.collection)[SamplesToBeModified[i]].xs=origxs*stretchfactor;
1658 dout << " Increased xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].filename << " from " << origxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ")" << endl;
1659 labels.push_back((allsamples.collection)[SamplesToBeModified[i]].samplename);
1660 (allsamples.collection)[SamplesToBeModified[i]].samplename=any2string(int(stretchfactor))+" x "+(allsamples.collection)[SamplesToBeModified[i]].samplename;
1661 dout << " (also renamed it to " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " )" << endl;
1662 }
1663
1664 dout << "Going to produce JZB plots" << endl;
1665 produce_stretched_jzb_plots(mcjzb,datajzb,ratio_binning);
1666 TCanvas *gloca = new TCanvas("gloca","gloca");
1667 float sigma=123456;
1668
1669 dout << "Going to produce prediction plots" << endl;
1670 do_prediction_plot(mcjzb, gloca, sigma, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do only MC plots, no signal
1671 do_prediction_plot(mcjzb, gloca, sigma, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do MC plots with signal
1672 delete gloca;
1673
1674 dout << "Going to reset the cross section for diboson samples ... " << endl;
1675 for(int i=0;i<SamplesToBeModified.size();i++) {
1676 float Upxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
1677 (allsamples.collection)[SamplesToBeModified[i]].xs=(allsamples.collection)[SamplesToBeModified[i]].xs*(1.0/stretchfactor);
1678 string Upname=(allsamples.collection)[SamplesToBeModified[i]].samplename;
1679 (allsamples.collection)[SamplesToBeModified[i]].samplename=labels[i];
1680 dout << " Reset xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " from " << Upxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ") and reset the correct name (from " << Upname << ")" << endl;
1681
1682 }
1683
1684 }
1685 void jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1686 TCanvas *can = new TCanvas("can","JZB Plots Canvas");
1687 float max=jzbHigh ;
1688 float min=-120;
1689 int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
1690 int coarserbins=int(nbins/2.0);
1691 int rebinnedbins=int(nbins/4.0);
1692
1693 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
1694 for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
1695 for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
1696 for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
1697
1698 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP",can,binning);
1699 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP",can,binning);
1700 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_SFZP",can,binning);
1701 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_SFZP",can,binning);
1702 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_OFZP",can,binning);
1703 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_OFZP",can,binning);
1704 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1705 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB",can,binning);
1706 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB",can,binning);
1707
1708 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarse",can,coarse_binning);
1709 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarse",can,coarse_binning);
1710 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1711 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarse",can,coarse_binning);
1712 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarse",can,coarse_binning);
1713
1714 // draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarsest",can,coarsest_binning);
1715 // draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarsest",can,coarsest_binning);
1716 // flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1717 // if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarsest",can,coarsest_binning);
1718 // if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarsest",can,coarsest_binning);
1719 delete can;
1720 }
1721
1722
1723 void calculate_all_yields(string mcdrawcommand,vector<float> jzb_cuts) {
1724 dout << "Calculating background yields in MC:" << endl;
1725 jzb_cuts.push_back(14000);
1726 TH1F *allbgs = allsamples.Draw("allbgs",jzbvariablemc,jzb_cuts, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc,luminosity);
1727 float cumulative=0;
1728 for(int i=allbgs->GetNbinsX();i>=1;i--) {
1729 cumulative+=allbgs->GetBinContent(i);
1730 dout << "Above " << allbgs->GetBinLowEdge(i) << " GeV/c : " << cumulative << endl;
1731 }
1732 }
1733
1734
1735 TCut give_jzb_expression(string mcjzb, float jzbcut, string posneg="pos") {
1736 stringstream res;
1737 res << "(" << mcjzb;
1738 if(posneg=="pos") res << ">";
1739 else res << "<-";
1740 res << jzbcut << ")";
1741 return TCut(res.str().c_str());
1742 }
1743
1744 string sigdig(float number, int nsigdig=3, float min=0) {
1745 //this function tries to extract n significant digits, and if the number is below (min), it returns "<min"
1746 if(number<min) return "< "+any2string(min);
1747 stringstream sol;
1748 sol << setprecision(nsigdig) << number;
1749
1750 return sol.str();
1751 }
1752
1753 string jzb_tex_command(string region, string posneg) {
1754 if(posneg=="pos") posneg="POS";
1755 else posneg="NEG";
1756 stringstream texcommand;
1757 texcommand<<"\\"<<region <<"JZB"<<posneg;
1758 return texcommand.str();
1759 }
1760 // \SFZPJZBPOS
1761 // Sample & \OFZPJZBPOS & \OFZPJZBNEG & \SFZPJZBPOS & \SFZPJZBNEG & \OFSBJZBPOS & \OFSBJZBNEG & \SFSBJZBPOS & \SFSBJZBNEG \\\hline
1762
1763 void compute_MC_yields(string mcjzb,vector<float> jzb_cuts) {
1764 dout << "Calculating background yields in MC:" << endl;
1765
1766 TCanvas *yica = new TCanvas("yica","yield canvas");
1767
1768 int nRegions=4;
1769 if(!PlottingSetup::RestrictToMassPeak) nRegions=2;
1770 string tsRegions[] = {"SFZP","OFZP","SFSB","OFSB"};
1771 string posneg[] = {"pos","neg"};
1772 TCut tkRegions[] = {cutOSSF&&cutnJets&&cutmass,cutOSOF&&cutnJets&&cutmass,cutOSSF&&cutnJets&&sidebandcut,cutOSOF&&cutnJets&&sidebandcut};
1773
1774 for(int ijzb=0;ijzb<jzb_cuts.size();ijzb++) {
1775 TCut jzbMC[] = { give_jzb_expression(mcjzb,jzb_cuts[ijzb],"pos"), give_jzb_expression(mcjzb,jzb_cuts[ijzb],"neg") };
1776 dout << "_________________________________________________________" << endl;
1777 dout << "Table for JZB> " << jzb_cuts[ijzb] << endl;
1778 for(int isample=0;isample<(allsamples.collection).size();isample++) {
1779 if(!(allsamples.collection)[isample].is_data) dout << (allsamples.collection)[isample].samplename << " & ";
1780 else dout << "Sample & ";
1781 for(int iregion=0;iregion<nRegions;iregion++) {
1782 for(int ipos=0;ipos<2;ipos++) {
1783 if((allsamples.collection)[isample].is_data) dout << jzb_tex_command(tsRegions[iregion],posneg[ipos]) << " & ";
1784 else {
1785 vector<int> specific;specific.push_back(isample);
1786 TH1F *shisto = allsamples.Draw("shisto","mll",1,0,500,"tester","events",tkRegions[iregion]&&jzbMC[ipos],mc,luminosity,specific);
1787 dout << sigdig(shisto->Integral(),3,0.05) <<" & ";
1788 delete shisto;
1789 }
1790 }//end of ipos
1791 }//end of iregion
1792 dout << " \\\\" << endl;
1793 }//end of isample
1794 }//end of ijzb
1795 dout << " \\hline" << endl;
1796
1797 delete yica;
1798 }
1799
1800 void draw_ttbar_and_zjets_shape_for_one_configuration(string mcjzb, string datajzb, int leptontype=-1, int scenario=0,bool floating=false) {
1801 //Step 1: Establishing cuts
1802 stringstream jetcutstring;
1803 string writescenario="";
1804
1805 if(scenario==0) jetcutstring << "(pfJetGoodNum>=3)&&"<<(const char*) basicqualitycut;
1806 if(scenario==1) jetcutstring << "(pfJetPt[0]>50&&pfJetPt[1]>50)&&"<<(const char*)basicqualitycut;
1807 TCut jetcut(jetcutstring.str().c_str());
1808 string leptoncut="mll>0";
1809 if(leptontype==0||leptontype==1) {
1810 if(leptontype==0) {
1811 leptoncut="id1==0";
1812 writescenario="__ee";
1813 }
1814 else {
1815 leptoncut="id1==1";
1816 writescenario="__ee";
1817 }
1818 }
1819 TCut lepcut(leptoncut.c_str());
1820
1821 TCanvas *c5 = new TCanvas("c5","c5",1500,500);
1822 TCanvas *c6 = new TCanvas("c6","c6");
1823 c5->Divide(3,1);
1824
1825 //STEP 2: Extract Zjets shape in data
1826 c5->cd(1);
1827 c5->cd(1)->SetLogy(1);
1828 TCut massat40("mll>40");
1829 TH1F *ossfleft = allsamples.Draw("ossfleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
1830 TH1F *osofleft = allsamples.Draw("osofleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
1831 ossfleft->SetLineColor(kRed);
1832 ossfleft->SetMarkerColor(kRed);
1833 ossfleft->Add(osofleft,-1);
1834 vector<TF1*> functions = do_cb_fit_to_plot(ossfleft,10);
1835 ossfleft->SetMarkerSize(DataMarkerSize);
1836 ossfleft->Draw();
1837 functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
1838 TF1 *zjetsfunc = (TF1*) functions[1]->Clone();
1839 TF1 *zjetsfuncN = (TF1*) functions[0]->Clone();
1840 TF1 *zjetsfuncP = (TF1*) functions[2]->Clone();
1841 zjetsfunc->Draw("same");zjetsfuncN->Draw("same");zjetsfuncP->Draw("same");
1842 TLegend *leg1 = new TLegend(0.6,0.6,0.89,0.80);
1843 leg1->SetFillColor(kWhite);
1844 leg1->SetLineColor(kWhite);
1845 leg1->AddEntry(ossfleft,"OSSF (sub),JZB<peak","p");
1846 leg1->AddEntry(zjetsfunc,"OSSF fit ('zjets')","l");
1847 leg1->Draw("same");
1848 TText *titleleft = write_title("Extracting Z+Jets shape");
1849 titleleft->Draw();
1850
1851 //Step 3: Extract ttbar shape (in data or MC?)
1852 c5->cd(2);
1853 c5->cd(2)->SetLogy(1);
1854 TH1F *osof;
1855 TText *titlecenter;
1856 bool frommc=false;
1857 if(frommc) {
1858 osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,mc,luminosity,allsamples.FindSample("TTJets"));
1859 titlecenter = write_title("Extracting ttbar shape (from ossf MC)");
1860 }
1861 else {
1862 osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
1863 titlecenter = write_title("Extracting ttbar shape (from osof data)");
1864 }
1865 osof->SetMarkerSize(DataMarkerSize);
1866 osof->Draw();
1867 vector<TF1*> ttbarfunctions = do_cb_fit_to_plot(osof,35,true);
1868 ttbarfunctions[0]->SetLineColor(kRed); ttbarfunctions[0]->SetLineStyle(2); ttbarfunctions[0]->Draw("same");
1869 ttbarfunctions[1]->SetLineColor(kRed); ttbarfunctions[1]->Draw("same");
1870 ttbarfunctions[2]->SetLineColor(kRed); ttbarfunctions[2]->SetLineStyle(2); ttbarfunctions[2]->Draw("same");
1871
1872 TLegend *leg2 = new TLegend(0.15,0.8,0.4,0.89);
1873 leg2->SetFillColor(kWhite);
1874 leg2->SetLineColor(kWhite);
1875 if(frommc) {
1876 leg2->AddEntry(osof,"t#bar{t} OSSF, MC","p");
1877 leg2->AddEntry(ttbarfunctions[1],"Fit to t#bar{t} OSSF,MC","l");
1878 } else {
1879 leg2->AddEntry(osof,"OSOF","p");
1880 leg2->AddEntry(ttbarfunctions[1],"Fit to OSOF","l");
1881 }
1882 leg2->Draw("same");
1883 titlecenter->Draw();
1884
1885 //--------------------------------------------------------------------------------------------------------------------------------
1886 //STEP 4: Present it!
1887 // actually: if we wanna let it float we need to do that first :-)
1888 c5->cd(3);
1889 c5->cd(3)->SetLogy(1);
1890 TH1F *observed = allsamples.Draw("observed",datajzb,100,0,500, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
1891 observed->SetMarkerSize(DataMarkerSize);
1892
1893 TF1 *logparc = new TF1("logparc",InvCrystalBall,0,1000,5); logparc->SetLineColor(kRed);
1894 TF1 *logparcn = new TF1("logparcn",InvCrystalBallN,0,1000,5); logparcn->SetLineColor(kRed); logparcn->SetLineStyle(2);
1895 TF1 *logparcp = new TF1("logparcp",InvCrystalBallP,0,1000,5); logparcp->SetLineColor(kRed); logparcp->SetLineStyle(2);
1896
1897 TF1 *zjetsc = new TF1("zjetsc",InvCrystalBall,0,1000,5); zjetsc->SetLineColor(kBlue);
1898 TF1 *zjetscn = new TF1("zjetscn",InvCrystalBallN,0,1000,5); zjetscn->SetLineColor(kBlue); zjetscn->SetLineStyle(2);
1899 TF1 *zjetscp = new TF1("zjetscp",InvCrystalBallP,0,1000,5); zjetscp->SetLineColor(kBlue); zjetscp->SetLineStyle(2);
1900
1901 TF1 *ZplusJetsplusTTbar = new TF1("ZplusJetsplusTTbar", DoubleInvCrystalBall,0,1000,10); ZplusJetsplusTTbar->SetLineColor(kBlue);
1902 TF1 *ZplusJetsplusTTbarP= new TF1("ZplusJetsplusTTbarP",DoubleInvCrystalBallP,0,1000,10); ZplusJetsplusTTbarP->SetLineColor(kBlue); ZplusJetsplusTTbarP->SetLineStyle(2);
1903 TF1 *ZplusJetsplusTTbarN= new TF1("ZplusJetsplusTTbarN",DoubleInvCrystalBallN,0,1000,10); ZplusJetsplusTTbarN->SetLineColor(kBlue); ZplusJetsplusTTbarN->SetLineStyle(2);
1904
1905 zjetsc->SetParameters(zjetsfunc->GetParameters());
1906 zjetscp->SetParameters(zjetsfunc->GetParameters());
1907 zjetscn->SetParameters(zjetsfunc->GetParameters());
1908
1909 TH1F *observeda = allsamples.Draw("observeda",datajzb,53,80,jzbHigh, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
1910 //blublu
1911 logparc->SetParameters(ttbarfunctions[1]->GetParameters());
1912 logparcn->SetParameters(ttbarfunctions[1]->GetParameters());
1913 logparcp->SetParameters(ttbarfunctions[1]->GetParameters());
1914 if(floating) {
1915 dout << "TTbar contribution assumed (before fitting) : " << logparc->GetParameter(0) << endl;
1916 logparc->SetParameters(ttbarfunctions[1]->GetParameters());
1917 for(int i=0;i<10;i++) {
1918 if(i<5) ZplusJetsplusTTbar->FixParameter(i,zjetsfunc->GetParameter(i));
1919 if(i>=5) {
1920 if (i>5) ZplusJetsplusTTbar->FixParameter(i,logparc->GetParameter(i-5));
1921 if (i==5) ZplusJetsplusTTbar->SetParameter(i,logparc->GetParameter(i-5));
1922 }
1923 }//end of setting parameters
1924 observeda->Draw("same");
1925 ZplusJetsplusTTbar->Draw("same");
1926 observeda->Fit(ZplusJetsplusTTbar);
1927 dout << "--> Quality of Z+Jets / TTbar fit : chi2/ndf = " << ZplusJetsplusTTbar->GetChisquare() << "/" << ZplusJetsplusTTbar->GetNDF() << endl;
1928 ZplusJetsplusTTbar->Draw("same");
1929 ZplusJetsplusTTbarP->SetParameters(ZplusJetsplusTTbar->GetParameters());
1930 ZplusJetsplusTTbarN->SetParameters(ZplusJetsplusTTbar->GetParameters());
1931 dout << "TTbar contribution found (after fitting) : " << ZplusJetsplusTTbar->GetParameter(5) << endl;
1932 float factor = ZplusJetsplusTTbar->GetParameter(5) / logparc->GetParameter(0);
1933 dout << "FACTOR: " << factor << endl;
1934 logparc->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
1935 logparcn->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
1936 logparcp->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
1937 }
1938
1939 c5->cd(3);
1940 c5->cd(3)->SetLogy(1);
1941 observed->Draw();
1942 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
1943 logparc->Draw("same");
1944 logparcn->Draw("same");
1945 logparcp->Draw("same");
1946
1947 TLegend *leg3 = new TLegend(0.6,0.6,0.89,0.80);
1948 leg3->SetFillColor(kWhite);
1949 leg3->SetLineColor(kWhite);
1950 leg3->AddEntry(observed,"OSSF,JZB>peak","p");
1951 leg3->AddEntry(ttbarfunctions[1],"OSOF fit ('ttbar')","l");
1952 leg3->AddEntry(zjetsfunc,"OSSF,JZB<0 fit ('zjets')","l");
1953 leg3->Draw("same");
1954 TText *titleright = write_title("Summary of shapes and observed shape");
1955 titleright->Draw();
1956
1957 c6->cd()->SetLogy(1);
1958 observed->Draw();
1959 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
1960 logparc->Draw("same");
1961 logparcn->Draw("same");
1962 logparcp->Draw("same");
1963 leg3->Draw("same");
1964 titleright->Draw();
1965
1966 if(scenario==0) {
1967 CompleteSave(c5,"Shapes2/Making_of___3jetsabove30"+writescenario);
1968 CompleteSave(c5->cd(1),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd1");
1969 CompleteSave(c5->cd(2),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd2");
1970 CompleteSave(c5->cd(3),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd3");
1971 CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30"+writescenario);
1972 } else {
1973 CompleteSave(c5,"Shapes2/Making_of___2jetsabove50"+writescenario);
1974 CompleteSave(c5->cd(1),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd1");
1975 CompleteSave(c5->cd(2),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd2");
1976 CompleteSave(c5->cd(3),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd3");
1977 CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50"+writescenario);
1978 }
1979 dout << "Statistics about our fits: " << endl;
1980 dout << "Z+Jets shape: Chi2/ndf = " << zjetsfunc->GetChisquare() << "/" << ossfleft->GetNbinsX() << endl;
1981 dout << "ttbar shape: Chi2/ndf = " << ttbarfunctions[1]->GetChisquare() << "/" << osof->GetNbinsX() << endl;
1982
1983 c6->cd();
1984 TLegend *additionallegend = new TLegend(0.6,0.6,0.89,0.89);
1985 additionallegend->SetFillColor(kWhite);
1986 additionallegend->SetLineColor(kWhite);
1987 additionallegend->AddEntry(observed,"Data","p");
1988 additionallegend->AddEntry(ZplusJetsplusTTbar,"Fitted Z+jets & TTbar","l");
1989 additionallegend->AddEntry(zjetsc,"Z+jets","l");
1990 additionallegend->AddEntry(logparc,"TTbar","l");
1991 observed->Draw();
1992 ZplusJetsplusTTbar->SetLineColor(kGreen);
1993 ZplusJetsplusTTbarP->SetLineColor(kGreen);
1994 ZplusJetsplusTTbarN->SetLineColor(kGreen);
1995 ZplusJetsplusTTbarP->SetLineStyle(2);
1996 ZplusJetsplusTTbarN->SetLineStyle(2);
1997 TF1 *ZplusJetsplusTTbar2 = new TF1("ZplusJetsplusTTbar2",DoubleInvCrystalBall,0,1000,10);
1998 ZplusJetsplusTTbar2->SetParameters(ZplusJetsplusTTbar->GetParameters());
1999 ZplusJetsplusTTbar2->SetLineColor(kGreen);
2000 ZplusJetsplusTTbarP->SetFillColor(TColor::GetColor("#81F781"));
2001 ZplusJetsplusTTbarN->SetFillColor(kWhite);
2002 ZplusJetsplusTTbarP->Draw("fcsame");
2003 ZplusJetsplusTTbarN->Draw("fcsame");
2004 TH1F *hZplusJetsplusTTbar = (TH1F*)ZplusJetsplusTTbar2->GetHistogram();
2005 TH1F *hZplusJetsplusTTbarN = (TH1F*)ZplusJetsplusTTbarN->GetHistogram();
2006 TH1F *hZplusJetsplusTTbarP = (TH1F*)ZplusJetsplusTTbarP->GetHistogram();
2007 hZplusJetsplusTTbar->SetMarkerSize(0);
2008 hZplusJetsplusTTbarP->SetMarkerSize(0);
2009 hZplusJetsplusTTbarN->SetMarkerSize(0);
2010 for (int i=1;i<=hZplusJetsplusTTbar->GetNbinsX();i++) {
2011 float newerror=hZplusJetsplusTTbarP->GetBinContent(i)-hZplusJetsplusTTbar->GetBinContent(i);
2012 hZplusJetsplusTTbar->SetBinError(i,newerror);
2013 if(hZplusJetsplusTTbar->GetBinContent(i)<0.05) hZplusJetsplusTTbar->SetBinContent(i,0); //avoiding a displaying probolem
2014 }
2015 hZplusJetsplusTTbarP->SetFillColor(kGreen);
2016 hZplusJetsplusTTbarN->SetFillColor(kWhite);
2017 hZplusJetsplusTTbarN->Draw("same");
2018
2019 ZplusJetsplusTTbar2->SetMarkerSize(0);
2020 ZplusJetsplusTTbar2->Draw("same");
2021
2022 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2023 logparc->Draw("same");
2024 logparcn->Draw("same");
2025 logparcp->Draw("same");
2026 additionallegend->Draw("same");
2027 if(scenario==0) {
2028 CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30__allfits__"+writescenario);
2029 } else {
2030 CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50__allfits__"+writescenario);
2031 }
2032 //--------------------------------------------------------------------------------------------------------------------------------
2033 }
2034
2035 void draw_ttbar_and_zjets_shape(string mcjzb, string datajzb) {
2036 int all_leptons=-1;
2037 int electrons_only=0;
2038 int mu_only=1;
2039 int twojetswith50gev=1;
2040 int threejetswith30gev=0;
2041 /*
2042 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,twojetswith50gev);
2043 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev);
2044
2045 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,twojetswith50gev);
2046 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,threejetswith30gev);
2047
2048 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,twojetswith50gev);
2049 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,threejetswith30gev);
2050 */
2051
2052 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev,true);
2053 }
2054
2055 void find_correction_factors(string &jzbvardata,string &jzbvarmc) {
2056 //first: colorful plots
2057 TCanvas *cancorr = new TCanvas("cancorr","Canvas for Response Correction");
2058 cancorr->SetLogz();
2059 cancorr->SetRightMargin(0.13);
2060 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2061 TCut zptforresponsepresentation("pt<600"&&cutmass&&cutOSSF&&"((sumJetPt[1]/pt)<5.0)");
2062 TH2F *niceresponseplotd = new TH2F("niceresponseplotd","",100,0,600,100,0,5);
2063 (allsamples.collection)[allsamples.FindSample("Data")[0]].events->Draw("sumJetPt[1]/pt:pt>>niceresponseplotd",zptforresponsepresentation);
2064 niceresponseplotd->SetStats(0);
2065 niceresponseplotd->GetXaxis()->SetTitle("Z p_{T} [GeV]");
2066 niceresponseplotd->GetYaxis()->SetTitle("Response");
2067 niceresponseplotd->GetXaxis()->CenterTitle();
2068 niceresponseplotd->GetYaxis()->CenterTitle();
2069 niceresponseplotd->Draw("COLZ");
2070 TProfile * profd = (TProfile*)niceresponseplotd->ProfileX();
2071 profd->SetMarkerSize(DataMarkerSize);
2072 profd->Fit("pol0","","same,e1",30,400);
2073 DrawPrelim();
2074 TText* title = write_text(0.5,0.7,"Data");
2075 title->SetTextAlign(12);
2076 title->Draw();
2077 TF1 *datapol=(TF1*)profd->GetFunction("pol0");
2078 float datacorrection=datapol->GetParameter(0);
2079 stringstream dataresstring;
2080 dataresstring<<"Response: "<<std::setprecision(2)<<100*datacorrection<<" %";
2081 TText* restitle = write_text(0.5,0.65,dataresstring.str());
2082 restitle->SetTextAlign(12);
2083 restitle->SetTextSize(0.03);
2084 restitle->Draw();
2085 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_Data");
2086
2087 TH2F *niceresponseplotm = new TH2F("niceresponseplotm","",100,0,600,100,0,5);
2088 (allsamples.collection)[allsamples.FindSample("DY")[0]].events->Draw("sumJetPt[1]/pt:pt>>niceresponseplotm",zptforresponsepresentation);
2089 niceresponseplotm->SetStats(0);
2090 niceresponseplotm->GetXaxis()->SetTitle("Z p_{T} [GeV]");
2091 niceresponseplotm->GetYaxis()->SetTitle("Response");
2092 niceresponseplotm->GetXaxis()->CenterTitle();
2093 niceresponseplotm->GetYaxis()->CenterTitle();
2094 niceresponseplotm->Draw("COLZ");
2095 (allsamples.collection)[allsamples.FindSample("DY")[0]].events->Draw("sumJetPt[1]/pt:pt",zptforresponsepresentation,"PROF,same");
2096 TProfile * profm = (TProfile*)niceresponseplotm->ProfileX();
2097 profm->SetMarkerSize(DataMarkerSize);
2098 profm->Fit("pol0","","same,e1",30,400);
2099 DrawMCPrelim();
2100 title = write_text(0.5,0.7,"MC simulation");
2101 title->SetTextAlign(12);
2102 title->Draw();
2103 TF1 *mcpol=(TF1*)profm->GetFunction("pol0");
2104 float mccorrection=mcpol->GetParameter(0);
2105 stringstream mcresstring;
2106 mcresstring<<"Response: "<<std::setprecision(2)<<100*mccorrection<<" %";
2107 TText* mcrestitle = write_text(0.5,0.65,mcresstring.str());
2108 mcrestitle->SetTextAlign(12);
2109 mcrestitle->SetTextSize(0.03);
2110 mcrestitle->Draw();
2111 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_MC");
2112
2113
2114 //Step 2: Getting the result
2115 // TCut zptcutforresponse("pt>30&&pt<300&&TMath::Abs(91.2-mll)<20&&id1==id2&&(ch1*ch2<0)");
2116 stringstream jzbvardatas;
2117 if(datacorrection>1) jzbvardatas<<"(jzb[1]-"<<datacorrection-1<<"*pt)";
2118 if(datacorrection<1) jzbvardatas<<"(jzb[1]+"<<1-datacorrection<<"*pt)";
2119 jzbvardata=jzbvardatas.str();
2120 stringstream jzbvarmcs;
2121 if(mccorrection>1) jzbvarmcs<<"(jzb[1]-"<<mccorrection-1<<"*pt)";
2122 if(mccorrection<1) jzbvarmcs<<"(jzb[1]+"<<1-mccorrection<<"*pt)";
2123 jzbvarmc=jzbvarmcs.str();
2124 dout << "JZB Z pt correction summary : " << endl;
2125 dout << " Data: The response is " << datacorrection << " --> jzb variable is now : " << jzbvardata << endl;
2126 dout << " MC : The response is " << mccorrection << " --> jzb variable is now : " << jzbvarmc << endl;
2127 }
2128
2129 void pick_up_events(string cut) {
2130 dout << "Picking up events with cut " << cut << endl;
2131 allsamples.PickUpEvents(cut);
2132 }
2133
2134 void save_template(string mcjzb, string datajzb,vector<float> jzb_cuts,float MCPeakError,float DataPeakError) {
2135 dout << "Saving configuration template!" << endl;
2136 ofstream configfile;
2137 configfile.open("../DistributedModelCalculations/last_configuration.C");
2138 configfile<<"#include <iostream>\n";
2139 configfile<<"#include <vector>\n";
2140 configfile<<"#ifndef SampleClassLoaded\n";
2141 configfile<<"#include \"SampleClass.C\"\n";
2142 configfile<<"#endif\n";
2143 configfile<<"#define SetupLoaded\n";
2144 configfile<<"#ifndef ResultLibraryClassLoaded\n";
2145 configfile<<"#include \"ResultLibraryClass.C\"\n";
2146 configfile<<"#endif\n";
2147
2148 configfile<<"\nusing namespace std;\n\n";
2149
2150 configfile<<"namespace PlottingSetup { \n";
2151 configfile<<"string datajzb=\"datajzb_ERROR\";\n";
2152 configfile<<"string mcjzb=\"mcjzb_ERROR\";\n";
2153 configfile<<"vector<float>jzb_cuts;\n";
2154 configfile<<"float MCPeakError=-999;\n";
2155 configfile<<"float DataPeakError=-999;\n";
2156 configfile<<"}\n\n";
2157
2158 configfile<<"void read_config() {\n";
2159 configfile<<"datajzb=\""<<datajzb<<"\";\n";
2160 configfile<<"mcjzb=\""<<mcjzb<<"\";\n\n";
2161 configfile<<"\n\nMCPeakError="<<MCPeakError<<";\n";
2162 configfile<<"DataPeakError="<<DataPeakError<<";\n\n";
2163 for(int i=0;i<jzb_cuts.size();i++) configfile<<"jzb_cuts.push_back("<<jzb_cuts[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2164 configfile<<"\n\n";
2165 for(int i=0;i<Nobs.size();i++) configfile<<"Nobs.push_back("<<Nobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2166 for(int i=0;i<Npred.size();i++) configfile<<"Npred.push_back("<<Npred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2167 for(int i=0;i<Nprederr.size();i++) configfile<<"Nprederr.push_back("<<Nprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2168 configfile<<"\n\n";
2169 for(int i=0;i<flippedNobs.size();i++) configfile<<"flippedNobs.push_back("<<flippedNobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2170 for(int i=0;i<flippedNpred.size();i++) configfile<<"flippedNpred.push_back("<<flippedNpred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2171 for(int i=0;i<flippedNprederr.size();i++) configfile<<"flippedNprederr.push_back("<<flippedNprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2172 configfile<<"\n\n";
2173 configfile<<"luminosity="<<luminosity<<";\n";
2174 configfile<<"RestrictToMassPeak="<<RestrictToMassPeak<<";//defines the type of analysis we're running\n";
2175
2176 configfile<<"\n\ncout << \"Configuration successfully loaded!\" << endl; \n \n } \n \n";
2177
2178 configfile.close();
2179
2180 }
2181
2182 float get_nonzero_minimum(TH1F *histo) {
2183 float min=histo->GetMaximum();
2184 for(int ibin=1;ibin<=histo->GetNbinsX();ibin++) {
2185 float curcont=histo->GetBinContent(ibin);
2186 if(curcont<min&&curcont>0) min=curcont;
2187 }
2188 return min;
2189 }
2190
2191 void draw_all_ttbar_histos(TCanvas *can, vector<TH1F*> histos, string drawoption="", float manualmin=-9) {
2192 can->cd();
2193 float min=1;
2194 float max=histos[0]->GetMaximum();
2195 if(manualmin>=0) min=manualmin;
2196 else {
2197 for(int i=1;i<histos.size();i++) {
2198 float curmin=get_nonzero_minimum(histos[i]);
2199 float curmax=histos[i]->GetMaximum();
2200 if(curmin<min) min=curmin;
2201 if(curmax>max) max=curmax;
2202 }
2203 }
2204 histos[0]->GetYaxis()->SetRangeUser(min,4*max);
2205 histos[0]->Draw(drawoption.c_str());
2206 stringstream drawopt;
2207 drawopt << drawoption << ",same";
2208 for(int i=1;i<histos.size();i++) {
2209 histos[i]->Draw(drawopt.str().c_str());
2210 }
2211 }
2212
2213 void ttbar_sidebands_comparison(string mcjzb, vector<float> binning, string prestring) {
2214 //in the case of the on peak analysis, we compare the 3 control regions to the real value
2215 //in the case of the OFF peak analysis, we compare our control region to the real value
2216 TCut weightbackup=cutWeight;
2217 cutWeight="1.0";
2218 float simulatedlumi = luminosity; //in pb please - adjust to your likings
2219
2220
2221 TH1F *TZem = systsamples.Draw("TZem",mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2222 TH1F *nTZem = systsamples.Draw("nTZem","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2223 TH1F *TSem;
2224 TH1F *nTSem;
2225 TH1F *TZeemm = systsamples.Draw("TZeemm",mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2226 TH1F *nTZeemm = systsamples.Draw("nTZeemm","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2227 TH1F *TSeemm;
2228 TH1F *nTSeemm;
2229
2230 if(PlottingSetup::RestrictToMassPeak) {
2231 TSem = systsamples.Draw("TSem",mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2232 nTSem = systsamples.Draw("nTSem","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2233 TSeemm = systsamples.Draw("TSeemm",mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2234 nTSeemm = systsamples.Draw("nTSeemm","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2235 }
2236
2237 TCanvas *tcan = new TCanvas("tcan","tcan");
2238
2239 tcan->SetLogy(1);
2240
2241 TZeemm->SetLineColor(kBlack);
2242 TZem->SetLineColor(kRed);
2243 TZeemm->SetMarkerColor(kBlack);
2244 TZem->SetMarkerColor(kRed);
2245
2246
2247 if(PlottingSetup::RestrictToMassPeak) {
2248 TSem->SetLineColor(TColor::GetColor("#00A616"));
2249 TSeemm->SetLineColor(kMagenta+2);
2250 TSem->SetMarkerColor(TColor::GetColor("#00A616"));
2251 TSeemm->SetMarkerColor(kMagenta+2);
2252 TSem->SetLineStyle(2);
2253 TSeemm->SetLineStyle(3);
2254 }
2255
2256 vector<TH1F*> histos;
2257 histos.push_back(TZem);
2258 histos.push_back(TZeemm);
2259 if(PlottingSetup::RestrictToMassPeak) {
2260 histos.push_back(TSem);
2261 histos.push_back(TSeemm);
2262 }
2263 draw_all_ttbar_histos(tcan,histos,"histo",0.04);
2264
2265 TLegend *leg = make_legend("MC t#bar{t}",0.6,0.65,false);
2266 leg->AddEntry(TZeemm,"SFZP","l");
2267 leg->AddEntry(TZem,"OFZP","l");
2268 if(PlottingSetup::RestrictToMassPeak) {
2269 leg->AddEntry(TSeemm,"SFSB","l");
2270 leg->AddEntry(TSem,"OFSB","l");
2271 }
2272 leg->Draw("same");
2273 DrawMCPrelim(simulatedlumi);
2274 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison");
2275 cout << __LINE__ << endl;
2276 TH1F *TZemcopy = (TH1F*)TZem->Clone("TZemcopy");
2277 cout << __LINE__ << endl;
2278 TH1F *TZeemmcopy = (TH1F*)TZeemm->Clone("TZeemmcopy");
2279 cout << __LINE__ << endl;
2280 TH1F *TSeemmcopy;
2281 TH1F *TSemcopy;
2282 if(PlottingSetup::RestrictToMassPeak) {
2283 TSeemmcopy = (TH1F*)TSeemm->Clone("TSeemmcopy");
2284 TSemcopy = (TH1F*)TSem->Clone("TSemcopy");
2285 }
2286
2287 TZem->Divide(TZeemm);
2288 TZem->SetMarkerStyle(21);
2289 if(PlottingSetup::RestrictToMassPeak) {
2290 TSem->Divide(TZeemm);
2291 TSeemm->Divide(TZeemm);
2292 TSem->SetMarkerStyle(24);
2293 TSeemm->SetMarkerStyle(32);
2294 }
2295
2296 tcan->SetLogy(0);
2297 TZem->GetYaxis()->SetRangeUser(0,2.5);
2298 TZem->GetYaxis()->SetTitle("ratio");
2299 TZem->Draw();
2300 if(PlottingSetup::RestrictToMassPeak) {
2301 TSem->Draw("same");
2302 TSeemm->Draw("same");
2303 }
2304
2305 float linepos=0.25;
2306 if(PlottingSetup::RestrictToMassPeak) linepos=0.25;
2307 if(!PlottingSetup::RestrictToMassPeak) linepos=0.1; //sys uncertainty for iJZB
2308 TLine *top = new TLine(binning[0],1.0+linepos,binning[binning.size()-1],1.0+linepos);
2309 TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
2310 TLine *bottom = new TLine(binning[0],1.0-linepos,binning[binning.size()-1],1.0-linepos);
2311
2312 /*write_warning(__FUNCTION__,"These two lines are to be removed!");
2313 TLine *topalt = new TLine(binning[0],1.0+0.1,binning[binning.size()-1],1.0+0.1);
2314 TLine *bottomalt = new TLine(binning[0],1.0-0.1,binning[binning.size()-1],1.0-0.1);
2315 topalt->SetLineColor(kRed);topalt->SetLineStyle(3);
2316 bottomalt->SetLineColor(kRed);bottomalt->SetLineStyle(3);
2317 topalt->Draw("same");bottomalt->Draw("same");*/
2318
2319
2320 top->SetLineColor(kBlue);top->SetLineStyle(2);
2321 bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2322 center->SetLineColor(kBlue);
2323
2324 top->Draw("same");
2325 center->Draw("same");
2326 bottom->Draw("same");
2327
2328 TLegend *leg2 = make_legend("MC t#bar{t}",0.55,0.75,false);
2329 leg2->AddEntry(TZem,"OFZP / SFZP","ple");
2330 if(PlottingSetup::RestrictToMassPeak) {
2331 leg2->AddEntry(TSeemm,"SFSB / SFZP","ple");
2332 leg2->AddEntry(TSem,"OFSB / SFZP","ple");
2333 }
2334 leg2->AddEntry(bottom,"syst. envelope","l");
2335 leg2->SetX1(0.25);leg2->SetX2(0.6);
2336 leg2->SetY1(0.65);
2337
2338 leg2->Draw("same");
2339
2340 DrawMCPrelim(simulatedlumi);
2341 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison_ratio");
2342
2343
2344 ///-------------- second part: only look at the quantity we actually care about!
2345 TH1F *leftsfzp = (TH1F*)nTZeemm->Clone("leftsfzp");
2346 TH1F *rightsfzp = (TH1F*)TZeemmcopy->Clone("rightsfzp");
2347 rightsfzp->Add(leftsfzp,-1);
2348 TH1F *leftofzp = (TH1F*)nTZem->Clone("leftofzp");
2349 TH1F *rightofzp = (TH1F*)TZemcopy->Clone("rightofzp");
2350 rightofzp->Add(leftofzp,-1);
2351 TH1F *leftofsb;
2352 TH1F *rightofsb;
2353 TH1F *leftsfsb;
2354 TH1F *rightsfsb;
2355 if(PlottingSetup::RestrictToMassPeak) {
2356 leftofsb = (TH1F*)nTSem->Clone("leftofsb");
2357 rightofsb = (TH1F*)TSemcopy->Clone("rightofsb");
2358 rightofsb->Add(leftofsb,-1);
2359 leftsfsb = (TH1F*)nTSeemm->Clone("leftsfsb");
2360 rightsfsb = (TH1F*)TSeemmcopy->Clone("rightsfsb");
2361 rightsfsb->Add(leftsfsb,-1);
2362 }
2363
2364 tcan->SetLogy(1);
2365 rightsfzp->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
2366 rightsfzp->GetYaxis()->SetTitle("#deltaJZB / 25 GeV");
2367 rightsfzp->Draw("histo");
2368 rightofzp->Draw("histo,same");
2369 if(PlottingSetup::RestrictToMassPeak) {
2370 rightofsb->Draw("histo,same");
2371 rightsfsb->Draw("histo,same");
2372 }
2373 DrawMCPrelim(simulatedlumi);
2374
2375 TLegend *legA = make_legend("MC t#bar{t}",0.6,0.65,false);
2376 legA->AddEntry(rightsfzp,"SFZP","l");
2377 legA->AddEntry(rightofzp,"OFZP","l");
2378 if(PlottingSetup::RestrictToMassPeak) {
2379 legA->AddEntry(rightofsb,"SFSB","l");
2380 legA->AddEntry(rightsfsb,"OFSB","l");
2381 }
2382 legA->Draw();
2383
2384 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison");
2385
2386 tcan->SetLogy(0);
2387 rightofzp->Divide(rightsfzp);
2388 rightofzp->GetXaxis()->SetRangeUser(0.0,binning[binning.size()-1]);
2389 rightofzp->GetYaxis()->SetRangeUser(0.0,2.0);
2390 rightofzp->GetYaxis()->SetTitle("#deltaJZB ratio");
2391 rightofzp->Draw();
2392 if(PlottingSetup::RestrictToMassPeak) {
2393 rightofsb->Divide(rightsfzp);
2394 rightsfsb->Divide(rightsfzp);
2395 rightofsb->Draw("same");
2396 rightsfsb->Draw("same");
2397 }
2398
2399 TLine *top2 = new TLine(0.0,1.0+linepos,binning[binning.size()-1],1.0+linepos);
2400 TLine *center2 = new TLine(0.0,1.0,binning[binning.size()-1],1.0);
2401 TLine *bottom2 = new TLine(0.0,1.0-linepos,binning[binning.size()-1],1.0-linepos);
2402
2403 top2->SetLineColor(kBlue);top2->SetLineStyle(2);
2404 bottom2->SetLineColor(kBlue);bottom2->SetLineStyle(2);
2405 center2->SetLineColor(kBlue);
2406
2407 top2->Draw("same");
2408 center2->Draw("same");
2409 bottom2->Draw("same");
2410
2411 rightofzp->SetMarkerStyle(21);
2412 if(PlottingSetup::RestrictToMassPeak) {
2413 rightofsb->SetMarkerStyle(24);
2414 rightsfsb->SetMarkerStyle(32);
2415 }
2416
2417 TLegend *leg3 = make_legend("MC t#bar{t}",0.55,0.75,false);
2418 leg3->AddEntry(rightofzp,"OFZP / SFZP","ple");
2419 if(PlottingSetup::RestrictToMassPeak) {
2420 leg3->AddEntry(rightsfsb,"SFSB / SFZP","ple");
2421 leg3->AddEntry(rightofsb,"OFSB / SFZP","ple");
2422 }
2423 leg3->AddEntry(bottom,"syst. envelope","l");
2424 leg3->SetX1(0.25);leg3->SetX2(0.6);
2425 leg3->SetY1(0.65);
2426
2427 leg3->Draw("same");
2428
2429 DrawMCPrelim(simulatedlumi);
2430 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison_ratio");
2431
2432 delete TZem;
2433 delete nTZem;
2434 delete TZeemm;
2435 delete nTZeemm;
2436 if(PlottingSetup::RestrictToMassPeak) {
2437 delete TSem;
2438 delete nTSem;
2439 delete TSeemm;
2440 delete nTSeemm;
2441 }
2442
2443 delete tcan;
2444 cutWeight=weightbackup;
2445 }
2446
2447 void ttbar_sidebands_comparison(string mcjzb, vector<float> jzb_binning) {
2448 vector<float> nicer_binning;
2449 nicer_binning.push_back(-125);
2450 nicer_binning.push_back(-100);
2451 nicer_binning.push_back(-75);
2452 nicer_binning.push_back(-50);
2453 nicer_binning.push_back(-25);
2454 nicer_binning.push_back(0);
2455 nicer_binning.push_back(25);
2456 nicer_binning.push_back(50);
2457 nicer_binning.push_back(75);
2458 nicer_binning.push_back(100);
2459 nicer_binning.push_back(125);
2460 nicer_binning.push_back(150);
2461 nicer_binning.push_back(175);
2462 nicer_binning.push_back(200);
2463 nicer_binning.push_back(230);
2464 nicer_binning.push_back(280);
2465 nicer_binning.push_back(400);
2466 ttbar_sidebands_comparison(mcjzb,nicer_binning, "ttbar/");
2467 }
2468
2469
2470 void zjets_prediction_comparison() {
2471 // Do it without PU re-weighting
2472 float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
2473 stringstream resultsNoPU;
2474
2475 stringstream mcjzbnoPU;
2476 find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,MCSigma,DataSigma,resultsNoPU,false);
2477 if(MCPeakNoPU>0) mcjzbnoPU<<"("<<jzbvariablemc<<"-"<<TMath::Abs(MCPeakNoPU)<<")";
2478 else mcjzbnoPU<<"("<<jzbvariablemc<<"+"<<TMath::Abs(MCPeakNoPU)<<")";
2479
2480 string mcjzb = mcjzbnoPU.str();
2481 dout << "The peak corrected JZB expression for MC without pileup is : " << mcjzb << endl;
2482
2483 TCut weightbackup=cutWeight;
2484 cutWeight="1.0";
2485 float sbg_min=0.;
2486 float sbg_max=100.;
2487 int sbg_nbins=5;
2488 float simulatedlumi = luminosity;//in pb please - adjust to your likings
2489
2490 TCut kPos((mcjzb+">0").c_str());
2491 TCut kNeg((mcjzb+"<0").c_str());
2492 string var( "abs("+mcjzb+")" );
2493
2494 TCut kcut(cutmass&&cutOSSF&&"pfJetGoodNum>2");
2495 TH1F *hJZBpos = systsamples.Draw("hJZBpos",var,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",
2496 kcut&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2497 TH1F *hJZBneg = systsamples.Draw("hJZBneg",var,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",
2498 kcut&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2499 hJZBpos->SetLineColor(kBlack);
2500 hJZBneg->SetLineColor(kRed);
2501
2502 Int_t nbins = 5;
2503 Float_t xmax = 100.;
2504
2505
2506 TCanvas *zcan = new TCanvas("zcan","zcan");
2507 zcan->SetLogy(1);
2508
2509 hJZBpos->Draw("e1");
2510 hJZBneg->Draw("same,hist");
2511 hJZBpos->Draw("same,e1"); // So it's on top...
2512
2513 TLegend *leg = make_legend("MC Z+jets",0.55,0.75,false);
2514 leg->AddEntry(hJZBpos,"Observed","pe");
2515 leg->AddEntry(hJZBneg,"Predicted","l");
2516 leg->Draw("same");
2517 DrawMCPrelim(simulatedlumi);
2518 CompleteSave(zcan,"Systematics/zjets_prediction");
2519
2520 TH1F* hratio = (TH1F*)hJZBpos->Clone("hratio");
2521 hratio->Divide(hJZBneg);
2522
2523 zcan->SetLogy(0);
2524 hratio->GetYaxis()->SetRangeUser(0,2.5);
2525 hratio->GetYaxis()->SetTitle("Observed/Predicted");
2526 hratio->Draw("e1");
2527
2528 TLine *top = new TLine(sbg_min,1.25,sbg_max,1.25);
2529 TLine *center = new TLine(sbg_min,1.0,sbg_max,1.0);
2530 TLine *bottom = new TLine(sbg_min,0.75,sbg_max,0.75);
2531
2532
2533 top->SetLineColor(kBlue);top->SetLineStyle(2);
2534 bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2535 center->SetLineColor(kBlue);
2536
2537 top->Draw("same");
2538 center->Draw("same");
2539 bottom->Draw("same");
2540
2541 TLegend *leg2 = make_legend("MC Z+jets",0.25,0.75,false);
2542 leg2->AddEntry(hratio,"obs / pred","pe");
2543 leg2->AddEntry(bottom,"syst. envelope","l");
2544 leg2->Draw("same");
2545 DrawMCPrelim(simulatedlumi);
2546 CompleteSave(zcan,"Systematics/zjets_prediction_ratio");
2547
2548 delete zcan;
2549 cutWeight=weightbackup;
2550
2551 }
2552
2553
2554
2555 void sideband_assessment(string datajzb, float min=30.0, float max=50.0) {
2556 tout << endl << endl;
2557 stringstream bordercut;
2558 bordercut << "(TMath::Abs(" << datajzb << ")<" << max << ")&&(TMath::Abs(" << datajzb << ")>" << min << ")";
2559 tout << bordercut.str().c_str() << endl;
2560 TH1F *ofsb = allsamples.Draw("ofsb",datajzb,100, 0,100, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
2561 TH1F *ofzp = allsamples.Draw("ofzp",datajzb,100, 0,100, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
2562 float OFSB = ofsb->Integral();
2563 float OFZP = ofzp->Integral();
2564
2565 tout << "\\begin{table}[hbtp]" << endl;
2566 tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
2567 tout << "\\begin{center}" << endl;
2568 tout << "\\caption{Total number of events observed in the auxiliary region $|JZB|>"<<min<<"\\GeV \\cup |JZB|<"<<max<<"\\GeV$ for the {\\OFZP} and {\\OFSB}.}\\label{tab:auxcounts}" << endl;
2569 tout << "\\begin{tabular}{l|cc}" << endl;
2570 tout << "\\hline" << endl;
2571 tout << "& {\\OFZP} & {\\OFSB} \\\\\\hline" << endl;
2572 tout << "\\#(events) & "<<OFSB<<" & "<<OFZP<<"\\\\ \\hline" << endl;
2573 tout << "\\end{tabular}" << endl;
2574 tout << "\\end{center}" << endl;
2575 tout << "\\end{table}" << endl;
2576
2577
2578 }
2579
2580 void make_table(samplecollection &coll, string jzbexpr, bool is_data, vector<float> jzb_cuts, string subselection="none") {
2581
2582 vector<float> jzbcutprediction;
2583 vector<float> metcutprediction;
2584
2585 vector<float> jzbcutobservation;
2586 vector<float> metcutobservation;
2587
2588 TCanvas *cannie = new TCanvas("cannie","cannie");
2589
2590 for(int icut=0;icut<jzb_cuts.size();icut++) {
2591 float currcut=jzb_cuts[icut];
2592 int nbins=1;float low=currcut;
2593 vector<int> mysample;
2594 if(subselection!="none") mysample=coll.FindSample(subselection);
2595 TH1F *RcorrJZBeemm = coll.Draw("RcorrJZBeemm",jzbexpr,1,currcut,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2596 TH1F *LcorrJZBeemm = coll.Draw("LcorrJZBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2597 TH1F *RcorrJZBem = coll.Draw("RcorrJZBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2598 TH1F *LcorrJZBem = coll.Draw("LcorrJZBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2599
2600 TH1F *RcorrJZBSBem;
2601 TH1F *LcorrJZBSBem;
2602 TH1F *RcorrJZBSBeemm;
2603 TH1F *LcorrJZBSBeemm;
2604
2605 if(PlottingSetup::RestrictToMassPeak) {
2606 RcorrJZBSBem = coll.Draw("RcorrJZBSBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2607 LcorrJZBSBem = coll.Draw("LcorrJZBSBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2608 RcorrJZBSBeemm = coll.Draw("RcorrJZBSBeemm",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2609 LcorrJZBSBeemm = coll.Draw("LcorrJZBSBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2610 }
2611
2612 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2613 if(PlottingSetup::RestrictToMassPeak) {
2614 Bpred->Add(RcorrJZBem,1.0/3.);
2615 Bpred->Add(LcorrJZBem,-1.0/3.);
2616 Bpred->Add(RcorrJZBSBem,1.0/3.);
2617 Bpred->Add(LcorrJZBSBem,-1.0/3.);
2618 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2619 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2620 } else {
2621 Bpred->Add(RcorrJZBem,1.0);
2622 Bpred->Add(LcorrJZBem,-1.0);
2623 }
2624
2625 jzbcutobservation.push_back(RcorrJZBeemm->Integral());
2626 jzbcutprediction.push_back(Bpred->Integral());
2627
2628 delete RcorrJZBeemm;
2629 delete LcorrJZBeemm;
2630 delete RcorrJZBem;
2631 delete LcorrJZBem;
2632 delete RcorrJZBSBem;
2633 delete LcorrJZBSBem;
2634 delete RcorrJZBSBeemm;
2635 delete LcorrJZBSBeemm;
2636
2637 TH1F *MetObs = coll.Draw("MetObs",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2638 TH1F *MetPred = coll.Draw("MetPred",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2639
2640 metcutobservation.push_back(MetObs->Integral());
2641 metcutprediction.push_back(MetPred->Integral());
2642 delete MetObs;
2643 delete MetPred;
2644 }//end of cut loop
2645
2646 //prediction part
2647 if(is_data) cout << "Data prediction & ";
2648 if(subselection!="none") cout << subselection << " prediction &";
2649 for(int ij=0;ij<jzb_cuts.size();ij++) cout << jzbcutprediction[ij] << " vs " << metcutprediction[ij] << " & ";
2650
2651 cout << endl;
2652 //observation part
2653 if(is_data) cout << "Data observation & ";
2654 if(subselection!="none") cout << subselection << " observation &";
2655 for(int ij=0;ij<jzb_cuts.size();ij++) cout << jzbcutobservation[ij] << " vs " << metcutobservation[ij] << " & ";
2656 cout << endl;
2657 cout << "_________________________________________________________________" << endl;
2658 delete cannie;
2659 }
2660
2661 void met_jzb_cut(string datajzb, string mcjzb, vector<float> jzb_cut) {
2662 /*we want a table like this:
2663 __________________ 50 | 100 | ...
2664 | Data prediction | a vs b | a vs b | ...
2665 | Data observed | a vs b | a vs b | ...
2666 --------------------------------------
2667 --------------------------------------
2668 | LM4 prediction | a vs b | a vs b | ...
2669 | LM4 observed | a vs b | a vs b | ...
2670 | LM8 prediction | a vs b | a vs b | ...
2671 | LM8 observed | a vs b | a vs b | ...
2672
2673 where a is the result for a jzb cut at X, and b is the result for a met cut at X
2674 */
2675 make_table(allsamples,datajzb, true,jzb_cut,"none");
2676 make_table(signalsamples,mcjzb, false,jzb_cut,"LM4");
2677 make_table(signalsamples,mcjzb, false,jzb_cut,"LM8");
2678 }
2679
2680
2681 //________________________________________________________________________________________
2682 // JZB Efficiency plot (efficiency of passing reco. JZB cut as function of generator JZB cut)
2683 void JZBSelEff(string mcjzb, TTree* events, string informalname, vector<float> jzb_bins) {
2684
2685 float min = 0, max = 400;
2686 float xbins[] = {min,10,20,30,40,50,60,70,80,90,100,110,120,140,150,160,170,180,190,200,210,220,250,300,max,max+100};
2687 int nbins = sizeof(xbins)/sizeof(float)-1;
2688 int markers[] = { 20, 26, 21, 24, 22, 25, 28 };
2689
2690 TH1F* heff = new TH1F("heff", "JZB eff ; generator-level JZB [GeV]; efficiency",nbins,xbins);
2691 TH1F* hgen = new TH1F("hgen", "JZB gen ; generator-level JZB [GeV]; efficiency",nbins,xbins);
2692 TH1F* hreco = new TH1F("hreco","JZB reco ; generator-level JZB [GeV]; efficiency",nbins,xbins);
2693
2694 TCut kgen(genMassCut&&"genZPt>0&&genNjets>2&&abs(genMID)==23"&&cutOSSF);
2695 TCut kreco(cutmass);
2696
2697 TF1* func = new TF1("func","0.5*[2]*(TMath::Erf((x-[1])/[0])+1)",min,max);
2698 func->SetParNames("epsilon","x_{1/2}","sigma");
2699 func->SetParameter(0,50.);
2700 func->SetParameter(1,0.);
2701 func->SetParameter(2,1.);
2702 gStyle->SetOptStat(0);
2703 gStyle->SetOptFit(0);
2704
2705 TCanvas *can = new TCanvas("can","Canvas for JZB Efficiency",600,600);
2706 can->SetGridx(1);
2707 can->SetGridy(1);
2708 TLegend *leg = make_legend("",0.6,0.2,false,0.89,0.5);
2709
2710
2711
2712 for ( int icut=0; icut<jzb_bins.size(); ++icut ) {
2713
2714 ostringstream selection;
2715 selection << mcjzb << ">" << jzb_bins[icut];
2716 TCut ksel(selection.str().c_str());
2717 events->Draw("genJZB>>hgen", kgen&&kreco, "goff");
2718 events->Draw("genJZB>>hreco",kgen&&kreco&&ksel,"goff");
2719
2720 // Loop over steps to get efficiency curve
2721 for ( Int_t iBin = 0; iBin<nbins-1; ++iBin ) {
2722 Float_t eff = hreco->GetBinContent(iBin+1)/hgen->GetBinContent(iBin+1);
2723 heff->SetBinContent(iBin+1,eff);
2724 heff->SetBinError(iBin+1,TMath::Sqrt(eff*(1-eff)/hgen->GetBinContent(iBin+1)));
2725 }
2726
2727 heff->GetXaxis()->SetRangeUser(min, max);
2728 heff->SetMarkerStyle(markers[icut]);
2729 heff->Fit("func","Q+","same");
2730
2731 // Print values
2732 dout << "+++ For " << selection.str() << std::endl;
2733 for ( int i=0; i<func->GetNpar(); ++i )
2734 dout << " " << func->GetParName(i) << " " << func->GetParameter(i) << " \\pm " << func->GetParError(i) << std::endl;
2735 char hname[256]; sprintf(hname,"heff%d",icut);
2736
2737 // Store plot
2738 TH1F* h = (TH1F*)heff->Clone(hname);
2739 if ( icut) h->Draw("same");
2740 else h->Draw();
2741 char htitle[256]; sprintf(htitle,"JZB > %3.0f GeV", jzb_bins[icut]);
2742 leg->AddEntry(h,htitle,"p");
2743
2744 }
2745
2746 leg->Draw();
2747 DrawMCPrelim(0.0);
2748 CompleteSave(can, "Systematics/jzb_efficiency_curve"+informalname );
2749
2750 delete hgen;
2751 delete hreco;
2752 delete heff;
2753 }
2754
2755 //________________________________________________________________________________________
2756 // Calls the above function for each signal sample
2757 void plot_jzb_sel_eff(string mcjzb, samplecollection &signalsamples, vector<float> bins )
2758 {
2759 for (int isignal=0; isignal<signalsamples.collection.size();isignal++) {
2760 dout << "JZB selection efficiency curve: " << std::endl;
2761 JZBSelEff(mcjzb,(signalsamples.collection)[isignal].events,(signalsamples.collection)[isignal].samplename,bins); // Only for some selected samples
2762 }
2763 }
2764
2765 void qcd_plots(string datajzb, string mcjzb, vector<float> bins) {
2766 // What this function aims to do:
2767 // Illustrate cut flow for QCD (requiring only one lepton, requiring etc.)
2768 // Illustrate how little QCD is left over! i.e. make some pointless JZB plot with only QCD to visualize the fact that there's not much really.
2769 TCanvas *can = new TCanvas("can","can");
2770 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
2771 kinpad->cd();
2772
2773 string jzb=mcjzb;
2774
2775 float hi=400;
2776 bool use_signal=false;
2777 bool use_data=false;
2778
2779 bool is_data=false;
2780 int nbins=50;//100;
2781 float low=0;
2782 float high=500;
2783 int versok=false;
2784 if(gROOT->GetVersionInt()>=53000) versok=true;
2785
2786 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
2787 TH1F *RcorrJZBeemm = qcdsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2788 TH1F *LcorrJZBeemm = qcdsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2789 TH1F *RcorrJZBem = qcdsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2790 TH1F *LcorrJZBem = qcdsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2791 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
2792 blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
2793 blankback->GetXaxis()->CenterTitle();
2794 blankback->GetYaxis()->CenterTitle();
2795
2796 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2797 TH1F *RcorrJZBSBem;
2798 TH1F *LcorrJZBSBem;
2799 TH1F *RcorrJZBSBeemm;
2800 TH1F *LcorrJZBSBeemm;
2801
2802 TH1F *RcorrJZBeemmNoS;
2803
2804 //these are for the ratio
2805 TH1F *JRcorrJZBeemm = qcdsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2806 TH1F *JLcorrJZBeemm = qcdsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2807 TH1F *JRcorrJZBem = qcdsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2808 TH1F *JLcorrJZBem = qcdsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2809
2810 TH1F *JRcorrJZBSBem;
2811 TH1F *JLcorrJZBSBem;
2812 TH1F *JRcorrJZBSBeemm;
2813 TH1F *JLcorrJZBSBeemm;
2814
2815 if(PlottingSetup::RestrictToMassPeak) {
2816 RcorrJZBSBem = qcdsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2817 LcorrJZBSBem = qcdsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2818 RcorrJZBSBeemm = qcdsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2819 LcorrJZBSBeemm = qcdsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2820
2821 //these are for the ratio
2822 JRcorrJZBSBem = qcdsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2823 JLcorrJZBSBem = qcdsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2824 JRcorrJZBSBeemm = qcdsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2825 JLcorrJZBSBeemm = qcdsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2826
2827 }
2828
2829 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2830
2831 TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
2832 TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
2833
2834 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2835 TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
2836 if(PlottingSetup::RestrictToMassPeak) {
2837 Bpred->Add(RcorrJZBem,1.0/3.);
2838 Bpred->Add(LcorrJZBem,-1.0/3.);
2839 Bpred->Add(RcorrJZBSBem,1.0/3.);
2840 Bpred->Add(LcorrJZBSBem,-1.0/3.);
2841 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2842 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2843
2844 TTbarpred->Scale(1.0/3);
2845 Zjetspred->Add(LcorrJZBem,-1.0/3.);
2846 Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
2847 TTbarpred->Add(RcorrJZBSBem,1.0/3.);
2848 Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
2849 TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
2850
2851 //these are for the ratio
2852 JBpred->Add(JRcorrJZBem,1.0/3.);
2853 JBpred->Add(JLcorrJZBem,-1.0/3.);
2854 JBpred->Add(JRcorrJZBSBem,1.0/3.);
2855 JBpred->Add(JLcorrJZBSBem,-1.0/3.);
2856 JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
2857 JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
2858 } else {
2859 Bpred->Add(RcorrJZBem,1.0);
2860 Bpred->Add(LcorrJZBem,-1.0);
2861
2862 Zjetspred->Add(LcorrJZBem,-1.0);
2863
2864 //these are for the ratio
2865 JBpred->Add(JRcorrJZBem,1.0);
2866 JBpred->Add(JLcorrJZBem,-1.0);
2867 }
2868
2869
2870 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
2871
2872 TLegend *legBpred = make_legend("",0.6,0.55,false);
2873 RcorrJZBeemm->Draw("e1x0,same");
2874 Bpred->Draw("hist,same");
2875 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2876 legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
2877 legBpred->AddEntry(Bpred,"MC predicted","l");
2878 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
2879 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
2880 legBpred->Draw();
2881 DrawMCPrelim();
2882
2883 //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
2884 string ytitle("ratio");
2885 if ( use_data==1 ) ytitle = "data/pred";
2886 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,"QCD/Bpred",true,use_data!=1,ytitle);
2887
2888 TH1F *allevents = qcdsamples.Draw("allevents","pfJetGoodNum",1,0,100, "internal code", "events", "" ,mc, luminosity);
2889 TH1F *ossf = qcdsamples.Draw("ossf","pfJetGoodNum",1,0,100, "internal code", "events", cutOSSF ,mc, luminosity);
2890 TH1F *osof = qcdsamples.Draw("osof","pfJetGoodNum",1,0,100, "internal code", "events", cutOSOF ,mc, luminosity);
2891 TH1F *njossf = qcdsamples.Draw("njossf","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSSF ,mc, luminosity);
2892 TH1F *njosof = qcdsamples.Draw("njosof","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSOF ,mc, luminosity);
2893
2894 dout << "______________________________________________" << endl;
2895 dout << "QCD contribution: " << endl;
2896 dout << "Total number of events: " << allevents->Integral() << endl;
2897 dout << "OSSF events: " << ossf->Integral() << endl;
2898 dout << "OSOF events: " << osof->Integral() << endl;
2899 dout << "OSSF events with >=3 jets:" << njossf->Integral() << endl;
2900 dout << "OSOF events with >=3 jets:" << njosof->Integral() << endl;
2901 dout << "(note that no mass requirement has been imposed)" << endl;
2902
2903 dout << "______________________________________________" << endl;
2904 dout << "How QCD shows up in the different regions: " << endl;
2905 dout << "OSSF: " << endl;
2906 if(PlottingSetup::RestrictToMassPeak) {
2907 dout << " Z window: \t" << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
2908 dout << " sideband: \t" << RcorrJZBSBeemm->Integral() << " (JZB>0) , " << LcorrJZBSBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBSBeemm->Integral() + LcorrJZBSBeemm->Integral() << endl;
2909 } else {
2910 dout << " " << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
2911 }
2912 dout << "OSOF: " << endl;
2913 if(PlottingSetup::RestrictToMassPeak) {
2914 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
2915 dout << " sideband: \t" << RcorrJZBSBem->Integral() << " (JZB>0) , " << LcorrJZBSBem->Integral() << " (JZB<0) --> total: " << RcorrJZBSBem->Integral() + LcorrJZBSBem->Integral() << endl;
2916 } else {
2917 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
2918 }
2919 dout << "Therefore: " << endl;
2920 if(PlottingSetup::RestrictToMassPeak) {
2921 dout << " Prediction increases by : " << LcorrJZBeemm->Integral() << " + (1.0/3)*(" << RcorrJZBSBeemm->Integral() <<"-"<< LcorrJZBSBeemm->Integral() << ") (SFSB) ";
2922 dout << " + (1.0/3)*(" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
2923 dout << " + (1.0/3)*(" << RcorrJZBSBem->Integral() <<"-"<< LcorrJZBSBem->Integral() << ") (OFSB) ";
2924 dout << " = " << LcorrJZBeemm->Integral() + (1.0/3)*(RcorrJZBSBeemm->Integral() - LcorrJZBSBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() + RcorrJZBSBem->Integral() - LcorrJZBSBem->Integral()) << endl;
2925 } else {
2926 dout << " Prediction increases by : " << LcorrJZBeemm->Integral();
2927 dout << " + (" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
2928 dout << " = " << LcorrJZBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() << endl;
2929 }
2930 dout << " Observation increases by : " << RcorrJZBeemm->Integral() << endl;
2931
2932 dout << endl;
2933 for(int i=0;i<bins.size();i++) {
2934 dout << " JZB > " << bins[i] << " : " << endl;
2935 dout << " Observation increases by : " << RcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
2936 if(PlottingSetup::RestrictToMassPeak) {
2937 dout << " Prediction increases by : " << LcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) + (1.0/3)*(RcorrJZBSBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) - LcorrJZBSBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) + RcorrJZBem->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) - LcorrJZBem->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) + RcorrJZBSBem->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) - LcorrJZBSBem->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX())) << endl;
2938 } else {
2939 dout << " Prediction increases by : " << LcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) + RcorrJZBem->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) - LcorrJZBem->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
2940 }
2941 }
2942
2943 delete can;
2944 delete allevents;
2945 if(ossf) delete ossf;
2946 if(RcorrJZBem) delete RcorrJZBem;
2947 if(LcorrJZBem) delete LcorrJZBem;
2948 if(RcorrJZBeemm) delete RcorrJZBeemm;
2949 if(LcorrJZBeemm) delete LcorrJZBeemm;
2950 if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBem) delete RcorrJZBSBem;
2951 if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBem) delete LcorrJZBSBem;
2952 if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBeemm) delete RcorrJZBSBeemm;
2953 if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBeemm) delete LcorrJZBSBeemm;
2954 }
2955
2956 void check_ptsanity() {
2957 TCanvas *ptsancan = new TCanvas("ptsancan","ptsancan",600,1800);
2958 TH1F *individualpt1histos[allsamples.collection.size()];
2959 TH1F *individualpt2histos[allsamples.collection.size()];
2960 TH1F *fpt1 = new TH1F("fpt1","fpt1",50,0,50);
2961 fpt1->GetYaxis()->SetRangeUser(0,1);
2962 fpt1->GetXaxis()->SetTitle("p_{T,1}");
2963 fpt1->GetXaxis()->CenterTitle();
2964
2965 TH1F *fpt2 = new TH1F("fpt2","fpt2",50,0,50);
2966 fpt2->GetXaxis()->SetTitle("p_{T,2}");
2967 fpt2->GetXaxis()->CenterTitle();
2968
2969 ptsancan->Divide(1,3);
2970 ptsancan->cd(1);
2971 float maxpt1entry=0;
2972 float maxpt2entry=0;
2973
2974 TLegend *leg = make_legend();
2975 leg->SetX1(0.0);
2976 leg->SetY1(0.0);
2977 leg->SetX2(1.0);
2978 leg->SetY2(1.0);
2979
2980
2981 for(int isample=0;isample<allsamples.collection.size();isample++) {
2982 string nowname=(allsamples.collection)[isample].filename;
2983 cout << "Drawing: " << nowname << " (sample " << isample+1 << " / " << allsamples.collection.size() << ")" << endl;
2984 individualpt1histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt1",50,0,50, "p_{T,1}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
2985 individualpt2histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt2",50,0,50, "p_{T,2}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
2986 individualpt1histos[isample]->SetLineColor(isample+1);
2987 individualpt2histos[isample]->SetLineColor(isample+1);
2988 float currmaxpt1entry=individualpt1histos[isample]->GetMaximum()/individualpt1histos[isample]->Integral();
2989 float currmaxpt2entry=individualpt2histos[isample]->GetMaximum()/individualpt2histos[isample]->Integral();
2990 cout << " pt 1 histo contains; " << individualpt1histos[isample]->Integral() << endl;
2991 cout << " pt 2 histo contains; " << individualpt2histos[isample]->Integral() << endl;
2992 if(currmaxpt1entry>maxpt1entry)maxpt1entry=currmaxpt1entry;
2993 if(currmaxpt2entry>maxpt2entry)maxpt2entry=currmaxpt2entry;
2994 leg->AddEntry(individualpt2histos[isample],((allsamples.collection)[isample].filename).c_str(),"f");
2995 }
2996
2997 fpt1->GetYaxis()->SetRangeUser(0,maxpt1entry);
2998 fpt2->GetYaxis()->SetRangeUser(0,maxpt2entry);
2999
3000 ptsancan->cd(1);
3001 fpt1->Draw();
3002 ptsancan->cd(2);
3003 fpt2->Draw();
3004
3005 for(int isample=0;isample<allsamples.collection.size();isample++) {
3006 ptsancan->cd(1);
3007 individualpt1histos[isample]->DrawNormalized("same,histo");
3008 ptsancan->cd(2);
3009 individualpt2histos[isample]->DrawNormalized("same,histo");
3010 }
3011 ptsancan->cd(3);
3012 leg->Draw();
3013 CompleteSave(ptsancan,"PtSanityCheck");
3014
3015 delete ptsancan;
3016 }
3017
3018 void do_mlls_plot(string mcjzb) {
3019 cout << "At this point we'd plot the mll distribution" << endl;
3020 TCanvas *sigcan = new TCanvas("sigcan","sigcan");
3021 for(int isig=0;isig<(signalsamples.collection).size();isig++) {
3022 if(!(signalsamples.collection)[isig].events) continue;
3023 string nowname=(signalsamples.collection)[isig].filename;
3024 TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets,mc,luminosity,signalsamples.FindSample(nowname));
3025 // TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events","",mc,luminosity,signalsamples.FindSample(nowname));
3026 mll->SetLineColor(TColor::GetColor("#04B404"));
3027 stringstream poscutS;
3028 poscutS << "((" << mcjzb <<")>50)";
3029 TCut poscut(poscutS.str().c_str());
3030 TH1F *mllP = signalsamples.Draw("mllhistoP","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets&&poscut,mc,luminosity,signalsamples.FindSample(nowname));
3031 mllP->SetLineColor(TColor::GetColor("#0040FF"));
3032 mll->Draw("histo");
3033 mllP->Draw("histo,same");
3034 TLegend *leg = make_legend();
3035 leg->SetY1(0.8);
3036 leg->AddEntry(mll,(signalsamples.collection)[isig].samplename.c_str(),"L");
3037 leg->AddEntry(mllP,((signalsamples.collection)[isig].samplename+", JZB>50").c_str(),"L");
3038 leg->Draw();
3039 TLine *lin = new TLine(71.2,0,71.2,mll->GetMaximum());
3040 TLine *lin2 = new TLine(111.2,0,111.2,mll->GetMaximum());
3041 lin->Draw("same");
3042 lin2->Draw("same");
3043
3044 CompleteSave(sigcan,"MllShape/"+(signalsamples.collection)[isig].samplename);
3045 delete mll;
3046 delete mllP;
3047 }
3048 }
3049
3050 void met_vs_jzb_plots() {
3051
3052 TCanvas *canmetjzb = new TCanvas("canmet","MET vs JZB canvas");
3053 canmetjzb->SetRightMargin(0.16);
3054
3055 vector<string> findme;
3056 findme.push_back("DY");
3057 findme.push_back("TTJets");
3058 findme.push_back("LM");
3059
3060 for(int ifind=0;ifind<findme.size();ifind++) {
3061 vector<int> selsamples = allsamples.FindSample(findme[ifind]);
3062 TH2F *metvsjzb = new TH2F("metvsjzb","metvsjzb",200,0,100,400,-100,100);
3063 for(int isel=0;isel<selsamples.size();isel++) {
3064 cout << "Producing MET:JZB plot ... working on sample: " << allsamples.collection[selsamples[isel]].filename << endl;
3065 allsamples.collection[selsamples[isel]].events->Draw("jzb[1]:met[4]>>+metvsjzb",cutmass&&cutOSSF);
3066 }
3067 metvsjzb->Scale(allsamples.collection[selsamples[0]].weight);
3068 metvsjzb->SetStats(0);
3069 metvsjzb->GetXaxis()->SetTitle("MET (GeV)");
3070 metvsjzb->GetYaxis()->SetTitle("JZB (GeV)");
3071 metvsjzb->GetXaxis()->CenterTitle();
3072 metvsjzb->GetYaxis()->CenterTitle();
3073 metvsjzb->Draw("COLZ");
3074 TText* title = write_text(0.5,0.95,allsamples.collection[selsamples[0]].samplename);
3075 title->SetTextAlign(12);
3076 title->Draw();
3077 CompleteSave(canmetjzb,(string)"METvsJZBplots/"+findme[ifind]);
3078 }
3079 }
3080
3081
3082 void test() {
3083
3084 TCanvas *testcanv = new TCanvas("testcanv","testcanv");
3085 testcanv->cd();
3086 switch_overunderflow(true);
3087 TH1F *ptdistr = allsamples.Draw("ptdistr","pt1",100,30,200, "p_{T} [GeV]", "events", cutOSSF,data,luminosity);
3088 switch_overunderflow(false);
3089 ptdistr->Draw();
3090 testcanv->SaveAs("test.png");
3091 dout << "HELLO there!" << endl;
3092
3093 }