ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.57
Committed: Thu Sep 6 10:19:18 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.56: +17 -11 lines
Log Message:
Updated peak finding to allow for different numbers of jets

File Contents

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