ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.75
Committed: Tue Dec 4 12:31:52 2012 UTC (12 years, 5 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.74: +4 -4 lines
Log Message:
Updated HT plots

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