ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.65
Committed: Thu Sep 13 09:44:16 2012 UTC (12 years, 7 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.64: +44 -174 lines
Log Message:
Turned off underflow bin globally. Switched on overflow bin for plots requiring it. Removed superfluous pred/obs ratio function which is in the general prediction function anyway; adapted the range of the prediction & observation histos so the overflow bin is shown

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