ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.63
Committed: Fri Sep 7 15:10:26 2012 UTC (12 years, 7 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.62: +4 -3 lines
Log Message:
One more plot.

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