ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.52
Committed: Thu Aug 16 14:30:32 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.51: +3 -1 lines
Log Message:
Added sideband option for storage (required for scans)

File Contents

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