ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.87
Committed: Mon Feb 25 18:00:09 2013 UTC (12 years, 2 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.86: +51 -8 lines
Log Message:
Finalized PU study

File Contents

# Content
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 dout << " - compare_onpeak_offpeak_signal_distributions: Implement this function ... " << endl;
27 dout << "Info : The trigger requirement is currently set to " << (const char*) passtrig << endl;
28 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 dout << "Info : The weight applied to all MC is " << (const char*) cutWeight << endl;
32 }
33
34
35
36 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 {
38 // Temporarily switch off PU reweighting, if asked
39 TCut weightbackup=cutWeight;
40 if ( !doPUreweighting ) cutWeight="1.0";
41
42 int nbins=100;
43 if(PlottingSetup::DoBTag) nbins=25;
44
45 TCut nJetsCut(cutnJets);
46 if(SwitchOffNJetsCut) nJetsCut=specialcut;
47
48 TCanvas *tempcan = new TCanvas("tempcan","Temporary canvas for peak finding preparations");
49 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 TH1F *rawttbarjzbeemmMC;
54
55 if(method==doKM) {
56 //we only need this histo for the KM fitting...
57 rawttbarjzbeemmMC = allsamples.Draw("rawttbarjzbeemmMC",jzbvariablemc,nbins, -50,50, "JZB [GeV]", "events",cutmass&&cutOSSF&&nJetsCut&&specialcut,mc,luminosity,allsamples.FindSample("TTJet"));
58 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 delete rawttbarjzbeemmMC;
61 }
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 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 delete reducedMC;
71 delete reducedData;
72 }
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 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 delete rawJZBeemmData;
84 delete rawJZBeemmMC;
85 delete rawJZBemData;
86 delete rawJZBemMC;
87 delete tempcan;
88 }
89
90 void DoPeakVsPU() {
91 cout << "Trying to find peak position as a function of PU" << endl;
92 float MCPeak, MCPeakError, DataPeak, DataPeakError;
93 stringstream result, datajzb, mcjzb;
94 bool doPUreweighting=true;
95 bool SwitchOffNJetsCut=false;
96
97
98 TCanvas *can = new TCanvas("can","can");
99 float mcSigma,mcSigmaError,dataSigma,dataSigmaError;
100
101 float NumVtxBin[6] = {0,5,10,15,20,30};
102
103 stringstream NowCut;
104
105 TGraphErrors *gMCPeak = new TGraphErrors();
106 gMCPeak->SetTitle("gMCPeak");
107 gMCPeak->SetName("gMCPeak");
108 TGraphErrors *gDataPeak = new TGraphErrors();
109 gDataPeak->SetTitle("gDataPeak");
110 gDataPeak->SetName("gDataPeak");
111 TGraphErrors *gMCWidth = new TGraphErrors();
112 gMCWidth->SetTitle("gMCWidth");
113 gMCWidth->SetName("gMCWidth");
114 TGraphErrors *gDataWidth = new TGraphErrors();
115 gDataWidth->SetTitle("gDataWidth");
116 gDataWidth->SetName("gDataWidth");
117
118 for(int i=0;i<5;i++) {
119 NowCut.str("");
120 NowCut << "numVtx>=" << NumVtxBin[i] << "&&numVtx<" << NumVtxBin[i+1];
121 find_one_peak_combination(TCut(NowCut.str().c_str()),SwitchOffNJetsCut,MCPeak,MCPeakError, DataPeak,DataPeakError,mcSigma,mcSigmaError, dataSigma,dataSigmaError,result,doPUreweighting,"");
122 cout << " " << MCPeak << " +/- " << MCPeakError << endl;
123 cout << " " << DataPeak << " +/- " << DataPeakError << endl;
124
125 gMCPeak->SetPoint(i,0.5*(NumVtxBin[i]+NumVtxBin[i+1]),MCPeak);
126 gMCPeak->SetPointError(i,0.5*(NumVtxBin[i+1]-NumVtxBin[i]),MCPeakError);
127
128 gDataPeak->SetPoint(i,0.5*(NumVtxBin[i]+NumVtxBin[i+1]),DataPeak);
129 gDataPeak->SetPointError(i,0.5*(NumVtxBin[i+1]-NumVtxBin[i]),DataPeakError);
130
131 gMCWidth->SetPoint(i,0.5*(NumVtxBin[i]+NumVtxBin[i+1]),mcSigma);
132 gMCWidth->SetPointError(i,0.5*(NumVtxBin[i+1]-NumVtxBin[i]),mcSigmaError);
133
134 gDataWidth->SetPoint(i,0.5*(NumVtxBin[i]+NumVtxBin[i+1]),dataSigma);
135 gDataWidth->SetPointError(i,0.5*(NumVtxBin[i+1]-NumVtxBin[i]),dataSigmaError);
136 }
137
138 can->cd();
139 gMCPeak->GetXaxis()->SetTitle("N(Vertices)");
140 gMCPeak->GetYaxis()->SetTitle("Peak position");
141 gMCPeak->GetXaxis()->CenterTitle();
142 gMCPeak->GetYaxis()->CenterTitle();
143 gDataPeak->GetXaxis()->SetTitle("N(Vertices)");
144 gDataPeak->GetYaxis()->SetTitle("Peak position");
145 gDataPeak->GetXaxis()->CenterTitle();
146 gDataPeak->GetYaxis()->CenterTitle();
147
148 gDataWidth->GetXaxis()->SetTitle("N(Vertices)");
149 gDataWidth->GetYaxis()->SetTitle("#sigma_{JZB}");
150 gDataWidth->GetXaxis()->CenterTitle();
151 gDataWidth->GetYaxis()->CenterTitle();
152 gMCWidth->GetXaxis()->SetTitle("N(Vertices)");
153 gMCWidth->GetYaxis()->SetTitle("#sigma_{JZB}");
154 gMCWidth->GetXaxis()->CenterTitle();
155 gMCWidth->GetYaxis()->CenterTitle();
156
157 gMCPeak->SetFillColor(TColor::GetColor("#2E9AFE"));
158 gDataPeak->SetFillColor(TColor::GetColor("#2E9AFE"));
159 gDataWidth->SetFillColor(TColor::GetColor("#2E9AFE"));
160 gMCWidth->SetFillColor(TColor::GetColor("#2E9AFE"));
161
162 gMCPeak->Draw("A2");
163 DrawMCPrelim();
164 CompleteSave(can,"PUStudy/MCPeak");
165 can->cd();
166 gMCWidth->Draw("A2");
167 DrawMCPrelim();
168 CompleteSave(can,"PUStudy/MCWidth");
169 can->cd();
170
171 gDataPeak->Draw("A2");
172 DrawPrelim();
173 CompleteSave(can,"PUStudy/DataPeak");
174 can->cd();
175 gDataWidth->Draw("A2");
176 DrawPrelim();
177 CompleteSave(can,"PUStudy/DataWidth");
178
179
180
181 delete can;
182
183 }
184
185 void find_peaks(float &MCPeak,float &MCPeakError, float &DataPeak, float &DataPeakError, stringstream &result, bool doPUreweighting, stringstream &datajzb, stringstream &mcjzb, string sSpecialCut="", bool SwitchOffNJetsCut=false)
186 {
187 bool overunderflowstatus=addoverunderflowbins;
188 switch_overunderflow(false);
189
190 TCut SpecialCut("mll>=0");
191 if(sSpecialCut!="") SpecialCut=TCut(sSpecialCut.c_str());
192
193 bool DoInvidualeemmPeaks=false;
194
195 float mcpeak, datapeak;
196 float mcpeakerr, datapeakerr;
197
198 float mceepeak,mcmmpeak;
199 float mceepeakerr,mcmmpeakerr;
200
201 float datammpeak,dataeepeak;
202 float datammpeakerr,dataeepeakerr;
203
204 float mcSigma,mcSigmaError, dataSigma, dataSigmaError;
205
206 dout << "Finding global peak : " << endl;
207 find_one_peak_combination(SpecialCut,SwitchOffNJetsCut,mcpeak,mcpeakerr, datapeak,datapeakerr,mcSigma,mcSigmaError, dataSigma,dataSigmaError,result,doPUreweighting,"");
208
209 if(DoInvidualeemmPeaks) {
210 dout << "Finding peak for electrons : " << endl;
211 find_one_peak_combination(SpecialCut&&TCut("id1==0"),SwitchOffNJetsCut,mceepeak,mceepeakerr,dataeepeak,dataeepeakerr,mcSigma,mcSigmaError,dataSigma,dataSigmaError,result,doPUreweighting,"_ele");
212 dout << "Finding peak for muons : " << endl;
213 find_one_peak_combination(SpecialCut&&TCut("id1==1"),SwitchOffNJetsCut,mcmmpeak,mcmmpeakerr,datammpeak,datammpeakerr,mcSigma,mcSigmaError,dataSigma,dataSigmaError,result,doPUreweighting,"_mu");
214
215 datajzb << "(" << jzbvariabledata;
216 mcjzb << "(" << jzbvariablemc;
217
218 if(dataeepeak>0) datajzb << "- (id1==id2)*(id1==0)*" << TMath::Abs(dataeepeak) << " ";
219 else datajzb << "+ (id1==id2)*(id1==0)*" << TMath::Abs(dataeepeak) << " ";
220
221 if(datammpeak>0) datajzb << "- (id1==id2)*(id1==1)*" << TMath::Abs(datammpeak) << " ";
222 else datajzb << "+ (id1==id2)*(id1==1)*" << TMath::Abs(datammpeak) << " ";
223
224 if(datapeak>0) datajzb << "- (id1!=id2)*" << TMath::Abs(datapeak) << " ";
225 else datajzb << "+ (id1!=id2)*" << TMath::Abs(datapeak) << " ";
226
227 datajzb << ")";
228
229 if(mceepeak>0) mcjzb << "- (id1==id2)*(id1==0)*" << TMath::Abs(mceepeak) << " ";
230 else mcjzb << "+ (id1==id2)*(id1==0)*" << TMath::Abs(mceepeak) << " ";
231
232 if(mcmmpeak>0) mcjzb << "- (id1==id2)*(id1==1)*" << TMath::Abs(mcmmpeak) << " ";
233 else mcjzb << "+ (id1==id2)*(id1==1)*" << TMath::Abs(mcmmpeak) << " ";
234
235 if(mcpeak>0) mcjzb << "- (id1!=id2)*" << TMath::Abs(mcpeak) << " ";
236 else mcjzb << "+ (id1!=id2)*" << TMath::Abs(mcpeak) << " ";
237
238 mcjzb << ")";
239
240 } else {
241 datajzb << "(" << jzbvariabledata;
242 mcjzb << "(" << jzbvariablemc;
243
244 if(datapeak>0) datajzb << "- " << TMath::Abs(datapeak) << " ";
245 else datajzb << "+ " << TMath::Abs(datapeak) << " ";
246
247 datajzb << ")";
248
249 if(mcpeak>0) mcjzb << "- " << TMath::Abs(mcpeak) << " ";
250 else mcjzb << "+ " << TMath::Abs(mcpeak) << " ";
251
252 mcjzb << ")";
253 }
254
255 MCPeak=mcpeak;
256 MCPeakError=mcpeakerr;
257 DataPeak=datapeak;
258 DataPeakError=datapeakerr;
259 switch_overunderflow(overunderflowstatus);
260 }
261
262 void make_special_obs_pred_mll_plot(string datajzb, string mcjzb, float jzbthreshold, float binWidth = 5.0) {
263 float min=70.0;
264 float max=115.0;
265 if(!PlottingSetup::RestrictToMassPeak) {
266 min=20;
267 max=300;
268 }
269 int nbins=int((max-min)/binWidth);
270
271 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
272
273 stringstream largerzeroS;
274 largerzeroS << "(" << datajzb << ">" << jzbthreshold << ")";
275 TCut largerzeroD(largerzeroS.str().c_str());
276
277 stringstream smallerzeroS;
278 smallerzeroS << "(" << datajzb << "<-" << jzbthreshold << ")";
279 TCut smallerzeroD(smallerzeroS.str().c_str());
280
281
282 stringstream largerzeroMS;
283 largerzeroMS << "(" << mcjzb << ">" << jzbthreshold << ")";
284 TCut largerzeroM(largerzeroMS.str().c_str());
285
286 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzeroD,data,luminosity);
287 THStack mcRcorrJZBeemm = allsamples.DrawStack("mcRcorrJZBeemm","mll",nbins,min,max, "m_{ll} [GeV}", "events", cutmass&&cutOSSF&&cutnJets&&largerzeroM,mc,luminosity);
288 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&smallerzeroD,data,luminosity);
289 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&largerzeroD,data,luminosity);
290 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&smallerzeroD,data,luminosity);
291
292 TH1F *RcorrJZBSBem;
293 TH1F *LcorrJZBSBem;
294 TH1F *RcorrJZBSBeemm;
295 TH1F *LcorrJZBSBeemm;
296
297 // TH1F *RcorrJZBeemmNoS;
298
299 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
300 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&largerzeroD,data, luminosity);
301 LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&smallerzeroD,data, luminosity);
302 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&largerzeroD,data, luminosity);
303 LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&smallerzeroD,data, luminosity);
304 }
305
306 // Separate predictions
307 TH1F* SFN = (TH1F*)LcorrJZBeemm->Clone("SFN");
308 TH1F* OFP = (TH1F*)RcorrJZBem->Clone("OFP");
309 TH1F* OFN = (TH1F*)LcorrJZBem->Clone("OFN");
310 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
311 OFP->Scale(1.0/3.0);
312 OFP->Add(RcorrJZBSBem,1.0/3.);
313 OFP->Add(RcorrJZBSBeemm,1.0/3.);
314 OFN->Scale(1.0/3.0);
315 OFN->Add(LcorrJZBSBem,1.0/3.);
316 OFN->Add(LcorrJZBSBeemm,1.0/3.);
317 }
318
319 TH1F* Bpred = (TH1F*)SFN->Clone("Bpred");
320 Bpred->Add(OFP);
321 Bpred->Add(OFN,-1);
322 Bpred->SetLineColor(kRed);
323
324 RcorrJZBeemm->SetTitleOffset(1.3,"y");
325 RcorrJZBeemm->Draw();
326 mcRcorrJZBeemm.Draw("histo,same");
327 Bpred->Draw("histo,same");
328 RcorrJZBeemm->Draw("same");
329
330 TLegend *leg = allsamples.allbglegend();
331 leg->SetX1(0.58);
332 leg->AddEntry(RcorrJZBeemm,"observed (data)","l");
333 leg->AddEntry(Bpred,"predicted (data)","l");
334 leg->Draw("same");
335
336 stringstream saveas;
337 saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold;
338 CompleteSave(ckin,saveas.str());
339
340 // Draw all predictions overlayed
341 unsigned int w = gStyle->GetHistLineWidth()+1; // Make line a bit wider, since we dash it
342 SFN->SetLineColor(kGreen+2);
343 SFN->SetLineStyle(2);
344 SFN->SetLineWidth(w);
345 OFP->SetLineColor(kBlue+2);
346 OFP->SetLineStyle(2);
347 OFP->SetLineWidth(w);
348 OFN->SetLineColor(kMagenta+2);
349 OFN->SetLineStyle(3);
350 OFN->SetLineWidth(w);
351
352 RcorrJZBeemm->Draw();
353 SFN->Draw("histo,same");
354 OFP->Draw("histo,same");
355 OFN->Draw("histo,same");
356 Bpred->Draw("histo,same");
357 RcorrJZBeemm->Draw("same");
358
359 TLegend *leg2 = make_legend("",0.52,0.7);
360 leg2->AddEntry(RcorrJZBeemm,"observed (data)","lp");
361 leg2->AddEntry(Bpred,"predicted (data)","l");
362 leg2->AddEntry(SFN, " SF JZB<0","l");
363 leg2->AddEntry(OFN, " OF JZB<0","l");
364 leg2->AddEntry(OFP, " OF JZB>0","l");
365 leg2->Draw("same");
366
367 saveas.str("");
368 saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold << "_nomc";
369 CompleteSave(ckin,saveas.str());
370
371 delete RcorrJZBeemm;
372 delete LcorrJZBeemm;
373 delete RcorrJZBem;
374 delete LcorrJZBem;
375 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
376 delete RcorrJZBSBeemm;
377 delete LcorrJZBSBeemm;
378 delete RcorrJZBSBem;
379 delete LcorrJZBSBem;
380 }
381 delete Bpred;
382 delete ckin;
383 CleanLegends();
384 }
385
386 void make_special_mll_plot(int nbins, float min, float max, bool logscale,string xlabel) {
387
388 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
389
390 TH1F *datahistoOSSF = allsamples.Draw("datahistoOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,data,luminosity);
391 THStack mcstackOSSF = allsamples.DrawStack("mcstackOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,mc,luminosity);
392 TH1F *datahistoOSOF = allsamples.Draw("datahistoOSOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&cutnJets&&basiccut,data,luminosity);
393
394 if(logscale) ckin->SetLogy(1);
395 datahistoOSSF->SetMarkerSize(DataMarkerSize);
396 datahistoOSSF->GetXaxis()->SetTitle(xlabel.c_str());
397 datahistoOSSF->GetXaxis()->CenterTitle();
398 datahistoOSSF->GetYaxis()->SetTitle("events");
399 datahistoOSSF->GetYaxis()->CenterTitle();
400 datahistoOSOF->SetMarkerSize(DataMarkerSize);
401 datahistoOSSF->SetMarkerSize(DataMarkerSize);
402 datahistoOSSF->Draw();
403
404 mcstackOSSF.Draw("histo,same");
405 datahistoOSSF->Draw("same");
406
407 datahistoOSOF->SetMarkerColor(TColor::GetColor("#FE642E"));
408 datahistoOSOF->SetLineColor(kRed);
409 datahistoOSOF->SetMarkerStyle(21);
410 datahistoOSOF->Draw("same");
411
412 // Try to re-arrange legend...
413 TLegend *bgleg = allsamples.allbglegend("",datahistoOSSF);
414 TLegend *kinleg = make_legend();
415 kinleg->AddEntry(datahistoOSSF,"SF (data)","p");
416 kinleg->AddEntry(datahistoOSOF,"OF (data)","p");
417 TIter next(bgleg->GetListOfPrimitives());
418 TObject* obj;
419 // Copy the nice bkgd legend skipping the "data"
420 while ( (obj = next()) )
421 if ( strcmp(((TLegendEntry*)obj)->GetObject()->GetName(),"datahistoOSSF") )
422 kinleg->GetListOfPrimitives()->Add(obj);
423
424 kinleg->Draw();
425 CompleteSave(ckin,"kin/mll_ossf_osof_distribution");
426
427 delete datahistoOSOF;
428 delete datahistoOSSF;
429 delete ckin;
430 CleanLegends();
431 }
432
433
434 void draw_ratio_plot(TH1* hdata, THStack& hmc, float ymin=0.5, float ymax=1.5) {
435
436 // Make a histogram from stack
437 TIter next(hmc.GetHists());
438 TObject* obj;
439 TH1* hratio = NULL;
440 while ( (obj = next()) ) {
441 if ( !hratio ) {
442 hratio = (TH1*)obj->Clone();
443 hratio->SetName("hratio");
444 } else hratio->Add( (TH1*)obj );
445 }
446 hratio->Divide(hdata);
447 hratio->SetMaximum(ymax);
448 hratio->SetMinimum(ymin);
449 hratio->SetMarkerStyle(2);
450 hratio->SetLineWidth(1);
451 hratio->GetYaxis()->SetLabelSize(0.08);
452 hratio->GetXaxis()->SetLabelSize(0.0);
453
454 TPad* rpad = new TPad("rpad","",0.15,0.73,0.4,0.88);
455 rpad->SetTopMargin(0.0);
456 rpad->SetBottomMargin(0.0);
457 rpad->SetRightMargin(0.0);
458 rpad->Draw();
459 rpad->cd();
460 // hratio->GetXaxis()->SetNdivisions(0);
461 hratio->GetYaxis()->SetNdivisions(502,false);
462 hratio->Draw("e1x0");
463
464 TF1* oneline = new TF1("","1.0",0,1000);
465 oneline->SetLineColor(kBlue);
466 oneline->SetLineStyle(1);
467 oneline->SetLineWidth(1);
468 oneline->Draw("same");
469 }
470
471 float make_one_OFSF_plot(string variable, string addcut, string legendTitle, int nbins, float min, float max, float ymax, bool logscale,
472 string xlabel, string filename, float legendPosition=0.55) {
473
474 TCut ibasiccut=basiccut;
475 bool draw_separation_lines=false;
476
477 if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
478
479 TCut cutSF;
480 TCut cutOF;
481
482 cutOF = cutOSOF&&cutnJets&&ibasiccut;
483 cutSF = cutOSSF&&cutnJets&&ibasiccut;
484
485 TCanvas *ofsf_can = new TCanvas("ofsf_can","ofsf_can");
486
487 TPad* rcan = new TPad("rcan","rcan",0,0,1,1);
488 rcan->SetLogy(logscale);
489 rcan->cd();
490
491 std::cout << "OF/SF comparison: variable = " << variable << ", cut = " << cutSF.GetTitle() << std::endl;
492 TH1F *datahistoSF = allsamples.Draw("datahistoSF",variable,nbins,min,max, xlabel, "events",cutSF,data,luminosity);
493 TH1F *datahistoOF = allsamples.Draw("datahistoOF",variable,nbins,min,max, xlabel, "events",cutOF,data,luminosity);
494 // string signal("LM3");
495 // TH1F* signalhisto = new TH1F("signalhisto",signal.c_str(),nbins,min,max);
496 // int idx = signalsamples.FindSample(signal)[0];
497 // (signalsamples.collection)[idx].events->Project("signalhisto",variable.c_str(),cutSF);
498 // signalhisto->Scale((signalsamples.collection)[idx].weight*luminosity);
499 // signalhisto->SetLineColor((signalsamples.collection)[idx].samplecolor);
500 // signalhisto->SetLineStyle(2);
501 datahistoSF->SetMarkerSize(DataMarkerSize);
502 datahistoOF->SetLineColor(kRed);
503
504 if ( !logscale ) {
505 datahistoSF->SetMinimum(0); // Defaults
506 } else {
507 datahistoSF->SetMinimum(0.5);
508 }
509 if (ymax<0) {
510 if ( logscale ) datahistoSF->SetMaximum(5.3*datahistoSF->GetMaximum());
511 else datahistoSF->SetMaximum(0.8*datahistoSF->GetMaximum());
512 } else {
513 datahistoSF->SetMaximum(ymax);
514 }
515
516 float ymaxSet = datahistoSF->GetMaximum();
517
518 datahistoSF->GetXaxis()->SetTitle(xlabel.c_str());
519 datahistoSF->GetYaxis()->SetTitle("Events");
520 datahistoSF->GetXaxis()->CenterTitle();
521 datahistoSF->GetYaxis()->CenterTitle();
522
523 TLegend *mleg = make_legend(legendTitle.c_str(),legendPosition,0.7,false,legendPosition+0.2);
524 mleg->AddEntry(datahistoSF, "Same-flavor", "PL");
525 if (datahistoOF->Integral()>0) {
526 mleg->AddEntry(datahistoOF, "Opposite-flavor", "L");
527 } else {
528 mleg->AddEntry((TObject*)0, "", "");
529 }
530 //mleg->AddEntry(signalhisto, "LM3", "L");
531
532 datahistoSF->Draw("E1");
533 if (datahistoOF->Integral()>0) datahistoOF->Draw("HIST,SAMES");
534 //signalhisto->Draw("HIST,SAMES");
535 mleg->Draw();
536 DrawPrelim();
537 if (datahistoOF->Integral()>0) {
538 Save_With_Ratio( datahistoSF, datahistoOF, rcan, "SFOF/" + filename, false, false, "SF/OF" );
539 } else {
540 CompleteSave(rcan, "SFOF/" + filename);
541 }
542
543 datahistoSF->Delete();
544 datahistoOF->Delete();
545 //signalhisto->Delete();
546 delete mleg;
547 delete rcan;
548 delete ofsf_can;
549
550 return ymaxSet;
551
552 }
553
554 // Compare data to data
555 float make_data_comparison_plot(string variable, TCut cut, int nbins, float min, float max, float ymax, bool logscale,
556 string xlabel, string filename, float legendPosition=0.55) {
557
558 TCut ibasiccut=basiccut&&cut;
559
560 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
561 TPad* rcan = new TPad("rcan","rcan",0,0,1,1);
562 rcan->SetLogy(logscale);
563 rcan->cd();
564
565 std::cout << "Data comparison: variable = " << variable << ", cut = " << ibasiccut.GetTitle() << std::endl;
566
567 TH1F *data1 = allsamples.Draw("data1",variable,nbins,min,max, xlabel, "events",ibasiccut,data,luminosity);
568 TH1F *data2 = comparesamples.Draw("data2",variable,nbins,min,max, xlabel, "events",ibasiccut,data,luminosity);
569 data1->Scale(5.0/9.2);
570
571 data1->SetMarkerSize(DataMarkerSize);
572 data2->SetLineColor(kRed);
573
574 if ( !logscale ) {
575 data1->SetMinimum(0); // Defaults
576 } else {
577 data1->SetMinimum(0.5);
578 }
579 if (ymax<0) {
580 if ( logscale ) data1->SetMaximum(5.3*data1->GetMaximum());
581 else data1->SetMaximum(1.5*data1->GetMaximum());
582 } else {
583 data1->SetMaximum(ymax);
584 }
585
586 float ymaxSet = data1->GetMaximum();
587
588 data1->GetXaxis()->SetTitle(xlabel.c_str());
589 data1->GetYaxis()->SetTitle("Events");
590 data1->GetXaxis()->CenterTitle();
591 data1->GetYaxis()->CenterTitle();
592
593 TLegend *mleg = make_legend("",legendPosition,0.7,false,legendPosition+0.2);
594 mleg->AddEntry(data1, "2012 data (scaled)", "PL");
595 mleg->AddEntry(data2, "2011 data", "L");
596
597 data1->Draw("E1");
598 data2->Draw("HIST,SAMES");
599 mleg->Draw();
600 DrawPrelim();
601 Save_With_Ratio( data1, data2, rcan, "compareData/" + filename, false, false, "new/old" );
602
603 data1->Delete();
604 data2->Delete();
605 delete mleg;
606 delete rcan;
607 delete ckin;
608
609 }
610
611 void make_OFSF_plots(string variable, string addcut, int nbins, float min, float max, bool logscale,
612 string xlabel, string filename, float legendPosition=0.55) {
613
614 string mllcuts[] = { "mll>20","mll>15&&mll<70", "mll>75&&mll<105", "mll>120" };
615 string mllcutname[] = { "m_{ll} > 20 GeV", "20 < m_{ll} < 70 GeV", "70 < m_{ll} < 110 GeV", "m_{ll} > 120 GeV" };
616 string plotname[] = {"_all","_low","_peak","_high"};
617 float ymax;
618
619 int start = 0;
620 if ( !PlottingSetup::openBox ) start = 3;
621
622 for ( int i=start; i<4; ++i ) {
623 if ( addcut != "" ) mllcuts[i] += "&&"+addcut;
624 if ( i==start ) {
625 ymax = make_one_OFSF_plot(variable, mllcuts[i], mllcutname[i], nbins, min, max, -1, logscale, xlabel,
626 filename+plotname[i], legendPosition );
627 } else {
628 make_one_OFSF_plot(variable, mllcuts[i], mllcutname[i], nbins, min, max, ymax, logscale, xlabel,
629 filename+plotname[i], legendPosition );
630 }
631 make_one_OFSF_plot(variable, "id1==1&&id1==id2&&"+mllcuts[i], mllcutname[i], nbins, min, max, ymax, logscale, xlabel,
632 filename+plotname[i]+"_mm", legendPosition );
633 make_one_OFSF_plot(variable, "id1==0&&id1==id2&&"+mllcuts[i], mllcutname[i], nbins, min, max, ymax, logscale, xlabel,
634 filename+plotname[i]+"_ee", legendPosition );
635 }
636
637 }
638
639 TCut ReplaceInCut(TCut cut, string replacethis, string withthis) {
640 string scut=(string)(const char*)cut;
641 string acut=ReplaceAll(scut,replacethis,withthis);
642 return TCut(acut.c_str());
643 }
644
645 void DoMCSystPlot(string datavariable, string mcvariable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
646 TCut cut=addcut&&basiccut;
647
648 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
649 ckin->SetLogy(dolog);
650 cout << "\r Creating " << filename << " : data (1/6)" << std::flush;
651 TH1F *datahisto = allsamples.Draw("datahisto",datavariable,nbins,min,max, xlabel, "events",cut,data,luminosity);
652 datahisto->SetMarkerSize(DataMarkerSize);
653 if ( !dolog ) datahisto->SetMinimum(0); // Defaults
654 else datahisto->SetMinimum(0.5);
655 if (dolog) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
656 else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
657 cout << "\r Creating " << filename << " : MC central (2/6)" << std::flush;
658 THStack mcstack = allsamples.DrawStack("mcstack", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
659 TH1F *MCcentral = CollapseStack(mcstack);
660
661 TCut bkpcut = cut;
662 cut = ReplaceInCut(cut,"pfJetGoodNum40","pfJetGoodNum40p1sigma");
663 cout << "\r Creating " << filename << " : MC JES up (3/6)" << std::flush;
664 TH1F *MCJESup = allsamples.Draw("MCJESup", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
665
666 cut = ReplaceInCut(cut,"pfJetGoodNum40p1sigma","pfJetGoodNum40n1sigma");
667 cout << "\r Creating " << filename << " : MC JES down (4/6)" << std::flush;
668 TH1F *MCJESdn = allsamples.Draw("MCJESdn", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
669
670 cut=bkpcut;
671 TCut bkpweight = cutWeight;
672 cutWeight= ReplaceInCut(cutWeight,"weight","PUweightUP");
673 cout << "\r Creating " << filename << " : MC PU up (5/6)" << std::flush;
674 TH1F *MCPUup = allsamples.Draw("MCPUup", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
675
676 cutWeight= ReplaceInCut(cutWeight,"PUweightUP","PUweightDOWN");
677 cout << "\r Creating " << filename << " : MC PU down (6/6)" << std::flush;
678 TH1F *MCPUdn = allsamples.Draw("MCPUdn", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
679 cutWeight=bkpweight;
680 cout << "\r Creating " << filename << " : Processing systematics ..." << std::flush;
681 TH1F *Systematic = (TH1F*)MCPUdn->Clone("Systematic");
682 for(int i=1;i<=Systematic->GetNbinsX();i++) {
683 float jesdn = abs(MCcentral->GetBinContent(i)-MCJESdn->GetBinContent(i));
684 float jesup = abs(MCcentral->GetBinContent(i)-MCJESup->GetBinContent(i));
685 float jes = jesdn>jesup?jesdn:jesup;
686
687 float PUup = abs(MCcentral->GetBinContent(i)-MCPUup->GetBinContent(i));
688 float PUdn = abs(MCcentral->GetBinContent(i)-MCPUdn->GetBinContent(i));
689 float pu = PUdn>PUup?PUdn:PUup;
690
691 float sys=sqrt(jes*jes+pu*pu);
692 sys/=MCcentral->GetBinContent(i);
693 if(MCcentral->GetBinContent(i)==0) sys=0;
694 Systematic->SetBinContent(i,sys);
695 }
696
697 datahisto->Draw("e1");
698 ckin->Update();
699 mcstack.Draw("histo,same");
700
701 datahisto->Draw("same,e1");
702 TLegend *kinleg = allsamples.allbglegend();
703 kinleg->Draw();
704
705 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
706 kinpad->SetLogy(dolog);
707 kinpad->cd();
708 datahisto->Draw("e1");
709 mcstack.Draw("histo,same");
710 datahisto->Draw("same,e1");
711 datahisto->Draw("same,axis");
712
713 kinleg->Draw("same");
714 DrawPrelim();
715 string saveas="kin/"+filename;
716
717 cout << "Passing filename to be saved : " << filename << " as " << saveas << endl;
718 save_with_ratio_and_sys_band( datahisto, CollapseStack(mcstack), kinpad->cd(), saveas, false, false, "data/mc",Systematic );
719
720 ckin->cd();
721 MCcentral->SetFillColor(kWhite);
722 MCcentral->SetLineColor(kBlack);
723 MCcentral->SetLineWidth(2);
724 MCPUdn->SetLineColor(kRed);
725 MCPUup->SetLineColor(kYellow);
726 MCJESdn->SetLineColor(kBlue);
727 MCJESup->SetLineColor(kGreen);
728
729 TLegend *legsmall = new TLegend(0.0,0.85,1.0,1.00);
730 legsmall->SetNColumns(5);
731 legsmall->AddEntry(MCcentral,"central","L");
732 legsmall->AddEntry(MCPUdn,"PU down","L");
733 legsmall->AddEntry(MCPUup,"PU up","L");
734 legsmall->AddEntry(MCJESdn,"JES down","L");
735 legsmall->AddEntry(MCJESup,"JES up","L");
736 legsmall->SetFillColor(kWhite);
737 legsmall->SetBorderSize(0);
738
739 datahisto->Draw("e1");
740 MCcentral->Draw("histo,same");
741 MCPUdn->Draw("histo,same");
742 MCPUup->Draw("histo,same");
743 MCJESdn->Draw("histo,same");
744 MCJESup->Draw("histo,same");
745 datahisto->Draw("e1,same");
746 legsmall->Draw();
747 CompleteSave(ckin,saveas+"___AllLines");
748
749 delete datahisto;
750 delete MCcentral;
751 delete MCPUdn;
752 delete MCPUup;
753 delete MCJESdn;
754 delete MCJESup;
755 delete ckin;
756 }
757
758 void DoMCSystPlot(string variable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
759 DoMCSystPlot(variable, variable, nbins, min, max, addcut, dolog, xlabel, filename);
760 }
761
762 float lastrange_min=0;
763 float lastrange_max=0;
764
765 void make_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
766 string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
767 // TCut basiccut("(pfJetGoodNum>=2&&pfJetGoodID[0])&&(pfJetGoodNum>=2&&pfJetGoodID[1])&&(passed_triggers||!is_data)");
768 TCut ibasiccut=basiccut;
769 bool draw_separation_lines=false;
770 bool drawsignal = false;
771
772 if(isPF) ibasiccut=basiccut&&"pfjzb[0]>-998";
773
774 if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
775
776 //Step 1: Adapt the variable (if we're dealing with PF we need to adapt the variable!)
777 if(isPF) {
778 if(variable=="mll") variable="pfmll[0]";
779 if(variable=="jetpt[0]") variable="pfJetGoodPt[0]";
780 if(variable=="jeteta[0]") variable="pfJetGoodEta[0]";
781 if(variable=="pt") variable="pfpt[0]";
782 if(variable=="pt1") variable="pfpt1[0]";
783 if(variable=="pt2") variable="pfpt2[0]";
784 if(variable=="eta1") variable="pfeta1[0]";
785 if(variable=="jzb[1]") variable="pfjzb[0]";
786 //if(variable=="pfJetGoodNum") variable="pfJetGoodNum"; // pointless.
787 }
788
789 //Step 2: Refine the cut
790 TCut cut;
791 cut=cutmass&&cutOSSF&&cutnJets&&ibasiccut;
792 if(filename=="nJets" || filename=="nJets_inclusive" || filename=="nJets_met100" || filename=="nJets_inclusive_met100") cut=cutmass&&cutOSSF&&ibasiccut;
793 if(filename=="nJets_osof" || filename=="nJets_osof_inclusive" || filename=="nJets_osof_met100" || filename=="nJets_osof_inclusive_met100") cut=cutmass&&cutOSOF&&ibasiccut;
794 if(filename=="nJets_nocuts_except_mll_ossf") cut=cutmass&&cutOSSF;
795 if(filename=="mll"||filename=="mll_met100") {
796 cut=cutOSSF&&cutnJets&&ibasiccut;
797 draw_separation_lines=true;
798 }
799 if(filename=="mll_ee"||filename=="mll_ee_met100") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==0";
800 if(filename=="mll_mm"||filename=="mll_mm_met100") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==1";
801 if(filename=="mll_osof"||filename=="mll_osof_met100") {
802 cut=cutOSOF&&cutnJets&&ibasiccut;
803 draw_separation_lines=true;
804 }
805 if(Contains(filename,"aboveJZB")) cut=cutOSSF&&cutnJets&&ibasiccut;
806 if(Contains(filename,"mll_ee_above")) cut=cut&&"id1==0";
807 if(Contains(filename,"mll_mm_above")) cut=cut&&"id1==1";
808 if(Contains(filename,"mll_osof_aboveJZB")) cut=cutOSOF&&cutnJets&&ibasiccut;
809 if(filename=="mll_inclusive"||filename=="mll_inclusive_highrange") cut=cutOSSF;
810 if(filename=="mll_inclusive_osof") cut=cutOSOF;
811 if(filename=="mll_inclusive_ee") cut=cutOSSF&&"id1==0";
812 if(filename=="mll_inclusive_mm") cut=cutOSSF&&"id1==1";
813 if(filename=="pfJetGoodEta_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
814 if(filename=="pfJetGoodPt_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
815 if(filename=="numVtx") cut=cutmass&&ibasiccut;
816
817 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
818 ckin->SetLogy(logscale);
819 TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
820 datahisto->SetMarkerSize(DataMarkerSize);
821 if ( !logscale ) datahisto->SetMinimum(0); // Defaults
822 else datahisto->SetMinimum(0.5);
823 // Custom max.
824 if(variable=="TMath::Abs(pfJetDphiMet[0])") datahisto->SetMaximum(1.5*datahisto->GetMaximum());
825 if(variable=="pfJetGoodPt[0]") datahisto->SetMaximum(10*datahisto->GetMaximum());
826 if(variable=="pt") datahisto->SetMaximum(10*datahisto->GetMaximum());
827 if(filename=="mll_inclusive"||filename=="mll_inclusive_mm"||filename=="mll_inclusive_ee") datahisto->SetMinimum(1);
828 if(filename=="mll_osof") datahisto->SetMaximum(10*datahisto->GetMaximum());
829 if(filename=="mll_osof") datahisto->SetMinimum(9);
830 if (logscale) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
831 else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
832
833 cout << "******** Cut used : " << (const char*) cut << " for plot " << filename << endl;
834 if(loadlastminmax) {
835 datahisto->SetMinimum(lastrange_min);
836 datahisto->SetMaximum(lastrange_max);
837 if(logscale) {
838 datahisto->SetMinimum(pow(10,lastrange_min));
839 datahisto->SetMaximum(pow(10,lastrange_max));
840 }
841 }
842
843 // Draw signal by hand (for some reason I don't manage to use the sample class: it adds it to the stack!)
844 string signal("LM3");
845 TH1F* signalhisto = new TH1F("signalhisto",signal.c_str(),nbins,min,max);
846 int idx = signalsamples.FindSample(signal)[0];
847 if(drawsignal) (signalsamples.collection)[idx].events->Project("signalhisto",variable.c_str(),cut);
848 if(drawsignal) signalhisto->Scale((signalsamples.collection)[idx].weight*luminosity);
849 if(drawsignal) signalhisto->SetLineColor(kOrange);
850
851 THStack mcstack = allsamples.DrawStack("mcstack", variable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
852 datahisto->Draw("e1");
853 ckin->Update();
854 mcstack.Draw("histo,same");
855
856 datahisto->Draw("same,e1");
857 TLegend *kinleg = allsamples.allbglegend();
858 kinleg->Draw();
859 if(filename=="mll_osof") {
860 kinleg->SetHeader("Opposite flavor");
861 kinleg->SetX1(0.58);
862 }
863 if(filename=="mll") {
864 kinleg->SetHeader("Same flavor");
865 kinleg->SetX1(0.58);
866 }
867 TText* write_cut = write_cut_on_canvas(decipher_cut(cut,basicqualitycut));
868 write_cut->Draw();
869 TText* write_variable = write_text(0.99,0.01,variable);
870 write_variable->SetTextAlign(31);
871 write_variable->SetTextSize(0.02);
872
873 TLine *lowerboundary;
874 TLine *upperboundary;
875
876 if(RestrictToMassPeak&&draw_separation_lines) {
877 Color_t linecolor=kBlue;
878 float linemin=pow(10,ckin->GetUymin());
879 if(filename=="mll_osof") linemin=pow(10,lastrange_min);
880 lowerboundary = new TLine(71,linemin,71,datahisto->GetMaximum());
881 upperboundary = new TLine(111,linemin,111,datahisto->GetMaximum());
882 lowerboundary->SetLineColor(linecolor);
883 lowerboundary->SetLineStyle(2);
884 upperboundary->SetLineColor(linecolor);
885 upperboundary->SetLineStyle(2);
886 }
887
888 lastrange_min=ckin->GetUymin();
889 lastrange_max=ckin->GetUymax();
890
891
892 if ( plotratio ) {
893 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
894 kinpad->cd();
895 kinpad->SetLogy(logscale);
896 datahisto->Draw("e1");
897 mcstack.Draw("histo,same");
898 if(drawsignal) signalhisto->Draw("same");
899 datahisto->Draw("same,e1");
900 datahisto->Draw("same,axis");
901 if(RestrictToMassPeak&&draw_separation_lines) {
902 lowerboundary->Draw("same");
903 upperboundary->Draw("same");
904 }
905
906 if(drawsignal) kinleg->AddEntry("signalhisto",signal.c_str(),"l");
907 kinleg->Draw();
908 write_cut->Draw();
909 DrawPrelim();
910 string saveas="kin/"+filename;
911 if(isPF) saveas="kin/"+filename+"__PF";
912 Save_With_Ratio(datahisto,mcstack,kinpad->cd(),saveas);
913 // if(isPF) CompleteSave(with_ratio,"kin/"+filename+"__PF_withratio");
914 // else CompleteSave(with_ratio,"kin/"+filename+"_withratio");
915 // delete with_ratio;
916 } else {
917 if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
918 else CompleteSave(ckin,"kin/"+filename);
919 }
920 datahisto->Delete();
921 delete signalhisto;
922 delete ckin;
923 }
924
925
926 void make_plain_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
927 string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
928 TCut cut=TCut(addcut.c_str())&&basiccut;
929
930 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
931 ckin->SetLogy(logscale);
932 TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
933 datahisto->SetMarkerSize(DataMarkerSize);
934 if ( !logscale ) datahisto->SetMinimum(0); // Defaults
935 else datahisto->SetMinimum(0.5);
936 // Custom max.
937 if (logscale) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
938 else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
939
940 cout << "******** Cut used : " << (const char*) cut << " for plot " << filename << endl;
941 if(loadlastminmax) {
942 datahisto->SetMinimum(lastrange_min);
943 datahisto->SetMaximum(lastrange_max);
944 if(logscale) {
945 datahisto->SetMinimum(pow(10,lastrange_min));
946 datahisto->SetMaximum(pow(10,lastrange_max));
947 }
948 }
949
950 THStack mcstack = allsamples.DrawStack("mcstack", variable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
951 datahisto->Draw("e1");
952 ckin->Update();
953 mcstack.Draw("histo,same");
954
955 datahisto->Draw("same,e1");
956 TLegend *kinleg = allsamples.allbglegend();
957 kinleg->Draw();
958
959 lastrange_min=ckin->GetUymin();
960 lastrange_max=ckin->GetUymax();
961
962 if ( plotratio ) {
963 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
964 kinpad->cd();
965 kinpad->SetLogy(logscale);
966 datahisto->Draw("e1");
967 mcstack.Draw("histo,same");
968 datahisto->Draw("same,e1");
969 datahisto->Draw("same,axis");
970
971 kinleg->Draw();
972 DrawPrelim();
973 string saveas="kin/"+filename;
974 if(isPF) saveas="kin/"+filename+"__PF";
975 Save_With_Ratio(datahisto,mcstack,kinpad->cd(),saveas);
976 } else {
977 if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
978 else CompleteSave(ckin,"kin/"+filename);
979 }
980 datahisto->Delete();
981 delete ckin;
982 }
983
984
985 void make_JES_plot(TCut cut, string name) {
986
987 int nbins=10;
988 float min=-0.5;
989 float max = 9.5;
990 bool logscale=true;
991 string xlabel="nJets";
992
993 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
994 ckin->SetLogy(logscale);
995 TH1F *datahisto = allsamples.Draw("datahisto","pfJetGoodNum40",nbins,min,max, xlabel, "events",cut,data,luminosity);
996 datahisto->SetMarkerSize(DataMarkerSize);
997 THStack mcstack = allsamples.DrawStack("mcstack","pfJetGoodNum40",nbins,min,max, xlabel, "events",cut,mc,luminosity);
998 TH1F *JESup = allsamples.Draw("JESup","pfJetGoodNum40p1sigma",nbins,min,max, xlabel, "events",cut,mc,luminosity);
999 TH1F *JESdn = allsamples.Draw("JESdn","pfJetGoodNum40n1sigma",nbins,min,max, xlabel, "events",cut,mc,luminosity);
1000
1001 datahisto->SetMinimum(1);
1002 datahisto->SetMaximum(5.3*datahisto->GetMaximum()); // in line with kinematic plots style
1003
1004 float xs[nbins],ys[nbins],exs[nbins],eys[nbins];
1005 for(int i=1;i<JESup->GetNbinsX();i++) {
1006 float up=JESup->GetBinContent(i);
1007 float dn=JESdn->GetBinContent(i);
1008 xs[i]=JESup->GetBinCenter(i);
1009 ys[i]=0.5*(up+dn);
1010 exs[i]=0.5*JESup->GetBinWidth(i);
1011 eys[i]=0.5*TMath::Abs(up-dn);
1012 }
1013
1014 TGraphAsymmErrors *JESunc = new TGraphAsymmErrors(nbins, xs,ys,exs,exs,eys,eys);
1015 JESunc->SetFillColor(TColor::GetColor("#00ADE1"));
1016 JESunc->SetFillStyle(3002);
1017 datahisto->Draw("e1");
1018 mcstack.Draw("histo,same");
1019 JESunc->Draw("2");
1020 datahisto->Draw("same,e1");
1021 TLegend *kinleg = allsamples.allbglegend();
1022 kinleg->AddEntry(JESunc,"JES uncertainty","f");
1023 kinleg->Draw();
1024 CompleteSave(ckin,"Systematics/JES"+name);
1025 datahisto->Delete();
1026 delete ckin;
1027 delete JESunc;
1028 delete JESup;
1029 delete JESdn;
1030 CleanLegends();
1031 }
1032
1033 string Cut2Str(TCut cut) {
1034 return ((string)(const char*)cut);
1035 }
1036
1037 void MakeElegantTwoThreeComparisons() {
1038
1039 TCut signal("met[4]>100&&met[4]<150&&mll>20"&&PlottingSetup::basicqualitycut);
1040 TCut TwoJets("pfJetGoodNum40==2");
1041 TCut ThreeJets("pfJetGoodNum40>=3");
1042
1043 float min=20;
1044 float max=300;
1045 int nbins=int((max-min)/5.0);
1046 string xlabel="m_{ll} [GeV]";
1047
1048 TCanvas *can2 = new TCanvas("can2","can2");
1049 TH1F *TwoOF = allsamples.Draw("TwoOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&signal&&TwoJets,mc,luminosity,allsamples.FindSample("TTJets_"));
1050 TH1F *TwoSF = allsamples.Draw("TwoSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&signal&&TwoJets,mc,luminosity,allsamples.FindSample("TTJets_"));
1051 TH1F *ThreeOF = allsamples.Draw("ThreeOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&signal&&ThreeJets,mc,luminosity,allsamples.FindSample("TTJets_"));
1052 TH1F *ThreeSF = allsamples.Draw("ThreeSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&signal&&ThreeJets,mc,luminosity,allsamples.FindSample("TTJets_"));
1053
1054 can2->cd(1);
1055
1056 TwoSF->SetFillColor(kWhite);
1057 TwoOF->SetFillColor(kWhite);
1058 ThreeSF->SetFillColor(kWhite);
1059 ThreeOF->SetFillColor(kWhite);
1060
1061 TPad *kin3 = new TPad("kin3","kin3",0,0,1,1);
1062 kin3->cd();
1063 TwoOF->Draw("histo");
1064 TwoSF->Draw("e1,same");
1065 TLegend *leg_SFOF_Two = make_legend();
1066 leg_SFOF_Two->SetHeader("t#bar{t} MC:");
1067 leg_SFOF_Two->AddEntry(TwoOF,"OF, nJets==2","l");
1068 leg_SFOF_Two->AddEntry(TwoSF,"SF, nJets==2","lp");
1069 leg_SFOF_Two->Draw();
1070 Save_With_Ratio(TwoSF,TwoOF,kin3->cd(),"DoubleRatios/SFOF_Two");
1071
1072 TPad *kin4 = new TPad("kin4","kin4",0,0,1,1);
1073 kin4->cd();
1074 ThreeOF->Draw("histo");
1075 ThreeSF->Draw("e1,same");
1076 TLegend *leg_SFOF_Three = make_legend();
1077 leg_SFOF_Three->SetHeader("t#bar{t} MC:");
1078 leg_SFOF_Three->AddEntry(TwoOF,"OF, nJet#geq3","l");
1079 leg_SFOF_Three->AddEntry(TwoSF,"SF, nJets#geq3","lp");
1080 leg_SFOF_Three->Draw();
1081 Save_With_Ratio(ThreeSF,ThreeOF,kin4->cd(),"DoubleRatios/SFOF_Three");
1082
1083
1084 TwoSF->Scale(ThreeSF->Integral()/TwoSF->Integral());
1085 TPad *kin = new TPad("kin","kin",0,0,1,1);
1086 kin->cd();
1087 TwoSF->Draw("histo");
1088 ThreeSF->Draw("e1,same");
1089 TLegend *leg_SF_Two_Three = make_legend();
1090 leg_SF_Two_Three->SetHeader("t#bar{t} MC:");
1091 leg_SF_Two_Three->AddEntry(TwoSF,"#splitline{SF, nJets==2}{ (scaled)}","l");
1092 leg_SF_Two_Three->AddEntry(ThreeSF,"SF, nJets#geq3","lp");
1093 leg_SF_Two_Three->Draw();
1094 Save_With_Ratio(TwoSF,ThreeSF,kin->cd(),"DoubleRatios/SF_Two_Three");
1095
1096 TwoOF->Scale(ThreeOF->Integral()/TwoOF->Integral());
1097 TPad *kin2 = new TPad("kin2","kin2",0,0,1,1);
1098 kin2->cd();
1099 TwoOF->Draw("histo");
1100 ThreeOF->Draw("e1,same");
1101 TLegend *leg_OF_Two_Three = make_legend();
1102 leg_OF_Two_Three->SetHeader("t#bar{t} MC:");
1103 leg_OF_Two_Three->AddEntry(TwoSF,"#splitline{OF, nJets==2}{ (scaled)}","l");
1104 leg_OF_Two_Three->AddEntry(ThreeSF,"OF, nJets#geq3","lp");
1105 leg_OF_Two_Three->Draw();
1106 Save_With_Ratio(TwoOF,ThreeOF,kin2->cd(),"DoubleRatios/OF_Two_Three");
1107
1108 }
1109
1110 void PresentRange(TH1F *Down, TH1F *Up, TH1F *central, TVirtualPad *pad, string title) {
1111 pad->cd();
1112 TGraphErrors *gr = new TGraphErrors(Down->GetNbinsX());
1113 for(int i=1;i<=Down->GetNbinsX();i++) {
1114 float average=0.5*(Down->GetBinContent(i)+Up->GetBinContent(i));
1115 float error=abs(Down->GetBinContent(i)-average);
1116 gr->SetPoint(i-1,Down->GetBinCenter(i),average);
1117 gr->SetPointError(i-1,Down->GetBinWidth(i)/2.0,error);
1118 }
1119 gr->SetFillColor(TColor::GetColor("#F79F81"));
1120 gr->GetYaxis()->SetRangeUser(0,2);
1121 gr->GetXaxis()->SetTitle(central->GetXaxis()->GetTitle());
1122 gr->GetYaxis()->SetTitle(central->GetYaxis()->GetTitle());
1123 gr->GetXaxis()->CenterTitle();
1124 gr->GetYaxis()->CenterTitle();
1125
1126 gr->Draw("A2");
1127 central->Draw("e1,same");
1128 DrawMCPrelim();
1129 TText *rtitle = write_text(0.8,0.8,title);
1130 TLine *line = new TLine(Down->GetBinLowEdge(1),1.0,Down->GetBinLowEdge(Down->GetNbinsX())+Down->GetBinWidth(Down->GetNbinsX()),1.0);
1131 line->SetLineColor(kBlue);
1132 line->SetLineStyle(2);
1133 line->Draw("same");
1134 rtitle->Draw("same");
1135 }
1136
1137 TH1F* ProduceTTbarRatio(TH1F *datahisto, TH1F *fullmc, TH1F *originalttbar, TH1F *httbar) {
1138 TH1F *basehisto = (TH1F*)fullmc->Clone("basehisto");
1139 basehisto->Add(originalttbar,-1);
1140 basehisto->Add(httbar);
1141
1142 string sname=httbar->GetName();
1143 sname="R"+sname.substr(1,sname.length());
1144 TH1F *ratio = (TH1F*)datahisto->Clone(sname.c_str());
1145 ratio->Divide(basehisto);
1146 delete basehisto;
1147 return ratio;
1148 }
1149
1150 void make_ttbar_comparison(string datavariable, string mcvariable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
1151
1152 TCut cut=addcut&&basiccut;
1153
1154 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
1155 ckin->SetLogy(dolog);
1156 cout << "\r Creating " << filename << " : data (1/7)" << std::flush;
1157 TH1F *datahisto = allsamples.Draw("datahisto",datavariable,nbins,min,max, xlabel, "events",cut,data,luminosity);
1158 datahisto->SetMarkerSize(DataMarkerSize);
1159 if ( !dolog ) datahisto->SetMinimum(0); // Defaults
1160 else datahisto->SetMinimum(0.5);
1161 if (dolog) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
1162 else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
1163 cout << "\r Creating " << filename << " : MC central (stack) (2/7)" << std::flush;
1164 THStack mcstack = allsamples.DrawStack("mcstack", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
1165 TH1F *MCcentral = CollapseStack(mcstack);
1166
1167 cout << "\r Creating " << filename << " : MC central (histo) (3/7)" << std::flush;
1168 TH1F *TCentral = allsamples.Draw ("TCentral", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,allsamples.FindSample("TTJets_"));
1169 TH1F *RCentral = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TCentral);
1170
1171 cout << "\r Creating " << filename << " : MC Matching up (4/7)" << std::flush;
1172 TH1F *TMatchingUp = systsamples.Draw("TMatchingUp", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_matchingup"));
1173 TH1F *RMatchingUp = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TMatchingUp);
1174
1175 cout << "\r Creating " << filename << " : MC Matching down (5/7)" << std::flush;
1176 TH1F *TMatchingDown = systsamples.Draw("TMatchingDown",mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_matchingdown"));
1177 TH1F *RMatchingDown = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TMatchingDown);
1178
1179 cout << "\r Creating " << filename << " : MC Scale up (6/7)" << std::flush;
1180 TH1F *TScaleUp = systsamples.Draw("TScaleUp", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_scaleup"));
1181 TH1F *RScaleUp = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TScaleUp);
1182
1183 cout << "\r Creating " << filename << " : MC Scale down (7/7)" << std::flush;
1184 TH1F *TScaleDown = systsamples.Draw("TScaleDown", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_scaledown"));
1185 TH1F *RScaleDown = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TScaleDown);
1186
1187 datahisto->Draw("e1");
1188 ckin->Update();
1189 mcstack.Draw("histo,same");
1190
1191 datahisto->Draw("same,e1");
1192 TLegend *kinleg = allsamples.allbglegend();
1193 kinleg->Draw();
1194
1195 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1196 kinpad->SetLogy(dolog);
1197 kinpad->cd();
1198 datahisto->Draw("e1");
1199 mcstack.Draw("histo,same");
1200 datahisto->Draw("same,e1");
1201 datahisto->Draw("same,axis");
1202
1203 kinleg->Draw("same");
1204 DrawPrelim();
1205 string saveas="kin/"+filename;
1206
1207 cout << "Passing filename to be saved : " << filename << " as " << saveas << endl;
1208 Save_With_Ratio( datahisto, CollapseStack(mcstack), kinpad->cd(), saveas, false, false, "data/mc");
1209 delete kinpad;
1210
1211 ckin->cd();
1212 TCentral->SetLineColor(kBlack);
1213
1214 TMatchingUp->SetLineColor(TColor::GetColor("#2c17b1"));//blue
1215 TMatchingUp->SetLineStyle(2);//dashed
1216 TMatchingDown->SetLineColor(TColor::GetColor("#2c17b1"));
1217 TMatchingDown->SetLineStyle(3);//dotted
1218
1219 TScaleUp->SetLineColor(TColor::GetColor("#FF8500"));//orange
1220 TScaleUp->SetLineStyle(2);//dashed
1221 TScaleDown->SetLineColor(TColor::GetColor("#FF8500"));
1222 TScaleDown->SetLineStyle(3);//dotted
1223
1224 MCcentral->SetLineStyle(3);
1225 MCcentral->SetLineColor(kRed);
1226
1227 TCentral->Draw("e1,same");
1228 TCentral->Draw("histo,same");
1229 TMatchingUp->Draw("histo,same");
1230 TMatchingDown->Draw("histo,same");
1231 TScaleUp->Draw("histo,same");
1232 TScaleDown->Draw("histo,same");
1233
1234 TLegend *sleg = make_legend();
1235 sleg->AddEntry(TCentral,"Central","L");
1236 sleg->AddEntry(TMatchingUp,"matching up","L");
1237 sleg->AddEntry(TMatchingDown,"matching down","L");
1238 sleg->AddEntry(TScaleUp,"scale up","L");
1239 sleg->AddEntry(TScaleDown,"scale down","L");
1240 sleg->Draw();
1241
1242 CompleteSave(ckin,saveas+"___AllLines");
1243 ckin->cd();
1244 ckin->SetLogy(0);
1245
1246 RCentral->SetLineColor(kBlack);
1247
1248 RMatchingUp->SetLineColor(TColor::GetColor("#2c17b1"));//blue
1249 RMatchingUp->SetLineStyle(2);//dashed
1250 RMatchingDown->SetLineColor(TColor::GetColor("#2c17b1"));
1251 RMatchingDown->SetLineStyle(3);//dotted
1252
1253 RScaleUp->SetLineColor(TColor::GetColor("#FF8500"));//orange
1254 RScaleUp->SetLineStyle(2);//dashed
1255 RScaleDown->SetLineColor(TColor::GetColor("#FF8500"));
1256 RScaleDown->SetLineStyle(3);//dotted
1257
1258 RCentral->GetYaxis()->SetRangeUser(0,2);
1259 RCentral->Draw("e1");
1260 RMatchingUp->Draw("histo,same");
1261 RMatchingDown->Draw("histo,same");
1262 RScaleUp->Draw("histo,same");
1263 RScaleDown->Draw("histo,same");
1264
1265 CompleteSave(ckin,saveas+"___AllRatios");
1266
1267 TCanvas *multicanvas = new TCanvas("multicanvas","multicanvas",1400,700);
1268 multicanvas->Divide(2,1);
1269 PresentRange(RMatchingUp,RMatchingDown,RCentral,multicanvas->cd(1),"Matching");
1270 PresentRange(RScaleUp,RScaleDown,RCentral,multicanvas->cd(2),"Scale");
1271 CompleteSave(multicanvas,saveas+"___RangeIllustration");
1272
1273
1274 delete datahisto;
1275 delete TCentral;
1276 delete TMatchingUp;
1277 delete TMatchingDown;
1278 delete TScaleUp;
1279 delete TScaleDown;
1280 // delete Ttmass166;
1281 // delete Ttmass169;
1282 // delete Ttmass175;
1283 // delete Ttmass178;
1284
1285 delete ckin;
1286
1287 }
1288
1289 void make_ttbar_comparison(string variable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
1290 make_ttbar_comparison(variable, variable, nbins, min, max, addcut, dolog, xlabel, filename);
1291 }
1292
1293 void ProduceJanPlots() {
1294 TCanvas *c1 = new TCanvas("c1","c1");
1295 TH1F *metSF = allsamples.Draw("metSF","met[4]",30,100,400, "E_{T}^{miss} [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1296 TH1F *metOF = allsamples.Draw("metOF","met[4]",30,100,400, "E_{T}^{miss} [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1297
1298 TPad* rcan = new TPad("rcan","rcan",0,0,1,1);
1299 rcan->cd();
1300
1301 metOF->SetLineColor(kRed);
1302 metSF->Draw("e1");
1303 metOF->Draw("histo,same");
1304 metSF->Draw("e1,same");
1305
1306 TLegend *leg = make_legend();
1307
1308 leg->AddEntry(metSF,"Data SF","p");
1309 leg->AddEntry(metOF,"Data OF","l");
1310 leg->Draw();
1311
1312 DrawPrelim();
1313
1314 Save_With_Ratio(metSF,metOF,rcan,"JanPlots/ETHConfig",false,false,"SF/OF");
1315
1316 delete rcan;
1317 delete metSF;
1318 delete metOF;
1319 delete c1;
1320 }
1321
1322 THStack MakeOneSystematicsPlot(TCut cut, string saveas, string variation, TH1F *hdata, string variable, int nbins, float bmin, float bmax, string label, TH1F* &thisto) {
1323 THStack SystPlot = allsamples.DrawStack(variation,variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity);
1324
1325 //now need to process the plot (calculate the variation and set the member of thstack accordingly!)
1326 if(variation!="Central") {
1327 TH1F *varttbar;
1328 if(variation=="MatchingUp") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_matchingup_TuneZ2s"));
1329 if(variation=="MatchingDown") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_matchingdown"));
1330 if(variation=="ScaleUp") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_scaleup"));
1331 if(variation=="ScaleDown") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_scaledown"));
1332 assert(varttbar);
1333
1334 TIter nextHisto(SystPlot.GetHists());
1335 TH1F* h;
1336 while ( h = (TH1F*)nextHisto() ) {
1337 if(Contains(h->GetName(),"t_bar_t")) {
1338 varttbar->Scale(h->Integral()/varttbar->Integral());
1339 for(int i=0;i<=h->GetNbinsX()+1;i++) {//note that we deliberatly consider the under/overflow bin as well!
1340 h->SetBinContent(i,varttbar->GetBinContent(i));
1341 h->SetBinError(i,varttbar->GetBinError(i));
1342 }
1343 thisto=(TH1F*)varttbar->Clone(variation.c_str());
1344 SystPlot.Modified();
1345 }
1346 }
1347 delete varttbar;
1348 } else {
1349 TIter nextHisto(SystPlot.GetHists());
1350 TH1F* h;
1351 while ( h = (TH1F*)nextHisto() ) {
1352 if(Contains(h->GetName(),"t_bar_t")) thisto=(TH1F*)h->Clone(variation.c_str());
1353 }
1354 }
1355
1356 TLegend *fullleg = allsamples.allbglegend();
1357 fullleg->SetHeader(variation.c_str());
1358 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1359 kinpad->SetLogy(1);
1360 kinpad->cd();
1361
1362 hdata->Draw("e1");
1363 SystPlot.Draw("histo,same");
1364 hdata->Draw("e1,same");
1365 fullleg->Draw();
1366 DrawPrelim();
1367
1368 Save_With_Ratio(hdata,SystPlot,kinpad,saveas+"_"+variation);
1369 CleanLegends();
1370
1371 delete kinpad;
1372 return SystPlot;
1373 }
1374
1375
1376
1377 void ProduceMCSystematicPlot(string variable, int nbins, float bmin, float bmax, string label, TCut thiscut, string saveas) {
1378 TCanvas *ca = new TCanvas("ca","ca");
1379 TH1F *hdata = allsamples.Draw("hdata",variable,nbins,bmin,bmax,label,"events",thiscut,data,luminosity);
1380
1381 TH1F *tScaleUp,*tScaleDown,*tMatchingUp,*tMatchingDown,*tCentral;
1382
1383 THStack ScaleUp = MakeOneSystematicsPlot(thiscut,saveas,"ScaleUp",hdata,variable, nbins, bmin, bmax, label,tScaleUp);
1384 THStack ScaleDown = MakeOneSystematicsPlot(thiscut,saveas,"ScaleDown",hdata,variable, nbins, bmin, bmax, label,tScaleDown);
1385 THStack MatchingUp = MakeOneSystematicsPlot(thiscut,saveas,"MatchingUp",hdata,variable, nbins, bmin, bmax, label,tMatchingUp);
1386 THStack MatchingDown = MakeOneSystematicsPlot(thiscut,saveas,"MatchingDown",hdata,variable, nbins, bmin, bmax, label,tMatchingDown);
1387
1388 TH1F *HScaleUp = CollapseStack(ScaleUp);
1389 TH1F *HScaleDown = CollapseStack(ScaleDown);
1390 TH1F *HMatchingUp = CollapseStack(MatchingUp);
1391 TH1F *HMatchingDown = CollapseStack(MatchingDown);
1392
1393 THStack Central = MakeOneSystematicsPlot(thiscut,saveas,"Central",hdata,variable, nbins, bmin, bmax, label,tCentral);
1394 TH1F *HCentral = CollapseStack(Central);
1395
1396 TH1F *Systematic = (TH1F*)hdata->Clone("Systematic");
1397 for(int i=1;i<=Systematic->GetNbinsX();i++) {
1398 float matchingup = abs(HMatchingUp->GetBinContent(i)-HCentral->GetBinContent(i));
1399 float matchingdown = abs(HMatchingDown->GetBinContent(i)-HCentral->GetBinContent(i));
1400 float scaleup = abs(HScaleUp->GetBinContent(i)-HCentral->GetBinContent(i));
1401 float scaledown = abs(HScaleDown->GetBinContent(i)-HCentral->GetBinContent(i));
1402
1403 float matching = matchingup>matchingdown?matchingup:matchingdown;
1404 float scale = scaleup>scaledown?scaleup:scaledown;
1405
1406 float sys=sqrt(matching*matching+scale*scale);
1407 sys/=HCentral->GetBinContent(i);
1408 if(HCentral->GetBinContent(i)==0) sys=0;
1409 Systematic->SetBinContent(i,sys);
1410 }
1411
1412 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1413 kinpad->SetLogy(1);
1414 kinpad->cd();
1415 if(variable=="genMET") {
1416 Central.Draw("histo");
1417 } else {
1418 hdata->Draw("e1");
1419 Central.Draw("histo,same");
1420 hdata->Draw("e1,same");
1421 }
1422
1423 DrawPrelim();
1424
1425 save_with_ratio_and_sys_band( hdata, HCentral, kinpad->cd(), saveas, false, false, "data/mc",Systematic );
1426
1427 kinpad->cd();
1428 tCentral->SetFillColor(kWhite);
1429 tCentral->SetLineColor(kBlack);
1430 tScaleUp->SetLineColor(kRed);
1431 tScaleDown->SetLineColor(kRed);
1432 tMatchingUp->SetLineColor(kBlue);
1433 tMatchingDown->SetLineColor(kBlue);
1434 tScaleUp->SetLineStyle(2);
1435 tScaleDown->SetLineStyle(3);
1436 tMatchingUp->SetLineStyle(2);
1437 tMatchingDown->SetLineStyle(3);
1438
1439 TLegend *leg2 = make_legend();
1440 leg2->AddEntry(hdata,"Data","p");
1441 leg2->AddEntry(tCentral,"Central (ttbar)","l");
1442 leg2->AddEntry(tScaleUp,"ScaleUp (ttbar)","l");
1443 leg2->AddEntry(tScaleDown,"ScaleDown (ttbar)","l");
1444 leg2->AddEntry(tMatchingUp,"MatchingUp (ttbar)","l");
1445 leg2->AddEntry(tMatchingDown,"MatchingDown (ttbar)","l");
1446 if(variable=="genMET") {
1447 Central.Draw("histo");
1448 }else {
1449 hdata->Draw("e1");
1450 Central.Draw("histo,same");
1451 hdata->Draw("e1,same");
1452 }
1453 tCentral->Draw("histo,same");
1454 tScaleUp->Draw("histo,same");
1455 tScaleDown->Draw("histo,same");
1456 tMatchingUp->Draw("histo,same");
1457 tMatchingDown->Draw("histo,same");
1458 leg2->Draw();
1459
1460 CompleteSave(kinpad,saveas+"__TTbarComparison");
1461
1462 gStyle->SetOptFit(0);
1463
1464 kinpad->cd();
1465 kinpad->SetLogy(0);
1466 TH1F *MatchingRatio = (TH1F*)tMatchingUp->Clone("MatchingRatio");
1467 MatchingRatio->Divide(tMatchingDown);
1468 TLine *lone = new TLine(tScaleUp->GetBinLowEdge(1),1,tScaleUp->GetBinLowEdge(tScaleUp->GetNbinsX())+tScaleUp->GetBinWidth(tScaleUp->GetNbinsX()),1);
1469 lone->SetLineColor(TColor::GetColor("#01DF01"));
1470 lone->SetLineStyle(2);
1471 TH1F *ScaleRatio = (TH1F*)tScaleUp->Clone("ScaleRatio");
1472 ScaleRatio->Divide(tScaleDown);
1473 MatchingRatio->GetYaxis()->SetRangeUser(0,3);
1474 MatchingRatio->Draw("e1");
1475 TF1 *QP1 = new TF1("QP1","[0]+[1]*x",50,200);//simple linear function ranging from 50 to 200
1476 MatchingRatio->Fit("QP1","R");
1477 lone->Draw();
1478 stringstream summary;
1479 summary << " #splitline{Fit result for f(x) = a+bx :}{#splitline{a=" << DigitsAfterComma(QP1->GetParameter(0),4) << " +/- " << DigitsAfterComma(QP1->GetParError(0),4) << "}{b=" << DigitsAfterComma(QP1->GetParameter(1),4);
1480 summary << " +/- " << DigitsAfterComma(QP1->GetParError(1),4) << "}}";
1481 TText *infobox = write_title(summary.str());
1482 infobox->SetX(0.75);
1483 infobox->SetTextSize(0.03);
1484 infobox->SetY(0.75);
1485 infobox->Draw();
1486 CompleteSave(kinpad,saveas+"__TTbarComparison_MatchingUpDividedMatchingDown");
1487 kinpad->cd();
1488 ScaleRatio->GetYaxis()->SetRangeUser(0,3);
1489 ScaleRatio->Draw("e1");
1490 ScaleRatio->Fit("QP1","R");
1491 summary.str("");
1492 summary << " #splitline{Fit result for f(x) = a+bx :}{#splitline{a=" << DigitsAfterComma(QP1->GetParameter(0),4) << " +/- " << DigitsAfterComma(QP1->GetParError(0),4) << "}{b=" << DigitsAfterComma(QP1->GetParameter(1),4);
1493 summary << " +/- " << DigitsAfterComma(QP1->GetParError(1),4) << "}}";
1494 TText *infobox2 = write_title(summary.str());
1495 infobox2->SetX(0.75);
1496 infobox2->SetTextSize(0.03);
1497 infobox2->SetY(0.75);
1498 infobox2->Draw();
1499
1500 lone->Draw();
1501 CompleteSave(kinpad,saveas+"__TTbarComparison_ScaleUpDividedScaleDown");
1502
1503
1504 delete QP1;
1505 delete infobox;
1506 delete infobox2;
1507 delete MatchingRatio;
1508 delete ScaleRatio;
1509 DeleteStack(ScaleUp);
1510 DeleteStack(ScaleDown);
1511 DeleteStack(MatchingUp);
1512 DeleteStack(MatchingDown);
1513 delete leg2;
1514 CleanLegends();
1515 DeleteStack(Central);
1516 delete Systematic;
1517 delete HScaleUp;
1518 delete HScaleDown;
1519 delete HMatchingUp;
1520 delete HMatchingDown;
1521 delete hdata;
1522 delete HCentral;
1523 delete ca;
1524 }
1525
1526 TH1F* ImposeBinning(TH1F *binninghisto, TH1F* histo) {
1527 float val=0,err=0;
1528 vector<float> bins;
1529 vector<float> vals;
1530 vector<float> errs;
1531
1532 bins.push_back(binninghisto->GetBinLowEdge(1));
1533 int iBin=1;
1534
1535 for(unsigned int i=1;i<histo->GetNbinsX();i++) {//going to second last one on purpose!
1536 if((histo->GetBinLowEdge(i)+0.00001>=binninghisto->GetBinLowEdge(iBin)+binninghisto->GetBinWidth(iBin))) {
1537 bins.push_back(histo->GetBinLowEdge(i));
1538 vals.push_back(val);val=0;
1539 errs.push_back(err);err=0;
1540 iBin++;
1541 }
1542 val+=histo->GetBinContent(i);
1543 err=sqrt(err*err+histo->GetBinError(i)*histo->GetBinError(i));
1544 }
1545 bins.push_back(histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()));
1546 vals.push_back(val);val=0;
1547 errs.push_back(err);err=0;
1548
1549 TH1F *h = new TH1F(("r"+(string)histo->GetName()).c_str(),("r"+(string)histo->GetName()).c_str(),bins.size()-1,&bins[0]);
1550 for(unsigned int i=0;i<vals.size();i++) {
1551 h->SetBinContent(i+1,vals[i]);
1552 h->SetBinError(i+1,errs[i]);
1553 }
1554
1555 h->GetXaxis()->SetTitle(histo->GetXaxis()->GetTitle());
1556 h->GetYaxis()->SetTitle(histo->GetYaxis()->GetTitle());
1557
1558 h->GetXaxis()->CenterTitle();
1559 h->GetYaxis()->CenterTitle();
1560
1561 return h;
1562 }
1563
1564
1565 TH1F* ReBinOptimizingStats(int nbins, TH1F *histo) {
1566 float statsperbin = (1/(float)nbins) * histo->Integral();
1567 float val=0,err=0;
1568 vector<float> bins;
1569 vector<float> vals;
1570 vector<float> errs;
1571
1572 bins.push_back(histo->GetBinLowEdge(1));
1573 for(unsigned int i=1;i<=histo->GetNbinsX();i++) {
1574 val+=histo->GetBinContent(i);
1575 err=sqrt(err*err+histo->GetBinError(i)*histo->GetBinError(i));
1576 if( val/statsperbin > 0.85) {
1577 if(bins.size()<nbins) {
1578 bins.push_back(histo->GetBinLowEdge(i)+histo->GetBinWidth(i));
1579 vals.push_back(val);val=0;
1580 errs.push_back(err);err=0;
1581 }
1582 }
1583 if(i==histo->GetNbinsX()) {
1584 bins.push_back(histo->GetBinLowEdge(i)+histo->GetBinWidth(i));
1585 vals.push_back(val);val=0;
1586 errs.push_back(err);err=0;
1587 }
1588 }
1589 TH1F *h = new TH1F(("r"+(string)histo->GetName()).c_str(),("r"+(string)histo->GetName()).c_str(),bins.size()-1,&bins[0]);
1590
1591 h->GetXaxis()->SetTitle(histo->GetXaxis()->GetTitle());
1592 h->GetYaxis()->SetTitle(histo->GetYaxis()->GetTitle());
1593
1594 h->GetXaxis()->CenterTitle();
1595 h->GetYaxis()->CenterTitle();
1596
1597 for(unsigned int i=0;i<vals.size();i++) {
1598 h->SetBinContent(i+1,vals[i]);
1599 h->SetBinError(i+1,errs[i]);
1600 }
1601
1602 return h;
1603 }
1604
1605
1606
1607 void ShowBinning(TH1F *histo) {
1608 cout << "Showing binning for " << histo->GetName() << " (\" " << histo->GetTitle() << "\")" << endl;
1609 for(unsigned int i=1;i<=histo->GetNbinsX();i++) cout << " Bin " << i << " : " << histo->GetBinLowEdge(i) << " , " << histo->GetBinLowEdge(i) + histo->GetBinWidth(i) << " : " << histo->GetBinContent(i) << endl;
1610 }
1611
1612 void QuickProduceMCSystematicPlot(string variable, int nbins, float bmin, float bmax, string label, TCut thiscut, string saveas) {
1613 TCanvas *ca = new TCanvas("ca","ca");
1614 TH1F *tScaleUp = systsamples.Draw("tScaleUp",variable,nbins,bmin,bmax,label,"events",thiscut,mc,luminosity,systsamples.FindSample("scaleup"));
1615 TH1F *tScaleDown = systsamples.Draw("tScaleDown",variable,nbins,bmin,bmax,label,"events",thiscut,mc,luminosity,systsamples.FindSample("scaledown"));
1616 TH1F *tMatchingUp = systsamples.Draw("tMatchingUp",variable,nbins,bmin,bmax,label,"events",thiscut,mc,luminosity,systsamples.FindSample("matchingup"));
1617 TH1F *tMatchingDown = systsamples.Draw("tMatchingDown",variable,nbins,bmin,bmax,label,"events",thiscut,mc,luminosity,systsamples.FindSample("matchingdown"));
1618 TH1F *tCentral = systsamples.Draw("tCentral",variable,nbins,bmin,bmax,label,"events",thiscut,mc,luminosity,systsamples.FindSample("TTJets_MassiveBinDECAY_TuneZ2sta"));
1619
1620 tScaleUp->Scale(1.0/tScaleUp->Integral());
1621 tScaleDown->Scale(1.0/tScaleDown->Integral());
1622 tMatchingDown->Scale(1.0/tMatchingDown->Integral());
1623 tMatchingUp->Scale(1.0/tMatchingUp->Integral());
1624 tCentral->Scale(1.0/tCentral->Integral());
1625
1626 cout << "At this point we want to rebin the scale/matching histograms so we get decent stats!" << endl;
1627
1628
1629 TH1F *rtScaleUp = ReBinOptimizingStats(7,tScaleUp); // using the scale up sample to get the binning (shouldn't use the central one for obvious reasons)
1630 TH1F *rtScaleDown = ImposeBinning(rtScaleUp,tScaleDown);
1631 TH1F *rtMatchingDown = ImposeBinning(rtScaleUp,tMatchingDown);
1632 TH1F *rtMatchingUp = ImposeBinning(rtScaleUp,tMatchingUp);
1633 TH1F *rtCentral = ImposeBinning(rtScaleUp,tCentral);
1634
1635 float min=rtScaleUp->GetMinimum();
1636 float max=rtScaleUp->GetMaximum();
1637
1638 if(rtScaleDown->GetMinimum()<min) min=rtScaleDown->GetMinimum();
1639 if(rtMatchingDown->GetMinimum()<min) min=rtMatchingDown->GetMinimum();
1640 if(rtMatchingDown->GetMinimum()<min) min=rtMatchingDown->GetMinimum();
1641 if(rtMatchingUp->GetMinimum()<min) min=rtMatchingUp->GetMinimum();
1642 if(rtCentral->GetMinimum()<min) min=rtCentral->GetMinimum();
1643
1644 if(rtScaleDown->GetMaximum()<min) max=rtScaleDown->GetMaximum();
1645 if(rtMatchingDown->GetMaximum()<min) max=rtMatchingDown->GetMaximum();
1646 if(rtMatchingDown->GetMaximum()<min) max=rtMatchingDown->GetMaximum();
1647 if(rtMatchingUp->GetMaximum()<min) max=rtMatchingUp->GetMaximum();
1648 if(rtCentral->GetMaximum()<min) max=rtCentral->GetMaximum();
1649
1650 rtCentral->SetMaximum(1.2*max);
1651 rtCentral->SetMinimum(0.8*min);
1652
1653 /* tScaleUp->Rebin(40);
1654 tScaleDown->Rebin(40);
1655 tMatchingDown->Rebin(40);
1656 tMatchingUp->Rebin(40);
1657 tCentral->Rebin(40);*/
1658
1659 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1660 kinpad->SetLogy(1);
1661 kinpad->cd();
1662 tCentral->SetFillColor(kWhite);
1663 tCentral->SetLineColor(kBlack);
1664 tScaleUp->SetLineColor(kRed);
1665 tScaleDown->SetLineColor(kRed);
1666 tMatchingUp->SetLineColor(kBlue);
1667 tMatchingDown->SetLineColor(kBlue);
1668 tScaleUp->SetLineStyle(2);
1669 tScaleDown->SetLineStyle(3);
1670 tMatchingUp->SetLineStyle(2);
1671 tMatchingDown->SetLineStyle(3);
1672
1673 rtScaleDown->SetLineColor(kRed);
1674 rtMatchingUp->SetLineColor(kBlue);
1675 rtMatchingDown->SetLineColor(kBlue);
1676 rtScaleUp->SetLineStyle(2);
1677 rtScaleDown->SetLineStyle(3);
1678 rtMatchingUp->SetLineStyle(2);
1679 rtMatchingDown->SetLineStyle(3);
1680
1681 TLegend *leg2 = make_legend();
1682 leg2->AddEntry(tCentral,"Central (ttbar)","l");
1683 leg2->AddEntry(tScaleUp,"ScaleUp (ttbar)","l");
1684 leg2->AddEntry(tScaleDown,"ScaleDown (ttbar)","l");
1685 leg2->AddEntry(tMatchingUp,"MatchingUp (ttbar)","l");
1686 leg2->AddEntry(tMatchingDown,"MatchingDown (ttbar)","l");
1687
1688 tCentral->Draw("histo");
1689 tScaleUp->Draw("histo,same");
1690 tScaleDown->Draw("histo,same");
1691 tMatchingUp->Draw("histo,same");
1692 tMatchingDown->Draw("histo,same");
1693 leg2->Draw();
1694 DrawMCPrelim();
1695 CompleteSave(kinpad,saveas+"__TTbarComparison");
1696 kinpad->cd();
1697 kinpad->SetLogy(0);
1698 rtCentral->Draw("histo");
1699 rtScaleUp->Draw("histo,same");
1700 rtScaleDown->Draw("histo,same");
1701 rtMatchingUp->Draw("histo,same");
1702 rtMatchingDown->Draw("histo,same");
1703 leg2->Draw();
1704 DrawMCPrelim();
1705 CompleteSave(kinpad,saveas+"__TTbarComparison__REBINNED");
1706
1707
1708 gStyle->SetOptFit(0);
1709
1710 kinpad->cd();
1711 kinpad->SetLogy(0);
1712 TH1F *MatchingRatio = (TH1F*)rtMatchingUp->Clone("MatchingRatio");
1713 MatchingRatio->Divide(rtMatchingDown);
1714 TLine *lone = new TLine(tScaleUp->GetBinLowEdge(1),1,tScaleUp->GetBinLowEdge(tScaleUp->GetNbinsX())+tScaleUp->GetBinWidth(tScaleUp->GetNbinsX()),1);
1715 lone->SetLineColor(TColor::GetColor("#01DF01"));
1716 lone->SetLineStyle(2);
1717 TH1F *ScaleRatio = (TH1F*)rtScaleUp->Clone("ScaleRatio");
1718 ScaleRatio->Divide(rtScaleDown);
1719 MatchingRatio->GetYaxis()->SetRangeUser(0,3);
1720 MatchingRatio->Draw("e1");
1721 TF1 *QP1 = new TF1("QP1","[0]+[1]*x",50,200);//simple linear function ranging from 50 to 200
1722 if(variable=="genMET" || variable=="met[4]" || variable=="met[1]") MatchingRatio->Fit("QP1","RQ");
1723 lone->Draw();
1724 stringstream summary;
1725 summary << " #splitline{Fit result for f(x) = a+bx :}{#splitline{a=" << DigitsAfterComma(QP1->GetParameter(0),4) << " +/- " << DigitsAfterComma(QP1->GetParError(0),4) << "}{b=" << DigitsAfterComma(QP1->GetParameter(1),4);
1726 summary << " +/- " << DigitsAfterComma(QP1->GetParError(1),4) << "}}";
1727 TText *infobox = write_title(summary.str());
1728 infobox->SetX(0.75);
1729 infobox->SetTextSize(0.03);
1730 infobox->SetY(0.75);
1731 if(variable=="genMET" || variable=="met[4]" || variable=="met[1]") infobox->Draw();
1732 DrawMCPrelim();
1733 CompleteSave(kinpad,saveas+"__TTbarComparison_MatchingUpDividedMatchingDown");
1734 kinpad->cd();
1735 ScaleRatio->GetYaxis()->SetRangeUser(0,3);
1736 ScaleRatio->Draw("e1");
1737 if(variable=="genMET" || variable=="met[4]" || variable=="met[1]") ScaleRatio->Fit("QP1","RQ");
1738 summary.str("");
1739 summary << " #splitline{Fit result for f(x) = a+bx :}{#splitline{a=" << DigitsAfterComma(QP1->GetParameter(0),4) << " +/- " << DigitsAfterComma(QP1->GetParError(0),4) << "}{b=" << DigitsAfterComma(QP1->GetParameter(1),4);
1740 summary << " +/- " << DigitsAfterComma(QP1->GetParError(1),4) << "}}";
1741 TText *infobox2 = write_title(summary.str());
1742 infobox2->SetX(0.75);
1743 infobox2->SetTextSize(0.03);
1744 infobox2->SetY(0.75);
1745 if(variable=="genMET" || variable=="met[4]" || variable=="met[1]") infobox2->Draw();
1746
1747 lone->Draw();
1748 DrawMCPrelim();
1749 CompleteSave(kinpad,saveas+"__TTbarComparison_ScaleUpDividedScaleDown");
1750
1751 kinpad->cd();
1752 TH1F *SysMatching = (TH1F*)rtMatchingDown->Clone("SysMatching");
1753 TH1F *SysScale = (TH1F*)rtScaleDown->Clone("SysMatching");
1754 TH1F *SysHisto = (TH1F*)rtScaleDown->Clone("SysHisto");
1755
1756 for(int i=1;i<=SysScale->GetNbinsX();i++) {
1757 float matching, scale;
1758 bool AssumeFactor=false;
1759 if(AssumeFactor) {
1760 // assume that an upward/downward variation means a change by a constant factor, i.e. f(up) = alpha * f(central)
1761 matching=0.;
1762 scale=0.;
1763 } else {
1764 // assume that the central value is exactly between up & down, i.e. central = (up-down)/2
1765 matching = fabs( ( rtMatchingUp->GetBinContent(i) - rtMatchingDown->GetBinContent(i)) / (rtMatchingUp->GetBinContent(i) + rtMatchingDown->GetBinContent(i)) );
1766 scale = fabs( ( rtScaleUp->GetBinContent(i) - rtScaleDown->GetBinContent(i)) / (rtScaleUp->GetBinContent(i) + rtScaleDown->GetBinContent(i)) );
1767 }
1768
1769 SysMatching->SetBinContent(i,1+matching);
1770 SysScale->SetBinContent(i,1+scale);
1771 SysHisto->SetBinContent(i,sqrt(matching*matching+scale*scale)+1);
1772 }
1773
1774 SysHisto->SetLineColor(kGreen);
1775
1776 SysMatching->SetMaximum(3.0);
1777 SysMatching->SetMinimum(0.0);
1778 SysMatching->Draw("histo");
1779 SysScale->Draw("histo,same");
1780 SysHisto->Draw("histo,same");
1781 CompleteSave(kinpad,saveas+"__TTbarComparison_DerivedSystematic");
1782
1783 delete SysMatching;
1784 delete SysScale;
1785
1786 if(!Contains(variable,"gen")) {
1787 TH1F *hdata = allsamples.Draw("hdata", variable,nbins,bmin,bmax,label,"events",thiscut,data,luminosity);
1788 THStack smc = allsamples.DrawStack("smc",variable,nbins,bmin,bmax,label,"events",thiscut,mc,luminosity);
1789
1790 TH1F *Systematic = (TH1F*)hdata->Clone("Systematic");
1791
1792 for(int i=1;i<=Systematic->GetNbinsX();i++) {
1793 int iBin=SysHisto->FindBin(Systematic->GetBinCenter(i));
1794 if(iBin>SysHisto->GetNbinsX()) --iBin; // if we're over the end of the histo, use the last bin
1795 float sys = SysHisto->GetBinContent(iBin)-1;
1796 Systematic->SetBinContent(i,sys);
1797 }
1798
1799 kinpad->cd();
1800 TLegend *leg = allsamples.allbglegend();
1801 hdata->Draw();
1802 smc.Draw("histo,same");
1803 hdata->Draw("same");
1804 leg->Draw();
1805 DrawPrelim();
1806 save_with_ratio_and_sys_band( hdata, CollapseStack(smc), kinpad->cd(), saveas+"__DataVsMC", false, false, "data/mc",Systematic );
1807
1808 delete Systematic;
1809 delete hdata;
1810 }
1811
1812
1813 delete SysHisto;
1814 delete tScaleUp;
1815 delete tScaleDown;
1816 delete tCentral;
1817 delete tMatchingUp;
1818 delete tMatchingDown;
1819 delete rtScaleUp;
1820 delete rtScaleDown;
1821 delete rtCentral;
1822 delete rtMatchingUp;
1823 delete rtMatchingDown;
1824 delete QP1;
1825 delete infobox;
1826 delete infobox2;
1827 delete MatchingRatio;
1828 delete ScaleRatio;
1829 delete leg2;
1830 CleanLegends();
1831 delete ca;
1832 }
1833
1834 void ProduceMCSystematicPlots() {
1835 cout << "Getting ready to produce systematic plots " << endl;
1836 TCut cutweightBKP = cutWeight;
1837
1838 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/ETH_SameFlavor");
1839 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/ETH_OppositeFlavor");
1840 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_SameFlavor");
1841 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_OppositeFlavor");
1842
1843 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/ETH_SameFlavor_INCLUSIVE");
1844 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/ETH_OppositeFlavor_INCLUSIVE");
1845 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/genMET/ETH_SameFlavor_INCLUSIVE_HighMass");
1846 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/genMET/ETH_OppositeFlavor_INCLUSIVE_HighMass");
1847
1848 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_SameFlavor_INCLUSIVE");
1849 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_OppositeFlavor_INCLUSIVE");
1850 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/MET/ETH_SameFlavor_INCLUSIVE_HighMass");
1851 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/MET/ETH_OppositeFlavor_INCLUSIVE_HighMass");
1852 QuickProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>100"),"MCSystPlots/NJets/ETH_SameFlavor");
1853 QuickProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>100"),"MCSystPlots/NJets/ETH_OppositeFlavor");
1854
1855
1856
1857 cout << "Kicking cutWeight " << (const char*) cutWeight << endl;
1858 cout << "Keeping OSSF cut " << (const char*)cutOSSF << endl;
1859 cutWeight="1.0";
1860
1861 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/ETH_SameFlavor_INCLUSIVE__NOPURW");
1862 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/ETH_OppositeFlavor_INCLUSIVE__NOPURW");
1863 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/genMET/ETH_SameFlavor_INCLUSIVE_HighMass__NOPURW");
1864 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/genMET/ETH_OppositeFlavor_INCLUSIVE_HighMass__NOPURW");
1865
1866 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_SameFlavor_INCLUSIVE__NOPURW");
1867 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_OppositeFlavor_INCLUSIVE__NOPURW");
1868 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/MET/ETH_SameFlavor_INCLUSIVE_HighMass__NOPURW");
1869 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/MET/ETH_OppositeFlavor_INCLUSIVE_HighMass__NOPURW");
1870
1871
1872 // -------------------------------------- ***** AACHEN ***** --------------------------------------
1873
1874 /*
1875 cutWeight=cutweightBKP;
1876 TCut essentialcutBKP = essentialcut;
1877 cout << (const char*) essentialcut << endl;
1878
1879 essentialcut = TCut((ReplaceAll((const char*)essentialcut,"pt2>20","pt2>10")).c_str());
1880 essentialcut = TCut((ReplaceAll((const char*)essentialcut,"abs(eta1)<1.4","abs(eta1)<2.4")).c_str());
1881 essentialcut = TCut((ReplaceAll((const char*)essentialcut,"abs(eta2)<1.4","abs(eta2)<2.4")).c_str());
1882
1883 TCut cutnJetsBKP = cutnJets;
1884 cutnJets = TCut((ReplaceAll((const char*)cutnJets,"pt2>20","pt2>10")).c_str());
1885 cutnJets = TCut((ReplaceAll((const char*)cutnJets,"pfJetGoodNum40>=3","pfJetGoodNum40>=2")).c_str());
1886 cutnJets = TCut((ReplaceAll((const char*)cutnJets,"abs(eta2)<1.4","abs(eta2)<2.4")).c_str());
1887 cutnJets = TCut((ReplaceAll((const char*)cutnJets,"abs(eta1)<1.4","abs(eta1)<2.4")).c_str());
1888
1889 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/Aachen_SameFlavor");
1890 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/Aachen_OppositeFlavor");
1891 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_SameFlavor");
1892 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_OppositeFlavor");
1893
1894 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/Aachen_SameFlavor_INCLUSIVE");
1895 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/Aachen_OppositeFlavor_INCLUSIVE");
1896 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/genMET/Aachen_SameFlavor_INCLUSIVE_HighMass");
1897 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/genMET/Aachen_OppositeFlavor_INCLUSIVE_HighMass");
1898
1899 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_SameFlavor_INCLUSIVE");
1900 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_OppositeFlavor_INCLUSIVE");
1901 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/MET/Aachen_SameFlavor_INCLUSIVE_HighMass");
1902 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/MET/Aachen_OppositeFlavor_INCLUSIVE_HighMass");
1903 QuickProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>100"),"MCSystPlots/NJets/Aachen_SameFlavor");
1904 QuickProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>100"),"MCSystPlots/NJets/Aachen_OppositeFlavor");
1905
1906
1907
1908 cout << "Kicking cutWeight " << (const char*) cutWeight << endl;
1909 cout << "Keeping OSSF cut " << (const char*)cutOSSF << endl;
1910 cutWeight="1.0";
1911
1912 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/Aachen_SameFlavor_INCLUSIVE__NOPURW");
1913 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/genMET/Aachen_OppositeFlavor_INCLUSIVE__NOPURW");
1914 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/genMET/Aachen_SameFlavor_INCLUSIVE_HighMass__NOPURW");
1915 QuickProduceMCSystematicPlot("genMET",20,0,200,"genMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/genMET/Aachen_OppositeFlavor_INCLUSIVE_HighMass__NOPURW");
1916
1917 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_SameFlavor_INCLUSIVE__NOPURW");
1918 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_OppositeFlavor_INCLUSIVE__NOPURW");
1919 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSSF&&TCut("mll>120"),"MCSystPlots/MET/Aachen_SameFlavor_INCLUSIVE_HighMass__NOPURW");
1920 QuickProduceMCSystematicPlot("met[4]",20,0,200,"PFMET [GeV]",cutOSOF&&TCut("mll>120"),"MCSystPlots/MET/Aachen_OppositeFlavor_INCLUSIVE_HighMass__NOPURW");
1921
1922 cutnJets = cutnJetsBKP;
1923 cutWeight = cutweightBKP;
1924 essentialcut = essentialcutBKP;
1925 */
1926 write_error(__FUNCTION__,"Still need to add systematic shape");assert(0);
1927 }
1928
1929 void MakeTauPlot(string label, TCut pcut, string filename, bool TauOnly) {
1930 TCut cut=pcut&&basiccut;
1931 string variable="mll";
1932 string xlabel="m_{ll} [GeV]";
1933 int nbins=40;
1934 float min=0;
1935 float max=200;
1936
1937 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
1938 TH1F *datahistoSF = allsamples.Draw("datahistoSF",variable,nbins,min,max, xlabel, "events",cut&&cutOSSF,data,luminosity);
1939 TH1F *datahistoOF = allsamples.Draw("datahistoOF",variable,nbins,min,max, xlabel, "events",cut&&cutOSOF,data,luminosity);
1940 TH1F *tauSF = allsamples.Draw("tauSF",variable,nbins,min,max, xlabel, "events",cut&&cutOSSF,data,luminosity,systsamples.FindSample("DYToTauTau"));
1941 TH1F *tauOF = allsamples.Draw("tauOF",variable,nbins,min,max, xlabel, "events",cut&&cutOSOF,data,luminosity,systsamples.FindSample("DYToTauTau"));
1942 datahistoSF->SetMarkerSize(DataMarkerSize);
1943 datahistoSF->SetMaximum(1.3*datahistoSF->GetMaximum());
1944 datahistoOF->SetMarkerSize(DataMarkerSize);
1945 datahistoOF->SetMaximum(1.3*datahistoOF->GetMaximum());
1946
1947 THStack mcstackSF = allsamples.DrawStack("mcstackSF", variable,nbins,min,max,xlabel,"events",cut&&cutOSSF,mc,luminosity);
1948 THStack mcstackOF = allsamples.DrawStack("mcstackOF", variable,nbins,min,max,xlabel,"events",cut&&cutOSOF,mc,luminosity);
1949 datahistoSF->Draw("e1");
1950 ckin->Update();
1951 mcstackSF.Draw("histo,same");
1952
1953 datahistoSF->Draw("same,e1");
1954 TLegend *kinleg = allsamples.allbglegend();
1955 kinleg->Draw();
1956
1957 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1958 kinpad->cd();
1959 datahistoSF->Draw("e1");
1960 mcstackSF.Draw("histo,same");
1961 datahistoSF->Draw("same,e1");
1962 datahistoSF->Draw("same,axis");
1963 kinleg->Draw();
1964 DrawPrelim();
1965 Save_With_Ratio(datahistoSF,mcstackSF,kinpad->cd(),filename+"__SF_mc");
1966
1967 kinpad->cd();
1968 datahistoOF->Draw("e1");
1969 mcstackOF.Draw("histo,same");
1970 datahistoOF->Draw("same,e1");
1971 datahistoOF->Draw("same,axis");
1972 kinleg->Draw();
1973 DrawPrelim();
1974 Save_With_Ratio(datahistoOF,mcstackOF,kinpad->cd(),filename+"__OF_mc");
1975
1976 kinpad->cd();
1977 tauSF->Draw("e1");
1978 tauOF->Draw("histo,same");
1979 tauSF->Draw("e1,same");
1980 TLegend *legtau = make_legend();
1981 legtau->AddEntry(tauSF,"DY->#tau#tau, SF","p");
1982 legtau->AddEntry(tauSF,"DY->#tau#tau, OF","l");
1983 legtau->Draw();
1984 DrawPrelim();
1985 Save_With_Ratio(tauSF,tauOF,kinpad->cd(),filename+"__Tau_SF_vs_OF");
1986
1987 delete datahistoSF;
1988 delete datahistoOF;
1989 delete tauSF;
1990 delete tauOF;
1991 delete kinpad;
1992 delete ckin;
1993 CleanLegends();
1994 }
1995
1996
1997 void TauQuestion() {
1998 // MakeTauPlot("MET>100 GeV, #geq 3 jets",cutnJets&&TCut("met[4]>100"),"TauQ/MET100_3Jets",true);
1999 // MakeTauPlot("MET>100 GeV",TCut("met[4]>100"),"TauQ/MET100",true);
2000 // MakeTauPlot("MET>0 GeV",TCut("met[4]>0"),"TauQ/MET0",true);
2001 MakeTauPlot("b-tag veto, 50<MET<100",TCut("pfJetGoodNumBtag30==0&&met[4]>50&&met[4]<100"),"TauQ/ControlPlots",false);
2002 }
2003
2004 void do_kinematic_plots(string mcjzb, string datajzb, bool doPF=false)
2005 {
2006 // switch_overunderflow(true);
2007 bool dolog=true;
2008 bool nolog=false;
2009
2010 bool doOFSF = false;
2011 bool doKin = true;
2012 bool doDataComp = false;
2013 bool MakeTwoThreeJetComparison = false;
2014
2015
2016 if(doPF) write_warning(__FUNCTION__,"Please use caution when trying to produce PF plots; not all versions of the JZB trees have these variables!");
2017 float mll_low=50;
2018 float mll_hi=160;
2019 if(!PlottingSetup::RestrictToMassPeak) {
2020 mll_low=20;
2021 mll_hi=320;
2022 }
2023
2024 if(MakeTwoThreeJetComparison) MakeElegantTwoThreeComparisons();
2025
2026 //TauQuestion();
2027
2028 //ProduceJanPlots();
2029 ProduceMCSystematicPlots();
2030 assert(0);
2031 // make_plain_kin_plot("pt",Cut2Str(cutOSSF&&TCut("mll>20&&pfJetGoodNumBtag30>=2")),40,0,200,nolog,"Z p_{T}","PlotForKostas",doPF,true);
2032
2033 if ( doOFSF ) {
2034 make_OFSF_plots("mll", "met[4]>100", 60, 20., 320., false, "m_{ll}", "mll");
2035 make_OFSF_plots("met[4]", "met[4]>100", 30, 100., 400., false, "PFMET", "met");
2036 make_OFSF_plots("leptonNum", "met[4]>100", 3, 2, 5., false, "N(leptons)", "NLeptons");
2037
2038 make_OFSF_plots("pfJetGoodNum40", "met[4]>100", 7, 3, 10, true, "#(jets)", "njets");
2039 make_OFSF_plots("pfJetGoodNum40", "met[4]>100&&pfJetGoodNumBtag30==0", 7, 3, 10, true, "#(jets)", "njets_btagVeto");
2040 make_OFSF_plots("pfJetGoodNum40", "met[4]>100&&pfJetGoodNumBtag30>0", 7, 3, 10, true, "#(jets)", "njets_AtLeastOneBJet30");
2041
2042 make_OFSF_plots("pfJetGoodNumBtag30", "met[4]>100", 5, 0, 5, true, "#(b-jets)", "nbjets");
2043 make_OFSF_plots("pfJetGoodPtBtag[0]", "met[4]>100&&pfJetGoodNumBtag30>0", 20, 0, 400, true, "p_{T}(leading b-jet)", "ptb1");
2044
2045 make_OFSF_plots("iso1", "met[4]>100", 20, 0, 0.3, true, "lepton 1 isolation", "iso1");
2046 make_OFSF_plots("iso2", "met[4]>100", 20, 0, 0.3, true, "lepton 2 isolation", "iso2");
2047 make_OFSF_plots("pt1", "met[4]>100", 30, 0., 300., true, "p_{T,1}", "pt1");
2048 make_OFSF_plots("pt2", "met[4]>100", 22, 0., 220., true, "p_{T,2}", "pt2");
2049 make_OFSF_plots("eta1", "met[4]>100", 10, -2.5, 2.5, false, "#eta_{1}", "eta1", 0.15);
2050 make_OFSF_plots("eta2", "met[4]>100", 10, -2.5, 2.5, false, "#eta_{2}", "eta2", 0.15);
2051 make_OFSF_plots("phi1", "met[4]>100", 10, -TMath::Pi(), TMath::Pi(), false, "#phi_{1}", "phi1", 0.2);
2052 make_OFSF_plots("phi2", "met[4]>100", 10, -TMath::Pi(), TMath::Pi(), false, "#phi_{2}", "phi2", 0.2);
2053 make_OFSF_plots("pfJetGoodPt[0]/pfJetGoodPt[1]", "met[4]>100", 20, 1, 10, true, "pt_{j}^{1}/pt_{j}^{2}", "jpt1pt2", 0.2);
2054 make_OFSF_plots("TMath::Abs(pfJetDphiMet[0])", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(jet1,MET)|", "dphij1met", 0.2);
2055 make_OFSF_plots("TMath::Abs(dphi)", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(l1,l2)|", "dphi", 0.2);
2056 make_OFSF_plots("TMath::Abs(dphiMet1)", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(l1,MET)|", "dphiMet1", 0.2);
2057 make_OFSF_plots("TMath::Abs(dphiMet2)", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(l2,MET)|", "dphiMet2", 0.2);
2058 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");
2059 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");
2060 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");
2061 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");
2062 }
2063
2064 if ( doDataComp) {
2065 TCut mllCut("");
2066 float massmin = 15.;
2067 float massmax = 315;
2068 int massnbins = 60;
2069 /* if ( !PlottingSetup::openBox ) {
2070 mllCut = "mll>70";
2071 massmin = 120;
2072 massmax = 360;
2073 massnbins = 14;
2074 }*/
2075
2076 TCut cutSignal = cutmass&&cutnJets&&"met[4]>100";
2077
2078 make_data_comparison_plot("numVtx", "",40, -0.5, 39.5,-1., true, "N(Vertices)", "numVtx");
2079 make_data_comparison_plot("pfJetGoodEta[0]", "",50, -3.0, 3.0,-1., true, "N(Jets)", "pfJetGoodEta0");
2080
2081
2082 make_data_comparison_plot("pfJetGoodNum40", cutOSOF,10, -0.5, 9.5,-1., true, "N(Jets)", "njets_OF");
2083 make_data_comparison_plot("met[4]", cutOSSF,60, 0., 300.,-1., true, "pfMET", "met_SF_inclusive");
2084 make_data_comparison_plot("met[1]", cutOSSF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_SF_inclusive");
2085 make_data_comparison_plot("met[4]", cutOSOF,60, 0., 300.,-1., true, "pfMET", "met_OF_inclusive");
2086 make_data_comparison_plot("met[1]", cutOSOF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_OF_inclusive");
2087
2088 make_data_comparison_plot("met[4]", cutnJets&&cutOSSF,60, 0., 300.,-1., true, "pfMET", "met_SF_exclusive");
2089 make_data_comparison_plot("met[1]", cutnJets&&cutOSSF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_SF_exclusive");
2090 make_data_comparison_plot("met[4]", cutnJets&&cutOSOF,60, 0., 300.,-1., true, "pfMET", "met_OF_exclusive");
2091 make_data_comparison_plot("met[1]", cutnJets&&cutOSOF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_OF_exclusive");
2092
2093
2094 string basiccutsaved = (const char*)basiccut;
2095
2096 string newbasiccut=basiccutsaved;
2097
2098 size_t found;
2099 found = newbasiccut.find( "pt2>20" );
2100 while (found!=string::npos){
2101 newbasiccut.replace( found, string( "pt2>20" ).length(), "pt2>10" );
2102 found = newbasiccut.find( "pt2>20" );
2103 }
2104 basiccut=TCut(newbasiccut.c_str());
2105 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[4]>150")&&cutOSSF,60, 0., 300.,-1., false, "mll", "mll_SF_Aachen_pt2010_met");
2106 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[4]>150")&&cutOSOF,60, 0., 300.,-1., false, "mll", "mll_OF_Aachen_pt2010_met");
2107 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[1]>150")&&cutOSSF,60, 0., 300.,-1., true, "mll", "mll_SF_Aachen_pt2010_t1cpfmet");
2108 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[1]>150")&&cutOSOF,60, 0., 300.,-1., true, "mll", "mll_OF_Aachen_pt2010_t1cpfmet");
2109 basiccut=TCut(basiccutsaved.c_str());
2110
2111 make_data_comparison_plot("pfJetGoodNum40", cutOSSF, 8, 0., 8.,-1., true, "#(jets)", "njets_SF");
2112 make_data_comparison_plot("pfJetGoodNum40", cutOSOF, 8, 0., 8.,-1., true, "#(jets)", "njets_OF");
2113
2114 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[4]>100")&&cutOSSF,60, 0., 300.,-1., true, "mll", "mll_SF_ETH_met");
2115 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[4]>100")&&cutOSOF,60, 0., 300.,-1., true, "mll", "mll_OF_ETH_met");
2116 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[1]>100")&&cutOSSF,60, 0., 300.,-1., true, "mll", "mll_SF_ETH_t1cpfmet");
2117 make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[1]>100")&&cutOSOF,60, 0., 300.,-1., true, "mll", "mll_OF_ETH_t1cpfmet");
2118
2119
2120 make_data_comparison_plot("mll", cutOSSF,60, 15., 315.,-1., true, "m_{ll}", "mll_SF_inclusive");
2121 make_data_comparison_plot("mll", cutOSSF&&TCut("id1==0"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_inclusive_ee");
2122 make_data_comparison_plot("mll", cutOSSF&&TCut("id1==1"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_inclusive_mm");
2123 make_data_comparison_plot("mll", cutOSOF,60, 15., 315.,-1., true, "m_{ll}", "mll_OF_inclusive");
2124 make_data_comparison_plot("mll", cutnJets&&cutOSSF&&TCut("id1==0"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_exclusive_ee");
2125 make_data_comparison_plot("mll", cutnJets&&cutOSSF&&TCut("id1==1"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_exclusive_mm");
2126 make_data_comparison_plot("mll", cutnJets&&cutOSSF,60, 15., 315.,-1., true, "m_{ll}", "mll_SF_exclusive");
2127 make_data_comparison_plot("mll", cutnJets&&cutOSOF,60, 15., 315.,-1., true, "m_{ll}", "mll_OF_exclusive");
2128
2129 make_data_comparison_plot("mll", cutOSSF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig");
2130 make_data_comparison_plot("mll", cutOSOF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig");
2131
2132 make_data_comparison_plot("mll", TCut("abs(eta1)<1.4&&abs(eta2)<1.4") && cutOSSF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig_central");
2133 make_data_comparison_plot("mll", TCut("abs(eta1)<1.4&&abs(eta2)<1.4") && cutOSOF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig_central");
2134
2135 make_data_comparison_plot("mll", cutOSSF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30==0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig_btagVeto");
2136 make_data_comparison_plot("mll", cutOSOF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30==0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig_btagVeto");
2137
2138 make_data_comparison_plot("mll", cutOSSF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30>0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig_AtLeastOneBJet");
2139 make_data_comparison_plot("mll", cutOSOF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30>0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig_AtLeastOneBJet");
2140
2141
2142 make_data_comparison_plot("mll", mllCut&&cutOSOF&&cutSignal, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig");
2143 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");
2144 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");
2145
2146 make_data_comparison_plot("pfJetGoodNum40", cutOSSF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(jets)", "njets_SF_sig");
2147 make_data_comparison_plot("pfJetGoodNum40", cutOSOF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(jets)", "njets_OF_sig");
2148 make_data_comparison_plot("pfJetGoodNumBtag30", cutOSSF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(b-jets)", "nbjets_SF_sig");
2149 make_data_comparison_plot("pfJetGoodNumBtag30", cutOSOF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(b-jets)", "nbjets_OF_sig");
2150
2151 }
2152
2153
2154 if ( doKin ) {
2155 string mllCut("");
2156
2157
2158
2159 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_0j",doPF,true);
2160 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_1j",doPF,true);
2161 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_2j",doPF,true);
2162 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_3j",doPF,true);
2163
2164 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_0j",doPF,true);
2165 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_1j",doPF,true);
2166 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_2j",doPF,true);
2167 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_3j",doPF,true);
2168
2169
2170 make_plain_kin_plot("pfTightHT",Cut2Str(cutOSOF&&cutnJets),120,0,1200,dolog,"H_{T}","HT_3jets_OF",doPF,true);
2171 make_plain_kin_plot("pfTightHT",Cut2Str(cutOSSF&&cutnJets) ,120,0,1200,dolog,"H_{T}","HT_3jets_SF",doPF,true);
2172 make_plain_kin_plot("pfTightHT",Cut2Str(cutOSOF&&cutnJets&&TCut("met[4]>100")),120,0,1200,dolog,"H_{T}","HT_3jets_OF_MET100",doPF,true);
2173 make_plain_kin_plot("pfTightHT",Cut2Str(cutOSSF&&cutnJets&&TCut("met[4]>100")) ,120,0,1200,dolog,"H_{T}","HT_3jets_SF_MET100",doPF,true);
2174
2175
2176 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_0j",doPF,true);
2177 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_1j",doPF,true);
2178 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_2j",doPF,true);
2179 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_3j",doPF,true);
2180
2181 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_0j",doPF,true);
2182 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_1j",doPF,true);
2183 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_2j",doPF,true);
2184 make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_3j",doPF,true);
2185
2186 make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&cutnJets&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_SF_20to70",doPF,true);
2187 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&cutnJets&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_OF_20to70",doPF,true);
2188
2189 make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&cutnJets&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_SF_above120",doPF,true);
2190 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&cutnJets&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_OF_above120",doPF,true);
2191
2192 make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&TCut("pfJetGoodNum40==2")&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_SF_20to70___2jetsonly",doPF,true);
2193 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("pfJetGoodNum40==2")&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_OF_20to70___2jetsonly",doPF,true);
2194
2195 make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&TCut("pfJetGoodNum40==2")&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_SF_above120___2jetsonly",doPF,true);
2196 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("pfJetGoodNum40==2")&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_OF_above120___2jetsonly",doPF,true);
2197
2198
2199 make_kin_plot("pfJetGoodPt[0]/pfJetGoodPt[1]","",45,1,10,dolog,"pt_{j}^{1}/pt_{j}^{2}","j1j2ratio",doPF,true);
2200 make_kin_plot("TMath::Abs(pfJetDphiMet[0])","",32,0,3.2,nolog,"|#Delta#phi(jet1,MET)|","dphiJ1MET",doPF,true);
2201 // Plots in signal region
2202 make_kin_plot("met[4]","",70,0,350,dolog,"MET [GeV]","met",doPF,true);
2203
2204
2205 make_kin_plot("MetFactor","",20,0,2,nolog,"MetFactor","MetFactor",doPF,true);
2206
2207 make_ttbar_comparison("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_OF_30to70_2j__ALLMCSAMPLES");
2208 /*
2209 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),dolog,"PFMET","Debunking/MET_OF_30to70_0j");
2210 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),dolog,"PFMET","Debunking/MET_OF_30to70_1j");
2211 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_OF_30to70_2j");
2212 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),dolog,"PFMET","Debunking/MET_OF_30to70_3j");
2213
2214 DoMCSystPlot("met[4]",40,0,400,(cutOSSF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),dolog,"PFMET","Debunking/MET_SF_30to70_0j");
2215 DoMCSystPlot("met[4]",40,0,400,(cutOSSF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),dolog,"PFMET","Debunking/MET_SF_30to70_1j");
2216 DoMCSystPlot("met[4]",40,0,400,(cutOSSF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_SF_30to70_2j");
2217 DoMCSystPlot("met[4]",40,0,400,(cutOSSF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),dolog,"PFMET","Debunking/MET_SF_30to70_3j");
2218
2219 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==0")),dolog,"PFMET","Debunking/MET_OF_Z_0j");
2220 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==1")),dolog,"PFMET","Debunking/MET_OF_Z_1j");
2221 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_OF_Z_2j");
2222 DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==3")),dolog,"PFMET","Debunking/MET_OF_Z_3j");
2223
2224
2225 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSSF,dolog,"m_{ll} [GeV]","kinSys/mll");
2226 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSSF&&TCut("id1==0"),dolog,"m_{ll} [GeV]","kinSys/mll_ee");
2227 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSSF&&TCut("id1==1"),dolog,"m_{ll} [GeV]","kinSys/mll_mm");
2228 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSOF,dolog,"m_{ll} [GeV]","kinSys/mll_osof");
2229
2230 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutOSSF,dolog,"m_{ll} [GeV]","kinSys/mll_inclusive");
2231 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutOSOF,dolog,"m_{ll} [GeV]","kinSys/mll_inclusive_osof");
2232
2233 DoMCSystPlot("pfJetGoodNum40", 9,-0.5,8.5,cutOSSF,dolog,"nJets","kinSys/nJets_ossf");
2234 DoMCSystPlot("pfJetGoodNum40", 9,-0.5,8.5,cutOSOF,dolog,"nJets","kinSys/nJets_osof");
2235
2236 DoMCSystPlot("pfJetGoodPt[0]/pfJetGoodPt[1]",45,1,10,cutnJets&&cutOSSF,dolog,"p_{T}^{J1} / p_{T}^{J2}","kinSys/j1j2ratio");
2237 DoMCSystPlot("TMath::Abs(pfJetDphiMet[0])",32,0,3.2,cutnJets&&cutOSSF,dolog,"|#Delta#phi(jet1,MET)|","kinSys/dphiJ1MET");
2238 DoMCSystPlot(datajzb,mcjzb, (int)((PlottingSetup::jzbHigh+110)/10),-110,PlottingSetup::jzbHigh,cutnJets&&cutOSSF&&Restrmasscut,dolog,"m_{ll} [GeV]","kinSys/jzb_OS_SFZP");
2239 DoMCSystPlot(datajzb,mcjzb, (int)((PlottingSetup::jzbHigh+110)/10),-110,PlottingSetup::jzbHigh,cutnJets&&cutOSOF&&Restrmasscut,dolog,"m_{ll} [GeV]","kinSys/jzb_OS_OFZP");
2240
2241 make_kin_plot("mll","mll>20"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll",doPF,true);
2242 make_kin_plot("mll","mll>20",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof",doPF,true,true);
2243 make_kin_plot("mll","mll>20"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee",doPF,true);
2244 make_kin_plot("mll","mll>20"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm",doPF,true);
2245
2246 make_kin_plot("pfJetGoodNum40",mllCut,9,-0.5,8.5,dolog,"nJets","nJets",doPF);
2247 make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_osof",doPF);
2248
2249 make_kin_plot("mll","mll>20&&met[4]>100"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_met100",doPF,true);
2250 make_kin_plot("mll","mll>20&&met[4]>100",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof_met100",doPF,true,true);
2251 make_kin_plot("mll","mll>20&&met[4]>100"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee_met100",doPF,true);
2252 make_kin_plot("mll","mll>20&&met[4]>100"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm_met100",doPF,true);
2253
2254
2255 make_kin_plot("pfJetGoodNum40","met[4]>100"+mllCut,9,-0.5,8.5,dolog,"nJets","nJets_met100",doPF);
2256 make_kin_plot("pfJetGoodNum40","met[4]>100",9,-0.5,8.5,dolog,"nJets","nJets_osof_met100",doPF);
2257
2258 // Further inclusive invariant mass plots
2259 make_kin_plot("mll",mllCut,(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive",doPF,true);
2260 make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_ee",doPF,true);
2261 make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_mm",doPF,true);
2262 make_kin_plot("mll",mllCut,(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_osof",doPF,true);
2263
2264 make_kin_plot("mll","",(int)((350-mll_low))/5,mll_low,350,dolog,"m_{ll} [GeV]","mll_inclusive_highrange",doPF);
2265 //if(!doPF) make_special_mll_plot((int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]");
2266
2267
2268 // Number of jets
2269 make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_inclusive",doPF);
2270 make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_osof_inclusive",doPF);
2271 make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_nocuts_except_mll_ossf",doPF);
2272
2273 // Others
2274 make_kin_plot("numVtx","",(int)(30.5-(-0.5)),-0.5,30.5,nolog,"N(Vtx)","numVtx",doPF);
2275 // make_kin_plot("jetpt[0]","",40,0,200,dolog,"leading jet p_{T} [GeV]","pfJetGoodPt_0",doPF);
2276 // make_kin_plot("jeteta[0]","",40,-5,5,nolog,"leading jet #eta","pfJetGoodEta_0",doPF);
2277 make_kin_plot("pt","",50,0,500,dolog,"Z p_{T} [GeV]","Zpt",doPF);
2278 make_kin_plot("pt1","",50,0,200,nolog,"p_{T} [GeV]","pt1",doPF);
2279 make_kin_plot("pt2","",50,0,200,nolog,"p_{T} [GeV]","pt2",doPF);
2280 make_kin_plot("eta1","",40,-3,3,nolog,"#eta_{l}","eta",doPF);
2281 make_kin_plot("jzb[1]","",100,-150,200,dolog,"JZB [GeV]","jzb_ossf",doPF);
2282 // stringstream jzbcut;
2283 // jzbcut << "((is_data&&("<<datajzb<<")>100)||(!is_data&&("<<mcjzb<<")>100))";
2284 // make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB100",doPF,true);
2285 // 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);
2286 // 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);
2287 // 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);
2288 // stringstream jzbcut2;
2289 // jzbcut2 << "((is_data&&("<<datajzb<<")>150)||(!is_data&&("<<mcjzb<<")>150))";
2290 // make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB150",doPF,true);
2291 // 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);
2292 // 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);
2293 // 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);
2294 // stringstream jzbcut3;
2295 // jzbcut3 << "((is_data&&("<<datajzb<<")>50)||(!is_data&&("<<mcjzb<<")>50))";
2296 // make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB50",doPF,true);
2297 // 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);
2298 // 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);
2299 // 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);
2300
2301 // 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);
2302 //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);
2303 //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);*/
2304 }
2305 /*
2306 make_special_obs_pred_mll_plot(datajzb,mcjzb,0);
2307 make_special_obs_pred_mll_plot(datajzb,mcjzb,50);
2308 make_special_obs_pred_mll_plot(datajzb,mcjzb,80);
2309 make_special_obs_pred_mll_plot(datajzb,mcjzb,100);
2310 make_special_obs_pred_mll_plot(datajzb,mcjzb,150);
2311 make_special_obs_pred_mll_plot(datajzb,mcjzb,200);
2312 make_special_obs_pred_mll_plot(datajzb,mcjzb,250);
2313
2314 make_JES_plot(cutmass&&cutOSSF&&basiccut,"_ossf");
2315 make_JES_plot(cutmass&&cutOSOF&&basiccut,"_osof");
2316 */
2317 switch_overunderflow(false);
2318 }
2319
2320 void make_comp_plot( string var, string xlabel, string filename, float jzbcut, string mcjzb, string datajzb,
2321 int nbins, float xmin, float xmax, bool log,
2322 float ymin=0, float ymax=0, bool leftJustified=false ) {
2323 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- WATCH OUT: the argument in the function changed!
2324
2325 TCut weightbackup=cutWeight;//backing up the correct weight (restoring below!)
2326 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__));
2327 //if(var=="numVtx") cutWeight=TCut("1.0");
2328 TCut jzbData[]= { TCut(TString(datajzb+">"+any2string(jzbcut))),TCut(TString(datajzb+"<-"+any2string(jzbcut))) };
2329 TCut jzbMC[] = { TCut(TString(mcjzb+">"+any2string(jzbcut))),TCut(TString(mcjzb+"<-"+any2string(jzbcut))) };
2330
2331 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- below: the next ~20 lines changed!
2332 int nRegions=4;
2333 if(!PlottingSetup::RestrictToMassPeak||!PlottingSetup::UseSidebandsForcJZB) {
2334 nRegions=2;
2335 }
2336
2337 string sRegions[] = { "SFZP","OFZP","SFSB","OFSB" };
2338 TCut kRegions[] = { cutOSSF&&cutnJets&&cutmass, cutOSOF&&cutnJets&&cutmass,
2339 cutOSSF&&cutnJets&&sidebandcut, cutOSOF&&cutnJets&&sidebandcut };
2340
2341 //find ymax
2342 TH1F *Refdatahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[0]&&jzbData[0],data,luminosity);
2343 ymax=int((Refdatahisto->GetMaximum()+2*TMath::Sqrt(Refdatahisto->GetMaximum()))*1.2+0.5);
2344 delete Refdatahisto;
2345
2346 for ( int iregion=0; iregion<nRegions; ++iregion )
2347 for ( int ijzb=0; ijzb<2; ++ijzb ) {
2348 TCanvas *ccomp = new TCanvas("ccomp","Comparison plot",600,400);
2349 ccomp->SetLogy(log);
2350 TH1F *datahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity);
2351 TH1F *lm3histo = signalsamples.Draw("lm3histo", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb],data,luminosity,signalsamples.FindSample("LM3"));
2352 THStack mcstack = allsamples.DrawStack("mcstack",var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb], mc, luminosity);
2353 datahisto->SetMarkerSize(DataMarkerSize);
2354 if (ymax>ymin) datahisto->SetMaximum(ymax);
2355 lm3histo->SetLineStyle(2);
2356 datahisto->Draw("e1");
2357 mcstack.Draw("histo,same");
2358 datahisto->Draw("same,e1");
2359 lm3histo->Draw("hist,same");
2360 TLegend *kinleg = allsamples.allbglegend((sRegions[iregion]+(ijzb?"neg":"pos")).c_str());
2361 if ( leftJustified ) {
2362 Float_t w = kinleg->GetX2()-kinleg->GetX1();
2363 kinleg->SetX1(0.2);
2364 kinleg->SetX2(0.2+w);
2365 }
2366 kinleg->AddEntry(lm3histo,"LM3","l");
2367 kinleg->Draw();
2368 TText* write_variable = write_text(0.99,0.01,var);
2369 write_variable->SetTextAlign(31);
2370 write_variable->SetTextSize(0.02);
2371 ccomp->RedrawAxis();
2372 CompleteSave(ccomp,"compare/JZBcut_at_"+any2string(jzbcut)+"/"+filename+"/"+filename+sRegions[iregion]+(ijzb?"neg":"pos"));
2373 delete datahisto;
2374 delete ccomp;
2375 delete lm3histo;
2376 }
2377 cutWeight=weightbackup;
2378 }
2379
2380
2381 void region_comparison_plots(string mcjzb, string datajzb, vector<float> jzb_cuts) {
2382 dout << "Creating comparison plots for signal and control regions" << endl;
2383 // Compare a few quantities in the signal region and all 7 control regions
2384
2385 // switch_overunderflow(true); // switching overflow/underflow bins on
2386
2387 switch_overunderflow(true);
2388 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- the arguments changed
2389 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
2390 float jzbcut=jzb_cuts[ijzb]; // Comparison plots are done for this JZB cut
2391 float mll_low=50;float mll_high=170;
2392 if(!PlottingSetup::RestrictToMassPeak) {
2393 mll_high=300;
2394 mll_low=20;
2395 }
2396 make_comp_plot("pfJetGoodPt[0]/pfJetGoodPt[1]","pt_{j}^{1}/pt_{j}^{2}","j1j2ratio",jzbcut,mcjzb,datajzb,100,0,10,true);
2397 make_comp_plot("TMath::Abs(pfJetDphiMet[0])","|#Delta#phi(jet1,MET)|","dphiJ1MET",jzbcut,mcjzb,datajzb,32,0,3.2,false,0,0,true);
2398
2399 make_comp_plot("mll","m_{ll} [GeV]","mll",jzbcut,mcjzb,datajzb,56,mll_low,mll_high,false,0,16.);
2400 make_comp_plot("met[4]","pfMET [GeV]","pfmet",jzbcut,mcjzb,datajzb,18,0,360,false,0,16.);
2401 make_comp_plot("pfJetGoodNum40","#(jets)","njets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
2402 make_comp_plot("pfJetGoodNumBtag","#(b-jets)","nBjets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
2403 make_comp_plot("pt","Z p_{T} [GeV]","Zpt",jzbcut,mcjzb,datajzb,26,0,525,false,0.,21.);
2404 make_comp_plot("numVtx","#(prim. vertices)","nvtx",jzbcut,mcjzb,datajzb,40,0.,40.,false,0,16.);
2405 make_comp_plot("TMath::Abs(dphi)","#Delta#phi(leptons)","dphilep",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
2406 make_comp_plot("TMath::Abs(dphi_sumJetVSZ[1])","#Delta#phi(Z,jets)","dphiZjets",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
2407 make_comp_plot("eta1","#eta_1","eta1",jzbcut,mcjzb,datajzb,10,0.,2.5,false,0,16.);
2408 make_comp_plot("eta2","#eta_2","eta2",jzbcut,mcjzb,datajzb,10,0.,2.5,false,0,16.);
2409 }
2410
2411 switch_overunderflow(false); // switching overflow/underflow bins off
2412 }
2413
2414
2415
2416 void do_kinematic_PF_plots(string mcjzb, string datajzb)
2417 {
2418 do_kinematic_plots(mcjzb,datajzb,true);
2419 }
2420
2421 void signal_bg_comparison()
2422 {
2423 TCanvas *can = new TCanvas("can","Signal Background Comparison Canvas");
2424 can->SetLogy(1);
2425
2426 int sbg_nbins=130;
2427 float sbg_min=-500; //-110;
2428 float sbg_max=800; //jzbHigh;
2429
2430 float simulatedlumi=luminosity;//in pb please - adjust to your likings
2431
2432 TH1F *JZBplotZJETs = allsamples.Draw("JZBplotZJETs",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/DY"));
2433 TH1F *JZBplotLM4;
2434 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"));
2435 else JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM3"));
2436 TH1F *JZBplotTtbar = allsamples.Draw("JZBplotTtbar",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("TTJets"));
2437
2438 JZBplotTtbar->SetLineColor(allsamples.GetColor("TTJet"));
2439 JZBplotZJETs->SetFillColor(allsamples.GetColor("DY"));
2440 JZBplotZJETs->SetLineColor(kBlack);
2441 JZBplotLM4->SetLineStyle(2);
2442 JZBplotZJETs->SetMaximum(JZBplotZJETs->GetMaximum()*5);
2443 JZBplotZJETs->SetMinimum(1);
2444
2445 JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
2446 JZBplotTtbar->SetMinimum(0.01);
2447 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
2448 JZBplotTtbar->DrawClone("histo");
2449 JZBplotZJETs->Draw("histo,same");
2450 JZBplotTtbar->SetFillColor(0);
2451 JZBplotTtbar->DrawClone("histo,same");
2452 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
2453 JZBplotLM4->Draw("histo,same");
2454
2455
2456 TLegend *signal_bg_comparison_leg2 = make_legend("",0.55,0.75,false);
2457 signal_bg_comparison_leg2->AddEntry(JZBplotZJETs,"Z+Jets","f");
2458 signal_bg_comparison_leg2->AddEntry(JZBplotTtbar,"t#bar{t}","f");
2459 if(PlottingSetup::RestrictToMassPeak) signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM4","f");
2460 else signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM3","f");
2461 signal_bg_comparison_leg2->Draw();
2462 DrawMCPrelim(simulatedlumi);
2463 CompleteSave(can,"jzb_bg_vs_signal_distribution");
2464
2465 // Define illustrative set of SMS points
2466 TCut kSMS1("MassGlu==250&&MassLSP==75");
2467 TCut kSMS2("MassGlu==800&&MassLSP==200");
2468 TCut kSMS3("MassGlu==1050&&MassLSP==850");
2469 TCut kSMS4("MassGlu==1200&&MassLSP==100");
2470
2471 //If the scan samples haven't been loaded yet, this is a good point to load them (all of them!)
2472 if((scansample.collection).size()<2) define_SMS_sample(false, allsamples, signalsamples, scansample, true); // loading ALL zones for the scans, not only the basic one.
2473
2474
2475 TH1F *JZBplotSMS1 = scansample.Draw("JZBplotSMS1",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS1,mc,simulatedlumi,scansample.FindSample("t"));
2476 JZBplotSMS1->Scale(JZBplotLM4->Integral()/JZBplotSMS1->Integral());
2477
2478 TH1F *JZBplotSMS2 = scansample.Draw("JZBplotSMS2",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS2,mc,simulatedlumi,scansample.FindSample("t"));
2479 JZBplotSMS2->Scale(JZBplotLM4->Integral()/JZBplotSMS2->Integral());
2480
2481 TH1F *JZBplotSMS3 = scansample.Draw("JZBplotSMS3",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS3,mc,simulatedlumi,scansample.FindSample("t"));
2482 JZBplotSMS3->Scale(JZBplotLM4->Integral()/JZBplotSMS3->Integral());
2483
2484 TH1F *JZBplotSMS4 = scansample.Draw("JZBplotSMS4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS4,mc,simulatedlumi,scansample.FindSample("t"));
2485 JZBplotSMS4->Scale(JZBplotLM4->Integral()/JZBplotSMS4->Integral());
2486
2487 // Draw all plots overlaid
2488 JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
2489 JZBplotTtbar->SetMinimum(0.01);
2490 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
2491 JZBplotTtbar->DrawClone("histo");
2492 JZBplotZJETs->Draw("histo,same");
2493 JZBplotTtbar->SetFillColor(0);
2494 JZBplotTtbar->DrawClone("histo,same");
2495 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
2496
2497 JZBplotSMS1->SetLineColor(kRed+1);
2498 JZBplotSMS2->SetLineColor(kBlue+1);
2499 JZBplotSMS3->SetLineColor(kRed+1);
2500 JZBplotSMS4->SetLineColor(kBlue+1);
2501 JZBplotSMS3->SetLineStyle(2);
2502 JZBplotSMS4->SetLineStyle(2);
2503
2504 JZBplotSMS1->Draw("histo,same");
2505 JZBplotSMS2->Draw("histo,same");
2506 JZBplotSMS3->Draw("histo,same");
2507 JZBplotSMS4->Draw("histo,same");
2508 JZBplotLM4->SetLineColor(kGreen);JZBplotLM4->Draw("histo,same");
2509 TLegend *signal_bg_comparison_leg6 = make_legend("",0.55,0.55,false);
2510 signal_bg_comparison_leg6->AddEntry(JZBplotZJETs,"Z+Jets","f");
2511 signal_bg_comparison_leg6->AddEntry(JZBplotTtbar,"t#bar{t}","f");
2512 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"","");
2513 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"SMS parameters","");
2514 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"(250,75) [GeV]","f");
2515 signal_bg_comparison_leg6->AddEntry(JZBplotSMS2,"(800,200) [GeV]","f");
2516 signal_bg_comparison_leg6->AddEntry(JZBplotSMS3,"(1050,850) [GeV]","f");
2517 signal_bg_comparison_leg6->AddEntry(JZBplotSMS4,"(1200,100) [GeV]","f");
2518 signal_bg_comparison_leg6->AddEntry(JZBplotLM4,"LM4","f");
2519 signal_bg_comparison_leg6->Draw();
2520 DrawMCPrelim(simulatedlumi);
2521 CompleteSave(can,"jzb_bg_vs_signal_distribution_SMS__summary");
2522
2523 while((scansample.collection).size() > 1) scansample.RemoveLastSample();
2524
2525 }
2526
2527 vector<TF1*> do_cb_fit_to_plot(TH1F *histo, float Sigma, float doingfitacrosstheboard=false) {
2528 TF1 *BpredFunc = new TF1("BpredFunc",InvCrystalBall,0,1000,5);
2529 BpredFunc->SetParameter(0,histo->GetBinContent(1));
2530 if(doingfitacrosstheboard) BpredFunc->SetParameter(0,histo->GetMaximum());
2531 BpredFunc->SetParameter(1,0.);
2532 if(method==1) BpredFunc->SetParameter(2,10*Sigma);//KM
2533 else BpredFunc->SetParameter(2,Sigma);//Gaussian based methods
2534 if(method==-99) BpredFunc->SetParameter(2,2.0*Sigma);//Kostas
2535 BpredFunc->SetParameter(3,1.8);
2536 BpredFunc->SetParameter(4,2.5);
2537 histo->Fit(BpredFunc,"QN0");
2538 BpredFunc->SetLineColor(kBlue);
2539
2540 TF1 *BpredFuncP = new TF1("BpredFuncP",InvCrystalBallP,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
2541 TF1 *BpredFuncN = new TF1("BpredFuncN",InvCrystalBallN,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
2542
2543 BpredFuncP->SetParameters(BpredFunc->GetParameters());
2544 BpredFuncP->SetLineColor(kBlue);
2545 BpredFuncP->SetLineStyle(2);
2546
2547 BpredFuncN->SetParameters(BpredFunc->GetParameters());
2548 BpredFuncN->SetLineColor(kBlue);
2549 BpredFuncN->SetLineStyle(2);
2550
2551 vector<TF1*> functions;
2552 functions.push_back(BpredFuncN);
2553 functions.push_back(BpredFunc);
2554 functions.push_back(BpredFuncP);
2555 return functions;
2556 }
2557
2558
2559 TF1* do_logpar_fit_to_plot(TH1F *osof) {
2560 TCanvas *logpar_fit_can = new TCanvas("logpar_fit_can","Fit canvas for LogPar");
2561 TF1 *logparfunc = new TF1("logparfunc",LogParabola,0,300,3);
2562 TF1 *logparfunc2 = new TF1("logparfunc2",LogParabola,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
2563 TF1 *logparfuncN = new TF1("logparfuncN",LogParabolaN,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
2564 TF1 *logparfuncP = new TF1("logparfuncP",LogParabolaP,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
2565 osof->SetMinimum(0);
2566 osof->Fit(logparfunc,"QR");
2567 osof->Draw();
2568 logparfunc->SetLineWidth(2);
2569 logparfunc2->SetParameters(logparfunc->GetParameters());
2570 logparfuncN->SetParameters(logparfunc->GetParameters());
2571 logparfuncP->SetParameters(logparfunc->GetParameters());
2572 stringstream fitinfo;
2573 fitinfo << "#Chi^{2} / NDF : " << logparfunc->GetChisquare() << " / " << logparfunc->GetNDF();
2574 TText *writefitinfo = write_text(0.8,0.8,fitinfo.str());
2575 writefitinfo->SetTextSize(0.03);
2576 DrawPrelim();
2577 writefitinfo->Draw();
2578 logparfunc->Draw("same");
2579 logparfunc2->Draw("same");
2580 logparfuncN->SetLineStyle(2);
2581 logparfuncP->SetLineStyle(2);
2582 logparfuncN->Draw("same");
2583 logparfuncP->Draw("same");
2584 CompleteSave(logpar_fit_can,"MakingOfBpredFunction/Bpred_Data_LogPar_Fit_To_TTbarPred");
2585 delete logpar_fit_can;
2586 return logparfunc2;
2587 }
2588
2589 vector<TF1*> do_extended_fit_to_plot(TH1F *prediction, TH1F *Tprediction, TH1F *ossf, TH1F *osof,int isdata) {
2590 /* there are mainly two background contributions: Z+Jets (a) and ttbar (b). So:
2591 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.
2592 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.
2593 Once we have these two components, we use the combined parameters to get the final function and we're done.
2594 */
2595 //Step 1: take the OSSF prediction - OSOF prediction, and fit a crystal ball function to it
2596 TH1F *step1cb = (TH1F*)ossf->Clone("step1cb");
2597 step1cb->Add(osof,-1);
2598 vector<TF1*> functions = do_cb_fit_to_plot(step1cb,PlottingSetup::JZBPeakWidthData);
2599 TF1 *zjetscrystalball = functions[1];
2600
2601 //Step 2: use the OSOF distribution and look at the [10,100] GeV JZB range, and fit our log parabola
2602 // TH1F *ttbarprediction=(TH1F*)prediction->Clone("ttbarprediction");
2603 // ttbarprediction->Add(ossf,-1);//without the Z+Jets estimate, this is really just the ttbar estimate!
2604 // 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)
2605 TF1 *ttbarlogpar = do_logpar_fit_to_plot(Tprediction);
2606 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2607 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);
2608
2609
2610 TF1 *ttbarlogparP = new TF1("ttbarlogparP",LogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2611 TF1 *ttbarlogparN = new TF1("ttbarlogparN",LogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2612
2613 //and now fuse the two!
2614 TF1 *kmlp = new TF1("kmlp", CrystalBallPlusLogParabola, 0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2615 TF1 *kmlpP= new TF1("kmlpP",CrystalBallPlusLogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2616 TF1 *kmlpN= new TF1("kmlpN",CrystalBallPlusLogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2617 double kmlp_pars[10];
2618 for(int i=0;i<5;i++) kmlp_pars[i]=zjetscrystalball->GetParameter(i);
2619 for(int i=0;i<3;i++) kmlp_pars[5+i]=ttbarlogpar->GetParameter(i);
2620 ttbarlogparP->SetParameters(ttbarlogpar->GetParameters());
2621 ttbarlogparN->SetParameters(ttbarlogpar->GetParameters());
2622 kmlp->SetParameters(kmlp_pars);
2623 prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
2624 /*
2625 if you want to start from scratch (without the partial fitting and only fitting the whole thing, some good start values could be :
2626 */
2627 kmlp_pars[0]=kmlp->GetParameter(0);
2628 kmlp_pars[1]=3.6198;
2629 kmlp_pars[2]=16.4664;
2630 kmlp_pars[3]=1.92253;
2631 kmlp_pars[4]=3.56099;
2632 kmlp_pars[5]=5.83;
2633 kmlp_pars[6]=0.000757479;
2634 kmlp_pars[7]=95.6157;
2635 kmlp_pars[8]=0;
2636 kmlp_pars[9]=0;
2637 kmlp->SetParameters(kmlp_pars);
2638 /**/
2639 prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
2640
2641 kmlpP->SetParameters(kmlp->GetParameters());
2642 kmlpN->SetParameters(kmlp->GetParameters());
2643
2644 // now that we're done, let's save all of this so we can have a look at it afterwards.
2645 TCanvas *can = new TCanvas("can","Prediction Fit Canvas");
2646 can->SetLogy(1);
2647 prediction->SetMarkerColor(kRed);
2648 prediction->Draw();
2649
2650 kmlp->SetLineColor(TColor::GetColor("#04B404"));
2651 kmlpP->SetLineColor(TColor::GetColor("#04B404"));
2652 kmlpN->SetLineColor(TColor::GetColor("#04B404"));
2653 kmlp->Draw("same");
2654 kmlpN->SetLineStyle(2);
2655 kmlpP->SetLineStyle(2);
2656 kmlpN->Draw("same");
2657 kmlpP->Draw("same");
2658
2659 ttbarlogpar->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
2660 ttbarlogpar->Draw("same");
2661 ttbarlogparP->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
2662 ttbarlogparN->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
2663 ttbarlogparP->SetLineStyle(2);
2664 ttbarlogparN->SetLineStyle(2);
2665 ttbarlogparP->Draw("same");
2666 ttbarlogparN->Draw("same");
2667
2668 functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
2669
2670 TLegend *analyticalBpredLEG = make_legend("",0.5,0.55);
2671 analyticalBpredLEG->AddEntry(prediction,"predicted","p");
2672 analyticalBpredLEG->AddEntry(functions[1],"Crystal Ball fit","l");
2673 analyticalBpredLEG->AddEntry(functions[0],"1#sigma Crystal Ball fit","l");
2674 analyticalBpredLEG->AddEntry(ttbarlogparN,"TTbar fit","l");
2675 analyticalBpredLEG->AddEntry(ttbarlogpar,"1#sigma TTbar fit","l");
2676 analyticalBpredLEG->AddEntry(kmlp,"Combined function","l");
2677 analyticalBpredLEG->AddEntry(kmlpN,"1#sigma combined function","l");
2678 analyticalBpredLEG->Draw("same");
2679
2680 if(isdata==0) CompleteSave(can,"MakingOfBpredFunction/Bpred_MC_Analytical_Function_Composition");
2681 if(isdata==1) CompleteSave(can,"MakingOfBpredFunction/Bpred_data_Analytical_Function_Composition");
2682 if(isdata==2) CompleteSave(can,"MakingOfBpredFunction/Bpred_MCBnS_Analytical_Function_Composition");
2683 delete can;
2684
2685 //and finally: prep return functions
2686 vector<TF1*> return_functions;
2687 return_functions.push_back(kmlpN);
2688 return_functions.push_back(kmlp);
2689 return_functions.push_back(kmlpP);
2690
2691 return_functions.push_back(ttbarlogparN);
2692 return_functions.push_back(ttbarlogpar);
2693 return_functions.push_back(ttbarlogparP);
2694
2695 return_functions.push_back(functions[0]);
2696 return_functions.push_back(functions[1]);
2697 return_functions.push_back(functions[2]);
2698
2699 return return_functions;
2700 }
2701
2702 void do_prediction_plot(string jzb, TCanvas *globalcanvas, float high, int use_data, bool overlay_signal = false,string subdir="" )
2703 {
2704
2705 bool is_data=false;
2706 bool use_signal=false;
2707 if(use_data==1) is_data=true;
2708 if(use_data==2) use_signal=true;
2709 int nbins=int(high/10);//100;
2710 if(is_data) nbins=int(high/10);
2711 float low=0;
2712 float hi=high;
2713
2714 stringstream cutpositiveS;
2715 cutpositiveS << "(" << jzb << ">0)";
2716 TCut cutpositive(cutpositiveS.str().c_str());
2717 stringstream cutnegativeS;
2718 cutnegativeS << "(" << jzb << "<0)";
2719 TCut cutnegative(cutnegativeS.str().c_str());
2720
2721
2722 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
2723 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2724 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2725 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2726 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2727
2728 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
2729 blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
2730 blankback->GetXaxis()->CenterTitle();
2731 blankback->GetYaxis()->CenterTitle();
2732
2733 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2734 TH1F *RcorrJZBSBem;
2735 TH1F *LcorrJZBSBem;
2736 TH1F *RcorrJZBSBeemm;
2737 TH1F *LcorrJZBSBeemm;
2738
2739 TH1F *RcorrJZBeemmNoS;
2740
2741 //these are for the ratio
2742 TH1F *JRcorrJZBeemm = allsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2743 TH1F *JLcorrJZBeemm = allsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2744 TH1F *JRcorrJZBem = allsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2745 TH1F *JLcorrJZBem = allsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2746
2747 TH1F *JRcorrJZBSBem;
2748 TH1F *JLcorrJZBSBem;
2749 TH1F *JRcorrJZBSBeemm;
2750 TH1F *JLcorrJZBSBeemm;
2751
2752 if(use_data==2 || overlay_signal) RcorrJZBeemmNoS = allsamples.Draw("RcorrJZBeemmNoS",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,false);
2753
2754
2755 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2756 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2757 LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2758 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2759 LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2760
2761 //these are for the ratio
2762 JRcorrJZBSBem = allsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2763 JLcorrJZBSBem = allsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2764 JRcorrJZBSBeemm = allsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2765 JLcorrJZBSBeemm = allsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2766 }
2767
2768 TH1F *lm4RcorrJZBeemm;
2769 if(overlay_signal || use_data == 2 || use_data == 1) lm4RcorrJZBeemm = allsamples.Draw("lm4RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,allsamples.FindSample("LM"));
2770
2771 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2772
2773 TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
2774 TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
2775
2776 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2777 TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
2778
2779 TH1F *BpredSys = new TH1F("Bpredsys","Bpredsys",PlottingSetup::global_ratio_binning.size()-1,&PlottingSetup::global_ratio_binning[0]);
2780 ClearHisto(BpredSys);
2781
2782 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2783 Bpred->Add(RcorrJZBem,1.0/3.);
2784 Bpred->Add(LcorrJZBem,-1.0/3.);
2785 Bpred->Add(RcorrJZBSBem,1.0/3.);
2786 Bpred->Add(LcorrJZBSBem,-1.0/3.);
2787 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2788 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2789
2790 TTbarpred->Scale(1.0/3);
2791 Zjetspred->Add(LcorrJZBem,-1.0/3.);
2792 Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
2793 TTbarpred->Add(RcorrJZBSBem,1.0/3.);
2794 Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
2795 TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
2796
2797 //these are for the ratio
2798 JBpred->Add(JRcorrJZBem,1.0/3.);
2799 JBpred->Add(JLcorrJZBem,-1.0/3.);
2800 JBpred->Add(JRcorrJZBSBem,1.0/3.);
2801 JBpred->Add(JLcorrJZBSBem,-1.0/3.);
2802 JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
2803 JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
2804
2805 //Systematics:
2806 AddSquared(BpredSys,JLcorrJZBeemm,zjetsestimateuncertONPEAK*zjetsestimateuncertONPEAK);
2807 AddSquared(BpredSys,JRcorrJZBem,emuncertONPEAK*emuncertONPEAK*(1.0/9));
2808 AddSquared(BpredSys,JLcorrJZBem,emuncertONPEAK*emuncertONPEAK*(1.0/9));
2809 AddSquared(BpredSys,JRcorrJZBSBem,emsidebanduncertONPEAK*emsidebanduncertONPEAK*(1.0/9));
2810 AddSquared(BpredSys,JLcorrJZBSBem,emsidebanduncertONPEAK*emsidebanduncertONPEAK*(1.0/9));
2811 AddSquared(BpredSys,JRcorrJZBSBeemm,eemmsidebanduncertONPEAK*eemmsidebanduncertONPEAK*(1.0/9));
2812 AddSquared(BpredSys,JLcorrJZBSBeemm,eemmsidebanduncertONPEAK*eemmsidebanduncertONPEAK*(1.0/9));
2813 } else {
2814 Bpred->Add(RcorrJZBem,1.0);
2815 Bpred->Add(LcorrJZBem,-1.0);
2816
2817 Zjetspred->Add(LcorrJZBem,-1.0);
2818
2819 //these are for the ratio
2820 JBpred->Add(JRcorrJZBem,1.0);
2821 JBpred->Add(JLcorrJZBem,-1.0);
2822
2823 //Systematics
2824 AddSquared(BpredSys,JLcorrJZBeemm,zjetsestimateuncertOFFPEAK*zjetsestimateuncertOFFPEAK);
2825 AddSquared(BpredSys,JRcorrJZBem,emuncertOFFPEAK*emuncertOFFPEAK);
2826 AddSquared(BpredSys,JLcorrJZBem,emuncertOFFPEAK*emuncertOFFPEAK);
2827
2828 }
2829
2830 SQRT(BpredSys);
2831 BpredSys->Divide(JBpred);
2832
2833 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
2834 TH1F *Tpred = (TH1F*)RcorrJZBem->Clone("Bpred");
2835 Tpred->Add(LcorrJZBem,-1.0);
2836 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2837 Tpred->Add(RcorrJZBSBem,1.0);
2838 Tpred->Add(LcorrJZBSBem,-1.0);
2839 Tpred->Add(RcorrJZBSBeemm,1.0);
2840 Tpred->Add(LcorrJZBSBeemm,-1.0);
2841 }
2842
2843 globalcanvas->cd();
2844 globalcanvas->SetLogy(1);
2845
2846 RcorrJZBeemm->SetMarkerStyle(20);
2847 RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
2848 RcorrJZBeemm->SetMinimum(0.1);
2849
2850 Bpred->SetLineColor(kRed);
2851 Bpred->SetStats(0);
2852
2853 int versok=false;
2854 if(gROOT->GetVersionInt()>=53000) versok=true;
2855
2856
2857 if ( overlay_signal || use_data==2 ) lm4RcorrJZBeemm->SetLineColor(TColor::GetColor("#088A08"));
2858 RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
2859
2860 TLegend *legBpred = make_legend("",0.6,0.55);
2861 TLegend *legBpred2 = make_legend("",0.6,0.55);
2862
2863
2864 vector<TF1*> analytical_function;
2865 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
2866 kinpad->cd();
2867 kinpad->SetLogy(1);
2868
2869 string Bpredsaveas="Bpred_Data";
2870 blankback->SetMaximum(5*RcorrJZBeemm->GetMaximum());
2871 blankback->SetMinimum(0.1);
2872 if(use_data!=1) blankback->SetMinimum(0.1);
2873 blankback->Draw();
2874 if(use_data==1)
2875 {
2876 //Bpred->SetLineWidth(3); //paper style.overruled.
2877 //lm4RcorrJZBeemm->SetLineWidth(3); //paper style.overruled.
2878 analytical_function = do_extended_fit_to_plot(Bpred,Tpred,LcorrJZBeemm,LcorrJZBem,is_data);
2879 kinpad->cd();//necessary because the extended fit function creates its own canvas
2880 RcorrJZBeemm->Draw("e1x0,same");
2881
2882 Bpred->Draw("hist,same");
2883 //analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
2884 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2885 //lm4RcorrJZBeemm->Draw("hist,same");
2886 legBpred->AddEntry(RcorrJZBeemm,"observed","p");
2887 legBpred->AddEntry(Bpred,"predicted","l");
2888 // legBpred->AddEntry(analytical_function[1],"predicted fit","l");
2889 // legBpred->AddEntry(analytical_function[2],"stat. uncert.","l");
2890 // legBpred->AddEntry(lm4RcorrJZBeemm,(allsamples.collection[allsamples.FindSample("LM")[0]].samplename).c_str(),"l");
2891 legBpred->Draw();
2892 DrawPrelim();
2893
2894 //this plot shows what the prediction is composed of
2895 TPad *predcomppad = new TPad("predcomppad","predcomppad",0,0,1,1);
2896 float CurrentBpredLineWidth=Bpred->GetLineWidth();
2897 Bpred->SetLineWidth(2);
2898 predcomppad->cd();
2899 predcomppad->SetLogy(1);
2900 TH1F *jzbnegative = (TH1F*)LcorrJZBeemm->Clone("jzbnegative");
2901 TH1F *sidebandsemu = (TH1F*)Bpred->Clone("sidebandsemu");
2902 sidebandsemu->Add(jzbnegative,-1);
2903
2904 jzbnegative->SetFillColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
2905 jzbnegative->SetLineColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
2906 sidebandsemu->SetLineColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
2907 sidebandsemu->SetFillColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
2908
2909 THStack predcomposition("predcomposition","prediction composition");
2910 predcomposition.Add(sidebandsemu);
2911 predcomposition.Add(jzbnegative);
2912 blankback->Draw();
2913 RcorrJZBeemm->Draw("e1x0,same");
2914 predcomposition.Draw("histo,same");//
2915 Bpred->Draw("hist,same");
2916 // analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
2917 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2918 // lm4RcorrJZBeemm->SetLineColor(kOrange+1);
2919 lm4RcorrJZBeemm->SetLineWidth(2);
2920 //lm4RcorrJZBeemm->SetLineWidth(2); // paper style. overruled.
2921 // lm4RcorrJZBeemm->Draw("histo,same");
2922 DrawPrelim();
2923 TLegend *speciallegBpred = make_legend("",0.45,0.55);
2924 //TLegend *speciallegBpred = make_legend("",0.35,0.55); // paper style. overruled.
2925 speciallegBpred->AddEntry(RcorrJZBeemm,"Data","pl");
2926 speciallegBpred->AddEntry(Bpred,"Total background","l");
2927 speciallegBpred->AddEntry(jzbnegative,"JZB<0 (data)","f");
2928 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) speciallegBpred->AddEntry(sidebandsemu,"Sidebands/e#mu (data)","f");
2929 else speciallegBpred->AddEntry(sidebandsemu,"e#mu (data)","f");
2930 // speciallegBpred->AddEntry(lm4RcorrJZBeemmC,"LM4","l");
2931 // speciallegBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
2932 speciallegBpred->Draw();
2933 Save_With_Ratio(JRcorrJZBeemm,JBpred,predcomppad,subdir+"Bpred_Data_____PredictionComposition",true,true,"data/pred",BpredSys);
2934 delete predcomppad;
2935
2936 TCanvas *specialcanv = new TCanvas("specialcanv","specialcanv");
2937 specialcanv->SetLogy(1);
2938 // THStack kostack = allsamples.DrawStack("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,!is_data, luminosity,use_signal);
2939 blankback->Draw();
2940 // kostack.Draw("same");
2941 predcomposition.Draw("hist");
2942 Bpred->Draw("hist,same");
2943 //analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
2944 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2945 legBpred->Draw();
2946 DrawPrelim();
2947 CompleteSave(specialcanv,subdir+"Bpred_Data_____PredictionCompositioninMC");
2948 Bpred->SetLineWidth((int)CurrentBpredLineWidth);
2949
2950
2951 //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;
2952
2953 delete speciallegBpred;
2954 delete Zjetspred;
2955 delete TTbarpred;
2956
2957 kinpad->cd();
2958 }
2959 if(use_data==0) {
2960 RcorrJZBeemm->Draw("e1x0,same");
2961 //Bpred->SetLineWidth(3); // paper style. overruled.
2962 Bpred->Draw("hist,same");
2963 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2964 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
2965 legBpred->AddEntry(Bpred,"MC predicted","l");
2966 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
2967 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
2968 // if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
2969 legBpred->Draw();
2970 DrawMCPrelim();
2971 Bpredsaveas="Bpred_MC";
2972 // CompleteSave(globalcanvas,"Bpred_MC"); // done below in save_with_ratio
2973 }
2974 if(use_data==2) {
2975 RcorrJZBeemm->Draw("e1x0,same");
2976 //Bpred->SetLineWidth(3); // paper style. overruled.
2977 Bpred->Draw("hist,same");
2978 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2979 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
2980 legBpred->AddEntry(Bpred,"MC predicted","l");
2981 legBpred2->AddEntry(RcorrJZBeemm,"MC true","p");
2982 legBpred2->AddEntry(Bpred,"MC predicted","l");
2983 {
2984 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
2985 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
2986 legBpred->Draw();
2987 DrawMCPrelim();
2988 Bpredsaveas="Bpred_MCwithS";
2989 // CompleteSave(globalcanvas,"Bpred_MCwithS"); // done below in save_with_ratio
2990 }
2991 {
2992 //lm4RcorrJZBeemm->SetLineWidth(3); //paper style. overruled.
2993 //RcorrJZBeemmNoS->SetLineWidth(3); //paper style. overruled.
2994 //lm4RcorrJZBeemm->SetLineStyle(2); //paper style. overruled.
2995 //RcorrJZBeemmNoS->SetLineStyle(3); //paper style. overruled.
2996 //lm4RcorrJZBeemm->SetLineColor(kOrange+1); //paper style. overruled.
2997
2998 RcorrJZBeemmNoS->SetLineStyle(2);
2999 legBpred2->AddEntry(RcorrJZBeemmNoS,"MC B","l");
3000 // legBpred2->AddEntry(lm4RcorrJZBeemm,"MC S","l");
3001 legBpred2->Draw();
3002 RcorrJZBeemmNoS->SetLineColor(TColor::GetColor("#61210B"));
3003 RcorrJZBeemmNoS->Draw("histo,same");
3004 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
3005 lm4RcorrJZBeemm->Draw("histo,same");
3006 DrawMCPrelim();
3007 Bpredsaveas="Bpred_MCwithS__plus";
3008 // CompleteSave(globalcanvas,"Bpred_MCwithS__plus"); // done below in save_with_ratio
3009 }
3010 }
3011
3012
3013 //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
3014 string ytitle("ratio");
3015 if ( use_data==1 ) ytitle = "data/pred";
3016 //save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,Bpredsaveas,true,use_data!=1,ytitle);
3017 Save_With_Ratio(JRcorrJZBeemm,JBpred,kinpad,subdir+Bpredsaveas,true,false,ytitle,BpredSys);//not extending the y range anymore up to 4
3018
3019 delete kinpad;
3020
3021
3022
3023 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
3024 // The part below is meaningless for the offpeak analysis (it's a comparison of the different estimates but there is but one estimate!)
3025 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3026 TH1F *Bpredem = (TH1F*)LcorrJZBeemm->Clone("Bpredem");
3027 Bpredem->Add(RcorrJZBem);
3028 Bpredem->Add(LcorrJZBem,-1);
3029 TH1F *BpredSBem = (TH1F*)LcorrJZBeemm->Clone("BpredSBem");
3030 BpredSBem->Add(RcorrJZBSBem);
3031 Bpred->Add(LcorrJZBSBem,-1);
3032 TH1F *BpredSBeemm = (TH1F*)LcorrJZBeemm->Clone("BpredSBeemm");
3033 BpredSBeemm->Add(RcorrJZBSBeemm);
3034 BpredSBeemm->Add(LcorrJZBSBeemm,-1.0);
3035 globalcanvas->cd();
3036 globalcanvas->SetLogy(1);
3037
3038 RcorrJZBeemm->SetMarkerStyle(20);
3039 RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
3040 blankback->Draw();
3041 RcorrJZBeemm->Draw("e1x0,same");
3042 RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
3043
3044 Bpredem->SetLineColor(kRed+1);
3045 Bpredem->SetStats(0);
3046 Bpredem->Draw("hist,same");
3047
3048 BpredSBem->SetLineColor(kGreen+2);//TColor::GetColor("#0B6138"));
3049 BpredSBem->SetLineStyle(2);
3050 BpredSBem->Draw("hist,same");
3051
3052 BpredSBeemm->SetLineColor(kBlue+1);
3053 BpredSBeemm->SetLineStyle(3);
3054 BpredSBeemm->Draw("hist,same");
3055 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
3056
3057 TLegend *legBpredc = make_legend("",0.6,0.55);
3058 if(use_data==1)
3059 {
3060 legBpredc->AddEntry(RcorrJZBeemm,"observed","p");
3061 legBpredc->AddEntry(Bpredem,"OFZP","l");
3062 legBpredc->AddEntry(BpredSBem,"OFSB","l");
3063 legBpredc->AddEntry(BpredSBeemm,"SFSB","l");
3064 legBpredc->Draw();
3065 CompleteSave(globalcanvas,subdir+"Bpred_Data_comparison");
3066 }
3067 if(use_data==0) {
3068 legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
3069 legBpredc->AddEntry(Bpredem,"MC OFZP","l");
3070 legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
3071 legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
3072 legBpredc->Draw();
3073 CompleteSave(globalcanvas,subdir+"Bpred_MC_comparison");
3074 }
3075 if(use_data==2) {
3076 legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
3077 legBpredc->AddEntry(Bpredem,"MC OFZP","l");
3078 legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
3079 legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
3080 // if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
3081 legBpredc->Draw();
3082 CompleteSave(globalcanvas,subdir+"Bpred_MCwithS_comparison");
3083 }
3084 }
3085
3086 TFile *f = new TFile("tester.root","RECREATE");
3087 RcorrJZBeemm->Write();
3088 Bpred->Write();
3089 f->Close();
3090
3091 delete RcorrJZBeemm;
3092 delete LcorrJZBeemm;
3093 delete RcorrJZBem;
3094 delete LcorrJZBem;
3095
3096 delete JRcorrJZBeemm;
3097 delete JLcorrJZBeemm;
3098 delete JRcorrJZBem;
3099 delete JLcorrJZBem;
3100
3101 delete blankback;
3102
3103 delete BpredSys;
3104 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3105 delete RcorrJZBSBem;
3106 delete LcorrJZBSBem;
3107 delete RcorrJZBSBeemm;
3108 delete LcorrJZBSBeemm;
3109
3110 delete JRcorrJZBSBem;
3111 delete JLcorrJZBSBem;
3112 delete JRcorrJZBSBeemm;
3113 delete JLcorrJZBSBeemm;
3114 }
3115 if(overlay_signal || use_data==2) delete lm4RcorrJZBeemm;
3116 }
3117
3118 void do_prediction_plots(string mcjzb, string datajzb, float DataSigma, float MCSigma, bool overlay_signal ) {
3119 switch_overunderflow(true);
3120 TCanvas *globalcanvas = new TCanvas("globalcanvas","Prediction Canvas");
3121 do_prediction_plot(datajzb,globalcanvas,jzbHigh ,data,overlay_signal);
3122 if ( !PlottingSetup::Approved ) {
3123 do_prediction_plot(mcjzb,globalcanvas,jzbHigh ,mc,overlay_signal);
3124 do_prediction_plot(mcjzb,globalcanvas,jzbHigh ,mcwithsignal,overlay_signal);
3125 } else {
3126 write_info(__FUNCTION__,"You set approved to true, therefore not producing prediction/observation plots for MC with and without signal.");
3127 }
3128 delete globalcanvas;
3129 switch_overunderflow(false);
3130 }
3131
3132 string give_jzb_expression(float peak, int type) {
3133 stringstream val;
3134 if(type==data) {
3135 if(peak<0) val << jzbvariabledata << "+" << TMath::Abs(peak);
3136 if(peak>0) val << jzbvariabledata << "-" << TMath::Abs(peak);
3137 if(peak==0) val << jzbvariabledata;
3138 }
3139 if(type==mc) {
3140 if(peak<0) val << jzbvariablemc << "+" << TMath::Abs(peak);
3141 if(peak>0) val << jzbvariablemc << "-" << TMath::Abs(peak);
3142 if(peak==0) val << jzbvariablemc;
3143 }
3144 return val.str();
3145 }
3146
3147
3148 void lepton_comparison_plots() {
3149 Float_t ymin = 1.e-5, ymax = 0.25;
3150 TCanvas *can = new TCanvas("can","Lepton Comparison Canvas");
3151 can->SetLogy(1);
3152 TH1F *eemc = allsamples.Draw("eemc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",mc, luminosity,allsamples.FindSample("/DY"));
3153 TH1F *mmmc = allsamples.Draw("mmmc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",mc, luminosity,allsamples.FindSample("/DY"));
3154 eemc->SetLineColor(kBlue);
3155 mmmc->SetLineColor(kRed);
3156 eemc->SetMinimum(0.1);
3157 eemc->SetMaximum(10*eemc->GetMaximum());
3158 eemc->Draw("histo");
3159 mmmc->Draw("histo,same");
3160 TLegend *leg = make_legend();
3161 leg->AddEntry(eemc,"ZJets->ee (MC)","l");
3162 leg->AddEntry(mmmc,"ZJets->#mu#mu (MC)","l");
3163 leg->Draw("same");
3164 CompleteSave(can, "lepton_comparison/mll_effratio_mc");
3165
3166 TH1F *eed = allsamples.Draw("eed","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
3167 TH1F *mmd = allsamples.Draw("mmd","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
3168 eed->SetLineColor(kBlue);
3169 mmd->SetLineColor(kRed);
3170 eed->SetMinimum(0.1);
3171 eed->SetMaximum(10*eed->GetMaximum());
3172 eed->Draw("histo");
3173 mmd->Draw("histo,same");
3174 TLegend *leg2 = make_legend();
3175 leg2->AddEntry(eed,"ZJets->ee (data)","l");
3176 leg2->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
3177 leg2->Draw();
3178 CompleteSave(can, "lepton_comparison/mll_effratio_data");
3179
3180 TH1F *jeed = allsamples.Draw("jeed",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
3181 TH1F *jmmd = allsamples.Draw("jmmd",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
3182 TH1F *jeemmd = allsamples.Draw("jeemmd",jzbvariabledata,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
3183 dout << "ee : " << jeed->GetMean() << "+/-" << jeed->GetMeanError() << endl;
3184 dout << "ee : " << jmmd->GetMean() << "+/-" << jmmd->GetMeanError() << endl;
3185 dout << "eemd : " << jeemmd->GetMean() << "+/-" << jeemmd->GetMeanError() << endl;
3186 jeemmd->SetLineColor(kBlack);
3187 jeemmd->SetMarkerStyle(25);
3188 jeed->SetLineColor(kBlue);
3189 jmmd->SetLineColor(kRed);
3190 jeed->SetMinimum(0.1);
3191 jeed->SetMaximum(10*eed->GetMaximum());
3192 TH1* njeemmd = jeemmd->DrawNormalized();
3193 njeemmd->SetMinimum(ymin);
3194 njeemmd->SetMaximum(ymax);
3195
3196 jeed->DrawNormalized("histo,same");
3197 jmmd->DrawNormalized("histo,same");
3198 jeemmd->DrawNormalized("same");
3199 TLegend *jleg2 = make_legend(" ");
3200 jleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
3201 jleg2->AddEntry(jeed,"ee","l");
3202 jleg2->AddEntry(jmmd,"#mu#mu","l");
3203 jleg2->Draw();
3204 CompleteSave(can,"lepton_comparison/jzb_effratio_data");
3205
3206 TPad *eemmpad = new TPad("eemmpad","eemmpad",0,0,1,1);
3207 eemmpad->cd();
3208 eemmpad->SetLogy(1);
3209 jeed->Draw("histo");
3210 jmmd->Draw("histo,same");
3211 TLegend *eemmlegend = make_legend(" ");
3212 eemmlegend->AddEntry(jeed,"ee","l");
3213 eemmlegend->AddEntry(jmmd,"#mu#mu","l");
3214 eemmlegend->Draw();
3215 DrawPrelim();
3216 Save_With_Ratio(jeed,jmmd,eemmpad->cd(),"lepton_comparison/jzb_Comparing_ee_mm_data");
3217
3218 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"));
3219 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"));
3220 TH1F *zjeemmd = allsamples.Draw("zjeemmd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets, mc, luminosity,allsamples.FindSample("/DY"));
3221 dout << "Z+Jets ee : " << zjeed->GetMean() << "+/-" << zjeed->GetMeanError() << endl;
3222 dout << "Z+Jets ee : " << zjmmd->GetMean() << "+/-" << zjmmd->GetMeanError() << endl;
3223 dout << "Z+Jets eemd : " << zjeemmd->GetMean() << "+/-" << zjeemmd->GetMeanError() << endl;
3224 zjeemmd->SetLineColor(kBlack);
3225 zjeemmd->SetMarkerStyle(25);
3226 zjeed->SetLineColor(kBlue);
3227 zjmmd->SetLineColor(kRed);
3228 zjeed->SetMinimum(0.1);
3229 zjeed->SetMaximum(10*eed->GetMaximum());
3230
3231 TH1* nzjeemmd = zjeemmd->DrawNormalized();
3232 nzjeemmd->SetMinimum(ymin);
3233 nzjeemmd->SetMaximum(ymax);
3234 zjeed->DrawNormalized("histo,same");
3235 zjmmd->DrawNormalized("histo,same");
3236 zjeemmd->DrawNormalized("same");
3237 TLegend *zjleg2 = make_legend("Z+jets MC");
3238 zjleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
3239 zjleg2->AddEntry(jeed,"ee","l");
3240 zjleg2->AddEntry(jmmd,"#mu#mu","l");
3241 zjleg2->Draw();
3242 CompleteSave(can,"lepton_comparison/jzb_effratio_ZJets");
3243
3244 TH1F *ld = allsamples.Draw("ld","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
3245 ld->DrawNormalized("e1");
3246 eed->DrawNormalized("histo,same");
3247 mmd->DrawNormalized("histo,same");
3248 TLegend *leg3 = make_legend();
3249 leg3->AddEntry(ld,"ZJets->ll (data)","p");
3250 leg3->AddEntry(eed,"ZJets->ee (data)","l");
3251 leg3->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
3252 leg3->Draw();
3253 CompleteSave(can,"lepton_comparison/mll_effratio_data__all_compared");
3254 /*
3255 TH1F *jzbld = allsamples.Draw("jzbld",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
3256 TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
3257 */
3258 TH1F *jzbld = allsamples.Draw("jzbld",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
3259 TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
3260 jzbld->SetMarkerColor(kBlack);
3261 jzbld->SetMarkerStyle(26);
3262 jzbemd->SetMarkerStyle(25);
3263 jzbemd->SetMarkerColor(kRed);
3264 jzbemd->SetLineColor(kRed);
3265 jzbld->SetMinimum(0.35);
3266 jzbld->Draw("e1");
3267 jzbemd->Draw("e1,same");
3268 TLegend *leg4 = make_legend();
3269 leg4->AddEntry(jzbld,"SFZP","p");
3270 leg4->AddEntry(jzbemd,"OFZP","p");
3271 leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
3272 leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
3273 leg4->Draw();
3274 CompleteSave(can,"lepton_comparison/jzb_eemumu_emu_data");
3275
3276 TH1F *ttbarjzbld = allsamples.Draw("ttbarjzbld",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
3277 TH1F *ttbarjzbemd = allsamples.Draw("ttbarjzbemd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
3278 ttbarjzbld->SetLineColor(allsamples.GetColor("TTJet"));
3279 ttbarjzbemd->SetLineColor(allsamples.GetColor("TTJet"));
3280 ttbarjzbld->Draw("histo");
3281 ttbarjzbemd->SetLineStyle(2);
3282 ttbarjzbemd->Draw("histo,same");
3283 TLegend *leg5 = make_legend();
3284 leg5->AddEntry(ttbarjzbld,"t#bar{t}->(ee or #mu#mu)","l");
3285 leg5->AddEntry(ttbarjzbemd,"t#bar{t}->e#mu","l");
3286 leg5->Draw();
3287 CompleteSave(can,"lepton_comparison/ttbar_emu_mc");
3288
3289 }
3290
3291 bool is_OF(TCut cut) {
3292 string scut = (const char*) cut;
3293 if((int)scut.find("id1!=id2")>-1) return true;
3294 if((int)scut.find("id1==id2")>-1) return false;
3295 return false;
3296 }
3297
3298 bool is_ZP(TCut cut) {
3299 string scut = (const char*) cut;
3300 if((int)scut.find("91")>-1) return true;
3301 return false;
3302 }
3303
3304
3305 void draw_pure_jzb_histo(TCut cut,string datavariable, string mcvariable, string savename, TCanvas *can,vector<float> binning) {
3306 TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
3307 jzbpad->cd();
3308 jzbpad->SetLogy(1);
3309 string xlabel="JZB [GeV]";
3310
3311 TH1F *datahisto = allsamples.Draw("datahisto",datavariable,binning, xlabel, "events",cut,data,luminosity);
3312 THStack mcstack = allsamples.DrawStack("mcstack",mcvariable,binning, xlabel, "events",cut,mc,luminosity);
3313
3314 datahisto->SetMinimum(0.1);
3315 datahisto->SetMarkerSize(DataMarkerSize);
3316 datahisto->Draw("e1");
3317 mcstack.Draw("histo,same");
3318 datahisto->Draw("same,e1");
3319
3320 TLegend *leg;
3321 if (!PlottingSetup::RestrictToMassPeak||!PlottingSetup::UseSidebandsForcJZB) {
3322 if(is_OF(cut)) leg = allsamples.allbglegend("Opposite flavor",datahisto);
3323 else leg = allsamples.allbglegend("Same flavor",datahisto);
3324 } else {
3325 if(is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("OFZP",datahisto);
3326 else if(!is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("SFZP",datahisto);
3327 else if( is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("OFSB",datahisto);
3328 else if(!is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("SFSB",datahisto);
3329 else {
3330 std::cerr << "Unable to decode cut: " << cut.GetTitle() << std::endl;
3331 exit(-1);
3332 }
3333 }
3334 leg->Draw();
3335 string write_cut = decipher_cut(cut,"");
3336 TText *writeline1 = write_cut_on_canvas(write_cut.c_str());
3337 writeline1->SetTextSize(0.035);
3338 writeline1->Draw();
3339 if(!Contains(savename,"Dibosons")) Save_With_Ratio(datahisto,mcstack,jzbpad->cd(),("jzb/"+savename));
3340 else Save_With_Ratio(datahisto,mcstack,jzbpad->cd(),savename);
3341 TPad *jzbpad2 = new TPad("jzbpad2","jzbpad2",0,0,1,1);
3342 jzbpad2->cd();
3343 jzbpad2->SetLogy(1);
3344 datahisto->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
3345 datahisto->SetMinimum(0.1);
3346 datahisto->SetMarkerSize(DataMarkerSize);
3347 datahisto->Draw("e1");
3348 mcstack.Draw("histo,same");
3349 datahisto->Draw("same,e1");
3350 leg->SetHeader("");
3351 leg->Draw();
3352 writeline1->SetTextSize(0.035);
3353 writeline1->Draw();
3354 DrawPrelim();
3355 if(!Contains(savename,"Dibosons")) Save_With_Ratio(datahisto,mcstack,jzbpad2->cd(),("jzb/PositiveSideOnly/"+savename+""));
3356 else Save_With_Ratio(datahisto,mcstack,jzbpad2->cd(),(savename+"__PosOnly"));
3357 datahisto->Delete();
3358 mcstack.Delete();
3359 }
3360
3361 Double_t GausR(Double_t *x, Double_t *par) {
3362 return gRandom->Gaus(x[0],par[0]);
3363 }
3364
3365 void produce_stretched_jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
3366 TCanvas *dican = new TCanvas("dican","JZB Plots Canvas");
3367 float max=jzbHigh ;
3368 float min=-120;
3369 int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
3370 int coarserbins=int(nbins/2.0);
3371 int rebinnedbins=int(nbins/4.0);
3372
3373 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
3374 for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
3375 for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
3376 for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
3377
3378 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP",dican,binning);
3379 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP",dican,binning);
3380 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_SFZP",dican,binning);
3381 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_SFZP",dican,binning);
3382 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_OFZP",dican,binning);
3383 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_OFZP",dican,binning);
3384 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB",dican,binning);
3385 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB",dican,binning);
3386
3387 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP_coarse",dican,coarse_binning);
3388 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP_coarse",dican,coarse_binning);
3389 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB_coarse",dican,coarse_binning);
3390 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB_coarse",dican,coarse_binning);
3391
3392 delete dican;
3393 }
3394
3395
3396 void diboson_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
3397 switch_overunderflow(true);
3398 vector<int> SamplesToBeModified = allsamples.FindSampleBySampleName("WW/WZ/ZZ");
3399
3400 if(SamplesToBeModified.size()==0 || SamplesToBeModified[0]==-1) {
3401 write_error(__FUNCTION__,"Could not find any diboson samples - aborting diboson plots");
3402 return;
3403 }
3404
3405 float stretchfactor = 100.0;
3406 vector<string> labels;
3407
3408
3409 dout << "Going to increase the cross section for diboson samples ... " << endl;
3410 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
3411 float origxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
3412 (allsamples.collection)[SamplesToBeModified[i]].xs=origxs*stretchfactor;
3413 dout << " Increased xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].filename << " from " << origxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ")" << endl;
3414 labels.push_back((allsamples.collection)[SamplesToBeModified[i]].samplename);
3415 (allsamples.collection)[SamplesToBeModified[i]].samplename=any2string(int(stretchfactor))+" x "+(allsamples.collection)[SamplesToBeModified[i]].samplename;
3416 dout << " (also renamed it to " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " )" << endl;
3417 }
3418
3419 dout << "Going to produce JZB plots" << endl;
3420 produce_stretched_jzb_plots(mcjzb,datajzb,ratio_binning);
3421 TCanvas *gloca = new TCanvas("gloca","gloca");
3422
3423 dout << "Going to produce prediction plots" << endl;
3424 do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do only MC plots, no signal
3425 do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do MC plots with signal
3426 delete gloca;
3427
3428 dout << "Going to reset the cross section for diboson samples ... " << endl;
3429 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
3430 float Upxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
3431 (allsamples.collection)[SamplesToBeModified[i]].xs=(allsamples.collection)[SamplesToBeModified[i]].xs*(1.0/stretchfactor);
3432 string Upname=(allsamples.collection)[SamplesToBeModified[i]].samplename;
3433 (allsamples.collection)[SamplesToBeModified[i]].samplename=labels[i];
3434 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;
3435
3436 }
3437 // switch_overunderflow(false);
3438 }
3439
3440
3441 void draw_normalized_data_vs_data_histo(TCut cut1, TCut cut2, string variable, string legentry1, string legentry2, string savename, TCanvas *can,vector<float> binning) {
3442 TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
3443 jzbpad->cd();
3444 jzbpad->SetLogy(1);
3445 string xlabel="JZB [GeV]";
3446
3447 TH1F *datahisto1 = allsamples.Draw("datahisto1",variable,binning, xlabel, "events",cut1,data,luminosity);
3448 datahisto1->SetLineColor(kRed);
3449 datahisto1->SetMarkerColor(kRed);
3450 TH1F *datahisto2 = allsamples.Draw("datahisto2",variable,binning, xlabel, "events",cut2,data,luminosity);
3451 datahisto2->SetLineColor(kBlue);
3452 datahisto2->SetMarkerColor(kBlue);
3453
3454 datahisto2->SetMarkerSize(DataMarkerSize);
3455 datahisto1->DrawNormalized("e1");
3456 datahisto2->DrawNormalized("histo,same");
3457 datahisto1->DrawNormalized("same,e1");
3458
3459 TLegend *leg = make_legend();
3460 leg->AddEntry(datahisto1,legentry1.c_str());
3461 leg->AddEntry(datahisto2,legentry2.c_str());
3462 leg->Draw();
3463
3464 Save_With_Ratio(datahisto1,datahisto2,jzbpad->cd(),("jzb/"+savename));
3465
3466 datahisto1->Delete();
3467 datahisto2->Delete();
3468 }
3469
3470
3471 void jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
3472 switch_overunderflow(true);
3473 TCanvas *can = new TCanvas("can","JZB Plots Canvas");
3474 float max=jzbHigh ;
3475 float min=-120;
3476 int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
3477 int coarserbins=int(nbins/2.0);
3478 int rebinnedbins=int(nbins/4.0);
3479
3480 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
3481 for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
3482 for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
3483 for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
3484
3485 if ( !PlottingSetup::Approved ) {
3486 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP",can,binning);
3487 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP",can,binning);
3488 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_SFZP",can,binning);
3489 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_SFZP",can,binning);
3490 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_OFZP",can,binning);
3491 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_OFZP",can,binning);
3492 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
3493 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB",can,binning);
3494 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB",can,binning);
3495 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);
3496 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);
3497 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);
3498
3499 }
3500
3501 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarse",can,coarse_binning);
3502 if ( !PlottingSetup::Approved ) {
3503 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarse",can,coarse_binning);
3504 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
3505 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarse",can,coarse_binning);
3506 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarse",can,coarse_binning);
3507 }
3508 delete can;
3509 switch_overunderflow(false);
3510 }
3511
3512
3513 void calculate_all_yields(string mcdrawcommand,vector<float> jzb_cuts) {
3514 dout << "Calculating background yields in MC:" << endl;
3515 jzb_cuts.push_back(14000);
3516 TH1F *allbgs = allsamples.Draw("allbgs",jzbvariablemc,jzb_cuts, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc,luminosity);
3517 float cumulative=0;
3518 for(int i=allbgs->GetNbinsX();i>=1;i--) {
3519 cumulative+=allbgs->GetBinContent(i);
3520 dout << "Above " << allbgs->GetBinLowEdge(i) << " GeV/c : " << cumulative << endl;
3521 }
3522 }
3523
3524
3525 TCut give_jzb_expression(string mcjzb, float jzbcut, string posneg="pos") {
3526 stringstream res;
3527 res << "(" << mcjzb;
3528 if(posneg=="pos") res << ">";
3529 else res << "<-";
3530 res << jzbcut << ")";
3531 return TCut(res.str().c_str());
3532 }
3533
3534 string sigdig(float number, int nsigdig=3, float min=0) {
3535 //this function tries to extract n significant digits, and if the number is below (min), it returns "<min"
3536 if(number<min) return "< "+any2string(min);
3537 stringstream sol;
3538 sol << setprecision(nsigdig) << number;
3539
3540 return sol.str();
3541 }
3542
3543 string jzb_tex_command(string region, string posneg) {
3544 if(posneg=="pos") posneg="POS";
3545 else posneg="NEG";
3546 stringstream texcommand;
3547 texcommand<<"\\"<<region <<"JZB"<<posneg;
3548 return texcommand.str();
3549 }
3550 // \SFZPJZBPOS
3551 // Sample & \OFZPJZBPOS & \OFZPJZBNEG & \SFZPJZBPOS & \SFZPJZBNEG & \OFSBJZBPOS & \OFSBJZBNEG & \SFSBJZBPOS & \SFSBJZBNEG \\\hline
3552
3553 void compute_MC_yields(string mcjzb,vector<float> jzb_cuts) {
3554 dout << "Calculating background yields in MC:" << endl;
3555
3556 TCanvas *yica = new TCanvas("yica","yield canvas");
3557
3558 int nRegions=4;
3559 if(!PlottingSetup::RestrictToMassPeak||!PlottingSetup::UseSidebandsForcJZB) nRegions=2;
3560 string tsRegions[] = {"SFZP","OFZP","SFSB","OFSB"};
3561 string posneg[] = {"pos","neg"};
3562 TCut tkRegions[] = {cutOSSF&&cutnJets&&cutmass,cutOSOF&&cutnJets&&cutmass,cutOSSF&&cutnJets&&sidebandcut,cutOSOF&&cutnJets&&sidebandcut};
3563
3564 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
3565 TCut jzbMC[] = { give_jzb_expression(mcjzb,jzb_cuts[ijzb],"pos"), give_jzb_expression(mcjzb,jzb_cuts[ijzb],"neg") };
3566 dout << "_________________________________________________________" << endl;
3567 dout << "Table for JZB> " << jzb_cuts[ijzb] << endl;
3568 for(int isample=0;isample<(int)(allsamples.collection).size();isample++) {
3569 if(!(allsamples.collection)[isample].is_data) dout << (allsamples.collection)[isample].samplename << " & ";
3570 else dout << "Sample & ";
3571 for(int iregion=0;iregion<nRegions;iregion++) {
3572 for(int ipos=0;ipos<2;ipos++) {
3573 if((allsamples.collection)[isample].is_data) dout << jzb_tex_command(tsRegions[iregion],posneg[ipos]) << " & ";
3574 else {
3575 vector<int> specific;specific.push_back(isample);
3576 TH1F *shisto = allsamples.Draw("shisto","mll",1,0,500,"tester","events",tkRegions[iregion]&&jzbMC[ipos],mc,luminosity,specific);
3577 dout << sigdig(shisto->Integral(),3,0.05) <<" & ";
3578 delete shisto;
3579 }
3580 }//end of ipos
3581 }//end of iregion
3582 dout << " \\\\" << endl;
3583 }//end of isample
3584 }//end of ijzb
3585 dout << " \\hline" << endl;
3586
3587 delete yica;
3588 }
3589
3590 void draw_ttbar_and_zjets_shape_for_one_configuration(string mcjzb, string datajzb, int leptontype=-1, int scenario=0,bool floating=false) {
3591 //Step 1: Establishing cuts
3592 stringstream jetcutstring;
3593 string writescenario="";
3594
3595 if(scenario==0) jetcutstring << "(pfJetGoodNum>=3)&&"<<(const char*) basicqualitycut;
3596 if(scenario==1) jetcutstring << "(pfJetPt[0]>50&&pfJetPt[1]>50)&&"<<(const char*)basicqualitycut;
3597 TCut jetcut(jetcutstring.str().c_str());
3598 string leptoncut="mll>0";
3599 if(leptontype==0||leptontype==1) {
3600 if(leptontype==0) {
3601 leptoncut="id1==0";
3602 writescenario="__ee";
3603 }
3604 else {
3605 leptoncut="id1==1";
3606 writescenario="__ee";
3607 }
3608 }
3609 TCut lepcut(leptoncut.c_str());
3610
3611 TCanvas *c5 = new TCanvas("c5","c5",1500,500);
3612 TCanvas *c6 = new TCanvas("c6","c6");
3613 c5->Divide(3,1);
3614
3615 //STEP 2: Extract Zjets shape in data
3616 c5->cd(1);
3617 c5->cd(1)->SetLogy(1);
3618 TCut massat40("mll>40");
3619 TH1F *ossfleft = allsamples.Draw("ossfleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
3620 TH1F *osofleft = allsamples.Draw("osofleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
3621 ossfleft->SetLineColor(kRed);
3622 ossfleft->SetMarkerColor(kRed);
3623 ossfleft->Add(osofleft,-1);
3624 vector<TF1*> functions = do_cb_fit_to_plot(ossfleft,10);
3625 ossfleft->SetMarkerSize(DataMarkerSize);
3626 ossfleft->Draw();
3627 functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
3628 TF1 *zjetsfunc = (TF1*) functions[1]->Clone();
3629 TF1 *zjetsfuncN = (TF1*) functions[0]->Clone();
3630 TF1 *zjetsfuncP = (TF1*) functions[2]->Clone();
3631 zjetsfunc->Draw("same");zjetsfuncN->Draw("same");zjetsfuncP->Draw("same");
3632 TLegend *leg1 = new TLegend(0.6,0.6,0.89,0.80);
3633 leg1->SetFillColor(kWhite);
3634 leg1->SetLineColor(kWhite);
3635 leg1->AddEntry(ossfleft,"OSSF (sub),JZB<peak","p");
3636 leg1->AddEntry(zjetsfunc,"OSSF fit ('zjets')","l");
3637 leg1->Draw("same");
3638 TText *titleleft = write_title("Extracting Z+Jets shape");
3639 titleleft->Draw();
3640
3641 //Step 3: Extract ttbar shape (in data or MC?)
3642 c5->cd(2);
3643 c5->cd(2)->SetLogy(1);
3644 TH1F *osof;
3645 TText *titlecenter;
3646 bool frommc=false;
3647 if(frommc) {
3648 osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,mc,luminosity,allsamples.FindSample("TTJets"));
3649 titlecenter = write_title("Extracting ttbar shape (from ossf MC)");
3650 }
3651 else {
3652 osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
3653 titlecenter = write_title("Extracting ttbar shape (from osof data)");
3654 }
3655 osof->SetMarkerSize(DataMarkerSize);
3656 osof->Draw();
3657 vector<TF1*> ttbarfunctions = do_cb_fit_to_plot(osof,35,true);
3658 ttbarfunctions[0]->SetLineColor(kRed); ttbarfunctions[0]->SetLineStyle(2); ttbarfunctions[0]->Draw("same");
3659 ttbarfunctions[1]->SetLineColor(kRed); ttbarfunctions[1]->Draw("same");
3660 ttbarfunctions[2]->SetLineColor(kRed); ttbarfunctions[2]->SetLineStyle(2); ttbarfunctions[2]->Draw("same");
3661
3662 TLegend *leg2 = new TLegend(0.15,0.8,0.4,0.89);
3663 leg2->SetFillColor(kWhite);
3664 leg2->SetLineColor(kWhite);
3665 if(frommc) {
3666 leg2->AddEntry(osof,"t#bar{t} OSSF, MC","p");
3667 leg2->AddEntry(ttbarfunctions[1],"Fit to t#bar{t} OSSF,MC","l");
3668 } else {
3669 leg2->AddEntry(osof,"OSOF","p");
3670 leg2->AddEntry(ttbarfunctions[1],"Fit to OSOF","l");
3671 }
3672 leg2->Draw("same");
3673 titlecenter->Draw();
3674
3675 //--------------------------------------------------------------------------------------------------------------------------------
3676 //STEP 4: Present it!
3677 // actually: if we wanna let it float we need to do that first :-)
3678 c5->cd(3);
3679 c5->cd(3)->SetLogy(1);
3680 TH1F *observed = allsamples.Draw("observed",datajzb,100,0,500, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
3681 observed->SetMarkerSize(DataMarkerSize);
3682
3683 TF1 *logparc = new TF1("logparc",InvCrystalBall,0,1000,5); logparc->SetLineColor(kRed);
3684 TF1 *logparcn = new TF1("logparcn",InvCrystalBallN,0,1000,5); logparcn->SetLineColor(kRed); logparcn->SetLineStyle(2);
3685 TF1 *logparcp = new TF1("logparcp",InvCrystalBallP,0,1000,5); logparcp->SetLineColor(kRed); logparcp->SetLineStyle(2);
3686
3687 TF1 *zjetsc = new TF1("zjetsc",InvCrystalBall,0,1000,5); zjetsc->SetLineColor(kBlue);
3688 TF1 *zjetscn = new TF1("zjetscn",InvCrystalBallN,0,1000,5); zjetscn->SetLineColor(kBlue); zjetscn->SetLineStyle(2);
3689 TF1 *zjetscp = new TF1("zjetscp",InvCrystalBallP,0,1000,5); zjetscp->SetLineColor(kBlue); zjetscp->SetLineStyle(2);
3690
3691 TF1 *ZplusJetsplusTTbar = new TF1("ZplusJetsplusTTbar", DoubleInvCrystalBall,0,1000,10); ZplusJetsplusTTbar->SetLineColor(kBlue);
3692 TF1 *ZplusJetsplusTTbarP= new TF1("ZplusJetsplusTTbarP",DoubleInvCrystalBallP,0,1000,10); ZplusJetsplusTTbarP->SetLineColor(kBlue); ZplusJetsplusTTbarP->SetLineStyle(2);
3693 TF1 *ZplusJetsplusTTbarN= new TF1("ZplusJetsplusTTbarN",DoubleInvCrystalBallN,0,1000,10); ZplusJetsplusTTbarN->SetLineColor(kBlue); ZplusJetsplusTTbarN->SetLineStyle(2);
3694
3695 zjetsc->SetParameters(zjetsfunc->GetParameters());
3696 zjetscp->SetParameters(zjetsfunc->GetParameters());
3697 zjetscn->SetParameters(zjetsfunc->GetParameters());
3698
3699 TH1F *observeda = allsamples.Draw("observeda",datajzb,53,80,jzbHigh, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
3700 //blublu
3701 logparc->SetParameters(ttbarfunctions[1]->GetParameters());
3702 logparcn->SetParameters(ttbarfunctions[1]->GetParameters());
3703 logparcp->SetParameters(ttbarfunctions[1]->GetParameters());
3704 if(floating) {
3705 dout << "TTbar contribution assumed (before fitting) : " << logparc->GetParameter(0) << endl;
3706 logparc->SetParameters(ttbarfunctions[1]->GetParameters());
3707 for(int i=0;i<10;i++) {
3708 if(i<5) ZplusJetsplusTTbar->FixParameter(i,zjetsfunc->GetParameter(i));
3709 if(i>=5) {
3710 if (i>5) ZplusJetsplusTTbar->FixParameter(i,logparc->GetParameter(i-5));
3711 if (i==5) ZplusJetsplusTTbar->SetParameter(i,logparc->GetParameter(i-5));
3712 }
3713 }//end of setting parameters
3714 observeda->Draw("same");
3715 ZplusJetsplusTTbar->Draw("same");
3716 observeda->Fit(ZplusJetsplusTTbar);
3717 dout << "--> Quality of Z+Jets / TTbar fit : chi2/ndf = " << ZplusJetsplusTTbar->GetChisquare() << "/" << ZplusJetsplusTTbar->GetNDF() << endl;
3718 ZplusJetsplusTTbar->Draw("same");
3719 ZplusJetsplusTTbarP->SetParameters(ZplusJetsplusTTbar->GetParameters());
3720 ZplusJetsplusTTbarN->SetParameters(ZplusJetsplusTTbar->GetParameters());
3721 dout << "TTbar contribution found (after fitting) : " << ZplusJetsplusTTbar->GetParameter(5) << endl;
3722 float factor = ZplusJetsplusTTbar->GetParameter(5) / logparc->GetParameter(0);
3723 dout << "FACTOR: " << factor << endl;
3724 logparc->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
3725 logparcn->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
3726 logparcp->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
3727 }
3728
3729 c5->cd(3);
3730 c5->cd(3)->SetLogy(1);
3731 observed->Draw();
3732 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
3733 logparc->Draw("same");
3734 logparcn->Draw("same");
3735 logparcp->Draw("same");
3736
3737 TLegend *leg3 = new TLegend(0.6,0.6,0.89,0.80);
3738 leg3->SetFillColor(kWhite);
3739 leg3->SetLineColor(kWhite);
3740 leg3->AddEntry(observed,"OSSF,JZB>peak","p");
3741 leg3->AddEntry(ttbarfunctions[1],"OSOF fit ('ttbar')","l");
3742 leg3->AddEntry(zjetsfunc,"OSSF,JZB<0 fit ('zjets')","l");
3743 leg3->Draw("same");
3744 TText *titleright = write_title("Summary of shapes and observed shape");
3745 titleright->Draw();
3746
3747 c6->cd()->SetLogy(1);
3748 observed->Draw();
3749 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
3750 logparc->Draw("same");
3751 logparcn->Draw("same");
3752 logparcp->Draw("same");
3753 leg3->Draw("same");
3754 titleright->Draw();
3755
3756 if(scenario==0) {
3757 CompleteSave(c5,"Shapes2/Making_of___3jetsabove30"+writescenario);
3758 CompleteSave(c5->cd(1),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd1");
3759 CompleteSave(c5->cd(2),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd2");
3760 CompleteSave(c5->cd(3),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd3");
3761 CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30"+writescenario);
3762 } else {
3763 CompleteSave(c5,"Shapes2/Making_of___2jetsabove50"+writescenario);
3764 CompleteSave(c5->cd(1),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd1");
3765 CompleteSave(c5->cd(2),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd2");
3766 CompleteSave(c5->cd(3),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd3");
3767 CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50"+writescenario);
3768 }
3769 dout << "Statistics about our fits: " << endl;
3770 dout << "Z+Jets shape: Chi2/ndf = " << zjetsfunc->GetChisquare() << "/" << ossfleft->GetNbinsX() << endl;
3771 dout << "ttbar shape: Chi2/ndf = " << ttbarfunctions[1]->GetChisquare() << "/" << osof->GetNbinsX() << endl;
3772
3773 c6->cd();
3774 TLegend *additionallegend = new TLegend(0.6,0.6,0.89,0.89);
3775 additionallegend->SetFillColor(kWhite);
3776 additionallegend->SetLineColor(kWhite);
3777 additionallegend->AddEntry(observed,"Data","p");
3778 additionallegend->AddEntry(ZplusJetsplusTTbar,"Fitted Z+jets & TTbar","l");
3779 additionallegend->AddEntry(zjetsc,"Z+jets","l");
3780 additionallegend->AddEntry(logparc,"TTbar","l");
3781 observed->Draw();
3782 ZplusJetsplusTTbar->SetLineColor(kGreen);
3783 ZplusJetsplusTTbarP->SetLineColor(kGreen);
3784 ZplusJetsplusTTbarN->SetLineColor(kGreen);
3785 ZplusJetsplusTTbarP->SetLineStyle(2);
3786 ZplusJetsplusTTbarN->SetLineStyle(2);
3787 TF1 *ZplusJetsplusTTbar2 = new TF1("ZplusJetsplusTTbar2",DoubleInvCrystalBall,0,1000,10);
3788 ZplusJetsplusTTbar2->SetParameters(ZplusJetsplusTTbar->GetParameters());
3789 ZplusJetsplusTTbar2->SetLineColor(kGreen);
3790 ZplusJetsplusTTbarP->SetFillColor(TColor::GetColor("#81F781"));
3791 ZplusJetsplusTTbarN->SetFillColor(kWhite);
3792 ZplusJetsplusTTbarP->Draw("fcsame");
3793 ZplusJetsplusTTbarN->Draw("fcsame");
3794 TH1F *hZplusJetsplusTTbar = (TH1F*)ZplusJetsplusTTbar2->GetHistogram();
3795 TH1F *hZplusJetsplusTTbarN = (TH1F*)ZplusJetsplusTTbarN->GetHistogram();
3796 TH1F *hZplusJetsplusTTbarP = (TH1F*)ZplusJetsplusTTbarP->GetHistogram();
3797 hZplusJetsplusTTbar->SetMarkerSize(0);
3798 hZplusJetsplusTTbarP->SetMarkerSize(0);
3799 hZplusJetsplusTTbarN->SetMarkerSize(0);
3800 for (int i=1;i<=hZplusJetsplusTTbar->GetNbinsX();i++) {
3801 float newerror=hZplusJetsplusTTbarP->GetBinContent(i)-hZplusJetsplusTTbar->GetBinContent(i);
3802 hZplusJetsplusTTbar->SetBinError(i,newerror);
3803 if(hZplusJetsplusTTbar->GetBinContent(i)<0.05) hZplusJetsplusTTbar->SetBinContent(i,0); //avoiding a displaying probolem
3804 }
3805 hZplusJetsplusTTbarP->SetFillColor(kGreen);
3806 hZplusJetsplusTTbarN->SetFillColor(kWhite);
3807 hZplusJetsplusTTbarN->Draw("same");
3808
3809 ZplusJetsplusTTbar2->SetMarkerSize(0);
3810 ZplusJetsplusTTbar2->Draw("same");
3811
3812 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
3813 logparc->Draw("same");
3814 logparcn->Draw("same");
3815 logparcp->Draw("same");
3816 additionallegend->Draw("same");
3817 if(scenario==0) {
3818 CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30__allfits__"+writescenario);
3819 } else {
3820 CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50__allfits__"+writescenario);
3821 }
3822 //--------------------------------------------------------------------------------------------------------------------------------
3823 }
3824
3825 void draw_ttbar_and_zjets_shape(string mcjzb, string datajzb) {
3826 int all_leptons=-1;
3827 int threejetswith30gev=0;
3828 /*
3829 int twojetswith50gev=1;
3830 int electrons_only=0;
3831 int mu_only=1;
3832
3833 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,twojetswith50gev);
3834 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev);
3835
3836 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,twojetswith50gev);
3837 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,threejetswith30gev);
3838
3839 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,twojetswith50gev);
3840 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,threejetswith30gev);
3841 */
3842
3843 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev,true);
3844 }
3845
3846 float find_one_correction_factor(string FindKeyword, bool dodata, TCut SpecialCut, string SaveAs) {
3847 TCanvas *cancorr = new TCanvas("cancorr","Canvas for Response Correction");
3848 cancorr->SetLogz();
3849 cancorr->SetRightMargin(0.13);
3850 TCut zptforresponsepresentation(Restrmasscut&&SpecialCut&&passtrig);
3851
3852 if(PlottingSetup::DoBTag) zptforresponsepresentation=zptforresponsepresentation&&PlottingSetup::bTagRequirement;
3853 TH2F *niceresponseplotd = new TH2F("niceresponseplotd","",100,0,600,100,0,5);
3854 niceresponseplotd->Sumw2();
3855 TH2F* emuResponse = (TH2F*)niceresponseplotd->Clone("emuResponse");
3856 vector<int> SampleIndices=allsamples.FindSample(FindKeyword);
3857 for(int iSample=0;iSample<(int)SampleIndices.size();iSample++) {
3858 if((allsamples.collection)[SampleIndices[iSample]].is_data && !dodata) continue;
3859 if((allsamples.collection)[SampleIndices[iSample]].is_data ==false && dodata) continue;
3860
3861 dout << " Response correction : Using sample " << (allsamples.collection)[SampleIndices[iSample]].filename << " for " << FindKeyword << endl;
3862 (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+niceresponseplotd",(zptforresponsepresentation&&cutOSSF)*cutWeight);
3863 (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+emuResponse",(zptforresponsepresentation&&cutOSOF)*cutWeight);
3864 }
3865 niceresponseplotd->Add(emuResponse,-1);
3866
3867 niceresponseplotd->SetStats(0);
3868 niceresponseplotd->GetXaxis()->SetTitle("Z p_{T} [GeV]");
3869 niceresponseplotd->GetYaxis()->SetTitle("Response");
3870 niceresponseplotd->GetXaxis()->CenterTitle();
3871 niceresponseplotd->GetYaxis()->CenterTitle();
3872 niceresponseplotd->Draw("COLZ");
3873 TProfile * profd = (TProfile*)niceresponseplotd->ProfileX();
3874 profd->Rebin(2);
3875 profd->SetMarkerSize(DataMarkerSize);
3876 profd->Fit("pol0","","same,e1",100,400);
3877 DrawPrelim();
3878 string stitle="Data";
3879 if(!Contains(FindKeyword,"Data")) stitle="MC";
3880 TText* title = write_text(0.5,0.7,stitle.c_str());
3881 title->SetTextAlign(12);
3882 title->Draw();
3883 TF1 *datapol=(TF1*)profd->GetFunction("pol0");
3884 float correction=datapol->GetParameter(0);
3885 stringstream resstring;
3886 resstring<<"Response: "<<std::setprecision(2)<<100*correction<<" %";
3887 TText* restitle = write_text(0.5,0.65,resstring.str());
3888 restitle->SetTextAlign(12);
3889 restitle->SetTextSize(0.03);
3890 restitle->Draw();
3891 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_New_"+SaveAs);
3892 delete cancorr;
3893 delete niceresponseplotd;
3894 delete profd;
3895 return correction;
3896 }
3897
3898 void find_correction_factors(string &jzbvardata,string &jzbvarmc) {
3899
3900 dout << "Computing response corrections: " << endl;
3901 //Step 1 : Get results
3902 float datacorrection=find_one_correction_factor("Data",true,"","Data");
3903 float mccorrection=find_one_correction_factor("DY",false,"","MC");
3904
3905 float dataEEcorrection=find_one_correction_factor("Data",true,"id1==0","Data_ee");
3906 float mcEEcorrection=find_one_correction_factor("DY",false,"id1==0","MC_ee");
3907
3908 float dataMMcorrection=find_one_correction_factor("Data",true,"id1==1","Data_mm");
3909 float mcMMcorrection=find_one_correction_factor("DY",false,"id1==1","MC_mm");
3910
3911 cout << "Corrections : " << endl;
3912 cout << " Data : " << datacorrection << endl;
3913 cout << " ee (" << dataEEcorrection << ") , mm (" << dataMMcorrection << ")" << endl;
3914 cout << " MC : " << mccorrection << endl;
3915 cout << " ee (" << mcEEcorrection << ") , mm (" << mcMMcorrection << ")" << endl;
3916
3917 //Step 2: Processing the result and making it into something useful :-)
3918 stringstream jzbvardatas;
3919 jzbvardatas << "(";
3920
3921 if(dataEEcorrection>=1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]-" << dataEEcorrection-1 << "*pt))";
3922 if(dataEEcorrection<1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-dataEEcorrection << "*pt))";
3923
3924 if(dataMMcorrection>=1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]-" << dataMMcorrection-1 << "*pt))";
3925 if(dataMMcorrection<1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-dataMMcorrection << "*pt))";
3926
3927 float averagecorrection=(dataMMcorrection+dataEEcorrection)/2.0;
3928
3929 if(datacorrection>=1) jzbvardatas<<"+((id1!=id2)*(jzb[1]-" << datacorrection-1 << "*pt))";
3930 if(datacorrection<1) jzbvardatas<<"+((id1!=id2)*(jzb[1]+" << 1-datacorrection << "*pt))";
3931
3932 jzbvardatas << ")";
3933 jzbvardata=jzbvardatas.str();
3934
3935 stringstream jzbvarmcs;
3936 jzbvarmcs << "(";
3937
3938 if(mcEEcorrection>=1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]-" << mcEEcorrection-1 << "*pt))";
3939 if(mcEEcorrection<1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-mcEEcorrection << "*pt))";
3940
3941 if(mcMMcorrection>=1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]-" << mcMMcorrection-1 << "*pt))";
3942 if(mcMMcorrection<1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-mcMMcorrection << "*pt))";
3943
3944 float averagemccorrection=(mcMMcorrection+mcEEcorrection)/2.0;
3945
3946 if(mccorrection>=1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]-" << mccorrection-1 << "*pt))";
3947 if(mccorrection<1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]+" << 1-mccorrection << "*pt))";
3948
3949 jzbvarmcs << ")";
3950 jzbvarmc=jzbvarmcs.str();
3951
3952 dout << "JZB Z pt correction summary : " << endl;
3953 dout << " Data: The response is " << datacorrection << " --> jzb variable is now : " << jzbvardata << endl;
3954 dout << " MC : The response is " << mccorrection << " --> jzb variable is now : " << jzbvarmc << endl;
3955
3956 }
3957
3958 void pick_up_events(string cut, string filename) {
3959 allsamples.PickUpEvents(cut,filename);
3960 }
3961
3962 void save_template(string mcjzb, string datajzb,vector<float> jzb_cuts,float MCPeakError,float DataPeakError, vector<float> jzb_shape_limit_bins) {
3963 dout << "Saving configuration template!" << endl;
3964 ofstream configfile;
3965 configfile.open("../DistributedModelCalculations/last_configuration.C");
3966 configfile<<"#include <iostream>\n";
3967 configfile<<"#include <vector>\n";
3968 configfile<<"#ifndef SampleClassLoaded\n";
3969 configfile<<"#include \"SampleClass.C\"\n";
3970 configfile<<"#endif\n";
3971 configfile<<"#define SetupLoaded\n";
3972 configfile<<"#ifndef ResultLibraryClassLoaded\n";
3973 configfile<<"#include \"ResultLibraryClass.C\"\n";
3974 configfile<<"#endif\n";
3975
3976 configfile<<"\nusing namespace std;\n\n";
3977
3978 configfile<<"namespace PlottingSetup { \n";
3979 configfile<<"string datajzb=\"datajzb_ERROR\";\n";
3980 configfile<<"string mcjzb=\"mcjzb_ERROR\";\n";
3981 configfile<<"vector<float>jzb_cuts;\n";
3982 configfile<<"vector<float>jzb_shape_limit_bins;\n";
3983 configfile<<"float MCPeakError=-999;\n";
3984 configfile<<"float DataPeakError=-999;\n";
3985 configfile<<"}\n\n";
3986
3987 configfile<<"void read_config() {\n";
3988 configfile<<"datajzb=\""<<datajzb<<"\";\n";
3989 configfile<<"mcjzb=\""<<mcjzb<<"\";\n\n";
3990 configfile<<"\n\nMCPeakError="<<MCPeakError<<";\n";
3991 configfile<<"DataPeakError="<<DataPeakError<<";\n\n";
3992 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";
3993 configfile<<"\n\n";
3994 for(int i=0;i<(int)Nobs.size();i++) configfile<<"Nobs.push_back("<<Nobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3995 for(int i=0;i<(int)Npred.size();i++) configfile<<"Npred.push_back("<<Npred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3996 for(int i=0;i<(int)Nprederr.size();i++) configfile<<"Nprederr.push_back("<<Nprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3997 configfile<<"\n\n";
3998 for(int i=0;i<(int)flippedNobs.size();i++) configfile<<"flippedNobs.push_back("<<flippedNobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3999 for(int i=0;i<(int)flippedNpred.size();i++) configfile<<"flippedNpred.push_back("<<flippedNpred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
4000 for(int i=0;i<(int)flippedNprederr.size();i++) configfile<<"flippedNprederr.push_back("<<flippedNprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
4001 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";
4002 configfile<<"\n\n";
4003 configfile<<"\n\n";
4004 configfile<<"luminosity="<<luminosity<<";\n";
4005 configfile<<"RestrictToMassPeak="<<RestrictToMassPeak<<";//defines the type of analysis we're running\n";
4006 configfile<<"UseSidebandsForcJZB="<<UseSidebandsForcJZB<<";//tells us whether to use the sidebands or not\n";
4007
4008 configfile<<"\n\ncout << \"Configuration successfully loaded!\" << endl; \n \n } \n \n";
4009
4010 configfile.close();
4011
4012 }
4013
4014 float get_nonzero_minimum(TH1F *histo) {
4015 float min=histo->GetMaximum();
4016 for(int ibin=1;ibin<=histo->GetNbinsX();ibin++) {
4017 float curcont=histo->GetBinContent(ibin);
4018 if(curcont<min&&curcont>0) min=curcont;
4019 }
4020 return min;
4021 }
4022
4023 void draw_all_ttbar_histos(TCanvas *can, vector<TH1F*> histos, string drawoption="", float manualmin=-9) {
4024 can->cd();
4025 float min=1;
4026 float max=histos[0]->GetMaximum();
4027 if(manualmin>=0) min=manualmin;
4028 else {
4029 for(int i=1;i<(int)histos.size();i++) {
4030 float curmin=get_nonzero_minimum(histos[i]);
4031 float curmax=histos[i]->GetMaximum();
4032 if(curmin<min) min=curmin;
4033 if(curmax>max) max=curmax;
4034 }
4035 }
4036 histos[0]->GetYaxis()->SetRangeUser(min,4*max);
4037 histos[0]->Draw(drawoption.c_str());
4038 stringstream drawopt;
4039 drawopt << drawoption << ",same";
4040 for(int i=1;i<(int)histos.size();i++) {
4041 histos[i]->Draw(drawopt.str().c_str());
4042 }
4043 }
4044
4045 void ttbar_sidebands_comparison(string mcjzb, vector<float> binning, string prestring) {
4046 //in the case of the on peak analysis, we compare the 3 control regions to the real value
4047 //in the case of the OFF peak analysis, we compare our control region to the real value
4048 TCut weightbackup=cutWeight;
4049 switch_overunderflow(true);
4050
4051 bool doPURW=false;
4052
4053
4054 if(!doPURW) {
4055 dout << "Not doing PU reweighting for ttbar closure test" << endl;
4056 cutWeight="1.0";
4057 // Do it without PU re-weighting
4058 float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
4059 stringstream resultsNoPU;
4060 stringstream noPUdatajzb;
4061 stringstream noPUmcjzb;
4062
4063 stringstream mcjzbnoPU;
4064 find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,true,noPUdatajzb,noPUmcjzb);
4065 mcjzb = noPUmcjzb.str();
4066 }
4067
4068
4069 float simulatedlumi = luminosity; //in pb please - adjust to your likings
4070
4071 TH1F *TZem = allsamples.Draw("TZem", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4072 TH1F *nTZem = allsamples.Draw("nTZem","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4073 TH1F *TSem;
4074 TH1F *nTSem;
4075 TH1F *TZeemm = allsamples.Draw("TZeemm", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4076 TH1F *nTZeemm = allsamples.Draw("nTZeemm","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4077 TH1F *TSeemm;
4078 TH1F *nTSeemm;
4079
4080 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4081 TSem = allsamples.Draw("TSem", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4082 nTSem = allsamples.Draw("nTSem", "-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4083 TSeemm = allsamples.Draw("TSeemm", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4084 nTSeemm = allsamples.Draw("nTSeemm","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/TT"));
4085 }
4086
4087 TCanvas *tcan = new TCanvas("tcan","tcan");
4088 tcan->SetLogy(1);
4089
4090 TZeemm->SetLineColor(kBlack);
4091 TZem->SetLineColor(kRed);
4092 TZeemm->SetMarkerColor(kBlack);
4093 TZem->SetMarkerColor(kRed);
4094
4095
4096 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4097 TSem->SetLineColor(TColor::GetColor("#00A616"));
4098 TSeemm->SetLineColor(kMagenta+2);
4099 TSem->SetMarkerColor(TColor::GetColor("#00A616"));
4100 TSeemm->SetMarkerColor(kMagenta+2);
4101 TSem->SetLineStyle(2);
4102 TSeemm->SetLineStyle(3);
4103 }
4104
4105 vector<TH1F*> histos;
4106 TZem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
4107 TZeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
4108 histos.push_back(TZem);
4109 histos.push_back(TZeemm);
4110 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4111 TSeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
4112 TSem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
4113 histos.push_back(TSem);
4114 histos.push_back(TSeemm);
4115 }
4116 draw_all_ttbar_histos(tcan,histos,"histo",8);
4117
4118 TLegend *leg = make_legend("MC t#bar{t}",0.6,0.65,false);
4119 leg->AddEntry(TZeemm,"SFZP","l");
4120 leg->AddEntry(TZem,"OFZP","l");
4121 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4122 leg->AddEntry(TSeemm,"SFSB","l");
4123 leg->AddEntry(TSem,"OFSB","l");
4124 }
4125 leg->Draw("same");
4126 DrawMCPrelim(simulatedlumi);
4127 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison");
4128
4129 TH1F *TZemcopy = (TH1F*)TZem->Clone("TZemcopy");
4130 TH1F *TZeemmcopy = (TH1F*)TZeemm->Clone("TZeemmcopy");
4131 TH1F *TSeemmcopy;
4132 TH1F *TSemcopy;
4133 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4134 TSeemmcopy = (TH1F*)TSeemm->Clone("TSeemmcopy");
4135 TSemcopy = (TH1F*)TSem->Clone("TSemcopy");
4136 }
4137
4138 TZem->Divide(TZeemm);
4139 TZem->SetMarkerStyle(21);
4140 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4141 TSem->Divide(TZeemm);
4142 TSeemm->Divide(TZeemm);
4143 TSem->SetMarkerStyle(24);
4144 TSeemm->SetMarkerStyle(32);
4145 }
4146
4147 tcan->SetLogy(0);
4148 TZem->GetYaxis()->SetRangeUser(0,2.5);
4149 TZem->GetYaxis()->SetTitle("ratio");
4150 TZem->Draw();
4151 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4152 TSem->Draw("same");
4153 TSeemm->Draw("same");
4154 }
4155
4156 float linepos=emuncertONPEAK;
4157 if(!PlottingSetup::RestrictToMassPeak) linepos=emuncertOFFPEAK;
4158
4159 TLine *top = new TLine(binning[0],1.0+linepos,binning[binning.size()-1],1.0+linepos);
4160 TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
4161 TLine *bottom = new TLine(binning[0],1.0-linepos,binning[binning.size()-1],1.0-linepos);
4162
4163 /*write_warning(__FUNCTION__,"These two lines are to be removed!");
4164 TLine *topalt = new TLine(binning[0],1.0+0.1,binning[binning.size()-1],1.0+0.1);
4165 TLine *bottomalt = new TLine(binning[0],1.0-0.1,binning[binning.size()-1],1.0-0.1);
4166 topalt->SetLineColor(kRed);topalt->SetLineStyle(3);
4167 bottomalt->SetLineColor(kRed);bottomalt->SetLineStyle(3);
4168 topalt->Draw("same");bottomalt->Draw("same");*/
4169
4170
4171 top->SetLineColor(kBlue);top->SetLineStyle(2);
4172 bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
4173 center->SetLineColor(kBlue);
4174
4175 top->Draw("same");
4176 center->Draw("same");
4177 bottom->Draw("same");
4178
4179 TLegend *leg2 = make_legend("MC t#bar{t}",0.55,0.75,false);
4180 leg2->AddEntry(TZem,"OFZP / SFZP","ple");
4181 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4182 leg2->AddEntry(TSeemm,"SFSB / SFZP","ple");
4183 leg2->AddEntry(TSem,"OFSB / SFZP","ple");
4184 }
4185 leg2->AddEntry(bottom,"syst. envelope","l");
4186 leg2->SetX1(0.25);leg2->SetX2(0.6);
4187 leg2->SetY1(0.65);
4188
4189 leg2->Draw("same");
4190
4191 DrawMCPrelim(simulatedlumi);
4192 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison_ratio");
4193
4194
4195 if (0) { // Turn this off: we don't need this
4196
4197 ///-------------- second part: only look at the quantity we actually care about!
4198 TH1F *leftsfzp = (TH1F*)nTZeemm->Clone("leftsfzp");
4199 TH1F *rightsfzp = (TH1F*)TZeemmcopy->Clone("rightsfzp");
4200 rightsfzp->Add(leftsfzp,-1);
4201 TH1F *leftofzp = (TH1F*)nTZem->Clone("leftofzp");
4202 TH1F *rightofzp = (TH1F*)TZemcopy->Clone("rightofzp");
4203 rightofzp->Add(leftofzp,-1);
4204 TH1F *leftofsb;
4205 TH1F *rightofsb;
4206 TH1F *leftsfsb;
4207 TH1F *rightsfsb;
4208 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4209 leftofsb = (TH1F*)nTSem->Clone("leftofsb");
4210 rightofsb = (TH1F*)TSemcopy->Clone("rightofsb");
4211 rightofsb->Add(leftofsb,-1);
4212 leftsfsb = (TH1F*)nTSeemm->Clone("leftsfsb");
4213 rightsfsb = (TH1F*)TSeemmcopy->Clone("rightsfsb");
4214 rightsfsb->Add(leftsfsb,-1);
4215 }
4216
4217 tcan->SetLogy(1);
4218 rightsfzp->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
4219 rightsfzp->GetYaxis()->SetTitle("#deltaJZB / 25 GeV");
4220 rightsfzp->Draw("histo");
4221 rightofzp->Draw("histo,same");
4222 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4223 rightofsb->Draw("histo,same");
4224 rightsfsb->Draw("histo,same");
4225 }
4226 DrawMCPrelim(simulatedlumi);
4227
4228 TLegend *legA = make_legend("MC t#bar{t}",0.6,0.65,false);
4229 legA->AddEntry(rightsfzp,"SFZP","l");
4230 legA->AddEntry(rightofzp,"OFZP","l");
4231 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4232 legA->AddEntry(rightofsb,"SFSB","l");
4233 legA->AddEntry(rightsfsb,"OFSB","l");
4234 }
4235 legA->Draw();
4236
4237 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison");
4238
4239 tcan->SetLogy(0);
4240 rightofzp->Divide(rightsfzp);
4241 rightofzp->GetXaxis()->SetRangeUser(0.0,binning[binning.size()-1]);
4242 rightofzp->GetYaxis()->SetRangeUser(0.0,2.5);
4243 rightofzp->GetYaxis()->SetTitle("#deltaJZB ratio");
4244 rightofzp->Draw();
4245 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4246 rightofsb->Divide(rightsfzp);
4247 rightsfsb->Divide(rightsfzp);
4248 rightofsb->Draw("same");
4249 rightsfsb->Draw("same");
4250 }
4251
4252 TLine *top2 = new TLine(0.0,1.0+linepos,binning[binning.size()-1],1.0+linepos);
4253 TLine *center2 = new TLine(0.0,1.0,binning[binning.size()-1],1.0);
4254 TLine *bottom2 = new TLine(0.0,1.0-linepos,binning[binning.size()-1],1.0-linepos);
4255
4256 top2->SetLineColor(kBlue);top2->SetLineStyle(2);
4257 bottom2->SetLineColor(kBlue);bottom2->SetLineStyle(2);
4258 center2->SetLineColor(kBlue);
4259
4260 top2->Draw("same");
4261 center2->Draw("same");
4262 bottom2->Draw("same");
4263
4264 rightofzp->SetMarkerStyle(21);
4265 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4266 rightofsb->SetMarkerStyle(24);
4267 rightsfsb->SetMarkerStyle(32);
4268 }
4269
4270 TLegend *leg3 = make_legend("MC t#bar{t}",0.55,0.75,false);
4271 leg3->AddEntry(rightofzp,"OFZP / SFZP","ple");
4272 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4273 leg3->AddEntry(rightsfsb,"SFSB / SFZP","ple");
4274 leg3->AddEntry(rightofsb,"OFSB / SFZP","ple");
4275 }
4276 leg3->AddEntry(bottom,"syst. envelope","l");
4277 leg3->SetX1(0.25);leg3->SetX2(0.6);
4278 leg3->SetY1(0.65);
4279
4280 leg3->Draw("same");
4281
4282 DrawMCPrelim(simulatedlumi);
4283 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison_ratio");
4284
4285 }
4286
4287 delete TZem;
4288 delete nTZem;
4289 delete TZeemm;
4290 delete nTZeemm;
4291 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4292 delete TSem;
4293 delete nTSem;
4294 delete TSeemm;
4295 delete nTSeemm;
4296 }
4297
4298 delete tcan;
4299 cutWeight=weightbackup;
4300 switch_overunderflow(false);
4301 }
4302
4303 void ttbar_sidebands_comparison(string mcjzb, vector<float> jzb_binning) {
4304 vector<float> nicer_binning;
4305
4306 /* nicer_binning.push_back(-400);
4307 nicer_binning.push_back(-250);
4308 nicer_binning.push_back(-200);
4309 nicer_binning.push_back(-150);
4310 nicer_binning.push_back(-100);
4311 nicer_binning.push_back(-50);
4312 nicer_binning.push_back(-20);
4313
4314 nicer_binning.push_back(0);
4315 nicer_binning.push_back(20);
4316 nicer_binning.push_back(50);
4317 nicer_binning.push_back(100);
4318 nicer_binning.push_back(150);
4319 nicer_binning.push_back(200);
4320 nicer_binning.push_back(250);
4321 nicer_binning.push_back(400);*/
4322
4323 nicer_binning.push_back(-100);
4324 nicer_binning.push_back(-50);
4325 nicer_binning.push_back(-25);
4326 nicer_binning.push_back(0);
4327 nicer_binning.push_back(25);
4328 nicer_binning.push_back(50);
4329 nicer_binning.push_back(75);
4330 nicer_binning.push_back(100);
4331 nicer_binning.push_back(125);
4332 nicer_binning.push_back(150);
4333 //nicer_binning.push_back(175);
4334 nicer_binning.push_back(200);
4335 // nicer_binning.push_back(250);
4336 // nicer_binning.push_back(300);
4337 // nicer_binning.push_back(400);
4338
4339 ttbar_sidebands_comparison(mcjzb,nicer_binning, "ttbar/");
4340 }
4341
4342
4343 void zjets_prediction_comparison(string mcjzbWithPUa, TCut massregioncut, string massregionname) {
4344 cout << "****************************************************************************************************************************************************************" << endl;
4345 TCanvas *zcan = new TCanvas("zcan","zcan");
4346 // zcan->SetLogy(1);
4347 TCut weightbackup=cutWeight;
4348
4349 bool UsePURW=true;
4350
4351
4352 string mcjzb;
4353 if(UsePURW) {
4354 mcjzb=mcjzbWithPUa;
4355 cout << "Using PURW peak positions" << endl;
4356 } else {
4357 // Do it without PU re-weighting
4358 cutWeight="1.0";
4359 float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
4360 stringstream resultsNoPU;
4361 stringstream noPUdatajzb;
4362 stringstream noPUmcjzb;
4363
4364 find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,false,noPUdatajzb,noPUmcjzb);
4365 dout << "The peak corrected JZB expression for MC without pileup is : " << noPUmcjzb.str() << endl;
4366
4367 mcjzb = noPUmcjzb.str();
4368
4369 }
4370
4371
4372 vector<float> binning;
4373 binning.push_back(0);
4374 binning.push_back(10);
4375 binning.push_back(20);
4376 binning.push_back(40);
4377 binning.push_back(60);
4378 // binning.push_back(50);
4379 // binning.push_back(60);
4380 // binning.push_back(70);
4381 // binning.push_back(80);
4382 // binning.push_back(90);
4383 binning.push_back(100);
4384
4385 float simulatedlumi = luminosity;//in pb please - adjust to your likings
4386
4387 TCut kPos((mcjzb+">0").c_str());
4388 TCut kNeg((mcjzb+"<0").c_str());
4389 string var( "abs("+mcjzb+")" );
4390
4391 TCut notTau("abs(genMID1)!=15");
4392 TCut ee_mm_tautau("mll>0");
4393
4394
4395 TH1F *hJZBpos = systsamples.Draw("hJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4396 TH1F *hJZBneg = systsamples.Draw("hJZBneg",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4397
4398 hJZBpos->SetLineColor(kBlack);
4399 hJZBneg->SetLineColor(kRed);
4400
4401 hJZBpos->SetMinimum(1.0);
4402 hJZBpos->Draw("e1");
4403 hJZBneg->Draw("same,hist");
4404 hJZBpos->Draw("same,e1"); // So it's on top...
4405
4406 TLegend *leg = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.55,0.75,false);
4407 leg->AddEntry(hJZBpos,"Observed","pe");
4408 leg->AddEntry(hJZBneg,"Predicted","l");
4409 leg->Draw("same");
4410 DrawMCPrelim(simulatedlumi);
4411 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction"+any2string(massregionname));
4412
4413 TH1F* hratio = (TH1F*)hJZBpos->Clone("hratio");
4414 hratio->Divide(hJZBneg);
4415
4416 for(int i=1;i<=hJZBpos->GetNbinsX();i++) {
4417 cout << "Positive: " << hJZBpos->GetBinContent(i) << " vs Negative : " << hJZBneg->GetBinContent(i) << " (ratio : " << hJZBpos->GetBinContent(i) / hJZBneg->GetBinContent(i) << endl;
4418 }
4419
4420 // zcan->SetLogy(0);
4421 hratio->GetYaxis()->SetRangeUser(0,2.5);
4422 hratio->GetYaxis()->SetTitle("Observed/Predicted");
4423 hratio->Draw("e1");
4424
4425 TLine *top = new TLine(binning[0],1.25,binning[binning.size()-1],1.25);
4426 TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
4427 TLine *bottom = new TLine(binning[0],0.75,binning[binning.size()-1],0.75);
4428
4429
4430 top->SetLineColor(kBlue);top->SetLineStyle(2);
4431 bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
4432 center->SetLineColor(kBlue);
4433
4434 top->Draw("same");
4435 center->Draw("same");
4436 bottom->Draw("same");
4437
4438 TLegend *leg2 = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.25,0.75,false);
4439 leg2->AddEntry(hratio,"obs / pred","pe");
4440 leg2->AddEntry(bottom,"syst. envelope","l");
4441 leg2->Draw("same");
4442 DrawMCPrelim(simulatedlumi);
4443 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction_ratio"+any2string(massregionname));
4444
4445 TCut reducedNJets(cutnJets);
4446
4447 TH1F *TAUhJZBpos = systsamples.Draw("TAUhJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4448 TH1F *LcorrJZBeemm = systsamples.Draw("LcorrJZBeemm",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4449 TH1F *RcorrJZBem = systsamples.Draw("RcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4450 TH1F *LcorrJZBem = systsamples.Draw("LcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4451
4452 TH1F *RcorrJZBSBem;
4453 TH1F *LcorrJZBSBem;
4454 TH1F *RcorrJZBSBeemm;
4455 TH1F *LcorrJZBSBeemm;
4456
4457 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4458 RcorrJZBSBem = systsamples.Draw("RcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4459 LcorrJZBSBem = systsamples.Draw("LcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4460 RcorrJZBSBeemm = systsamples.Draw("RcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4461 LcorrJZBSBeemm = systsamples.Draw("LcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
4462 }
4463
4464 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
4465 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4466 Bpred->Add(RcorrJZBem,1.0/3.);
4467 Bpred->Add(LcorrJZBem,-1.0/3.);
4468 Bpred->Add(RcorrJZBSBem,1.0/3.);
4469 Bpred->Add(LcorrJZBSBem,-1.0/3.);
4470 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
4471 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
4472 } else {
4473 Bpred->Add(RcorrJZBem,1.0);
4474 Bpred->Add(LcorrJZBem,-1.0);
4475 }
4476
4477 Bpred->SetLineColor(kRed);
4478
4479 TAUhJZBpos->SetLineColor(kBlack);
4480 Bpred->SetLineColor(kRed);
4481
4482 TAUhJZBpos->SetMinimum(1.0);
4483 TAUhJZBpos->Draw("e1");
4484 Bpred->Draw("same,hist");
4485 TAUhJZBpos->Draw("same,e1");
4486
4487 TLegend *TAUleg = make_legend("MC Z+jets #rightarrow ee,#mu#mu,#tau#tau",0.55,0.75,false);
4488 TAUleg->AddEntry(TAUhJZBpos,"Observed","pe");
4489 TAUleg->AddEntry(Bpred,"Predicted","l");
4490 TAUleg->Draw("same");
4491 DrawMCPrelim(simulatedlumi);
4492 CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction__"+any2string(massregionname));
4493
4494 TH1F* TAUhratio = (TH1F*)TAUhJZBpos->Clone("TAUhratio");
4495 TAUhratio->Divide(Bpred);
4496
4497 for(int i=1;i<=TAUhJZBpos->GetNbinsX();i++) {
4498 cout << "ee/mm/tautau observed: " << TAUhJZBpos->GetBinContent(i) << " vs predicted : " << Bpred->GetBinContent(i) << " (ratio : " << TAUhJZBpos->GetBinContent(i) / Bpred->GetBinContent(i) << endl;
4499 }
4500
4501 zcan->SetLogy(0);
4502 TAUhratio->GetYaxis()->SetRangeUser(0,2.5);
4503 TAUhratio->GetYaxis()->SetTitle("Observed/Predicted");
4504 TAUhratio->Draw("e1");
4505
4506 top->Draw("same");
4507 center->Draw("same");
4508 bottom->Draw("same");
4509
4510 TLegend *TAUleg2 = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.25,0.75,false);
4511 TAUleg2->AddEntry(TAUhratio,"obs / pred","pe");
4512 TAUleg2->AddEntry(bottom,"syst. envelope","l");
4513 TAUleg2->Draw("same");
4514 DrawMCPrelim(simulatedlumi);
4515 CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction_ratio"+any2string(massregionname));
4516
4517 delete Bpred;
4518 delete TAUhJZBpos;
4519 delete LcorrJZBeemm;
4520 delete RcorrJZBem;
4521 delete LcorrJZBem;
4522 delete hJZBpos;
4523 delete hJZBneg;
4524
4525 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4526 delete RcorrJZBSBem;
4527 delete LcorrJZBSBem;
4528 delete RcorrJZBSBeemm;
4529 delete LcorrJZBSBeemm;
4530 }
4531
4532
4533 delete zcan;
4534 cutWeight=weightbackup;
4535 }
4536
4537
4538 void zjets_prediction_comparison(string mcjzbWithPUa) {
4539 zjets_prediction_comparison(mcjzbWithPUa, TCut(""), "nomasscut");
4540 zjets_prediction_comparison(mcjzbWithPUa, TCut("abs(mll-91)<20"), "Zwindow_20");
4541 zjets_prediction_comparison(mcjzbWithPUa, TCut("mll>20&&mll<70"), "LowMassRegion2070");
4542 zjets_prediction_comparison(mcjzbWithPUa, TCut("mll>110"), "HighMassRegion110");
4543 }
4544
4545 void sideband_assessment(string datajzb, float min=30.0, float max=50.0) {
4546 tout << endl << endl;
4547 stringstream bordercut;
4548 bordercut << "(TMath::Abs(" << datajzb << ")<" << max << ")&&(TMath::Abs(" << datajzb << ")>" << min << ")";
4549 tout << bordercut.str().c_str() << endl;
4550 TH1F *ofsb = allsamples.Draw("ofsb",datajzb,100, 0,100, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
4551 TH1F *ofzp = allsamples.Draw("ofzp",datajzb,100, 0,100, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
4552 float OFSB = ofsb->Integral();
4553 float OFZP = ofzp->Integral();
4554
4555 tout << "\\begin{table}[hbtp]" << endl;
4556 tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
4557 tout << "\\begin{center}" << endl;
4558 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;
4559 tout << "\\begin{tabular}{l|cc}" << endl;
4560 tout << "\\hline" << endl;
4561 tout << "& {\\OFZP} & {\\OFSB} \\\\\\hline" << endl;
4562 tout << "\\#(events) & "<<OFZP<<" & "<<OFSB<<"\\\\ \\hline" << endl;
4563 tout << "\\end{tabular}" << endl;
4564 tout << "\\end{center}" << endl;
4565 tout << "\\end{table}" << endl;
4566
4567
4568 }
4569
4570 void make_table(samplecollection &coll, string jzbexpr, bool is_data, vector<float> jzb_cuts, string subselection="none") {
4571
4572 vector<float> jzbcutprediction;
4573 vector<float> metcutprediction;
4574
4575 vector<float> jzbcutobservation;
4576 vector<float> metcutobservation;
4577
4578 TCanvas *cannie = new TCanvas("cannie","cannie");
4579
4580 for(int icut=0;icut<(int)jzb_cuts.size();icut++) {
4581 float currcut=jzb_cuts[icut];
4582 int nbins=1;float low=currcut;
4583 vector<int> mysample;
4584 if(subselection!="none") mysample=coll.FindSample(subselection);
4585 TH1F *RcorrJZBeemm = coll.Draw("RcorrJZBeemm",jzbexpr,1,currcut,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4586 TH1F *LcorrJZBeemm = coll.Draw("LcorrJZBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4587 TH1F *RcorrJZBem = coll.Draw("RcorrJZBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4588 TH1F *LcorrJZBem = coll.Draw("LcorrJZBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4589
4590 TH1F *RcorrJZBSBem;
4591 TH1F *LcorrJZBSBem;
4592 TH1F *RcorrJZBSBeemm;
4593 TH1F *LcorrJZBSBeemm;
4594
4595 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4596 RcorrJZBSBem = coll.Draw("RcorrJZBSBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4597 LcorrJZBSBem = coll.Draw("LcorrJZBSBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4598 RcorrJZBSBeemm = coll.Draw("RcorrJZBSBeemm",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4599 LcorrJZBSBeemm = coll.Draw("LcorrJZBSBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4600 }
4601
4602 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
4603 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4604 Bpred->Add(RcorrJZBem,1.0/3.);
4605 Bpred->Add(LcorrJZBem,-1.0/3.);
4606 Bpred->Add(RcorrJZBSBem,1.0/3.);
4607 Bpred->Add(LcorrJZBSBem,-1.0/3.);
4608 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
4609 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
4610 } else {
4611 Bpred->Add(RcorrJZBem,1.0);
4612 Bpred->Add(LcorrJZBem,-1.0);
4613 }
4614
4615 jzbcutobservation.push_back(RcorrJZBeemm->Integral());
4616 jzbcutprediction.push_back(Bpred->Integral());
4617
4618 delete RcorrJZBeemm;
4619 delete LcorrJZBeemm;
4620 delete RcorrJZBem;
4621 delete LcorrJZBem;
4622 delete RcorrJZBSBem;
4623 delete LcorrJZBSBem;
4624 delete RcorrJZBSBeemm;
4625 delete LcorrJZBSBeemm;
4626
4627 TH1F *MetObs = coll.Draw("MetObs",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4628 TH1F *MetPred = coll.Draw("MetPred",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4629
4630 metcutobservation.push_back(MetObs->Integral());
4631 metcutprediction.push_back(MetPred->Integral());
4632 delete MetObs;
4633 delete MetPred;
4634 }//end of cut loop
4635
4636 //prediction part
4637 if(is_data) cout << "Data prediction & ";
4638 if(subselection!="none") cout << subselection << " prediction &";
4639 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutprediction[ij] << " vs " << metcutprediction[ij] << " & ";
4640
4641 cout << endl;
4642 //observation part
4643 if(is_data) cout << "Data observation & ";
4644 if(subselection!="none") cout << subselection << " observation &";
4645 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutobservation[ij] << " vs " << metcutobservation[ij] << " & ";
4646 cout << endl;
4647 cout << "_________________________________________________________________" << endl;
4648 delete cannie;
4649 }
4650
4651 void met_jzb_cut(string datajzb, string mcjzb, vector<float> jzb_cut) {
4652 cout << "You probably don't want --met, you want --metplots ... " << endl;
4653 assert(0);
4654 /*we want a table like this:
4655 __________________ 50 | 100 | ...
4656 | Data prediction | a vs b | a vs b | ...
4657 | Data observed | a vs b | a vs b | ...
4658 --------------------------------------
4659 --------------------------------------
4660 | LM4 prediction | a vs b | a vs b | ...
4661 | LM4 observed | a vs b | a vs b | ...
4662 | LM8 prediction | a vs b | a vs b | ...
4663 | LM8 observed | a vs b | a vs b | ...
4664
4665 where a is the result for a jzb cut at X, and b is the result for a met cut at X
4666 */
4667 make_table(allsamples,datajzb, true,jzb_cut,"none");
4668 make_table(signalsamples,mcjzb, false,jzb_cut,"LM4");
4669 make_table(signalsamples,mcjzb, false,jzb_cut,"LM8");
4670 }
4671
4672
4673 //________________________________________________________________________________________
4674 // JZB Efficiency plot (efficiency of passing reco. JZB cut as function of generator JZB cut)
4675 void JZBSelEff(string mcjzb, TTree* events, string informalname, vector<float> jzb_bins) {
4676
4677 float min = 0, max = 400;
4678 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};
4679 int nbins = sizeof(xbins)/sizeof(float)-1;
4680 int markers[] = { 20, 26, 21, 24, 22, 25, 28 };
4681
4682
4683 TH1F* heff = new TH1F("heff", "JZB eff ; generator JZB [GeV]; efficiency",nbins,xbins);
4684 TH1F* hgen = new TH1F("hgen", "JZB gen ; generator JZB [GeV]; efficiency",nbins,xbins);
4685 TH1F* hreco = new TH1F("hreco","JZB reco ; generator JZB [GeV]; efficiency",nbins,xbins);
4686
4687 TCut kgen(genMassCut&&"genZPt>0&&genNjets>2&&abs(genMID)==23"&&cutOSSF);
4688 TCut kreco(cutmass);
4689
4690 TF1* func = new TF1("func","0.5*[2]*(TMath::Erf((x-[1])/[0])+1)",min,max);
4691 func->SetParNames("epsilon","x_{1/2}","sigma");
4692 func->SetParameter(0,50.);
4693 func->SetParameter(1,0.);
4694 func->SetParameter(2,1.);
4695 gStyle->SetOptStat(0);
4696 gStyle->SetOptFit(0);
4697
4698 TCanvas *can = new TCanvas("can","Canvas for JZB Efficiency",600,600);
4699 can->SetGridx(1);
4700 can->SetGridy(1);
4701 can->SetLeftMargin(0.16);
4702 can->SetRightMargin(0.05);
4703 TLegend *leg = make_legend("",0.6,0.2,false,0.89,0.5);
4704 leg->SetBorderSize(1);
4705 leg->SetLineColor(kBlack);
4706 leg->SetTextFont(62);
4707
4708 for ( int icut=0; icut<(int)jzb_bins.size(); ++icut ) {
4709
4710 ostringstream selection;
4711 selection << mcjzb << ">" << jzb_bins[icut];
4712 TCut ksel(selection.str().c_str());
4713 events->Draw("genJZB>>hgen", kgen&&kreco, "goff");
4714 events->Draw("genJZB>>hreco",kgen&&kreco&&ksel,"goff");
4715
4716 // Loop over steps to get efficiency curve
4717 for ( Int_t iBin = 0; iBin<nbins-1; ++iBin ) {
4718 Float_t eff = hreco->GetBinContent(iBin+1)/hgen->GetBinContent(iBin+1);
4719 heff->SetBinContent(iBin+1,eff);
4720 heff->SetBinError(iBin+1,TMath::Sqrt(eff*(1-eff)/hgen->GetBinContent(iBin+1)));
4721 }
4722
4723 heff->GetXaxis()->SetRangeUser(min, max);
4724 // heff->GetXaxis()->SetLabelSize(0.05); // paper style. overruled.
4725 // heff->GetYaxis()->SetLabelSize(0.05); // paper style. overruled.
4726 // heff->GetXaxis()->SetTitleSize(0.06); // paper style. overruled.
4727 // heff->GetYaxis()->SetTitleSize(0.06); // paper style. overruled.
4728 heff->SetMarkerStyle(markers[icut]);
4729 heff->Fit("func","Q+","same");
4730
4731 // Print values
4732 dout << "+++ For " << selection.str() << std::endl;
4733 for ( int i=0; i<func->GetNpar(); ++i )
4734 dout << " " << func->GetParName(i) << " " << func->GetParameter(i) << " \\pm " << func->GetParError(i) << std::endl;
4735 char hname[256]; sprintf(hname,"heff%d",icut);
4736
4737 // Store plot
4738 TH1F* h = (TH1F*)heff->Clone(hname);
4739 h->SetNdivisions(505,"X");
4740 if ( icut) h->Draw("same");
4741 else h->Draw();
4742 char htitle[256]; sprintf(htitle,"JZB > %3.0f GeV", jzb_bins[icut]);
4743 leg->AddEntry(h,htitle,"p");
4744
4745 }
4746
4747 leg->Draw();
4748 DrawMCPrelim(0.0);
4749 CompleteSave(can, "Systematics/jzb_efficiency_curve"+informalname );
4750
4751 delete hgen;
4752 delete hreco;
4753 delete heff;
4754 }
4755
4756 //________________________________________________________________________________________
4757 // Calls the above function for each signal sample
4758 void plot_jzb_sel_eff(string mcjzb, samplecollection &signalsamples, vector<float> bins )
4759 {
4760 for (int isignal=0; isignal<(int)signalsamples.collection.size();isignal++) {
4761 dout << "JZB selection efficiency curve: " << std::endl;
4762 JZBSelEff(mcjzb,(signalsamples.collection)[isignal].events,(signalsamples.collection)[isignal].samplename,bins); // Only for some selected samples
4763 }
4764 }
4765
4766 void qcd_plots(string datajzb, string mcjzb, vector<float> bins) {
4767 // What this function aims to do:
4768 // Illustrate cut flow for QCD (requiring only one lepton, requiring etc.)
4769 // 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.
4770 TCanvas *can = new TCanvas("can","can");
4771 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
4772 kinpad->cd();
4773
4774 string jzb=mcjzb;
4775
4776 float hi=400;
4777 bool use_signal=false;
4778 bool use_data=false;
4779
4780 bool is_data=false;
4781 int nbins=50;//100;
4782 float low=0;
4783 float high=500;
4784 int versok=false;
4785 if(gROOT->GetVersionInt()>=53000) versok=true;
4786
4787 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
4788 TH1F *RcorrJZBeemm = qcdsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4789 TH1F *LcorrJZBeemm = qcdsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4790 TH1F *RcorrJZBem = qcdsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4791 TH1F *LcorrJZBem = qcdsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4792 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
4793 blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
4794 blankback->GetXaxis()->CenterTitle();
4795 blankback->GetYaxis()->CenterTitle();
4796
4797 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
4798 TH1F *RcorrJZBSBem;
4799 TH1F *LcorrJZBSBem;
4800 TH1F *RcorrJZBSBeemm;
4801 TH1F *LcorrJZBSBeemm;
4802
4803 // TH1F *RcorrJZBeemmNoS;
4804
4805 //these are for the ratio
4806 TH1F *JRcorrJZBeemm = qcdsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4807 TH1F *JLcorrJZBeemm = qcdsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4808 TH1F *JRcorrJZBem = qcdsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4809 TH1F *JLcorrJZBem = qcdsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4810
4811 TH1F *JRcorrJZBSBem;
4812 TH1F *JLcorrJZBSBem;
4813 TH1F *JRcorrJZBSBeemm;
4814 TH1F *JLcorrJZBSBeemm;
4815
4816 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4817 RcorrJZBSBem = qcdsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4818 LcorrJZBSBem = qcdsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4819 RcorrJZBSBeemm = qcdsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4820 LcorrJZBSBeemm = qcdsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4821
4822 //these are for the ratio
4823 JRcorrJZBSBem = qcdsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4824 JLcorrJZBSBem = qcdsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4825 JRcorrJZBSBeemm = qcdsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4826 JLcorrJZBSBeemm = qcdsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4827
4828 }
4829
4830 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
4831
4832 TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
4833 TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
4834
4835 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
4836 TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
4837 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4838 Bpred->Add(RcorrJZBem,1.0/3.);
4839 Bpred->Add(LcorrJZBem,-1.0/3.);
4840 Bpred->Add(RcorrJZBSBem,1.0/3.);
4841 Bpred->Add(LcorrJZBSBem,-1.0/3.);
4842 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
4843 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
4844
4845 TTbarpred->Scale(1.0/3);
4846 Zjetspred->Add(LcorrJZBem,-1.0/3.);
4847 Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
4848 TTbarpred->Add(RcorrJZBSBem,1.0/3.);
4849 Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
4850 TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
4851
4852 //these are for the ratio
4853 JBpred->Add(JRcorrJZBem,1.0/3.);
4854 JBpred->Add(JLcorrJZBem,-1.0/3.);
4855 JBpred->Add(JRcorrJZBSBem,1.0/3.);
4856 JBpred->Add(JLcorrJZBSBem,-1.0/3.);
4857 JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
4858 JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
4859 } else {
4860 Bpred->Add(RcorrJZBem,1.0);
4861 Bpred->Add(LcorrJZBem,-1.0);
4862
4863 Zjetspred->Add(LcorrJZBem,-1.0);
4864
4865 //these are for the ratio
4866 JBpred->Add(JRcorrJZBem,1.0);
4867 JBpred->Add(JLcorrJZBem,-1.0);
4868 }
4869
4870
4871 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
4872
4873 TLegend *legBpred = make_legend("",0.6,0.55,false);
4874 RcorrJZBeemm->Draw("e1x0,same");
4875 Bpred->Draw("hist,same");
4876 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
4877 legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
4878 legBpred->AddEntry(Bpred,"MC predicted","l");
4879 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
4880 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
4881 legBpred->Draw();
4882 DrawMCPrelim();
4883
4884 //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
4885 string ytitle("ratio");
4886 if ( use_data==1 ) ytitle = "data/pred";
4887 Save_With_Ratio(JRcorrJZBeemm,JBpred,kinpad,"QCD/Bpred",true,false,ytitle);
4888 delete kinpad;
4889
4890 TH1F *allevents = qcdsamples.Draw("allevents","pfJetGoodNum",1,0,100, "internal code", "events", "" ,mc, luminosity);
4891 TH1F *ossf = qcdsamples.Draw("ossf","pfJetGoodNum",1,0,100, "internal code", "events", cutOSSF ,mc, luminosity);
4892 TH1F *osof = qcdsamples.Draw("osof","pfJetGoodNum",1,0,100, "internal code", "events", cutOSOF ,mc, luminosity);
4893 TH1F *njossf = qcdsamples.Draw("njossf","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSSF ,mc, luminosity);
4894 TH1F *njosof = qcdsamples.Draw("njosof","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSOF ,mc, luminosity);
4895
4896 dout << "______________________________________________" << endl;
4897 dout << "QCD contribution: " << endl;
4898 dout << "Total number of events: " << allevents->Integral() << endl;
4899 dout << "OSSF events: " << ossf->Integral() << endl;
4900 dout << "OSOF events: " << osof->Integral() << endl;
4901 dout << "OSSF events with >=3 jets:" << njossf->Integral() << endl;
4902 dout << "OSOF events with >=3 jets:" << njosof->Integral() << endl;
4903 dout << "(note that no mass requirement has been imposed)" << endl;
4904
4905 dout << "______________________________________________" << endl;
4906 dout << "How QCD shows up in the different regions: " << endl;
4907 dout << "OSSF: " << endl;
4908 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4909 dout << " Z window: \t" << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
4910 dout << " sideband: \t" << RcorrJZBSBeemm->Integral() << " (JZB>0) , " << LcorrJZBSBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBSBeemm->Integral() + LcorrJZBSBeemm->Integral() << endl;
4911 } else {
4912 dout << " " << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
4913 }
4914 dout << "OSOF: " << endl;
4915 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4916 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
4917 dout << " sideband: \t" << RcorrJZBSBem->Integral() << " (JZB>0) , " << LcorrJZBSBem->Integral() << " (JZB<0) --> total: " << RcorrJZBSBem->Integral() + LcorrJZBSBem->Integral() << endl;
4918 } else {
4919 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
4920 }
4921 dout << "Therefore: " << endl;
4922 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4923 dout << " Prediction increases by : " << LcorrJZBeemm->Integral() << " + (1.0/3)*(" << RcorrJZBSBeemm->Integral() <<"-"<< LcorrJZBSBeemm->Integral() << ") (SFSB) ";
4924 dout << " + (1.0/3)*(" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
4925 dout << " + (1.0/3)*(" << RcorrJZBSBem->Integral() <<"-"<< LcorrJZBSBem->Integral() << ") (OFSB) ";
4926 dout << " = " << LcorrJZBeemm->Integral() + (1.0/3)*(RcorrJZBSBeemm->Integral() - LcorrJZBSBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() + RcorrJZBSBem->Integral() - LcorrJZBSBem->Integral()) << endl;
4927 } else {
4928 dout << " Prediction increases by : " << LcorrJZBeemm->Integral();
4929 dout << " + (" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
4930 dout << " = " << LcorrJZBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() << endl;
4931 }
4932 dout << " Observation increases by : " << RcorrJZBeemm->Integral() << endl;
4933
4934 dout << endl;
4935 for(int i=0;i<(int)bins.size();i++) {
4936 dout << " JZB > " << bins[i] << " : " << endl;
4937 dout << " Observation increases by : " << RcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
4938 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4939 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;
4940 } else {
4941 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;
4942 }
4943 }
4944
4945 delete can;
4946 delete allevents;
4947 if(ossf) delete ossf;
4948 if(RcorrJZBem) delete RcorrJZBem;
4949 if(LcorrJZBem) delete LcorrJZBem;
4950 if(RcorrJZBeemm) delete RcorrJZBeemm;
4951 if(LcorrJZBeemm) delete LcorrJZBeemm;
4952 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&RcorrJZBSBem) delete RcorrJZBSBem;
4953 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&LcorrJZBSBem) delete LcorrJZBSBem;
4954 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&RcorrJZBSBeemm) delete RcorrJZBSBeemm;
4955 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&LcorrJZBSBeemm) delete LcorrJZBSBeemm;
4956 }
4957
4958 void check_ptsanity() {
4959 TCanvas *ptsancan = new TCanvas("ptsancan","ptsancan",600,1800);
4960 TH1F *individualpt1histos[allsamples.collection.size()];
4961 TH1F *individualpt2histos[allsamples.collection.size()];
4962 TH1F *fpt1 = new TH1F("fpt1","fpt1",50,0,50);
4963 fpt1->GetYaxis()->SetRangeUser(0,1);
4964 fpt1->GetXaxis()->SetTitle("p_{T,1}");
4965 fpt1->GetXaxis()->CenterTitle();
4966
4967 TH1F *fpt2 = new TH1F("fpt2","fpt2",50,0,50);
4968 fpt2->GetXaxis()->SetTitle("p_{T,2}");
4969 fpt2->GetXaxis()->CenterTitle();
4970
4971 ptsancan->Divide(1,3);
4972 ptsancan->cd(1);
4973 float maxpt1entry=0;
4974 float maxpt2entry=0;
4975
4976 TLegend *leg = make_legend();
4977 leg->SetX1(0.0);
4978 leg->SetY1(0.0);
4979 leg->SetX2(1.0);
4980 leg->SetY2(1.0);
4981
4982
4983 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
4984 string nowname=(allsamples.collection)[isample].filename;
4985 cout << "Drawing: " << nowname << " (sample " << isample+1 << " / " << allsamples.collection.size() << ")" << endl;
4986 individualpt1histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt1",50,0,50, "p_{T,1}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
4987 individualpt2histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt2",50,0,50, "p_{T,2}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
4988 individualpt1histos[isample]->SetLineColor(isample+1);
4989 individualpt2histos[isample]->SetLineColor(isample+1);
4990 float currmaxpt1entry=individualpt1histos[isample]->GetMaximum()/individualpt1histos[isample]->Integral();
4991 float currmaxpt2entry=individualpt2histos[isample]->GetMaximum()/individualpt2histos[isample]->Integral();
4992 cout << " pt 1 histo contains; " << individualpt1histos[isample]->Integral() << endl;
4993 cout << " pt 2 histo contains; " << individualpt2histos[isample]->Integral() << endl;
4994 if(currmaxpt1entry>maxpt1entry)maxpt1entry=currmaxpt1entry;
4995 if(currmaxpt2entry>maxpt2entry)maxpt2entry=currmaxpt2entry;
4996 leg->AddEntry(individualpt2histos[isample],((allsamples.collection)[isample].filename).c_str(),"f");
4997 }
4998
4999 fpt1->GetYaxis()->SetRangeUser(0,maxpt1entry);
5000 fpt2->GetYaxis()->SetRangeUser(0,maxpt2entry);
5001
5002 ptsancan->cd(1);
5003 fpt1->Draw();
5004 ptsancan->cd(2);
5005 fpt2->Draw();
5006
5007 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
5008 ptsancan->cd(1);
5009 individualpt1histos[isample]->DrawNormalized("same,histo");
5010 ptsancan->cd(2);
5011 individualpt2histos[isample]->DrawNormalized("same,histo");
5012 }
5013 ptsancan->cd(3);
5014 leg->Draw();
5015 CompleteSave(ptsancan,"PtSanityCheck");
5016
5017 delete ptsancan;
5018 }
5019
5020 void do_mlls_plot(string mcjzb) {
5021 cout << "At this point we'd plot the mll distribution" << endl;
5022 TCanvas *sigcan = new TCanvas("sigcan","sigcan");
5023 for(int isig=0;isig<(int)(signalsamples.collection).size();isig++) {
5024 if(!(signalsamples.collection)[isig].events) continue;
5025 string nowname=(signalsamples.collection)[isig].filename;
5026 TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets,mc,luminosity,signalsamples.FindSample(nowname));
5027 // TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events","",mc,luminosity,signalsamples.FindSample(nowname));
5028 mll->SetLineColor(TColor::GetColor("#04B404"));
5029 stringstream poscutS;
5030 poscutS << "((" << mcjzb <<")>50)";
5031 TCut poscut(poscutS.str().c_str());
5032 TH1F *mllP = signalsamples.Draw("mllhistoP","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets&&poscut,mc,luminosity,signalsamples.FindSample(nowname));
5033 mllP->SetLineColor(TColor::GetColor("#0040FF"));
5034 mll->Draw("histo");
5035 mllP->Draw("histo,same");
5036 TLegend *leg = make_legend();
5037 leg->SetY1(0.8);
5038 leg->AddEntry(mll,(signalsamples.collection)[isig].samplename.c_str(),"L");
5039 leg->AddEntry(mllP,((signalsamples.collection)[isig].samplename+", JZB>50").c_str(),"L");
5040 leg->Draw();
5041 TLine *lin = new TLine(71.2,0,71.2,mll->GetMaximum());
5042 TLine *lin2 = new TLine(111.2,0,111.2,mll->GetMaximum());
5043 lin->Draw("same");
5044 lin2->Draw("same");
5045
5046 CompleteSave(sigcan,"MllShape/"+(signalsamples.collection)[isig].samplename);
5047 delete mll;
5048 delete mllP;
5049 }
5050 }
5051
5052 void met_vs_jzb_plots(string datajzb, string mcjzb) {
5053
5054 TCanvas *canmetjzb = new TCanvas("canmet","MET vs JZB canvas");
5055 canmetjzb->SetRightMargin(0.16);
5056
5057 vector<string> findme;
5058 findme.push_back("DY");
5059 findme.push_back("TTJets");
5060 findme.push_back("LM");
5061 /*
5062 for(int ifind=0;ifind<(int)findme.size();ifind++) {
5063 vector<int> selsamples = allsamples.FindSample(findme[ifind]);
5064 TH2F *metvsjzb = new TH2F("metvsjzb","metvsjzb",200,0,100,400,-100,100);
5065 for(int isel=0;isel<(int)selsamples.size();isel++) {
5066 dout << "Producing MET:JZB plot ... working on sample: " << allsamples.collection[selsamples[isel]].filename << endl;
5067 allsamples.collection[selsamples[isel]].events->Draw("jzb[1]:met[4]>>+metvsjzb",cutmass&&cutOSSF&&cutnJets);
5068 }
5069 metvsjzb->Scale(allsamples.collection[selsamples[0]].weight);
5070 metvsjzb->SetStats(0);
5071 metvsjzb->GetXaxis()->SetTitle("MET (GeV)");
5072 metvsjzb->GetYaxis()->SetTitle("JZB (GeV)");
5073 metvsjzb->GetXaxis()->CenterTitle();
5074 metvsjzb->GetYaxis()->CenterTitle();
5075 metvsjzb->Draw("COLZ");
5076 TText* title = write_text(0.5,0.95,allsamples.collection[selsamples[0]].samplename);
5077 title->SetTextAlign(12);
5078 title->Draw();
5079 CompleteSave(canmetjzb,(string)"METvsJZBplots/"+findme[ifind]);
5080 }
5081 */
5082
5083 dout << "About to produce MET plot for DY split up by JZB" << endl;
5084
5085 int nbins=14;
5086 float low=0;
5087 float high=140;
5088
5089 stringstream sLEFT;
5090 sLEFT << "((" << mcjzb << ")<0)";
5091 TCut LEFT(sLEFT.str().c_str());
5092 stringstream sRIGHT;
5093 sRIGHT << "((" << mcjzb << ")>0)";
5094 TCut RIGHT(sRIGHT.str().c_str());
5095
5096 TH1F *metleft = allsamples.Draw("metleft","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
5097 TH1F *metleftO = allsamples.Draw("metleftO","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
5098 TH1F *metright = allsamples.Draw("metright","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
5099 TH1F *metrightO = allsamples.Draw("metrightO","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
5100
5101
5102 TH1F *Bpred = (TH1F*)metleft->Clone("Bpred");
5103 Bpred->Add(metleftO,-1);
5104 Bpred->Add(metrightO);
5105 TH1F *obs = (TH1F*)metright->Clone("obs");
5106
5107 metleft->Add(metleftO,-1);
5108 metright->Add(metrightO,-1);
5109
5110 metleft->SetLineColor(kRed);
5111 metright->SetLineColor(kBlack);
5112 TPad *metpad = new TPad("metpad","metpad",0,0,1,1);
5113 metpad->cd();
5114 metpad->SetLogy(1);
5115 metleft->Draw("histo");
5116 metright->Draw("same");
5117 TLegend *lg = make_legend();
5118 lg->SetX1(0.5);
5119 lg->SetY1(0.7);
5120 lg->AddEntry(metright,"JZB>0 (OSOF corrected)","P");
5121 lg->AddEntry(metleft,"JZB<0 (OSOF corrected)","L");
5122 lg->SetHeader("DY");
5123
5124 lg->Draw();
5125 Save_With_Ratio(metright,metleft,metpad->cd(),"METvsJZBplots/ComparingLeftToRightinMETspectrum");
5126
5127 TPad *metpad3 = new TPad("metpad3","metpad3",0,0,1,1);
5128 metpad3->cd();
5129 metpad3->SetLogy(1);
5130 Bpred->SetLineColor(kRed);
5131 Bpred->Draw("histo");
5132 obs->SetLineColor(kBlack);
5133 obs->Draw("same");
5134 TLegend *lg2 = make_legend();
5135 lg2->SetX1(0.5);
5136 lg2->SetY1(0.7);
5137 lg2->AddEntry(obs,"observed","P");
5138 lg2->AddEntry(Bpred,"predicted","L");
5139 lg2->SetHeader("DY");
5140
5141 lg2->Draw();
5142
5143 Save_With_Ratio(obs,Bpred,metpad3->cd(),"METvsJZBplots/ComparingPredObsinMET");
5144
5145 TPad *metpad2 = new TPad("metpad2","metpad2",0,0,1,1);
5146 metpad2->cd();
5147 metpad2->SetLogy(1);
5148
5149 TH1F *metlefta = allsamples.Draw("metlefta","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
5150 TH1F *metleftOa = allsamples.Draw("metleftOa","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
5151 TH1F *metrighta = allsamples.Draw("metrighta","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
5152 TH1F *metrightOa = allsamples.Draw("metrightOa","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
5153
5154 metlefta->Add(metleftOa,-1);
5155 metrighta->Add(metrightOa,-1);
5156
5157 metlefta->SetLineColor(kRed);
5158 metpad2->cd();
5159 metlefta->Draw("histo");
5160 metrighta->Draw("same");
5161 lg->Draw();
5162 Save_With_Ratio(metrighta,metlefta,metpad2->cd(),"METvsJZBplots/ComparingLeftToRightinMET_type1_spectrum");
5163
5164 delete Bpred;
5165 delete obs;
5166
5167 float newhigh=300;
5168 int newNBins=30;
5169
5170 TPad *metpad4 = new TPad("metpad4","metpad4",0,0,1,1);
5171 TH1F *Ametleft = allsamples.Draw("Ametleft","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity);
5172 TH1F *AmetleftO = allsamples.Draw("AmetleftO","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity);
5173 TH1F *Ametright = allsamples.Draw("Ametright","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity);
5174 TH1F *AmetrightO = allsamples.Draw("AmetrightO","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity);
5175
5176 TH1F *aBpred = (TH1F*)Ametleft->Clone("aBpred");
5177 aBpred->Add(AmetleftO,-1);
5178 aBpred->Add(AmetrightO);
5179 aBpred->SetLineColor(kRed);
5180
5181 TH1F *aobs = (TH1F*)Ametright->Clone("aobs");
5182 metpad4->cd();
5183 metpad4->SetLogy(1);
5184 aobs->Draw();
5185 aBpred->Draw("histo,same");
5186 aobs->Draw("same");
5187 lg->SetHeader("All MC");
5188 lg->Draw();
5189 Save_With_Ratio(aobs,aBpred,metpad4->cd(),"METvsJZBplots/ComparingPredObsinMET_ALLSAMPLES");
5190
5191
5192 delete lg;
5193 delete canmetjzb;
5194 delete metleft;
5195 delete metleftO;
5196 delete metright;
5197 delete metrightO;
5198 }
5199
5200
5201 void test() {
5202
5203 TCanvas *testcanv = new TCanvas("testcanv","testcanv");
5204 testcanv->cd();
5205 // switch_overunderflow(true);
5206 TH1F *ptdistr = allsamples.Draw("ptdistr","pt1",100,30,200, "p_{T} [GeV]", "events", cutOSSF,data,luminosity);
5207 switch_overunderflow(false);
5208 ptdistr->Draw();
5209 testcanv->SaveAs("test.png");
5210 dout << "HELLO there!" << endl;
5211
5212 }