ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.18
Committed: Tue May 22 16:28:11 2012 UTC (12 years, 11 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.17: +9 -5 lines
Log Message:
Added option to have customized binning for shape analysis; added btag option to response correction

File Contents

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