ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.56
Committed: Wed Sep 5 20:16:25 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.55: +7 -1 lines
Log Message:
Storing peak position; deactivated underflow/overflow bin while fitting

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