ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.41
Committed: Wed Jul 25 14:38:04 2012 UTC (12 years, 9 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.40: +14 -9 lines
Log Message:
Fix name in JZB distributions.
Make ratio in Bpred_MC only up to 2.0

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