ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.68
Committed: Fri Sep 14 15:17:51 2012 UTC (12 years, 7 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.67: +18 -18 lines
Log Message:
Adapted mll ranges (20<mll<70  and  mll>120   instead of  15<mll<50 and 50<mll<70); adapted corresponding y ranges in histos

File Contents

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