ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.46
Committed: Thu Aug 2 16:45:47 2012 UTC (12 years, 9 months ago) by pablom
Content type: text/plain
Branch: MAIN
Changes since 1.45: +108 -0 lines
Log Message:
New kinematical plots added.

File Contents

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