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

File Contents

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