ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.22
Committed: Wed Jun 6 07:02:16 2012 UTC (12 years, 11 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.21: +9 -11 lines
Log Message:
Added new kinematic plots (for number of jets with OSOF), removed some that were removed at the JZBtree level (jet variables); now doing response with PURW

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