ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.58
Committed: Thu Sep 6 14:43:55 2012 UTC (12 years, 8 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.57: +26 -21 lines
Log Message:
Fixes.

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