ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.14
Committed: Wed Apr 18 12:56:51 2012 UTC (13 years ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.13: +50 -31 lines
Log Message:
Ported changes from paper to this version. In matters of style, changes were overruled

File Contents

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