ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.55
Committed: Wed Sep 5 16:32:51 2012 UTC (12 years, 8 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.54: +114 -29 lines
Log Message:
More plots in preparation for comparison and control regions.

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