ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.73
Committed: Mon Dec 3 16:05:36 2012 UTC (12 years, 5 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.72: +68 -43 lines
Log Message:
Updating THStack implementation

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