ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.3
Committed: Thu Feb 23 15:15:52 2012 UTC (13 years, 2 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.2: +198 -8 lines
Log Message:
Added check for QCD in MC

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