ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.65
Committed: Thu Sep 13 09:44:16 2012 UTC (12 years, 7 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.64: +44 -174 lines
Log Message:
Turned off underflow bin globally. Switched on overflow bin for plots requiring it. Removed superfluous pred/obs ratio function which is in the general prediction function anyway; adapted the range of the prediction & observation histos so the overflow bin is shown

File Contents

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