ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.10
Committed: Fri Mar 30 07:05:45 2012 UTC (13 years, 1 month ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.9: +74 -44 lines
Log Message:
ported paper changes to latest version

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