ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.20
Committed: Wed May 23 16:02:03 2012 UTC (12 years, 11 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.19: +12 -10 lines
Log Message:
Using 3D reweighted events for ZJets systematics

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