ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.56
Committed: Wed Sep 5 20:16:25 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.55: +7 -1 lines
Log Message:
Storing peak position; deactivated underflow/overflow bin while fitting

File Contents

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