ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.59
Committed: Fri Sep 7 09:46:46 2012 UTC (12 years, 7 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.58: +2 -2 lines
Log Message:
Lower mass cut at 15 GeV...

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