ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.50
Committed: Wed Aug 15 13:52:12 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.49: +112 -120 lines
Log Message:
Added option to switch off sidebands for classic JZB

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