ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.16
Committed: Mon Apr 30 08:38:11 2012 UTC (13 years ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.15: +38 -40 lines
Log Message:
fixed some uint vs int comparisons; commented out/removed unused variables; made Wall happy

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