ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.11
Committed: Tue Apr 10 13:45:00 2012 UTC (13 years ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.10: +190 -71 lines
Log Message:
Added new plot to show mll distribution as predicted and observed; expanded saved last configuration (for peak error in data)

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