ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.5
Committed: Wed Mar 7 16:58:42 2012 UTC (13 years, 2 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.4: +2 -0 lines
Log Message:
Added masspeak restriction variable to last_config file output

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 }
32
33 void find_peaks(float &MCPeak,float &MCPeakError, float &DataPeak, float &DataPeakError, float &MCSigma, float &DataSigma, stringstream &result, bool doPUreweighting = true )
34 {
35 // Temporarily switch off PU reweighting, if asked
36 TCut weightbackup=cutWeight;
37 if ( !doPUreweighting ) cutWeight="1.0";
38
39 TCanvas *tempcan = new TCanvas("tempcan","Temporary canvas for peak finding preparations");
40 TH1F *rawJZBeemmMC = allsamples.Draw("rawJZBeemmMC",jzbvariablemc,100,-50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc, luminosity);
41 TH1F *rawJZBeemmData = allsamples.Draw("rawJZBeemmData",jzbvariabledata,100, -50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
42 TH1F *rawJZBemMC = allsamples.Draw("rawJZBemMC",jzbvariablemc,100,-50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,mc, luminosity);
43 TH1F *rawJZBemData = allsamples.Draw("rawJZBemData",jzbvariabledata,100, -50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
44 TH1F *rawttbarjzbeemmMC;
45
46 if(method==doKM) {
47 //we only need this histo for the KM fitting...
48 rawttbarjzbeemmMC = allsamples.Draw("rawttbarjzbeemmMC",jzbvariablemc,100, -50,50, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample("TTJet"));
49 MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
50 DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
51 }
52 else {
53 TH1F *reducedMC = (TH1F*)rawJZBeemmMC->Clone();
54 TH1F *reducedData = (TH1F*)rawJZBeemmData->Clone();
55 reducedMC->Add(rawJZBemMC,-1);
56 reducedData->Add(rawJZBemData,-1);
57 //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)
58 MCPeak=find_peak(reducedMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
59 DataPeak=find_peak(reducedData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
60
61 }
62
63 // Revert to original PU reweighting
64 if ( !doPUreweighting ) cutWeight = weightbackup;
65
66 // MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
67 // DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
68 dout << "We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- ?? (not impl.)" << endl;
69 result << "We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- ?? (not impl.)" << endl;
70 dout << "We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- ?? (not impl.)" << endl;
71 result << "We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- ?? (not impl.)" << endl;
72 delete tempcan;
73 }
74
75 void make_special_mll_plot(int nbins, float min, float max, bool logscale,string xlabel) {
76
77 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
78
79 TH1F *datahistoOSSF = allsamples.Draw("datahistoOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,data,luminosity);
80 THStack mcstackOSSF = allsamples.DrawStack("mcstackOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,mc,luminosity);
81 TH1F *datahistoOSOF = allsamples.Draw("datahistoOSOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&cutnJets&&basiccut,data,luminosity);
82
83 if(logscale) ckin->SetLogy(1);
84 datahistoOSSF->SetMarkerSize(DataMarkerSize);
85 datahistoOSSF->GetXaxis()->SetTitle(xlabel.c_str());
86 datahistoOSSF->GetXaxis()->CenterTitle();
87 datahistoOSSF->GetYaxis()->SetTitle("events");
88 datahistoOSSF->GetYaxis()->CenterTitle();
89 datahistoOSOF->SetMarkerSize(DataMarkerSize);
90 datahistoOSSF->SetMarkerSize(DataMarkerSize);
91 datahistoOSSF->Draw();
92
93 mcstackOSSF.Draw("same");
94 datahistoOSSF->Draw("same");
95
96 datahistoOSOF->SetMarkerColor(TColor::GetColor("#FE642E"));
97 datahistoOSOF->SetLineColor(kRed);
98 datahistoOSOF->SetMarkerStyle(21);
99 datahistoOSOF->Draw("same");
100
101 // Try to re-arrange legend...
102 TLegend *bgleg = allsamples.allbglegend("",datahistoOSSF);
103 TLegend *kinleg = make_legend();
104 kinleg->AddEntry(datahistoOSSF,"SF (data)","p");
105 kinleg->AddEntry(datahistoOSOF,"OF (data)","p");
106 TIter next(bgleg->GetListOfPrimitives());
107 TObject* obj;
108 // Copy the nice bkgd legend skipping the "data"
109 while ( obj = next() )
110 if ( strcmp(((TLegendEntry*)obj)->GetObject()->GetName(),"datahistoOSSF") )
111 kinleg->GetListOfPrimitives()->Add(obj);
112
113 kinleg->Draw();
114 CompleteSave(ckin,"kin/mll_ossf_osof_distribution");
115
116 delete datahistoOSOF;
117 delete datahistoOSSF;
118 delete ckin;
119 }
120
121
122 void draw_ratio_plot(TH1* hdata, THStack& hmc, float ymin=0.5, float ymax=1.5) {
123
124 // Make a histogram from stack
125 TIter next(hmc.GetHists());
126 TObject* obj;
127 TH1* hratio = NULL;
128 while ( obj = next() ) {
129 if ( !hratio ) {
130 hratio = (TH1*)obj->Clone();
131 hratio->SetName("hratio");
132 } else hratio->Add( (TH1*)obj );
133 }
134 hratio->Divide(hdata);
135 hratio->SetMaximum(ymax);
136 hratio->SetMinimum(ymin);
137 hratio->SetMarkerStyle(2);
138 hratio->SetLineWidth(1);
139 hratio->GetYaxis()->SetLabelSize(0.08);
140 hratio->GetXaxis()->SetLabelSize(0.0);
141
142 TPad* rpad = new TPad("rpad","",0.15,0.73,0.4,0.88);
143 rpad->SetTopMargin(0.0);
144 rpad->SetBottomMargin(0.0);
145 rpad->SetRightMargin(0.0);
146 rpad->Draw();
147 rpad->cd();
148 // hratio->GetXaxis()->SetNdivisions(0);
149 hratio->GetYaxis()->SetNdivisions(502,false);
150 hratio->Draw("e1x0");
151
152 TF1* oneline = new TF1("","1.0",0,1000);
153 oneline->SetLineColor(kBlue);
154 oneline->SetLineStyle(1);
155 oneline->SetLineWidth(1);
156 oneline->Draw("same");
157 }
158
159 float lastrange_min=0;
160 float lastrange_max=0;
161
162 void make_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
163 string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
164 // TCut basiccut("(pfJetGoodNum>=2&&pfJetGoodID[0])&&(pfJetGoodNum>=2&&pfJetGoodID[1])&&(passed_triggers||!is_data)");
165 TCut ibasiccut=basiccut;
166 bool draw_separation_lines=false;
167
168 if(isPF) ibasiccut=basiccut&&"pfjzb[0]>-998";
169
170 if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
171
172 //Step 1: Adapt the variable (if we're dealing with PF we need to adapt the variable!)
173 if(isPF) {
174 if(variable=="mll") variable="pfmll[0]";
175 if(variable=="jetpt[0]") variable="pfJetGoodPt[0]";
176 if(variable=="jeteta[0]") variable="pfJetGoodEta[0]";
177 if(variable=="pt") variable="pfpt[0]";
178 if(variable=="pt1") variable="pfpt1[0]";
179 if(variable=="pt2") variable="pfpt2[0]";
180 if(variable=="eta1") variable="pfeta1[0]";
181 if(variable=="jzb[1]") variable="pfjzb[0]";
182 //if(variable=="pfJetGoodNum") variable="pfJetGoodNum"; // pointless.
183 }
184
185 //Step 2: Refine the cut
186 TCut cut;
187 cut=cutmass&&cutOSSF&&cutnJets&&ibasiccut;
188 if(filename=="nJets") cut=cutmass&&cutOSSF&&ibasiccut;
189 if(filename=="nJets_nocuts_except_mll_ossf") cut=cutmass&&cutOSSF;
190 if(filename=="mll") {
191 cut=cutOSSF&&cutnJets&&ibasiccut;
192 draw_separation_lines=true;
193 }
194 if(filename=="mll_ee") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==0";
195 if(filename=="mll_osof") {
196 cut=cutOSOF&&cutnJets&&ibasiccut;
197 draw_separation_lines=true;
198 }
199 if(filename=="mll_mm") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==1";
200 if(filename=="mll_aboveJZB100") cut=cutOSSF&&cutnJets&&ibasiccut;
201 if(filename=="mll_inclusive"||filename=="mll_inclusive_highrange") cut=cutOSSF;
202 if(filename=="mll_inclusive_osof") cut=cutOSOF;
203 if(filename=="mll_inclusive_ee") cut=cutOSSF&&"id1==0";
204 if(filename=="mll_inclusive_mm") cut=cutOSSF&&"id1==1";
205 if(filename=="pfJetGoodEta_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
206 if(filename=="pfJetGoodPt_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
207
208 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
209 ckin->SetLogy(logscale);
210 TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
211 datahisto->SetMarkerSize(DataMarkerSize);
212 THStack mcstack = allsamples.DrawStack("mcstack",variable,nbins,min,max, xlabel, "events",cut,mc,luminosity);
213 if(variable=="pfJetGoodPt[0]") datahisto->SetMaximum(10*datahisto->GetMaximum());
214 if(variable=="pt") datahisto->SetMaximum(10*datahisto->GetMaximum());
215 if(filename=="mll_inclusive") datahisto->SetMinimum(1);
216 if(filename=="mll_osof") datahisto->SetMaximum(10*datahisto->GetMaximum());
217 if(filename=="mll_osof") datahisto->SetMinimum(9);
218
219 datahisto->SetMaximum(5.3*datahisto->GetMaximum());
220 datahisto->Draw("e1");
221 ckin->Update();
222 if(loadlastminmax) {
223 datahisto->SetMinimum(lastrange_min);
224 datahisto->SetMaximum(lastrange_max);
225 if(logscale) {
226 datahisto->SetMinimum(pow(10,lastrange_min));
227 datahisto->SetMaximum(pow(10,lastrange_max));
228 }
229 }
230
231 mcstack.Draw("same");
232 datahisto->Draw("same,e1");
233 TLegend *kinleg = allsamples.allbglegend();
234 kinleg->Draw();
235 if(filename=="mll_osof") {
236 kinleg->SetHeader("Opposite flavor");
237 kinleg->SetX1(0.58);
238 }
239 if(filename=="mll") {
240 kinleg->SetHeader("Same flavor");
241 kinleg->SetX1(0.58);
242 }
243 TText* write_cut = write_cut_on_canvas(decipher_cut(cut,basicqualitycut));
244 write_cut->Draw();
245 TText* write_variable = write_text(0.99,0.01,variable);
246 write_variable->SetTextAlign(31);
247 write_variable->SetTextSize(0.02);
248
249 TLine *lowerboundary;
250 TLine *upperboundary;
251
252 if(RestrictToMassPeak&&draw_separation_lines) {
253 Color_t linecolor=kBlue;
254 float linemin=pow(10,ckin->GetUymin());
255 if(filename=="mll_osof") linemin=pow(10,lastrange_min);
256 lowerboundary = new TLine(71,linemin,71,datahisto->GetMaximum());
257 upperboundary = new TLine(111,linemin,111,datahisto->GetMaximum());
258 lowerboundary->SetLineColor(linecolor);
259 lowerboundary->SetLineStyle(2);
260 upperboundary->SetLineColor(linecolor);
261 upperboundary->SetLineStyle(2);
262 }
263
264 lastrange_min=ckin->GetUymin();
265 lastrange_max=ckin->GetUymax();
266
267
268 if ( plotratio ) {
269 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
270 kinpad->cd();
271 kinpad->SetLogy(logscale);
272 datahisto->Draw("e1");
273 mcstack.Draw("same");
274 datahisto->Draw("same,e1");
275 datahisto->Draw("same,axis");
276 if(RestrictToMassPeak&&draw_separation_lines) {
277 lowerboundary->Draw("same");
278 upperboundary->Draw("same");
279 }
280
281 kinleg->Draw();
282 write_cut->Draw();
283 DrawPrelim();
284 string saveas="kin/"+filename;
285 if(isPF) saveas="kin/"+filename+"__PF";
286 save_with_ratio(datahisto,mcstack,kinpad->cd(),saveas);
287 // if(isPF) CompleteSave(with_ratio,"kin/"+filename+"__PF_withratio");
288 // else CompleteSave(with_ratio,"kin/"+filename+"_withratio");
289 // delete with_ratio;
290 } else {
291 if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
292 else CompleteSave(ckin,"kin/"+filename);
293 }
294 datahisto->Delete();
295 delete ckin;
296 }
297
298
299 void make_JES_plot() {
300
301 int nbins=10;
302 float min=-0.5;
303 float max = 9.5;
304 bool logscale=true;
305 string xlabel="nJets";
306 TCut cut=cutmass&&cutOSSF&&basiccut;
307
308 TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
309 ckin->SetLogy(logscale);
310 TH1F *datahisto = allsamples.Draw("datahisto","pfJetGoodNum",nbins,min,max, xlabel, "events",cut,data,luminosity);
311 datahisto->SetMarkerSize(DataMarkerSize);
312 THStack mcstack = allsamples.DrawStack("mcstack","pfJetGoodNum",nbins,min,max, xlabel, "events",cut,mc,luminosity);
313 TH1F *JESup = allsamples.Draw("JESup","pfJetGoodNum315",nbins,min,max, xlabel, "events",cut,mc,luminosity);
314 TH1F *JESdn = allsamples.Draw("JESdn","pfJetGoodNum285",nbins,min,max, xlabel, "events",cut,mc,luminosity);
315
316 datahisto->SetMinimum(1);
317 datahisto->SetMaximum(5.3*datahisto->GetMaximum()); // in line with kinematic plots style
318
319 float xs[nbins],ys[nbins],exs[nbins],eys[nbins];
320 for(int i=1;i<JESup->GetNbinsX();i++) {
321 float up=JESup->GetBinContent(i);
322 float dn=JESdn->GetBinContent(i);
323 xs[i]=JESup->GetBinCenter(i);
324 ys[i]=0.5*(up+dn);
325 exs[i]=0.5*JESup->GetBinWidth(i);
326 eys[i]=0.5*TMath::Abs(up-dn);
327 }
328
329 TGraphAsymmErrors *JESunc = new TGraphAsymmErrors(nbins, xs,ys,exs,exs,eys,eys);
330 JESunc->SetFillColor(TColor::GetColor("#00ADE1"));
331 JESunc->SetFillStyle(3002);
332 datahisto->Draw("e1");
333 mcstack.Draw("same");
334 JESunc->Draw("2");
335 datahisto->Draw("same,e1");
336 TLegend *kinleg = allsamples.allbglegend();
337 kinleg->AddEntry(JESunc,"JES uncertainty","f");
338 kinleg->Draw();
339 CompleteSave(ckin,"Systematics/JES");
340 datahisto->Delete();
341 delete ckin;
342
343 }
344
345 void do_kinematic_plots(string mcjzb, string datajzb, bool doPF=false)
346 {
347 bool dolog=true;
348 bool nolog=false;
349 if(doPF) write_warning(__FUNCTION__,"Please use caution when trying to produce PF plots; not all versions of the JZB trees have these variables!");
350 float mll_low=40;
351 float mll_hi=160;
352 if(!PlottingSetup::RestrictToMassPeak) {
353 mll_low=30;
354 mll_hi=180;
355 }
356 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll",doPF,true);
357 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof",doPF,true,true);
358 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee",doPF,true);
359 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm",doPF,true);
360 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive",doPF,true);
361 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_ee",doPF,true);
362 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_mm",doPF,true);
363 make_kin_plot("mll","",(int)((mll_hi-mll_low)),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_osof",doPF,true);
364 make_kin_plot("mll","",(int)((350-mll_low)),mll_low,350,dolog,"m_{ll} [GeV]","mll_inclusive_highrange",doPF);
365 make_kin_plot("jetpt[0]","",40,0,200,dolog,"leading jet p_{T} [GeV]","pfJetGoodPt_0",doPF);
366 make_kin_plot("jeteta[0]","",40,-5,5,nolog,"leading jet #eta","pfJetGoodEta_0",doPF);
367 make_kin_plot("pt","",50,0,400,dolog,"Z p_{T} [GeV]","Zpt",doPF);
368 make_kin_plot("pt1","",50,0,100,nolog,"p_{T} [GeV]","pt1",doPF);
369 make_kin_plot("pt2","",50,0,100,nolog,"p_{T} [GeV]","pt2",doPF);
370 make_kin_plot("eta1","",40,-5,5,nolog,"#eta_{l}","eta",doPF);
371 make_kin_plot("jzb[1]","",100,-150,150,dolog,"JZB [GeV]","jzb_ossf",doPF);
372 make_kin_plot("pfJetGoodNum","",8,0.5,8.5,dolog,"nJets","nJets",doPF);
373 make_kin_plot("pfJetGoodNum","",8,0.5,8.5,dolog,"nJets","nJets_nocuts_except_mll_ossf",doPF);
374 if(!doPF) make_special_mll_plot((int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]");
375 stringstream jzbcut;
376 jzbcut << "((is_data&&("<<datajzb<<")>100)||(!is_data&&("<<mcjzb<<")>100))";
377 make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_aboveJZB100",doPF,true);
378 }
379
380 void make_comp_plot( string var, string xlabel, string filename, float jzbcut, string mcjzb, string datajzb,
381 int nbins, float xmin, float xmax, bool log,
382 float ymin=0, float ymax=0, bool leftJustified=false ) {
383 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- WATCH OUT: the argument in the function changed!
384
385 TCut weightbackup=cutWeight;//backing up the correct weight (restoring below!)
386 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__));
387 if(var=="numVtx") cutWeight=TCut("1.0");
388 TCut jzbData[]= { TCut(TString(datajzb+">"+any2string(jzbcut))),TCut(TString(datajzb+"<-"+any2string(jzbcut))) };
389 TCut jzbMC[] = { TCut(TString(mcjzb+">"+any2string(jzbcut))),TCut(TString(mcjzb+"<-"+any2string(jzbcut))) };
390
391 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- below: the next ~20 lines changed!
392 int nRegions=4;
393 if(!PlottingSetup::RestrictToMassPeak) {
394 nRegions=2;
395 }
396
397 string sRegions[] = { "SFZP","OFZP","SFSB","OFSB" };
398 TCut kRegions[] = { cutOSSF&&cutnJets&&cutmass, cutOSOF&&cutnJets&&cutmass,
399 cutOSSF&&cutnJets&&sidebandcut, cutOSOF&&cutnJets&&sidebandcut };
400
401 //find ymax
402 TH1F *Refdatahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[0]&&jzbData[0],data,luminosity);
403 ymax=int((Refdatahisto->GetMaximum()+2*TMath::Sqrt(Refdatahisto->GetMaximum()))*1.2+0.5);
404 delete Refdatahisto;
405
406 for ( int iregion=0; iregion<nRegions; ++iregion )
407 for ( int ijzb=0; ijzb<2; ++ijzb ) {
408 TCanvas *ccomp = new TCanvas("ccomp","Comparison plot",600,400);
409 ccomp->SetLogy(log);
410 TH1F *datahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity);
411 TH1F *lm4histo = signalsamples.Draw("lm4histo", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity,signalsamples.FindSample("LM4"));
412 THStack mcstack = allsamples.DrawStack("mcstack",var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb], mc, luminosity);
413 datahisto->SetMarkerSize(DataMarkerSize);
414 if (ymax>ymin) datahisto->SetMaximum(ymax);
415 lm4histo->SetLineStyle(2);
416 datahisto->Draw("e1");
417 mcstack.Draw("same");
418 datahisto->Draw("same,e1");
419 // lm4histo->Draw("hist,same");
420 TLegend *kinleg = allsamples.allbglegend((sRegions[iregion]+(ijzb?"neg":"pos")).c_str());
421 if ( leftJustified ) {
422 Float_t w = kinleg->GetX2()-kinleg->GetX1();
423 kinleg->SetX1(0.2);
424 kinleg->SetX2(0.2+w);
425 }
426 // kinleg->AddEntry(lm4histo,"LM4","l");
427 kinleg->Draw();
428 TText* write_variable = write_text(0.99,0.01,var);
429 write_variable->SetTextAlign(31);
430 write_variable->SetTextSize(0.02);
431 ccomp->RedrawAxis();
432 CompleteSave(ccomp,"compare/JZBcut_at_"+any2string(jzbcut)+"/"+filename+"/"+filename+sRegions[iregion]+(ijzb?"neg":"pos"));
433 delete datahisto;
434 delete ccomp;
435 delete lm4histo;
436 }
437 cutWeight=weightbackup;
438 }
439
440
441 void region_comparison_plots(string mcjzb, string datajzb, vector<float> jzb_cuts) {
442 dout << "Creating comparison plots for signal and control regions" << endl;
443 // Compare a few quantities in the signal region and all 7 control regions
444
445 switch_overunderflow(true); // switching overflow/underflow bins on
446
447
448 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- the arguments changed
449 for(int ijzb=0;ijzb<jzb_cuts.size();ijzb++) {
450 float jzbcut=jzb_cuts[ijzb]; // Comparison plots are done for this JZB cut
451 float mll_low=50;float mll_high=170;
452 if(!PlottingSetup::RestrictToMassPeak) {
453 mll_high=200;
454 mll_low=50;
455 }
456 make_comp_plot("mll","m_{ll} [GeV]","mll",jzbcut,mcjzb,datajzb,30,mll_low,mll_high,false,0,16.);
457 make_comp_plot("met[4]","pfMET [GeV]","pfmet",jzbcut,mcjzb,datajzb,18,0,360,false,0,16.);
458 make_comp_plot("pfJetGoodNum","#(jets)","njets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
459 make_comp_plot("pt","Z p_{T} [GeV]","Zpt",jzbcut,mcjzb,datajzb,26,0,525,false,0.,21.);
460 make_comp_plot("numVtx","#(prim. vertices)","nvtx",jzbcut,mcjzb,datajzb,20,0.,20.,false,0,16.);
461 make_comp_plot("TMath::Abs(dphi)","#Delta#phi(leptons)","dphilep",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
462 make_comp_plot("TMath::Abs(dphi_sumJetVSZ[1])","#Delta#phi(Z,jets)","dphiZjets",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
463 }
464
465 switch_overunderflow(false); // switching overflow/underflow bins off
466 }
467
468
469
470 void do_kinematic_PF_plots(string mcjzb, string datajzb)
471 {
472 do_kinematic_plots(mcjzb,datajzb,true);
473 }
474
475 void signal_bg_comparison()
476 {
477 TCanvas *can = new TCanvas("can","Signal Background Comparison Canvas");
478 can->SetLogy(1);
479
480 int sbg_nbins=130;
481 float sbg_min=-500; //-110;
482 float sbg_max=800; //jzbHigh;
483
484 float simulatedlumi=luminosity;//in pb please - adjust to your likings
485
486 TH1F *JZBplotZJETs = allsamples.Draw("JZBplotZJETs",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("/DY"));
487 TH1F *JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM4"));
488 TH1F *JZBplotTtbar = allsamples.Draw("JZBplotTtbar",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("TTJets"));
489
490 JZBplotTtbar->SetLineColor(allsamples.GetColor("TTJet"));
491 JZBplotZJETs->SetFillColor(allsamples.GetColor("DY"));
492 JZBplotZJETs->SetLineColor(kBlack);
493 JZBplotLM4->SetLineStyle(2);
494 JZBplotZJETs->SetMaximum(JZBplotZJETs->GetMaximum()*5);
495 JZBplotZJETs->SetMinimum(1);
496
497 JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
498 JZBplotTtbar->SetMinimum(0.01);
499 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
500 JZBplotTtbar->DrawClone("histo");
501 JZBplotZJETs->Draw("histo,same");
502 JZBplotTtbar->SetFillColor(0);
503 JZBplotTtbar->DrawClone("histo,same");
504 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
505 JZBplotLM4->Draw("histo,same");
506
507
508 TLegend *signal_bg_comparison_leg2 = make_legend("",0.55,0.75,false);
509 signal_bg_comparison_leg2->AddEntry(JZBplotZJETs,"Z+Jets","f");
510 signal_bg_comparison_leg2->AddEntry(JZBplotTtbar,"t#bar{t}","f");
511 signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM4","f");
512 signal_bg_comparison_leg2->Draw();
513 DrawMCPrelim(simulatedlumi);
514 CompleteSave(can,"jzb_bg_vs_signal_distribution");
515
516 // Define illustrative set of SMS points
517 TCut kSMS1("MassGlu==250&&MassLSP==75");
518 TCut kSMS2("MassGlu==800&&MassLSP==200");
519 TCut kSMS3("MassGlu==1050&&MassLSP==850");
520 TCut kSMS4("MassGlu==1200&&MassLSP==100");
521
522 //If the scan samples haven't been loaded yet, this is a good point to load them (all of them!)
523 if((scansample.collection).size()<2) define_SMS_sample(false, allsamples, signalsamples, scansample, true); // loading ALL zones for the scans, not only the basic one.
524
525
526 TH1F *JZBplotSMS1 = scansample.Draw("JZBplotSMS1",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS1,mc,simulatedlumi,scansample.FindSample("t"));
527 JZBplotSMS1->Scale(JZBplotLM4->Integral()/JZBplotSMS1->Integral());
528
529 TH1F *JZBplotSMS2 = scansample.Draw("JZBplotSMS2",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS2,mc,simulatedlumi,scansample.FindSample("t"));
530 JZBplotSMS2->Scale(JZBplotLM4->Integral()/JZBplotSMS2->Integral());
531
532 TH1F *JZBplotSMS3 = scansample.Draw("JZBplotSMS3",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS3,mc,simulatedlumi,scansample.FindSample("t"));
533 JZBplotSMS3->Scale(JZBplotLM4->Integral()/JZBplotSMS3->Integral());
534
535 TH1F *JZBplotSMS4 = scansample.Draw("JZBplotSMS4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS4,mc,simulatedlumi,scansample.FindSample("t"));
536 JZBplotSMS4->Scale(JZBplotLM4->Integral()/JZBplotSMS4->Integral());
537
538 // Draw all plots overlaid
539 JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
540 JZBplotTtbar->SetMinimum(0.01);
541 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
542 JZBplotTtbar->DrawClone("histo");
543 JZBplotZJETs->Draw("histo,same");
544 JZBplotTtbar->SetFillColor(0);
545 JZBplotTtbar->DrawClone("histo,same");
546 JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
547
548 JZBplotSMS1->SetLineColor(kRed+1);
549 JZBplotSMS2->SetLineColor(kBlue+1);
550 JZBplotSMS3->SetLineColor(kRed+1);
551 JZBplotSMS4->SetLineColor(kBlue+1);
552 JZBplotSMS3->SetLineStyle(2);
553 JZBplotSMS4->SetLineStyle(2);
554
555 JZBplotSMS1->Draw("histo,same");
556 JZBplotSMS2->Draw("histo,same");
557 JZBplotSMS3->Draw("histo,same");
558 JZBplotSMS4->Draw("histo,same");
559 JZBplotLM4->SetLineColor(kGreen);JZBplotLM4->Draw("histo,same");
560 TLegend *signal_bg_comparison_leg6 = make_legend("",0.55,0.55,false);
561 signal_bg_comparison_leg6->AddEntry(JZBplotZJETs,"Z+Jets","f");
562 signal_bg_comparison_leg6->AddEntry(JZBplotTtbar,"t#bar{t}","f");
563 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"","");
564 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"SMS parameters","");
565 signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"(250,75) [GeV]","f");
566 signal_bg_comparison_leg6->AddEntry(JZBplotSMS2,"(800,200) [GeV]","f");
567 signal_bg_comparison_leg6->AddEntry(JZBplotSMS3,"(1050,850) [GeV]","f");
568 signal_bg_comparison_leg6->AddEntry(JZBplotSMS4,"(1200,100) [GeV]","f");
569 signal_bg_comparison_leg6->AddEntry(JZBplotLM4,"LM4","f");
570 signal_bg_comparison_leg6->Draw();
571 DrawMCPrelim(simulatedlumi);
572 CompleteSave(can,"jzb_bg_vs_signal_distribution_SMS__summary");
573
574 while((scansample.collection).size() > 1) scansample.RemoveLastSample();
575
576 }
577
578 vector<TF1*> do_cb_fit_to_plot(TH1F *histo, float Sigma, float doingfitacrosstheboard=false) {
579 TF1 *BpredFunc = new TF1("BpredFunc",InvCrystalBall,0,1000,5);
580 BpredFunc->SetParameter(0,histo->GetBinContent(1));
581 if(doingfitacrosstheboard) BpredFunc->SetParameter(0,histo->GetMaximum());
582 BpredFunc->SetParameter(1,0.);
583 if(method==1) BpredFunc->SetParameter(2,10*Sigma);//KM
584 else BpredFunc->SetParameter(2,Sigma);//Gaussian based methods
585 if(method==-99) BpredFunc->SetParameter(2,2.0*Sigma);//Kostas
586 BpredFunc->SetParameter(3,1.8);
587 BpredFunc->SetParameter(4,2.5);
588 histo->Fit(BpredFunc,"QN0");
589 BpredFunc->SetLineColor(kBlue);
590
591 TF1 *BpredFuncP = new TF1("BpredFuncP",InvCrystalBallP,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
592 TF1 *BpredFuncN = new TF1("BpredFuncN",InvCrystalBallN,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
593
594 BpredFuncP->SetParameters(BpredFunc->GetParameters());
595 BpredFuncP->SetLineColor(kBlue);
596 BpredFuncP->SetLineStyle(2);
597
598 BpredFuncN->SetParameters(BpredFunc->GetParameters());
599 BpredFuncN->SetLineColor(kBlue);
600 BpredFuncN->SetLineStyle(2);
601
602 vector<TF1*> functions;
603 functions.push_back(BpredFuncN);
604 functions.push_back(BpredFunc);
605 functions.push_back(BpredFuncP);
606 return functions;
607 }
608
609
610 TF1* do_logpar_fit_to_plot(TH1F *osof) {
611 TCanvas *logpar_fit_can = new TCanvas("logpar_fit_can","Fit canvas for LogPar");
612 TF1 *logparfunc = new TF1("logparfunc",LogParabola,0,300,3);
613 TF1 *logparfunc2 = new TF1("logparfunc2",LogParabola,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
614 TF1 *logparfuncN = new TF1("logparfuncN",LogParabolaN,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
615 TF1 *logparfuncP = new TF1("logparfuncP",LogParabolaP,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
616 osof->SetMinimum(0);
617 osof->Fit(logparfunc,"QR");
618 osof->Draw();
619 logparfunc->SetLineWidth(2);
620 logparfunc2->SetParameters(logparfunc->GetParameters());
621 logparfuncN->SetParameters(logparfunc->GetParameters());
622 logparfuncP->SetParameters(logparfunc->GetParameters());
623 stringstream fitinfo;
624 fitinfo << "#Chi^{2} / NDF : " << logparfunc->GetChisquare() << " / " << logparfunc->GetNDF();
625 TText *writefitinfo = write_text(0.8,0.8,fitinfo.str());
626 writefitinfo->SetTextSize(0.03);
627 DrawPrelim();
628 writefitinfo->Draw();
629 logparfunc->Draw("same");
630 logparfunc2->Draw("same");
631 logparfuncN->SetLineStyle(2);
632 logparfuncP->SetLineStyle(2);
633 logparfuncN->Draw("same");
634 logparfuncP->Draw("same");
635 CompleteSave(logpar_fit_can,"MakingOfBpredFunction/Bpred_Data_LogPar_Fit_To_TTbarPred");
636 delete logpar_fit_can;
637 return logparfunc2;
638 }
639
640 vector<TF1*> do_extended_fit_to_plot(TH1F *prediction, TH1F *Tprediction, TH1F *ossf, TH1F *osof,int isdata) {
641 /* there are mainly two background contributions: Z+Jets (a) and ttbar (b). So:
642 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.
643 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.
644 Once we have these two components, we use the combined parameters to get the final function and we're done.
645 */
646 //Step 1: take the OSSF prediction - OSOF prediction, and fit a crystal ball function to it
647 TH1F *step1cb = (TH1F*)ossf->Clone("step1cb");
648 step1cb->Add(osof,-1);
649 vector<TF1*> functions = do_cb_fit_to_plot(step1cb,PlottingSetup::JZBPeakWidthData);
650 TF1 *zjetscrystalball = functions[1];
651
652 //Step 2: use the OSOF distribution and look at the [10,100] GeV JZB range, and fit our log parabola
653 // TH1F *ttbarprediction=(TH1F*)prediction->Clone("ttbarprediction");
654 // ttbarprediction->Add(ossf,-1);//without the Z+Jets estimate, this is really just the ttbar estimate!
655 // 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)
656 TF1 *ttbarlogpar = do_logpar_fit_to_plot(Tprediction);
657 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
658 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);
659
660
661 TF1 *ttbarlogparP = new TF1("ttbarlogparP",LogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
662 TF1 *ttbarlogparN = new TF1("ttbarlogparN",LogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
663
664 //and now fuse the two!
665 TF1 *kmlp = new TF1("kmlp", CrystalBallPlusLogParabola, 0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
666 TF1 *kmlpP= new TF1("kmlpP",CrystalBallPlusLogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
667 TF1 *kmlpN= new TF1("kmlpN",CrystalBallPlusLogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
668 double kmlp_pars[10];
669 for(int i=0;i<5;i++) kmlp_pars[i]=zjetscrystalball->GetParameter(i);
670 for(int i=0;i<3;i++) kmlp_pars[5+i]=ttbarlogpar->GetParameter(i);
671 ttbarlogparP->SetParameters(ttbarlogpar->GetParameters());
672 ttbarlogparN->SetParameters(ttbarlogpar->GetParameters());
673 kmlp->SetParameters(kmlp_pars);
674 prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
675 /*
676 if you want to start from scratch (without the partial fitting and only fitting the whole thing, some good start values could be :
677 */
678 kmlp_pars[0]=kmlp->GetParameter(0);
679 kmlp_pars[1]=3.6198;
680 kmlp_pars[2]=16.4664;
681 kmlp_pars[3]=1.92253;
682 kmlp_pars[4]=3.56099;
683 kmlp_pars[5]=5.83;
684 kmlp_pars[6]=0.000757479;
685 kmlp_pars[7]=95.6157;
686 kmlp_pars[8]=0;
687 kmlp_pars[9]=0;
688 kmlp->SetParameters(kmlp_pars);
689 /**/
690 prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
691
692 kmlpP->SetParameters(kmlp->GetParameters());
693 kmlpN->SetParameters(kmlp->GetParameters());
694
695 // now that we're done, let's save all of this so we can have a look at it afterwards.
696 TCanvas *can = new TCanvas("can","Prediction Fit Canvas");
697 can->SetLogy(1);
698 prediction->SetMarkerColor(kRed);
699 prediction->Draw();
700
701 kmlp->SetLineColor(TColor::GetColor("#04B404"));
702 kmlpP->SetLineColor(TColor::GetColor("#04B404"));
703 kmlpN->SetLineColor(TColor::GetColor("#04B404"));
704 kmlp->Draw("same");
705 kmlpN->SetLineStyle(2);
706 kmlpP->SetLineStyle(2);
707 kmlpN->Draw("same");
708 kmlpP->Draw("same");
709
710 ttbarlogpar->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
711 ttbarlogpar->Draw("same");
712 ttbarlogparP->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
713 ttbarlogparN->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
714 ttbarlogparP->SetLineStyle(2);
715 ttbarlogparN->SetLineStyle(2);
716 ttbarlogparP->Draw("same");
717 ttbarlogparN->Draw("same");
718
719 functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
720
721 TLegend *analyticalBpredLEG = make_legend("",0.5,0.55);
722 analyticalBpredLEG->AddEntry(prediction,"predicted","p");
723 analyticalBpredLEG->AddEntry(functions[1],"Crystal Ball fit","l");
724 analyticalBpredLEG->AddEntry(functions[0],"1#sigma Crystal Ball fit","l");
725 analyticalBpredLEG->AddEntry(ttbarlogparN,"TTbar fit","l");
726 analyticalBpredLEG->AddEntry(ttbarlogpar,"1#sigma TTbar fit","l");
727 analyticalBpredLEG->AddEntry(kmlp,"Combined function","l");
728 analyticalBpredLEG->AddEntry(kmlpN,"1#sigma combined function","l");
729 analyticalBpredLEG->Draw("same");
730
731 if(isdata==0) CompleteSave(can,"MakingOfBpredFunction/Bpred_MC_Analytical_Function_Composition");
732 if(isdata==1) CompleteSave(can,"MakingOfBpredFunction/Bpred_data_Analytical_Function_Composition");
733 if(isdata==2) CompleteSave(can,"MakingOfBpredFunction/Bpred_MCBnS_Analytical_Function_Composition");
734 delete can;
735
736 //and finally: prep return functions
737 vector<TF1*> return_functions;
738 return_functions.push_back(kmlpN);
739 return_functions.push_back(kmlp);
740 return_functions.push_back(kmlpP);
741
742 return_functions.push_back(ttbarlogparN);
743 return_functions.push_back(ttbarlogpar);
744 return_functions.push_back(ttbarlogparP);
745
746 return_functions.push_back(functions[0]);
747 return_functions.push_back(functions[1]);
748 return_functions.push_back(functions[2]);
749
750 return return_functions;
751 }
752
753 void do_prediction_plot(string jzb, TCanvas *globalcanvas, float sigma, float high, int use_data, bool overlay_signal = false )
754 {
755 bool is_data=false;
756 bool use_signal=false;
757 if(use_data==1) is_data=true;
758 if(use_data==2) use_signal=true;
759 int nbins=50;//100;
760 if(is_data) nbins=50;
761 float low=0;
762 float hi=500;
763 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
764 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
765 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
766 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
767 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
768 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
769 blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
770 blankback->GetXaxis()->CenterTitle();
771 blankback->GetYaxis()->CenterTitle();
772
773 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
774 TH1F *RcorrJZBSBem;
775 TH1F *LcorrJZBSBem;
776 TH1F *RcorrJZBSBeemm;
777 TH1F *LcorrJZBSBeemm;
778
779 TH1F *RcorrJZBeemmNoS;
780
781 //these are for the ratio
782 TH1F *JRcorrJZBeemm = allsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
783 TH1F *JLcorrJZBeemm = allsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
784 TH1F *JRcorrJZBem = allsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
785 TH1F *JLcorrJZBem = allsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
786
787 TH1F *JRcorrJZBSBem;
788 TH1F *JLcorrJZBSBem;
789 TH1F *JRcorrJZBSBeemm;
790 TH1F *JLcorrJZBSBeemm;
791
792 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);
793
794
795 if(PlottingSetup::RestrictToMassPeak) {
796 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
797 LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
798 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
799 LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
800
801 //these are for the ratio
802 JRcorrJZBSBem = allsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
803 JLcorrJZBSBem = allsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
804 JRcorrJZBSBeemm = allsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
805 JLcorrJZBSBeemm = allsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
806
807 }
808
809 TH1F *lm4RcorrJZBeemm;
810 if(overlay_signal || use_data == 2 ) lm4RcorrJZBeemm = allsamples.Draw("lm4RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,allsamples.FindSample("LM4"));
811
812 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
813
814 TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
815 TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
816
817 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
818 TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
819 if(PlottingSetup::RestrictToMassPeak) {
820 Bpred->Add(RcorrJZBem,1.0/3.);
821 Bpred->Add(LcorrJZBem,-1.0/3.);
822 Bpred->Add(RcorrJZBSBem,1.0/3.);
823 Bpred->Add(LcorrJZBSBem,-1.0/3.);
824 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
825 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
826
827 TTbarpred->Scale(1.0/3);
828 Zjetspred->Add(LcorrJZBem,-1.0/3.);
829 Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
830 TTbarpred->Add(RcorrJZBSBem,1.0/3.);
831 Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
832 TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
833
834 //these are for the ratio
835 JBpred->Add(JRcorrJZBem,1.0/3.);
836 JBpred->Add(JLcorrJZBem,-1.0/3.);
837 JBpred->Add(JRcorrJZBSBem,1.0/3.);
838 JBpred->Add(JLcorrJZBSBem,-1.0/3.);
839 JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
840 JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
841 } else {
842 Bpred->Add(RcorrJZBem,1.0);
843 Bpred->Add(LcorrJZBem,-1.0);
844
845 Zjetspred->Add(LcorrJZBem,-1.0);
846
847 //these are for the ratio
848 JBpred->Add(JRcorrJZBem,1.0);
849 JBpred->Add(JLcorrJZBem,-1.0);
850 }
851
852
853
854 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
855 TH1F *Tpred = (TH1F*)RcorrJZBem->Clone("Bpred");
856 Tpred->Add(LcorrJZBem,-1.0);
857 if(PlottingSetup::RestrictToMassPeak) {
858 Tpred->Add(RcorrJZBSBem,1.0);
859 Tpred->Add(LcorrJZBSBem,-1.0);
860 Tpred->Add(RcorrJZBSBeemm,1.0);
861 Tpred->Add(LcorrJZBSBeemm,-1.0);
862 }
863
864 globalcanvas->cd();
865 globalcanvas->SetLogy(1);
866
867 RcorrJZBeemm->SetMarkerStyle(20);
868 RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
869 RcorrJZBeemm->SetMinimum(0.1);
870
871 Bpred->SetLineColor(kRed);
872 Bpred->SetStats(0);
873
874 int versok=false;
875 if(gROOT->GetVersionInt()>=53000) versok=true;
876
877
878 if ( overlay_signal || use_data==2 ) lm4RcorrJZBeemm->SetLineColor(TColor::GetColor("#088A08"));
879 RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
880
881 TLegend *legBpred = make_legend("",0.6,0.55);
882 TLegend *legBpred2 = make_legend("",0.6,0.55);
883
884
885 vector<TF1*> analytical_function;
886 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
887 kinpad->cd();
888 kinpad->SetLogy(1);
889
890 string Bpredsaveas="Bpred_Data";
891 blankback->SetMaximum(5*RcorrJZBeemm->GetMaximum());
892 blankback->SetMinimum(0.1);
893 if(use_data!=1) blankback->SetMinimum(0.1);
894 blankback->Draw();
895 if(use_data==1)
896 {
897 analytical_function = do_extended_fit_to_plot(Bpred,Tpred,LcorrJZBeemm,LcorrJZBem,is_data);
898 kinpad->cd();//necessary because the extended fit function creates its own canvas
899 RcorrJZBeemm->Draw("e1x0,same");
900
901 Bpred->Draw("hist,same");
902 analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
903 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
904 legBpred->AddEntry(RcorrJZBeemm,"observed","p");
905 legBpred->AddEntry(Bpred,"predicted","l");
906 legBpred->AddEntry(analytical_function[1],"predicted fit","l");
907 legBpred->AddEntry(analytical_function[2],"stat. uncert.","l");
908 if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
909 legBpred->Draw();
910 DrawPrelim();
911
912 //this plot shows what the prediction is composed of
913 TCanvas *specialcanv = new TCanvas("specialcanv","specialcanv");
914 specialcanv->SetLogy(1);
915 Zjetspred->SetFillColor(kYellow);
916 Zjetspred->SetLineColor(kYellow);
917 TTbarpred->SetFillColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
918 TTbarpred->SetLineColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
919 THStack predcomposition("predcomposition","prediction composition");
920 predcomposition.Add(TTbarpred);
921 predcomposition.Add(Zjetspred);
922 blankback->Draw();
923 RcorrJZBeemm->Draw("e1x0,same");
924 predcomposition.Draw("histo,same");//
925 Bpred->Draw("hist,same");
926 analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
927 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
928 legBpred->Draw();
929 DrawPrelim();
930 TLegend *specialleg = new TLegend(0.6,0.4,0.89,0.55);
931 specialleg->SetFillColor(kWhite);specialleg->SetLineColor(kWhite);
932 specialleg->AddEntry(Zjetspred,"Z+Jets prediction","f");
933 specialleg->AddEntry(TTbarpred,"t#bar{t} prediction","f");
934 specialleg->Draw("same");
935 CompleteSave(specialcanv,"Bpred_Data_____PredictionComposition");
936
937 THStack kostack = allsamples.DrawStack("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,!is_data, luminosity,use_signal);
938 blankback->Draw();
939 kostack.Draw("same");
940 Bpred->Draw("hist,same");
941 analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
942 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
943 legBpred->Draw();
944 DrawPrelim();
945 CompleteSave(specialcanv,"Bpred_Data_____PredictionCompositioninMC");
946
947 delete specialcanv;
948 delete specialleg;
949 delete Zjetspred;
950 delete TTbarpred;
951
952 kinpad->cd();
953 }
954 if(use_data==0) {
955 RcorrJZBeemm->Draw("e1x0,same");
956 Bpred->Draw("hist,same");
957 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
958 legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
959 legBpred->AddEntry(Bpred,"MC predicted","l");
960 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
961 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
962 if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
963 legBpred->Draw();
964 DrawMCPrelim();
965 Bpredsaveas="Bpred_MC";
966 // CompleteSave(globalcanvas,"Bpred_MC"); // done below in save_with_ratio
967 }
968 if(use_data==2) {
969 RcorrJZBeemm->Draw("e1x0,same");
970 Bpred->Draw("hist,same");
971 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
972 legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
973 legBpred->AddEntry(Bpred,"MC predicted","l");
974 legBpred2->AddEntry(RcorrJZBeemm,"MC observed","p");
975 legBpred2->AddEntry(Bpred,"MC predicted","l");
976 {
977 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
978 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
979 legBpred->Draw();
980 DrawMCPrelim();
981 Bpredsaveas="Bpred_MCwithS";
982 // CompleteSave(globalcanvas,"Bpred_MCwithS"); // done below in save_with_ratio
983 }
984 {
985 RcorrJZBeemmNoS->SetLineStyle(2);
986 legBpred2->AddEntry(RcorrJZBeemmNoS,"MC B","l");
987 legBpred2->AddEntry(lm4RcorrJZBeemm,"MC S","l");
988 legBpred2->Draw();
989 RcorrJZBeemmNoS->SetLineColor(TColor::GetColor("#61210B"));
990 RcorrJZBeemmNoS->Draw("histo,same");
991 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
992 lm4RcorrJZBeemm->Draw("histo,same");
993 DrawMCPrelim();
994 Bpredsaveas="Bpred_MCwithS__plus";
995 // CompleteSave(globalcanvas,"Bpred_MCwithS__plus"); // done below in save_with_ratio
996 }
997 }
998
999
1000 //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
1001 string ytitle("ratio");
1002 if ( use_data==1 ) ytitle = "data/pred";
1003 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,Bpredsaveas,true,use_data!=1,ytitle);
1004
1005
1006 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1007 /// The part below is meaningless for the offpeak analysis (it's a comparison of the different estimates but there is but one estimate!)
1008 if(!PlottingSetup::RestrictToMassPeak) return;
1009 TH1F *Bpredem = (TH1F*)LcorrJZBeemm->Clone("Bpredem");
1010 Bpredem->Add(RcorrJZBem);
1011 Bpredem->Add(LcorrJZBem,-1);
1012 TH1F *BpredSBem = (TH1F*)LcorrJZBeemm->Clone("BpredSBem");
1013 BpredSBem->Add(RcorrJZBSBem);
1014 Bpred->Add(LcorrJZBSBem,-1);
1015 TH1F *BpredSBeemm = (TH1F*)LcorrJZBeemm->Clone("BpredSBeemm");
1016 BpredSBeemm->Add(RcorrJZBSBeemm);
1017 BpredSBeemm->Add(LcorrJZBSBeemm,-1.0);
1018 globalcanvas->cd();
1019 globalcanvas->SetLogy(1);
1020
1021 RcorrJZBeemm->SetMarkerStyle(20);
1022 RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
1023 blankback->Draw();
1024 RcorrJZBeemm->Draw("e1x0,same");
1025 RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
1026
1027 Bpredem->SetLineColor(kRed+1);
1028 Bpredem->SetStats(0);
1029 Bpredem->Draw("hist,same");
1030
1031 BpredSBem->SetLineColor(kGreen+2);//TColor::GetColor("#0B6138"));
1032 BpredSBem->SetLineStyle(2);
1033 BpredSBem->Draw("hist,same");
1034
1035 BpredSBeemm->SetLineColor(kBlue+1);
1036 BpredSBeemm->SetLineStyle(3);
1037 BpredSBeemm->Draw("hist,same");
1038 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1039
1040 TLegend *legBpredc = make_legend("",0.6,0.55);
1041 if(use_data==1)
1042 {
1043 legBpredc->AddEntry(RcorrJZBeemm,"observed","p");
1044 legBpredc->AddEntry(Bpredem,"OFZP","l");
1045 legBpredc->AddEntry(BpredSBem,"OFSB","l");
1046 legBpredc->AddEntry(BpredSBeemm,"SFSB","l");
1047 legBpredc->Draw();
1048 CompleteSave(globalcanvas,"Bpred_Data_comparison");
1049 }
1050 if(use_data==0) {
1051 legBpredc->AddEntry(RcorrJZBeemm,"MC observed","p");
1052 legBpredc->AddEntry(Bpredem,"MC OFZP","l");
1053 legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
1054 legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
1055 legBpredc->Draw();
1056 CompleteSave(globalcanvas,"Bpred_MC_comparison");
1057 }
1058 if(use_data==2) {
1059 legBpredc->AddEntry(RcorrJZBeemm,"MC observed","p");
1060 legBpredc->AddEntry(Bpredem,"MC OFZP","l");
1061 legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
1062 legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
1063 if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1064 legBpredc->Draw();
1065 CompleteSave(globalcanvas,"Bpred_MCwithS_comparison");
1066 }
1067 delete RcorrJZBeemm;
1068 delete LcorrJZBeemm;
1069 delete RcorrJZBem;
1070 delete LcorrJZBem;
1071
1072 delete JRcorrJZBeemm;
1073 delete JLcorrJZBeemm;
1074 delete JRcorrJZBem;
1075 delete JLcorrJZBem;
1076
1077 delete blankback;
1078
1079 if(PlottingSetup::RestrictToMassPeak) {
1080 delete RcorrJZBSBem;
1081 delete LcorrJZBSBem;
1082 delete RcorrJZBSBeemm;
1083 delete LcorrJZBSBeemm;
1084
1085 delete JRcorrJZBSBem;
1086 delete JLcorrJZBSBem;
1087 delete JRcorrJZBSBeemm;
1088 delete JLcorrJZBSBeemm;
1089 }
1090 if(overlay_signal || use_data==2) delete lm4RcorrJZBeemm;
1091 }
1092
1093 void do_prediction_plots(string mcjzb, string datajzb, float DataSigma, float MCSigma, bool overlay_signal ) {
1094 TCanvas *globalcanvas = new TCanvas("globalcanvas","Prediction Canvas");
1095 do_prediction_plot(datajzb,globalcanvas,DataSigma,jzbHigh ,data,overlay_signal);
1096 do_prediction_plot(mcjzb,globalcanvas,MCSigma,jzbHigh ,mc,overlay_signal);
1097 do_prediction_plot(mcjzb,globalcanvas,MCSigma,jzbHigh ,mcwithsignal,overlay_signal);
1098 }
1099
1100 void do_ratio_plot(int is_data,vector<float> binning, string jzb, TCanvas *can, float high=-9999) {
1101 bool do_data=0;
1102 bool dosignal=0;
1103 if(is_data==1) do_data=1;
1104 if(is_data==2) dosignal=1;
1105 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1106 TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1107 TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1108 TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1109
1110 TH1F *RcorrJZBSBem;
1111 TH1F *LcorrJZBSBem;
1112 TH1F *RcorrJZBSBeemm;
1113 TH1F *LcorrJZBSbeemm;
1114
1115 if(PlottingSetup::RestrictToMassPeak) {
1116 RcorrJZBSBem = allsamples.Draw("RcorrJZBSbem",jzb.c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1117 LcorrJZBSBem = allsamples.Draw("LcorrJZBSbem",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1118 RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSbeemm",jzb.c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1119 LcorrJZBSbeemm = allsamples.Draw("LcorrJZBSbeemm",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1120 }
1121
1122
1123
1124
1125 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1126 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
1127 if(PlottingSetup::RestrictToMassPeak) {
1128 Bpred->Add(RcorrJZBem,1.0/3);
1129 Bpred->Add(LcorrJZBem,-1.0/3);
1130 Bpred->Add(RcorrJZBSBem,1.0/3);
1131 Bpred->Add(LcorrJZBSBem,-1.0/3);
1132 Bpred->Add(RcorrJZBSBeemm,1.0/3);
1133 Bpred->Add(LcorrJZBSbeemm,-1.0/3);
1134 } else {
1135 Bpred->Add(RcorrJZBem,1.0);
1136 Bpred->Add(LcorrJZBem,-1.0);
1137 }
1138
1139 can->cd();
1140 can->SetLogy(0);
1141 Bpred->SetLineColor(kRed);
1142 Bpred->SetStats(0);
1143 if(high>0) Bpred->GetXaxis()->SetRangeUser(0,high);
1144 TH1F *JZBratioforfitting=(TH1F*)RcorrJZBeemm->Clone("JZBratioforfitting");
1145 JZBratioforfitting->Divide(Bpred);
1146 TGraphAsymmErrors *JZBratio = histRatio(RcorrJZBeemm,Bpred,is_data,binning,false);
1147
1148
1149 JZBratio->SetTitle("");
1150 JZBratio->GetYaxis()->SetRangeUser(0.0,9.0);
1151 // if(is_data==1) JZBratio->GetXaxis()->SetRangeUser(0,jzbHigh );
1152
1153 TF1 *pol0 = new TF1("pol0","[0]",0,1000);
1154 TF1 *pol0d = new TF1("pol0","[0]",0,1000);
1155 // straightline_fit->SetParameter(0,1);
1156 JZBratioforfitting->Fit(pol0,"Q0R","",0,30);
1157 pol0d->SetParameter(0,pol0->GetParameter(0));
1158
1159 JZBratio->GetYaxis()->SetTitle("Observed/Predicted");
1160 JZBratio->GetXaxis()->SetTitle("JZB [GeV]");
1161 if ( high>0 ) JZBratio->GetXaxis()->SetRangeUser(0.0,high);
1162 JZBratio->GetYaxis()->SetNdivisions(519);
1163 JZBratio->GetYaxis()->SetRangeUser(0.0,4.0);
1164 JZBratio->GetYaxis()->CenterTitle();
1165 JZBratio->GetXaxis()->CenterTitle();
1166 JZBratio->SetMarkerSize(DataMarkerSize);
1167 JZBratio->Draw("AP");
1168 /////----------------------------
1169 TPaveText *writeresult = new TPaveText(0.15,0.78,0.49,0.91,"blNDC");
1170 writeresult->SetFillStyle(4000);
1171 writeresult->SetFillColor(kWhite);
1172 writeresult->SetTextFont(42);
1173 writeresult->SetTextSize(0.03);
1174 writeresult->SetTextAlign(12);
1175 ostringstream jzb_agreement_data_text;
1176 jzb_agreement_data_text<< setprecision(2) << "mean =" << pol0->GetParameter(0) << " #pm " << setprecision(1) << pol0->GetParError(0);
1177 if(is_data==1) fitresultconstdata=pol0->GetParameter(0);// data
1178 if(is_data==0) fitresultconstmc=pol0->GetParameter(0); // monte carlo, no signal
1179 /* if(is_data) writeresult->AddText("Data closure test");
1180 else writeresult->AddText("MC closure test");
1181 */
1182 writeresult->AddText(jzb_agreement_data_text.str().c_str());
1183 // writeresult->Draw("same");
1184 // pol0d->Draw("same");
1185 TF1 *topline = new TF1("","1.5",0,1000);
1186 TF1 *bottomline = new TF1("","0.5",0,1000);
1187 topline->SetLineColor(kBlue);
1188 topline->SetLineStyle(2);
1189 bottomline->SetLineColor(kBlue);
1190 bottomline->SetLineStyle(2);
1191 // topline->Draw("same");
1192 // bottomline->Draw("same");
1193 TF1 *oneline = new TF1("","1.0",0,1000);
1194 oneline->SetLineColor(kBlue);
1195 oneline->SetLineStyle(1);
1196 oneline->Draw("same");
1197 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.
1198 if(is_data==1) DrawPrelim();
1199 else DrawMCPrelim();
1200 TLegend *leg = new TLegend(0.55,0.75,0.89,0.89);
1201 leg->SetTextFont(42);
1202 leg->SetTextSize(0.04);
1203 // if(is_data==1) leg->SetHeader("Ratio (data)");
1204 // else leg->SetHeader("Ratio (MC)");
1205
1206 TString MCtitle("MC ");
1207 if (is_data==1) MCtitle = "";
1208
1209 leg->SetFillStyle(4000);
1210 leg->SetFillColor(kWhite);
1211 leg->SetTextFont(42);
1212 // leg->AddEntry(topline,"+20\% sys envelope","l");
1213 leg->AddEntry(JZBratio,MCtitle+"obs / "+MCtitle+"pred","p");
1214 leg->AddEntry(oneline,"ratio = 1","l");
1215 // leg->AddEntry(pol0d,"fit in [0,30] GeV","l");
1216 // leg->AddEntry(bottomline,"#pm50% envelope","l");
1217
1218
1219 //leg->Draw("same"); // no longer drawing legend
1220
1221 if(is_data==1) CompleteSave(can, "jzb_ratio_data");
1222 if(is_data==0) CompleteSave(can, "jzb_ratio_mc");
1223 if(is_data==2) CompleteSave(can, "jzb_ratio_mc_BandS");//special case, MC with signal!
1224
1225 delete RcorrJZBeemm;
1226 delete LcorrJZBeemm;
1227 delete RcorrJZBem;
1228 delete LcorrJZBem;
1229
1230 delete RcorrJZBSBem;
1231 delete LcorrJZBSBem;
1232 delete RcorrJZBSBeemm;
1233 delete LcorrJZBSbeemm;
1234 }
1235
1236 void do_ratio_plots(string mcjzb,string datajzb,vector<float> ratio_binning) {
1237 TCanvas *globalc = new TCanvas("globalc","Ratio Plot Canvas");
1238 globalc->SetLogy(0);
1239
1240 do_ratio_plot(mc,ratio_binning,mcjzb,globalc, jzbHigh );
1241 do_ratio_plot(data,ratio_binning,datajzb,globalc, jzbHigh );
1242 do_ratio_plot(mcwithsignal,ratio_binning,mcjzb,globalc, jzbHigh );
1243 }
1244
1245 string give_jzb_expression(float peak, int type) {
1246 stringstream val;
1247 if(type==data) {
1248 if(peak<0) val << jzbvariabledata << "+" << TMath::Abs(peak);
1249 if(peak>0) val << jzbvariabledata << "-" << TMath::Abs(peak);
1250 if(peak==0) val << jzbvariabledata;
1251 }
1252 if(type==mc) {
1253 if(peak<0) val << jzbvariablemc << "+" << TMath::Abs(peak);
1254 if(peak>0) val << jzbvariablemc << "-" << TMath::Abs(peak);
1255 if(peak==0) val << jzbvariablemc;
1256 }
1257 return val.str();
1258 }
1259
1260
1261 void lepton_comparison_plots() {
1262 Float_t ymin = 1.e-5, ymax = 0.25;
1263 TCanvas *can = new TCanvas("can","Lepton Comparison Canvas");
1264 can->SetLogy(1);
1265 TH1F *eemc = allsamples.Draw("eemc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",mc, luminosity,allsamples.FindSample("/DY"));
1266 TH1F *mmmc = allsamples.Draw("mmmc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",mc, luminosity,allsamples.FindSample("/DY"));
1267 eemc->SetLineColor(kBlue);
1268 mmmc->SetLineColor(kRed);
1269 eemc->SetMinimum(0.1);
1270 eemc->SetMaximum(10*eemc->GetMaximum());
1271 eemc->Draw("histo");
1272 mmmc->Draw("histo,same");
1273 TLegend *leg = make_legend();
1274 leg->AddEntry(eemc,"ZJets->ee (MC)","l");
1275 leg->AddEntry(mmmc,"ZJets->#mu#mu (MC)","l");
1276 leg->Draw("same");
1277 CompleteSave(can, "lepton_comparison/mll_effratio_mc");
1278
1279 TH1F *eed = allsamples.Draw("eed","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
1280 TH1F *mmd = allsamples.Draw("mmd","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
1281 eed->SetLineColor(kBlue);
1282 mmd->SetLineColor(kRed);
1283 eed->SetMinimum(0.1);
1284 eed->SetMaximum(10*eed->GetMaximum());
1285 eed->Draw("histo");
1286 mmd->Draw("histo,same");
1287 TLegend *leg2 = make_legend();
1288 leg2->AddEntry(eed,"ZJets->ee (data)","l");
1289 leg2->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
1290 leg2->Draw();
1291 CompleteSave(can, "lepton_comparison/mll_effratio_data");
1292
1293 TH1F *jeed = allsamples.Draw("jeed",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
1294 TH1F *jmmd = allsamples.Draw("jmmd",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
1295 TH1F *jeemmd = allsamples.Draw("jeemmd",jzbvariabledata,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
1296 dout << "ee : " << jeed->GetMean() << "+/-" << jeed->GetMeanError() << endl;
1297 dout << "ee : " << jmmd->GetMean() << "+/-" << jmmd->GetMeanError() << endl;
1298 dout << "eemd : " << jeemmd->GetMean() << "+/-" << jeemmd->GetMeanError() << endl;
1299 jeemmd->SetLineColor(kBlack);
1300 jeemmd->SetMarkerStyle(25);
1301 jeed->SetLineColor(kBlue);
1302 jmmd->SetLineColor(kRed);
1303 jeed->SetMinimum(0.1);
1304 jeed->SetMaximum(10*eed->GetMaximum());
1305 TH1* njeemmd = jeemmd->DrawNormalized();
1306 njeemmd->SetMinimum(ymin);
1307 njeemmd->SetMaximum(ymax);
1308
1309 jeed->DrawNormalized("histo,same");
1310 jmmd->DrawNormalized("histo,same");
1311 jeemmd->DrawNormalized("same");
1312 TLegend *jleg2 = make_legend(" ");
1313 jleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
1314 jleg2->AddEntry(jeed,"ee","l");
1315 jleg2->AddEntry(jmmd,"#mu#mu","l");
1316 jleg2->Draw();
1317 CompleteSave(can,"lepton_comparison/jzb_effratio_data");
1318
1319 TPad *eemmpad = new TPad("eemmpad","eemmpad",0,0,1,1);
1320 eemmpad->cd();
1321 eemmpad->SetLogy(1);
1322 jeed->Draw("histo");
1323 jmmd->Draw("histo,same");
1324 TLegend *eemmlegend = make_legend(" ");
1325 eemmlegend->AddEntry(jeed,"ee","l");
1326 eemmlegend->AddEntry(jmmd,"#mu#mu","l");
1327 eemmlegend->Draw();
1328 DrawPrelim();
1329 save_with_ratio(jeed,jmmd,eemmpad->cd(),"lepton_comparison/jzb_Comparing_ee_mm_data");
1330
1331 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"));
1332 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"));
1333 TH1F *zjeemmd = allsamples.Draw("zjeemmd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets, mc, luminosity,allsamples.FindSample("/DY"));
1334 dout << "Z+Jets ee : " << zjeed->GetMean() << "+/-" << zjeed->GetMeanError() << endl;
1335 dout << "Z+Jets ee : " << zjmmd->GetMean() << "+/-" << zjmmd->GetMeanError() << endl;
1336 dout << "Z+Jets eemd : " << zjeemmd->GetMean() << "+/-" << zjeemmd->GetMeanError() << endl;
1337 zjeemmd->SetLineColor(kBlack);
1338 zjeemmd->SetMarkerStyle(25);
1339 zjeed->SetLineColor(kBlue);
1340 zjmmd->SetLineColor(kRed);
1341 zjeed->SetMinimum(0.1);
1342 zjeed->SetMaximum(10*eed->GetMaximum());
1343
1344 TH1* nzjeemmd = zjeemmd->DrawNormalized();
1345 nzjeemmd->SetMinimum(ymin);
1346 nzjeemmd->SetMaximum(ymax);
1347 zjeed->DrawNormalized("histo,same");
1348 zjmmd->DrawNormalized("histo,same");
1349 zjeemmd->DrawNormalized("same");
1350 TLegend *zjleg2 = make_legend("Z+jets MC");
1351 zjleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
1352 zjleg2->AddEntry(jeed,"ee","l");
1353 zjleg2->AddEntry(jmmd,"#mu#mu","l");
1354 zjleg2->Draw();
1355 CompleteSave(can,"lepton_comparison/jzb_effratio_ZJets");
1356
1357 TH1F *ld = allsamples.Draw("ld","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
1358 ld->DrawNormalized("e1");
1359 eed->DrawNormalized("histo,same");
1360 mmd->DrawNormalized("histo,same");
1361 TLegend *leg3 = make_legend();
1362 leg3->AddEntry(ld,"ZJets->ll (data)","p");
1363 leg3->AddEntry(eed,"ZJets->ee (data)","l");
1364 leg3->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
1365 leg3->Draw();
1366 CompleteSave(can,"lepton_comparison/mll_effratio_data__all_compared");
1367 /*
1368 TH1F *jzbld = allsamples.Draw("jzbld",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1369 TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1370 */
1371 TH1F *jzbld = allsamples.Draw("jzbld",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1372 TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1373 jzbld->SetMarkerColor(kBlack);
1374 jzbld->SetMarkerStyle(26);
1375 jzbemd->SetMarkerStyle(25);
1376 jzbemd->SetMarkerColor(kRed);
1377 jzbemd->SetLineColor(kRed);
1378 jzbld->SetMinimum(0.35);
1379 jzbld->Draw("e1");
1380 jzbemd->Draw("e1,same");
1381 TLegend *leg4 = make_legend();
1382 leg4->AddEntry(jzbld,"SFZP","p");
1383 leg4->AddEntry(jzbemd,"OFZP","p");
1384 leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
1385 leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
1386 leg4->Draw();
1387 CompleteSave(can,"lepton_comparison/jzb_eemumu_emu_data");
1388
1389 TH1F *ttbarjzbld = allsamples.Draw("ttbarjzbld",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
1390 TH1F *ttbarjzbemd = allsamples.Draw("ttbarjzbemd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
1391 ttbarjzbld->SetLineColor(allsamples.GetColor("TTJet"));
1392 ttbarjzbemd->SetLineColor(allsamples.GetColor("TTJet"));
1393 ttbarjzbld->Draw("histo");
1394 ttbarjzbemd->SetLineStyle(2);
1395 ttbarjzbemd->Draw("histo,same");
1396 TLegend *leg5 = make_legend();
1397 leg5->AddEntry(ttbarjzbld,"t#bar{t}->(ee or #mu#mu)","l");
1398 leg5->AddEntry(ttbarjzbemd,"t#bar{t}->e#mu","l");
1399 leg5->Draw();
1400 CompleteSave(can,"lepton_comparison/ttbar_emu_mc");
1401
1402 }
1403
1404 bool is_OF(TCut cut) {
1405 string scut = (const char*) cut;
1406 if((int)scut.find("id1!=id2")>-1) return true;
1407 if((int)scut.find("id1==id2")>-1) return false;
1408 return false;
1409 }
1410
1411 bool is_ZP(TCut cut) {
1412 string scut = (const char*) cut;
1413 if((int)scut.find("91")>-1) return true;
1414 return false;
1415 }
1416
1417
1418 void draw_pure_jzb_histo(TCut cut,string datavariable, string mcvariable, string savename, TCanvas *can,vector<float> binning) {
1419 TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
1420 jzbpad->cd();
1421 jzbpad->SetLogy(1);
1422 string xlabel="JZB [GeV]";
1423
1424 TH1F *datahisto = allsamples.Draw("datahisto",datavariable,binning, xlabel, "events",cut,data,luminosity);
1425 THStack mcstack = allsamples.DrawStack("mcstack",mcvariable,binning, xlabel, "events",cut,mc,luminosity);
1426
1427 datahisto->SetMinimum(0.1);
1428 datahisto->SetMarkerSize(DataMarkerSize);
1429 datahisto->Draw("e1");
1430 mcstack.Draw("same");
1431 datahisto->Draw("same,e1");
1432
1433 TLegend *leg;
1434 if(is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("OFZP",datahisto);
1435 else if(!is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("SFZP",datahisto);
1436 else if( is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("OFSB",datahisto);
1437 else if(!is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("SFSB",datahisto);
1438 else {
1439 std::cerr << "Unable to decode cut: " << cut.GetTitle() << std::endl;
1440 exit(-1);
1441 }
1442 leg->Draw();
1443 string write_cut = decipher_cut(cut,"");
1444 TText *writeline1 = write_cut_on_canvas(write_cut.c_str());
1445 writeline1->SetTextSize(0.035);
1446 writeline1->Draw();
1447 save_with_ratio(datahisto,mcstack,jzbpad->cd(),("jzb/"+savename));
1448 TPad *jzbpad2 = new TPad("jzbpad2","jzbpad2",0,0,1,1);
1449 jzbpad2->cd();
1450 jzbpad2->SetLogy(1);
1451 datahisto->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
1452 datahisto->SetMinimum(0.1);
1453 datahisto->SetMarkerSize(DataMarkerSize);
1454 datahisto->Draw("e1");
1455 mcstack.Draw("same");
1456 datahisto->Draw("same,e1");
1457 leg->SetHeader("");
1458 leg->Draw();
1459 writeline1->SetTextSize(0.035);
1460 writeline1->Draw();
1461 DrawPrelim();
1462 save_with_ratio(datahisto,mcstack,jzbpad2->cd(),("jzb/PositiveSideOnly/"+savename+""));
1463 datahisto->Delete();
1464 mcstack.Delete();
1465 }
1466
1467 Double_t GausR(Double_t *x, Double_t *par) {
1468 return gRandom->Gaus(x[0],par[0]);
1469 }
1470
1471 void jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1472 TCanvas *can = new TCanvas("can","JZB Plots Canvas");
1473 float max=jzbHigh ;
1474 float min=-120;
1475 int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
1476 int coarserbins=int(nbins/2.0);
1477 int rebinnedbins=int(nbins/4.0);
1478
1479 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
1480 for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
1481 for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
1482 for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
1483
1484 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP",can,binning);
1485 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP",can,binning);
1486 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_SFZP",can,binning);
1487 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_SFZP",can,binning);
1488 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_OFZP",can,binning);
1489 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_OFZP",can,binning);
1490 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1491 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB",can,binning);
1492 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB",can,binning);
1493
1494 draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarse",can,coarse_binning);
1495 draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarse",can,coarse_binning);
1496 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1497 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarse",can,coarse_binning);
1498 if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarse",can,coarse_binning);
1499
1500 // draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarsest",can,coarsest_binning);
1501 // draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarsest",can,coarsest_binning);
1502 // flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1503 // if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarsest",can,coarsest_binning);
1504 // if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarsest",can,coarsest_binning);
1505 }
1506
1507
1508 void calculate_all_yields(string mcdrawcommand,vector<float> jzb_cuts) {
1509 dout << "Calculating background yields in MC:" << endl;
1510 jzb_cuts.push_back(14000);
1511 TH1F *allbgs = allsamples.Draw("allbgs",jzbvariablemc,jzb_cuts, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc,luminosity);
1512 float cumulative=0;
1513 for(int i=allbgs->GetNbinsX();i>=1;i--) {
1514 cumulative+=allbgs->GetBinContent(i);
1515 dout << "Above " << allbgs->GetBinLowEdge(i) << " GeV/c : " << cumulative << endl;
1516 }
1517 }
1518
1519
1520 TCut give_jzb_expression(string mcjzb, float jzbcut, string posneg="pos") {
1521 stringstream res;
1522 res << "(" << mcjzb;
1523 if(posneg=="pos") res << ">";
1524 else res << "<-";
1525 res << jzbcut << ")";
1526 return TCut(res.str().c_str());
1527 }
1528
1529 string sigdig(float number, int nsigdig=3, float min=0) {
1530 //this function tries to extract n significant digits, and if the number is below (min), it returns "<min"
1531 if(number<min) return "< "+any2string(min);
1532 stringstream sol;
1533 sol << setprecision(nsigdig) << number;
1534
1535 return sol.str();
1536 }
1537
1538 string jzb_tex_command(string region, string posneg) {
1539 if(posneg=="pos") posneg="POS";
1540 else posneg="NEG";
1541 stringstream texcommand;
1542 texcommand<<"\\"<<region <<"JZB"<<posneg;
1543 return texcommand.str();
1544 }
1545 // \SFZPJZBPOS
1546 // Sample & \OFZPJZBPOS & \OFZPJZBNEG & \SFZPJZBPOS & \SFZPJZBNEG & \OFSBJZBPOS & \OFSBJZBNEG & \SFSBJZBPOS & \SFSBJZBNEG \\\hline
1547
1548 void compute_MC_yields(string mcjzb,vector<float> jzb_cuts) {
1549 dout << "Calculating background yields in MC:" << endl;
1550
1551 TCanvas *yica = new TCanvas("yica","yield canvas");
1552
1553 int nRegions=4;
1554 if(!PlottingSetup::RestrictToMassPeak) nRegions=2;
1555 string tsRegions[] = {"SFZP","OFZP","SFSB","OFSB"};
1556 string posneg[] = {"pos","neg"};
1557 TCut tkRegions[] = {cutOSSF&&cutnJets&&cutmass,cutOSOF&&cutnJets&&cutmass,cutOSSF&&cutnJets&&sidebandcut,cutOSOF&&cutnJets&&sidebandcut};
1558
1559 for(int ijzb=0;ijzb<jzb_cuts.size();ijzb++) {
1560 TCut jzbMC[] = { give_jzb_expression(mcjzb,jzb_cuts[ijzb],"pos"), give_jzb_expression(mcjzb,jzb_cuts[ijzb],"neg") };
1561 dout << "_________________________________________________________" << endl;
1562 dout << "Table for JZB> " << jzb_cuts[ijzb] << endl;
1563 for(int isample=0;isample<(allsamples.collection).size();isample++) {
1564 if(!(allsamples.collection)[isample].is_data) dout << (allsamples.collection)[isample].samplename << " & ";
1565 else dout << "Sample & ";
1566 for(int iregion=0;iregion<nRegions;iregion++) {
1567 for(int ipos=0;ipos<2;ipos++) {
1568 if((allsamples.collection)[isample].is_data) dout << jzb_tex_command(tsRegions[iregion],posneg[ipos]) << " & ";
1569 else {
1570 vector<int> specific;specific.push_back(isample);
1571 TH1F *shisto = allsamples.Draw("shisto","mll",1,0,500,"tester","events",tkRegions[iregion]&&jzbMC[ipos],mc,luminosity,specific);
1572 dout << sigdig(shisto->Integral(),3,0.05) <<" & ";
1573 delete shisto;
1574 }
1575 }//end of ipos
1576 }//end of iregion
1577 dout << " \\\\" << endl;
1578 }//end of isample
1579 }//end of ijzb
1580 dout << " \\hline" << endl;
1581
1582 delete yica;
1583 }
1584
1585 void draw_ttbar_and_zjets_shape_for_one_configuration(string mcjzb, string datajzb, int leptontype=-1, int scenario=0,bool floating=false) {
1586 //Step 1: Establishing cuts
1587 stringstream jetcutstring;
1588 string writescenario="";
1589
1590 if(scenario==0) jetcutstring << "(pfJetGoodNum>=3)&&"<<(const char*) basicqualitycut;
1591 if(scenario==1) jetcutstring << "(pfJetPt[0]>50&&pfJetPt[1]>50)&&"<<(const char*)basicqualitycut;
1592 TCut jetcut(jetcutstring.str().c_str());
1593 string leptoncut="mll>0";
1594 if(leptontype==0||leptontype==1) {
1595 if(leptontype==0) {
1596 leptoncut="id1==0";
1597 writescenario="__ee";
1598 }
1599 else {
1600 leptoncut="id1==1";
1601 writescenario="__ee";
1602 }
1603 }
1604 TCut lepcut(leptoncut.c_str());
1605
1606 TCanvas *c5 = new TCanvas("c5","c5",1500,500);
1607 TCanvas *c6 = new TCanvas("c6","c6");
1608 c5->Divide(3,1);
1609
1610 //STEP 2: Extract Zjets shape in data
1611 c5->cd(1);
1612 c5->cd(1)->SetLogy(1);
1613 TCut massat40("mll>40");
1614 TH1F *ossfleft = allsamples.Draw("ossfleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
1615 TH1F *osofleft = allsamples.Draw("osofleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
1616 ossfleft->SetLineColor(kRed);
1617 ossfleft->SetMarkerColor(kRed);
1618 ossfleft->Add(osofleft,-1);
1619 vector<TF1*> functions = do_cb_fit_to_plot(ossfleft,10);
1620 ossfleft->SetMarkerSize(DataMarkerSize);
1621 ossfleft->Draw();
1622 functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
1623 TF1 *zjetsfunc = (TF1*) functions[1]->Clone();
1624 TF1 *zjetsfuncN = (TF1*) functions[0]->Clone();
1625 TF1 *zjetsfuncP = (TF1*) functions[2]->Clone();
1626 zjetsfunc->Draw("same");zjetsfuncN->Draw("same");zjetsfuncP->Draw("same");
1627 TLegend *leg1 = new TLegend(0.6,0.6,0.89,0.80);
1628 leg1->SetFillColor(kWhite);
1629 leg1->SetLineColor(kWhite);
1630 leg1->AddEntry(ossfleft,"OSSF (sub),JZB<peak","p");
1631 leg1->AddEntry(zjetsfunc,"OSSF fit ('zjets')","l");
1632 leg1->Draw("same");
1633 TText *titleleft = write_title("Extracting Z+Jets shape");
1634 titleleft->Draw();
1635
1636 //Step 3: Extract ttbar shape (in data or MC?)
1637 c5->cd(2);
1638 c5->cd(2)->SetLogy(1);
1639 TH1F *osof;
1640 TText *titlecenter;
1641 bool frommc=false;
1642 if(frommc) {
1643 osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,mc,luminosity,allsamples.FindSample("TTJets"));
1644 titlecenter = write_title("Extracting ttbar shape (from ossf MC)");
1645 }
1646 else {
1647 osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
1648 titlecenter = write_title("Extracting ttbar shape (from osof data)");
1649 }
1650 osof->SetMarkerSize(DataMarkerSize);
1651 osof->Draw();
1652 vector<TF1*> ttbarfunctions = do_cb_fit_to_plot(osof,35,true);
1653 ttbarfunctions[0]->SetLineColor(kRed); ttbarfunctions[0]->SetLineStyle(2); ttbarfunctions[0]->Draw("same");
1654 ttbarfunctions[1]->SetLineColor(kRed); ttbarfunctions[1]->Draw("same");
1655 ttbarfunctions[2]->SetLineColor(kRed); ttbarfunctions[2]->SetLineStyle(2); ttbarfunctions[2]->Draw("same");
1656
1657 TLegend *leg2 = new TLegend(0.15,0.8,0.4,0.89);
1658 leg2->SetFillColor(kWhite);
1659 leg2->SetLineColor(kWhite);
1660 if(frommc) {
1661 leg2->AddEntry(osof,"t#bar{t} OSSF, MC","p");
1662 leg2->AddEntry(ttbarfunctions[1],"Fit to t#bar{t} OSSF,MC","l");
1663 } else {
1664 leg2->AddEntry(osof,"OSOF","p");
1665 leg2->AddEntry(ttbarfunctions[1],"Fit to OSOF","l");
1666 }
1667 leg2->Draw("same");
1668 titlecenter->Draw();
1669
1670 //--------------------------------------------------------------------------------------------------------------------------------
1671 //STEP 4: Present it!
1672 // actually: if we wanna let it float we need to do that first :-)
1673 c5->cd(3);
1674 c5->cd(3)->SetLogy(1);
1675 TH1F *observed = allsamples.Draw("observed",datajzb,100,0,500, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
1676 observed->SetMarkerSize(DataMarkerSize);
1677
1678 TF1 *logparc = new TF1("logparc",InvCrystalBall,0,1000,5); logparc->SetLineColor(kRed);
1679 TF1 *logparcn = new TF1("logparcn",InvCrystalBallN,0,1000,5); logparcn->SetLineColor(kRed); logparcn->SetLineStyle(2);
1680 TF1 *logparcp = new TF1("logparcp",InvCrystalBallP,0,1000,5); logparcp->SetLineColor(kRed); logparcp->SetLineStyle(2);
1681
1682 TF1 *zjetsc = new TF1("zjetsc",InvCrystalBall,0,1000,5); zjetsc->SetLineColor(kBlue);
1683 TF1 *zjetscn = new TF1("zjetscn",InvCrystalBallN,0,1000,5); zjetscn->SetLineColor(kBlue); zjetscn->SetLineStyle(2);
1684 TF1 *zjetscp = new TF1("zjetscp",InvCrystalBallP,0,1000,5); zjetscp->SetLineColor(kBlue); zjetscp->SetLineStyle(2);
1685
1686 TF1 *ZplusJetsplusTTbar = new TF1("ZplusJetsplusTTbar", DoubleInvCrystalBall,0,1000,10); ZplusJetsplusTTbar->SetLineColor(kBlue);
1687 TF1 *ZplusJetsplusTTbarP= new TF1("ZplusJetsplusTTbarP",DoubleInvCrystalBallP,0,1000,10); ZplusJetsplusTTbarP->SetLineColor(kBlue); ZplusJetsplusTTbarP->SetLineStyle(2);
1688 TF1 *ZplusJetsplusTTbarN= new TF1("ZplusJetsplusTTbarN",DoubleInvCrystalBallN,0,1000,10); ZplusJetsplusTTbarN->SetLineColor(kBlue); ZplusJetsplusTTbarN->SetLineStyle(2);
1689
1690 zjetsc->SetParameters(zjetsfunc->GetParameters());
1691 zjetscp->SetParameters(zjetsfunc->GetParameters());
1692 zjetscn->SetParameters(zjetsfunc->GetParameters());
1693
1694 TH1F *observeda = allsamples.Draw("observeda",datajzb,53,80,jzbHigh, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
1695 //blublu
1696 logparc->SetParameters(ttbarfunctions[1]->GetParameters());
1697 logparcn->SetParameters(ttbarfunctions[1]->GetParameters());
1698 logparcp->SetParameters(ttbarfunctions[1]->GetParameters());
1699 if(floating) {
1700 dout << "TTbar contribution assumed (before fitting) : " << logparc->GetParameter(0) << endl;
1701 logparc->SetParameters(ttbarfunctions[1]->GetParameters());
1702 for(int i=0;i<10;i++) {
1703 if(i<5) ZplusJetsplusTTbar->FixParameter(i,zjetsfunc->GetParameter(i));
1704 if(i>=5) {
1705 if (i>5) ZplusJetsplusTTbar->FixParameter(i,logparc->GetParameter(i-5));
1706 if (i==5) ZplusJetsplusTTbar->SetParameter(i,logparc->GetParameter(i-5));
1707 }
1708 }//end of setting parameters
1709 observeda->Draw("same");
1710 ZplusJetsplusTTbar->Draw("same");
1711 observeda->Fit(ZplusJetsplusTTbar);
1712 dout << "--> Quality of Z+Jets / TTbar fit : chi2/ndf = " << ZplusJetsplusTTbar->GetChisquare() << "/" << ZplusJetsplusTTbar->GetNDF() << endl;
1713 ZplusJetsplusTTbar->Draw("same");
1714 ZplusJetsplusTTbarP->SetParameters(ZplusJetsplusTTbar->GetParameters());
1715 ZplusJetsplusTTbarN->SetParameters(ZplusJetsplusTTbar->GetParameters());
1716 dout << "TTbar contribution found (after fitting) : " << ZplusJetsplusTTbar->GetParameter(5) << endl;
1717 float factor = ZplusJetsplusTTbar->GetParameter(5) / logparc->GetParameter(0);
1718 dout << "FACTOR: " << factor << endl;
1719 logparc->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
1720 logparcn->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
1721 logparcp->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
1722 }
1723
1724 c5->cd(3);
1725 c5->cd(3)->SetLogy(1);
1726 observed->Draw();
1727 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
1728 logparc->Draw("same");
1729 logparcn->Draw("same");
1730 logparcp->Draw("same");
1731
1732 TLegend *leg3 = new TLegend(0.6,0.6,0.89,0.80);
1733 leg3->SetFillColor(kWhite);
1734 leg3->SetLineColor(kWhite);
1735 leg3->AddEntry(observed,"OSSF,JZB>peak","p");
1736 leg3->AddEntry(ttbarfunctions[1],"OSOF fit ('ttbar')","l");
1737 leg3->AddEntry(zjetsfunc,"OSSF,JZB<0 fit ('zjets')","l");
1738 leg3->Draw("same");
1739 TText *titleright = write_title("Summary of shapes and observed shape");
1740 titleright->Draw();
1741
1742 c6->cd()->SetLogy(1);
1743 observed->Draw();
1744 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
1745 logparc->Draw("same");
1746 logparcn->Draw("same");
1747 logparcp->Draw("same");
1748 leg3->Draw("same");
1749 titleright->Draw();
1750
1751 if(scenario==0) {
1752 CompleteSave(c5,"Shapes2/Making_of___3jetsabove30"+writescenario);
1753 CompleteSave(c5->cd(1),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd1");
1754 CompleteSave(c5->cd(2),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd2");
1755 CompleteSave(c5->cd(3),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd3");
1756 CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30"+writescenario);
1757 } else {
1758 CompleteSave(c5,"Shapes2/Making_of___2jetsabove50"+writescenario);
1759 CompleteSave(c5->cd(1),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd1");
1760 CompleteSave(c5->cd(2),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd2");
1761 CompleteSave(c5->cd(3),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd3");
1762 CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50"+writescenario);
1763 }
1764 dout << "Statistics about our fits: " << endl;
1765 dout << "Z+Jets shape: Chi2/ndf = " << zjetsfunc->GetChisquare() << "/" << ossfleft->GetNbinsX() << endl;
1766 dout << "ttbar shape: Chi2/ndf = " << ttbarfunctions[1]->GetChisquare() << "/" << osof->GetNbinsX() << endl;
1767
1768 c6->cd();
1769 TLegend *additionallegend = new TLegend(0.6,0.6,0.89,0.89);
1770 additionallegend->SetFillColor(kWhite);
1771 additionallegend->SetLineColor(kWhite);
1772 additionallegend->AddEntry(observed,"Data","p");
1773 additionallegend->AddEntry(ZplusJetsplusTTbar,"Fitted Z+jets & TTbar","l");
1774 additionallegend->AddEntry(zjetsc,"Z+jets","l");
1775 additionallegend->AddEntry(logparc,"TTbar","l");
1776 observed->Draw();
1777 ZplusJetsplusTTbar->SetLineColor(kGreen);
1778 ZplusJetsplusTTbarP->SetLineColor(kGreen);
1779 ZplusJetsplusTTbarN->SetLineColor(kGreen);
1780 ZplusJetsplusTTbarP->SetLineStyle(2);
1781 ZplusJetsplusTTbarN->SetLineStyle(2);
1782 TF1 *ZplusJetsplusTTbar2 = new TF1("ZplusJetsplusTTbar2",DoubleInvCrystalBall,0,1000,10);
1783 ZplusJetsplusTTbar2->SetParameters(ZplusJetsplusTTbar->GetParameters());
1784 ZplusJetsplusTTbar2->SetLineColor(kGreen);
1785 ZplusJetsplusTTbarP->SetFillColor(TColor::GetColor("#81F781"));
1786 ZplusJetsplusTTbarN->SetFillColor(kWhite);
1787 ZplusJetsplusTTbarP->Draw("fcsame");
1788 ZplusJetsplusTTbarN->Draw("fcsame");
1789 TH1F *hZplusJetsplusTTbar = (TH1F*)ZplusJetsplusTTbar2->GetHistogram();
1790 TH1F *hZplusJetsplusTTbarN = (TH1F*)ZplusJetsplusTTbarN->GetHistogram();
1791 TH1F *hZplusJetsplusTTbarP = (TH1F*)ZplusJetsplusTTbarP->GetHistogram();
1792 hZplusJetsplusTTbar->SetMarkerSize(0);
1793 hZplusJetsplusTTbarP->SetMarkerSize(0);
1794 hZplusJetsplusTTbarN->SetMarkerSize(0);
1795 for (int i=1;i<=hZplusJetsplusTTbar->GetNbinsX();i++) {
1796 float newerror=hZplusJetsplusTTbarP->GetBinContent(i)-hZplusJetsplusTTbar->GetBinContent(i);
1797 hZplusJetsplusTTbar->SetBinError(i,newerror);
1798 if(hZplusJetsplusTTbar->GetBinContent(i)<0.05) hZplusJetsplusTTbar->SetBinContent(i,0); //avoiding a displaying probolem
1799 }
1800 hZplusJetsplusTTbarP->SetFillColor(kGreen);
1801 hZplusJetsplusTTbarN->SetFillColor(kWhite);
1802 hZplusJetsplusTTbarN->Draw("same");
1803
1804 ZplusJetsplusTTbar2->SetMarkerSize(0);
1805 ZplusJetsplusTTbar2->Draw("same");
1806
1807 zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
1808 logparc->Draw("same");
1809 logparcn->Draw("same");
1810 logparcp->Draw("same");
1811 additionallegend->Draw("same");
1812 if(scenario==0) {
1813 CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30__allfits__"+writescenario);
1814 } else {
1815 CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50__allfits__"+writescenario);
1816 }
1817 //--------------------------------------------------------------------------------------------------------------------------------
1818 }
1819
1820 void draw_ttbar_and_zjets_shape(string mcjzb, string datajzb) {
1821 int all_leptons=-1;
1822 int electrons_only=0;
1823 int mu_only=1;
1824 int twojetswith50gev=1;
1825 int threejetswith30gev=0;
1826 /*
1827 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,twojetswith50gev);
1828 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev);
1829
1830 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,twojetswith50gev);
1831 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,threejetswith30gev);
1832
1833 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,twojetswith50gev);
1834 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,threejetswith30gev);
1835 */
1836
1837 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev,true);
1838 }
1839
1840 void find_correction_factors(string &jzbvardata,string &jzbvarmc) {
1841 //first: colorful plots
1842 TCanvas *cancorr = new TCanvas("cancorr","Canvas for Response Correction");
1843 cancorr->SetLogz();
1844 cancorr->SetRightMargin(0.13);
1845 flag_this_change(__FUNCTION__,__LINE__,false);//PlottingSetup::RestrictToMassPeak
1846 TCut zptforresponsepresentation("pt<600"&&cutmass&&cutOSSF&&"((sumJetPt[1]/pt)<5.0)");
1847 TH2F *niceresponseplotd = new TH2F("niceresponseplotd","",100,0,600,100,0,5);
1848 (allsamples.collection)[allsamples.FindSample("Data")[0]].events->Draw("sumJetPt[1]/pt:pt>>niceresponseplotd",zptforresponsepresentation);
1849 niceresponseplotd->SetStats(0);
1850 niceresponseplotd->GetXaxis()->SetTitle("Z p_{T} [GeV]");
1851 niceresponseplotd->GetYaxis()->SetTitle("Response");
1852 niceresponseplotd->GetXaxis()->CenterTitle();
1853 niceresponseplotd->GetYaxis()->CenterTitle();
1854 niceresponseplotd->Draw("COLZ");
1855 TProfile * profd = (TProfile*)niceresponseplotd->ProfileX();
1856 profd->SetMarkerSize(DataMarkerSize);
1857 profd->Fit("pol0","","same,e1",30,400);
1858 DrawPrelim();
1859 TText* title = write_text(0.5,0.7,"Data");
1860 title->SetTextAlign(12);
1861 title->Draw();
1862 TF1 *datapol=(TF1*)profd->GetFunction("pol0");
1863 float datacorrection=datapol->GetParameter(0);
1864 stringstream dataresstring;
1865 dataresstring<<"Response: "<<std::setprecision(2)<<100*datacorrection<<" %";
1866 TText* restitle = write_text(0.5,0.65,dataresstring.str());
1867 restitle->SetTextAlign(12);
1868 restitle->SetTextSize(0.03);
1869 restitle->Draw();
1870 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_Data");
1871
1872 TH2F *niceresponseplotm = new TH2F("niceresponseplotm","",100,0,600,100,0,5);
1873 (allsamples.collection)[allsamples.FindSample("DY")[0]].events->Draw("sumJetPt[1]/pt:pt>>niceresponseplotm",zptforresponsepresentation);
1874 niceresponseplotm->SetStats(0);
1875 niceresponseplotm->GetXaxis()->SetTitle("Z p_{T} [GeV]");
1876 niceresponseplotm->GetYaxis()->SetTitle("Response");
1877 niceresponseplotm->GetXaxis()->CenterTitle();
1878 niceresponseplotm->GetYaxis()->CenterTitle();
1879 niceresponseplotm->Draw("COLZ");
1880 (allsamples.collection)[allsamples.FindSample("DY")[0]].events->Draw("sumJetPt[1]/pt:pt",zptforresponsepresentation,"PROF,same");
1881 TProfile * profm = (TProfile*)niceresponseplotm->ProfileX();
1882 profm->SetMarkerSize(DataMarkerSize);
1883 profm->Fit("pol0","","same,e1",30,400);
1884 DrawMCPrelim();
1885 title = write_text(0.5,0.7,"MC simulation");
1886 title->SetTextAlign(12);
1887 title->Draw();
1888 TF1 *mcpol=(TF1*)profm->GetFunction("pol0");
1889 float mccorrection=mcpol->GetParameter(0);
1890 stringstream mcresstring;
1891 mcresstring<<"Response: "<<std::setprecision(2)<<100*mccorrection<<" %";
1892 TText* mcrestitle = write_text(0.5,0.65,mcresstring.str());
1893 mcrestitle->SetTextAlign(12);
1894 mcrestitle->SetTextSize(0.03);
1895 mcrestitle->Draw();
1896 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_MC");
1897
1898
1899 //Step 2: Getting the result
1900 // TCut zptcutforresponse("pt>30&&pt<300&&TMath::Abs(91.2-mll)<20&&id1==id2&&(ch1*ch2<0)");
1901 stringstream jzbvardatas;
1902 if(datacorrection>1) jzbvardatas<<"(jzb[1]-"<<datacorrection-1<<"*pt)";
1903 if(datacorrection<1) jzbvardatas<<"(jzb[1]+"<<1-datacorrection<<"*pt)";
1904 jzbvardata=jzbvardatas.str();
1905 stringstream jzbvarmcs;
1906 if(mccorrection>1) jzbvarmcs<<"(jzb[1]-"<<mccorrection-1<<"*pt)";
1907 if(mccorrection<1) jzbvarmcs<<"(jzb[1]+"<<1-mccorrection<<"*pt)";
1908 jzbvarmc=jzbvarmcs.str();
1909 dout << "JZB Z pt correction summary : " << endl;
1910 dout << " Data: The response is " << datacorrection << " --> jzb variable is now : " << jzbvardata << endl;
1911 dout << " MC : The response is " << mccorrection << " --> jzb variable is now : " << jzbvarmc << endl;
1912 }
1913
1914 void pick_up_events(string cut) {
1915 dout << "Picking up events with cut " << cut << endl;
1916 allsamples.PickUpEvents(cut);
1917 }
1918
1919 void save_template(string mcjzb, string datajzb,vector<float> jzb_cuts,float MCPeakError) {
1920 dout << "Saving configuration template!" << endl;
1921 ofstream configfile;
1922 configfile.open("../DistributedModelCalculations/last_configuration.C");
1923 configfile<<"#include <iostream>\n";
1924 configfile<<"#include <vector>\n";
1925 configfile<<"#ifndef SampleClassLoaded\n";
1926 configfile<<"#include \"SampleClass.C\"\n";
1927 configfile<<"#endif\n";
1928 configfile<<"#define SetupLoaded\n";
1929 configfile<<"#ifndef ResultLibraryClassLoaded\n";
1930 configfile<<"#include \"ResultLibraryClass.C\"\n";
1931 configfile<<"#endif\n";
1932
1933 configfile<<"\nusing namespace std;\n\n";
1934
1935 configfile<<"namespace PlottingSetup { \n";
1936 configfile<<"string datajzb=\"datajzb_ERROR\";\n";
1937 configfile<<"string mcjzb=\"mcjzb_ERROR\";\n";
1938 configfile<<"vector<float>jzb_cuts;\n";
1939 configfile<<"float MCPeakError=-999;\n";
1940 configfile<<"}\n\n";
1941
1942 configfile<<"void read_config() {\n";
1943 configfile<<"datajzb=\""<<datajzb<<"\";\n";
1944 configfile<<"mcjzb=\""<<mcjzb<<"\";\n\n";
1945 configfile<<"\n\nMCPeakError="<<MCPeakError<<";\n\n";
1946 for(int i=0;i<jzb_cuts.size();i++) configfile<<"jzb_cuts.push_back("<<jzb_cuts[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1947 configfile<<"\n\n";
1948 for(int i=0;i<Nobs.size();i++) configfile<<"Nobs.push_back("<<Nobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1949 for(int i=0;i<Npred.size();i++) configfile<<"Npred.push_back("<<Npred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1950 for(int i=0;i<Nprederr.size();i++) configfile<<"Nprederr.push_back("<<Nprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1951 configfile<<"\n\n";
1952 for(int i=0;i<flippedNobs.size();i++) configfile<<"flippedNobs.push_back("<<flippedNobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1953 for(int i=0;i<flippedNpred.size();i++) configfile<<"flippedNpred.push_back("<<flippedNpred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1954 for(int i=0;i<flippedNprederr.size();i++) configfile<<"flippedNprederr.push_back("<<flippedNprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
1955 configfile<<"\n\n";
1956 configfile<<"luminosity="<<luminosity<<";\n";
1957 configfile<<"RestrictToMassPeak="<<RestrictToMassPeak<<";//defines the type of analysis we're running\n";
1958
1959 configfile<<"\n\ncout << \"Configuration successfully loaded!\" << endl; \n \n } \n \n";
1960
1961 configfile.close();
1962
1963 }
1964
1965 float get_nonzero_minimum(TH1F *histo) {
1966 float min=histo->GetMaximum();
1967 for(int ibin=1;ibin<=histo->GetNbinsX();ibin++) {
1968 float curcont=histo->GetBinContent(ibin);
1969 if(curcont<min&&curcont>0) min=curcont;
1970 }
1971 return min;
1972 }
1973
1974 void draw_all_ttbar_histos(TCanvas *can, vector<TH1F*> histos, string drawoption="", float manualmin=-9) {
1975 can->cd();
1976 float min=1;
1977 float max=histos[0]->GetMaximum();
1978 if(manualmin>=0) min=manualmin;
1979 else {
1980 for(int i=1;i<histos.size();i++) {
1981 float curmin=get_nonzero_minimum(histos[i]);
1982 float curmax=histos[i]->GetMaximum();
1983 if(curmin<min) min=curmin;
1984 if(curmax>max) max=curmax;
1985 }
1986 }
1987 histos[0]->GetYaxis()->SetRangeUser(min,4*max);
1988 histos[0]->Draw(drawoption.c_str());
1989 stringstream drawopt;
1990 drawopt << drawoption << ",same";
1991 for(int i=1;i<histos.size();i++) {
1992 histos[i]->Draw(drawopt.str().c_str());
1993 }
1994 }
1995
1996 void ttbar_sidebands_comparison(string mcjzb, vector<float> binning, string prestring) {
1997 //in the case of the on peak analysis, we compare the 3 control regions to the real value
1998 //in the case of the OFF peak analysis, we compare our control region to the real value
1999 TCut weightbackup=cutWeight;
2000 cutWeight="1.0";
2001 float simulatedlumi = luminosity; //in pb please - adjust to your likings
2002
2003
2004 TH1F *TZem = systsamples.Draw("TZem",mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2005 TH1F *nTZem = systsamples.Draw("nTZem","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2006 TH1F *TSem;
2007 TH1F *nTSem;
2008 TH1F *TZeemm = systsamples.Draw("TZeemm",mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2009 TH1F *nTZeemm = systsamples.Draw("nTZeemm","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2010 TH1F *TSeemm;
2011 TH1F *nTSeemm;
2012
2013 if(PlottingSetup::RestrictToMassPeak) {
2014 TSem = systsamples.Draw("TSem",mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2015 nTSem = systsamples.Draw("nTSem","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2016 TSeemm = systsamples.Draw("TSeemm",mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2017 nTSeemm = systsamples.Draw("nTSeemm","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2018 }
2019
2020 TCanvas *tcan = new TCanvas("tcan","tcan");
2021
2022 tcan->SetLogy(1);
2023
2024 TZeemm->SetLineColor(kBlack);
2025 TZem->SetLineColor(kRed);
2026 TZeemm->SetMarkerColor(kBlack);
2027 TZem->SetMarkerColor(kRed);
2028
2029
2030 if(PlottingSetup::RestrictToMassPeak) {
2031 TSem->SetLineColor(TColor::GetColor("#00A616"));
2032 TSeemm->SetLineColor(kMagenta+2);
2033 TSem->SetMarkerColor(TColor::GetColor("#00A616"));
2034 TSeemm->SetMarkerColor(kMagenta+2);
2035 TSem->SetLineStyle(2);
2036 TSeemm->SetLineStyle(3);
2037 }
2038
2039 vector<TH1F*> histos;
2040 histos.push_back(TZem);
2041 histos.push_back(TZeemm);
2042 if(PlottingSetup::RestrictToMassPeak) {
2043 histos.push_back(TSem);
2044 histos.push_back(TSeemm);
2045 }
2046 draw_all_ttbar_histos(tcan,histos,"histo",0.04);
2047
2048 TLegend *leg = make_legend("MC t#bar{t}",0.6,0.65,false);
2049 leg->AddEntry(TZeemm,"SFZP","l");
2050 leg->AddEntry(TZem,"OFZP","l");
2051 if(PlottingSetup::RestrictToMassPeak) {
2052 leg->AddEntry(TSeemm,"SFSB","l");
2053 leg->AddEntry(TSem,"OFSB","l");
2054 }
2055 leg->Draw("same");
2056 DrawMCPrelim(simulatedlumi);
2057 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison");
2058
2059 TH1F *TZemcopy = (TH1F*)TZem->Clone("TZemcopy");
2060 TH1F *TZeemmcopy = (TH1F*)TZeemm->Clone("TZeemmcopy");
2061 TH1F *TSeemmcopy = (TH1F*)TSeemm->Clone("TSeemmcopy");
2062 TH1F *TSemcopy = (TH1F*)TSem->Clone("TSemcopy");
2063
2064 TZem->Divide(TZeemm);
2065 TZem->SetMarkerStyle(21);
2066 if(PlottingSetup::RestrictToMassPeak) {
2067 TSem->Divide(TZeemm);
2068 TSeemm->Divide(TZeemm);
2069 TSem->SetMarkerStyle(24);
2070 TSeemm->SetMarkerStyle(32);
2071 }
2072
2073 tcan->SetLogy(0);
2074 TZem->GetYaxis()->SetRangeUser(0,2.5);
2075 TZem->GetYaxis()->SetTitle("ratio");
2076 TZem->Draw();
2077 if(PlottingSetup::RestrictToMassPeak) {
2078 TSem->Draw("same");
2079 TSeemm->Draw("same");
2080 }
2081
2082 float linepos=0.25;
2083 if(PlottingSetup::RestrictToMassPeak) linepos=0.25;
2084 TLine *top = new TLine(binning[0],1.0+linepos,binning[binning.size()-1],1.0+linepos);
2085 TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
2086 TLine *bottom = new TLine(binning[0],1.0-linepos,binning[binning.size()-1],1.0-linepos);
2087
2088 top->SetLineColor(kBlue);top->SetLineStyle(2);
2089 bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2090 center->SetLineColor(kBlue);
2091
2092 top->Draw("same");
2093 center->Draw("same");
2094 bottom->Draw("same");
2095
2096 TLegend *leg2 = make_legend("MC t#bar{t}",0.55,0.75,false);
2097 leg2->AddEntry(TZem,"OFZP / SFZP","ple");
2098 if(PlottingSetup::RestrictToMassPeak) {
2099 leg2->AddEntry(TSeemm,"SFSB / SFZP","ple");
2100 leg2->AddEntry(TSem,"OFSB / SFZP","ple");
2101 }
2102 leg2->AddEntry(bottom,"syst. envelope","l");
2103 leg2->SetX1(0.25);leg2->SetX2(0.6);
2104 leg2->SetY1(0.65);
2105
2106 leg2->Draw("same");
2107
2108 DrawMCPrelim(simulatedlumi);
2109 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison_ratio");
2110
2111
2112
2113 ///-------------- second part: only look at the quantity we actually care about!
2114 TH1F *leftsfzp = (TH1F*)nTZeemm->Clone("leftsfzp");
2115 TH1F *rightsfzp = (TH1F*)TZeemmcopy->Clone("rightsfzp");
2116 rightsfzp->Add(leftsfzp,-1);
2117 TH1F *leftofzp = (TH1F*)nTZem->Clone("leftofzp");
2118 TH1F *rightofzp = (TH1F*)TZemcopy->Clone("rightofzp");
2119 rightofzp->Add(leftofzp,-1);
2120 TH1F *leftofsb;
2121 TH1F *rightofsb;
2122 TH1F *leftsfsb;
2123 TH1F *rightsfsb;
2124 if(PlottingSetup::RestrictToMassPeak) {
2125 leftofsb = (TH1F*)nTSem->Clone("leftofsb");
2126 rightofsb = (TH1F*)TSemcopy->Clone("rightofsb");
2127 rightofsb->Add(leftofsb,-1);
2128 leftsfsb = (TH1F*)nTSeemm->Clone("leftsfsb");
2129 rightsfsb = (TH1F*)TSeemmcopy->Clone("rightsfsb");
2130 rightsfsb->Add(leftsfsb,-1);
2131 }
2132
2133 tcan->SetLogy(1);
2134 rightsfzp->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
2135 rightsfzp->GetYaxis()->SetTitle("#deltaJZB / 25 GeV");
2136 rightsfzp->Draw("histo");
2137 rightofzp->Draw("histo,same");
2138 if(PlottingSetup::RestrictToMassPeak) {
2139 rightofsb->Draw("histo,same");
2140 rightsfsb->Draw("histo,same");
2141 }
2142 DrawMCPrelim(simulatedlumi);
2143
2144 TLegend *legA = make_legend("MC t#bar{t}",0.6,0.65,false);
2145 legA->AddEntry(rightsfzp,"SFZP","l");
2146 legA->AddEntry(rightofzp,"OFZP","l");
2147 if(PlottingSetup::RestrictToMassPeak) {
2148 legA->AddEntry(rightofsb,"SFSB","l");
2149 legA->AddEntry(rightsfsb,"OFSB","l");
2150 }
2151 legA->Draw();
2152
2153 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison");
2154
2155 tcan->SetLogy(0);
2156 rightofzp->Divide(rightsfzp);
2157 rightofzp->GetXaxis()->SetRangeUser(0.0,binning[binning.size()-1]);
2158 rightofzp->GetYaxis()->SetRangeUser(0.0,2.0);
2159 rightofzp->GetYaxis()->SetTitle("#deltaJZB ratio");
2160 rightofzp->Draw();
2161 if(PlottingSetup::RestrictToMassPeak) {
2162 rightofsb->Divide(rightsfzp);
2163 rightsfsb->Divide(rightsfzp);
2164 rightofsb->Draw("same");
2165 rightsfsb->Draw("same");
2166 }
2167
2168 TLine *top2 = new TLine(0.0,1.0+linepos,binning[binning.size()-1],1.0+linepos);
2169 TLine *center2 = new TLine(0.0,1.0,binning[binning.size()-1],1.0);
2170 TLine *bottom2 = new TLine(0.0,1.0-linepos,binning[binning.size()-1],1.0-linepos);
2171
2172 top2->SetLineColor(kBlue);top2->SetLineStyle(2);
2173 bottom2->SetLineColor(kBlue);bottom2->SetLineStyle(2);
2174 center2->SetLineColor(kBlue);
2175
2176 top2->Draw("same");
2177 center2->Draw("same");
2178 bottom2->Draw("same");
2179
2180 rightofzp->SetMarkerStyle(21);
2181 if(PlottingSetup::RestrictToMassPeak) {
2182 rightofsb->SetMarkerStyle(24);
2183 rightsfsb->SetMarkerStyle(32);
2184 }
2185
2186 TLegend *leg3 = make_legend("MC t#bar{t}",0.55,0.75,false);
2187 leg3->AddEntry(rightofzp,"OFZP / SFZP","ple");
2188 if(PlottingSetup::RestrictToMassPeak) {
2189 leg3->AddEntry(rightsfsb,"SFSB / SFZP","ple");
2190 leg3->AddEntry(rightofsb,"OFSB / SFZP","ple");
2191 }
2192 leg3->AddEntry(bottom,"syst. envelope","l");
2193 leg3->SetX1(0.25);leg3->SetX2(0.6);
2194 leg3->SetY1(0.65);
2195
2196 leg3->Draw("same");
2197
2198 DrawMCPrelim(simulatedlumi);
2199 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison_ratio");
2200
2201 delete TZem;
2202 delete nTZem;
2203 delete TZeemm;
2204 delete nTZeemm;
2205 if(PlottingSetup::RestrictToMassPeak) {
2206 delete TSem;
2207 delete nTSem;
2208 delete TSeemm;
2209 delete nTSeemm;
2210 }
2211
2212 delete tcan;
2213 cutWeight=weightbackup;
2214 }
2215
2216 void ttbar_sidebands_comparison(string mcjzb, vector<float> jzb_binning) {
2217 vector<float> nicer_binning;
2218 nicer_binning.push_back(-125);
2219 nicer_binning.push_back(-100);
2220 nicer_binning.push_back(-75);
2221 nicer_binning.push_back(-50);
2222 nicer_binning.push_back(-25);
2223 nicer_binning.push_back(0);
2224 nicer_binning.push_back(25);
2225 nicer_binning.push_back(50);
2226 nicer_binning.push_back(75);
2227 nicer_binning.push_back(100);
2228 nicer_binning.push_back(125);
2229 nicer_binning.push_back(150);
2230 nicer_binning.push_back(175);
2231 nicer_binning.push_back(200);
2232 nicer_binning.push_back(230);
2233 nicer_binning.push_back(280);
2234 nicer_binning.push_back(400);
2235 ttbar_sidebands_comparison(mcjzb,nicer_binning, "ttbar/");
2236 }
2237
2238
2239 void zjets_prediction_comparison() {
2240 // Do it without PU re-weighting
2241 float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
2242 stringstream resultsNoPU;
2243
2244 stringstream mcjzbnoPU;
2245 find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,MCSigma,DataSigma,resultsNoPU,false);
2246 if(MCPeakNoPU>0) mcjzbnoPU<<"("<<jzbvariablemc<<"-"<<TMath::Abs(MCPeakNoPU)<<")";
2247 else mcjzbnoPU<<"("<<jzbvariablemc<<"+"<<TMath::Abs(MCPeakNoPU)<<")";
2248
2249 string mcjzb = mcjzbnoPU.str();
2250 dout << "The peak corrected JZB expression for MC without pileup is : " << mcjzb << endl;
2251
2252 TCut weightbackup=cutWeight;
2253 cutWeight="1.0";
2254 float sbg_min=0.;
2255 float sbg_max=100.;
2256 int sbg_nbins=5;
2257 float simulatedlumi = luminosity;//in pb please - adjust to your likings
2258
2259 TCut kPos((mcjzb+">0").c_str());
2260 TCut kNeg((mcjzb+"<0").c_str());
2261 string var( "abs("+mcjzb+")" );
2262
2263 TCut kcut(cutmass&&cutOSSF&&"pfJetGoodNum>2");
2264 TH1F *hJZBpos = systsamples.Draw("hJZBpos",var,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",
2265 kcut&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2266 TH1F *hJZBneg = systsamples.Draw("hJZBneg",var,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",
2267 kcut&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2268 hJZBpos->SetLineColor(kBlack);
2269 hJZBneg->SetLineColor(kRed);
2270
2271 Int_t nbins = 5;
2272 Float_t xmax = 100.;
2273
2274
2275 TCanvas *zcan = new TCanvas("zcan","zcan");
2276 zcan->SetLogy(1);
2277
2278 hJZBpos->Draw("e1");
2279 hJZBneg->Draw("same,hist");
2280 hJZBpos->Draw("same,e1"); // So it's on top...
2281
2282 TLegend *leg = make_legend("MC Z+jets",0.55,0.75,false);
2283 leg->AddEntry(hJZBpos,"Observed","pe");
2284 leg->AddEntry(hJZBneg,"Predicted","l");
2285 leg->Draw("same");
2286 DrawMCPrelim(simulatedlumi);
2287 CompleteSave(zcan,"Systematics/zjets_prediction");
2288
2289 TH1F* hratio = (TH1F*)hJZBpos->Clone("hratio");
2290 hratio->Divide(hJZBneg);
2291
2292 zcan->SetLogy(0);
2293 hratio->GetYaxis()->SetRangeUser(0,2.5);
2294 hratio->GetYaxis()->SetTitle("Observed/Predicted");
2295 hratio->Draw("e1");
2296
2297 TLine *top = new TLine(sbg_min,1.25,sbg_max,1.25);
2298 TLine *center = new TLine(sbg_min,1.0,sbg_max,1.0);
2299 TLine *bottom = new TLine(sbg_min,0.75,sbg_max,0.75);
2300
2301
2302 top->SetLineColor(kBlue);top->SetLineStyle(2);
2303 bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2304 center->SetLineColor(kBlue);
2305
2306 top->Draw("same");
2307 center->Draw("same");
2308 bottom->Draw("same");
2309
2310 TLegend *leg2 = make_legend("MC Z+jets",0.25,0.75,false);
2311 leg2->AddEntry(hratio,"obs / pred","pe");
2312 leg2->AddEntry(bottom,"syst. envelope","l");
2313 leg2->Draw("same");
2314 DrawMCPrelim(simulatedlumi);
2315 CompleteSave(zcan,"Systematics/zjets_prediction_ratio");
2316
2317 delete zcan;
2318 cutWeight=weightbackup;
2319
2320 }
2321
2322
2323
2324 void sideband_assessment(string datajzb, float min=30.0, float max=50.0) {
2325 tout << endl << endl;
2326 stringstream bordercut;
2327 bordercut << "(TMath::Abs(" << datajzb << ")<" << max << ")&&(TMath::Abs(" << datajzb << ")>" << min << ")";
2328 tout << bordercut.str().c_str() << endl;
2329 TH1F *ofsb = allsamples.Draw("ofsb",datajzb,100, 0,100, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
2330 TH1F *ofzp = allsamples.Draw("ofzp",datajzb,100, 0,100, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
2331 float OFSB = ofsb->Integral();
2332 float OFZP = ofzp->Integral();
2333
2334 tout << "\\begin{table}[hbtp]" << endl;
2335 tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
2336 tout << "\\begin{center}" << endl;
2337 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;
2338 tout << "\\begin{tabular}{l|cc}" << endl;
2339 tout << "\\hline" << endl;
2340 tout << "& {\\OFZP} & {\\OFSB} \\\\\\hline" << endl;
2341 tout << "\\#(events) & "<<OFSB<<" & "<<OFZP<<"\\\\ \\hline" << endl;
2342 tout << "\\end{tabular}" << endl;
2343 tout << "\\end{center}" << endl;
2344 tout << "\\end{table}" << endl;
2345
2346
2347 }
2348
2349 void make_table(samplecollection &coll, string jzbexpr, bool is_data, vector<float> jzb_cuts, string subselection="none") {
2350
2351 vector<float> jzbcutprediction;
2352 vector<float> metcutprediction;
2353
2354 vector<float> jzbcutobservation;
2355 vector<float> metcutobservation;
2356
2357 TCanvas *cannie = new TCanvas("cannie","cannie");
2358
2359 for(int icut=0;icut<jzb_cuts.size();icut++) {
2360 float currcut=jzb_cuts[icut];
2361 int nbins=1;float low=currcut;
2362 vector<int> mysample;
2363 if(subselection!="none") mysample=coll.FindSample(subselection);
2364 TH1F *RcorrJZBeemm = coll.Draw("RcorrJZBeemm",jzbexpr,1,currcut,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2365 TH1F *LcorrJZBeemm = coll.Draw("LcorrJZBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2366 TH1F *RcorrJZBem = coll.Draw("RcorrJZBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2367 TH1F *LcorrJZBem = coll.Draw("LcorrJZBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2368
2369 TH1F *RcorrJZBSBem;
2370 TH1F *LcorrJZBSBem;
2371 TH1F *RcorrJZBSBeemm;
2372 TH1F *LcorrJZBSBeemm;
2373
2374 if(PlottingSetup::RestrictToMassPeak) {
2375 RcorrJZBSBem = coll.Draw("RcorrJZBSBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2376 LcorrJZBSBem = coll.Draw("LcorrJZBSBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2377 RcorrJZBSBeemm = coll.Draw("RcorrJZBSBeemm",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2378 LcorrJZBSBeemm = coll.Draw("LcorrJZBSBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2379 }
2380
2381 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2382 if(PlottingSetup::RestrictToMassPeak) {
2383 Bpred->Add(RcorrJZBem,1.0/3.);
2384 Bpred->Add(LcorrJZBem,-1.0/3.);
2385 Bpred->Add(RcorrJZBSBem,1.0/3.);
2386 Bpred->Add(LcorrJZBSBem,-1.0/3.);
2387 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2388 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2389 } else {
2390 Bpred->Add(RcorrJZBem,1.0);
2391 Bpred->Add(LcorrJZBem,-1.0);
2392 }
2393
2394 jzbcutobservation.push_back(RcorrJZBeemm->Integral());
2395 jzbcutprediction.push_back(Bpred->Integral());
2396
2397 delete RcorrJZBeemm;
2398 delete LcorrJZBeemm;
2399 delete RcorrJZBem;
2400 delete LcorrJZBem;
2401 delete RcorrJZBSBem;
2402 delete LcorrJZBSBem;
2403 delete RcorrJZBSBeemm;
2404 delete LcorrJZBSBeemm;
2405
2406 TH1F *MetObs = coll.Draw("MetObs",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
2407 TH1F *MetPred = coll.Draw("MetPred",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
2408
2409 metcutobservation.push_back(MetObs->Integral());
2410 metcutprediction.push_back(MetPred->Integral());
2411 delete MetObs;
2412 delete MetPred;
2413 }//end of cut loop
2414
2415 //prediction part
2416 if(is_data) cout << "Data prediction & ";
2417 if(subselection!="none") cout << subselection << " prediction &";
2418 for(int ij=0;ij<jzb_cuts.size();ij++) cout << jzbcutprediction[ij] << " vs " << metcutprediction[ij] << " & ";
2419
2420 cout << endl;
2421 //observation part
2422 if(is_data) cout << "Data observation & ";
2423 if(subselection!="none") cout << subselection << " observation &";
2424 for(int ij=0;ij<jzb_cuts.size();ij++) cout << jzbcutobservation[ij] << " vs " << metcutobservation[ij] << " & ";
2425 cout << endl;
2426 cout << "_________________________________________________________________" << endl;
2427 delete cannie;
2428 }
2429
2430 void met_jzb_cut(string datajzb, string mcjzb, vector<float> jzb_cut) {
2431 /*we want a table like this:
2432 __________________ 50 | 100 | ...
2433 | Data prediction | a vs b | a vs b | ...
2434 | Data observed | a vs b | a vs b | ...
2435 --------------------------------------
2436 --------------------------------------
2437 | LM4 prediction | a vs b | a vs b | ...
2438 | LM4 observed | a vs b | a vs b | ...
2439 | LM8 prediction | a vs b | a vs b | ...
2440 | LM8 observed | a vs b | a vs b | ...
2441
2442 where a is the result for a jzb cut at X, and b is the result for a met cut at X
2443 */
2444 make_table(allsamples,datajzb, true,jzb_cut,"none");
2445 make_table(signalsamples,mcjzb, false,jzb_cut,"LM4");
2446 make_table(signalsamples,mcjzb, false,jzb_cut,"LM8");
2447 }
2448
2449
2450 //________________________________________________________________________________________
2451 // JZB Efficiency plot (efficiency of passing reco. JZB cut as function of generator JZB cut)
2452 void JZBSelEff(string mcjzb, TTree* events, string informalname, vector<float> jzb_bins) {
2453
2454 float min = 0, max = 400;
2455 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};
2456 int nbins = sizeof(xbins)/sizeof(float)-1;
2457 int markers[] = { 20, 26, 21, 24, 22, 25, 28 };
2458
2459 TH1F* heff = new TH1F("heff", "JZB eff ; generator-level JZB [GeV]; efficiency",nbins,xbins);
2460 TH1F* hgen = new TH1F("hgen", "JZB gen ; generator-level JZB [GeV]; efficiency",nbins,xbins);
2461 TH1F* hreco = new TH1F("hreco","JZB reco ; generator-level JZB [GeV]; efficiency",nbins,xbins);
2462
2463 TCut kgen(genMassCut&&"genZPt>0&&genNjets>2&&abs(genMID)==23"&&cutOSSF);
2464 TCut kreco(cutmass);
2465
2466 TF1* func = new TF1("func","0.5*[2]*(TMath::Erf((x-[1])/[0])+1)",min,max);
2467 func->SetParNames("epsilon","x_{1/2}","sigma");
2468 func->SetParameter(0,50.);
2469 func->SetParameter(1,0.);
2470 func->SetParameter(2,1.);
2471 gStyle->SetOptStat(0);
2472 gStyle->SetOptFit(0);
2473
2474 TCanvas *can = new TCanvas("can","Canvas for JZB Efficiency",600,600);
2475 can->SetGridx(1);
2476 can->SetGridy(1);
2477 TLegend *leg = make_legend("",0.6,0.2,false,0.89,0.5);
2478
2479
2480
2481 for ( int icut=0; icut<jzb_bins.size(); ++icut ) {
2482
2483 ostringstream selection;
2484 selection << mcjzb << ">" << jzb_bins[icut];
2485 TCut ksel(selection.str().c_str());
2486 events->Draw("genJZB>>hgen", kgen&&kreco, "goff");
2487 events->Draw("genJZB>>hreco",kgen&&kreco&&ksel,"goff");
2488
2489 // Loop over steps to get efficiency curve
2490 for ( Int_t iBin = 0; iBin<nbins-1; ++iBin ) {
2491 Float_t eff = hreco->GetBinContent(iBin+1)/hgen->GetBinContent(iBin+1);
2492 heff->SetBinContent(iBin+1,eff);
2493 heff->SetBinError(iBin+1,TMath::Sqrt(eff*(1-eff)/hgen->GetBinContent(iBin+1)));
2494 }
2495
2496 heff->GetXaxis()->SetRangeUser(min, max);
2497 heff->SetMarkerStyle(markers[icut]);
2498 heff->Fit("func","Q+","same");
2499
2500 // Print values
2501 dout << "+++ For " << selection.str() << std::endl;
2502 for ( int i=0; i<func->GetNpar(); ++i )
2503 dout << " " << func->GetParName(i) << " " << func->GetParameter(i) << " \\pm " << func->GetParError(i) << std::endl;
2504 char hname[256]; sprintf(hname,"heff%d",icut);
2505
2506 // Store plot
2507 TH1F* h = (TH1F*)heff->Clone(hname);
2508 if ( icut) h->Draw("same");
2509 else h->Draw();
2510 char htitle[256]; sprintf(htitle,"JZB > %3.0f GeV", jzb_bins[icut]);
2511 leg->AddEntry(h,htitle,"p");
2512
2513 }
2514
2515 leg->Draw();
2516 DrawMCPrelim(0.0);
2517 CompleteSave(can, "Systematics/jzb_efficiency_curve"+informalname );
2518
2519 delete hgen;
2520 delete hreco;
2521 delete heff;
2522 }
2523
2524 //________________________________________________________________________________________
2525 // Calls the above function for each signal sample
2526 void plot_jzb_sel_eff(string mcjzb, samplecollection &signalsamples, vector<float> bins )
2527 {
2528 for (int isignal=0; isignal<signalsamples.collection.size();isignal++) {
2529 dout << "JZB selection efficiency curve: " << std::endl;
2530 JZBSelEff(mcjzb,(signalsamples.collection)[isignal].events,(signalsamples.collection)[isignal].samplename,bins); // Only for some selected samples
2531 }
2532 }
2533
2534 void qcd_plots(string datajzb, string mcjzb, vector<float> bins) {
2535 // What this function aims to do:
2536 // Illustrate cut flow for QCD (requiring only one lepton, requiring etc.)
2537 // 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.
2538 TCanvas *can = new TCanvas("can","can");
2539 TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
2540 kinpad->cd();
2541
2542 string jzb=mcjzb;
2543
2544 float hi=400;
2545 bool use_signal=false;
2546 bool use_data=false;
2547
2548 bool is_data=false;
2549 int nbins=50;//100;
2550 float low=0;
2551 float high=500;
2552 int versok=false;
2553 if(gROOT->GetVersionInt()>=53000) versok=true;
2554
2555 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
2556 TH1F *RcorrJZBeemm = qcdsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2557 TH1F *LcorrJZBeemm = qcdsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2558 TH1F *RcorrJZBem = qcdsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2559 TH1F *LcorrJZBem = qcdsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2560 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
2561 blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
2562 blankback->GetXaxis()->CenterTitle();
2563 blankback->GetYaxis()->CenterTitle();
2564
2565 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2566 TH1F *RcorrJZBSBem;
2567 TH1F *LcorrJZBSBem;
2568 TH1F *RcorrJZBSBeemm;
2569 TH1F *LcorrJZBSBeemm;
2570
2571 TH1F *RcorrJZBeemmNoS;
2572
2573 //these are for the ratio
2574 TH1F *JRcorrJZBeemm = qcdsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2575 TH1F *JLcorrJZBeemm = qcdsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2576 TH1F *JRcorrJZBem = qcdsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2577 TH1F *JLcorrJZBem = qcdsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2578
2579 TH1F *JRcorrJZBSBem;
2580 TH1F *JLcorrJZBSBem;
2581 TH1F *JRcorrJZBSBeemm;
2582 TH1F *JLcorrJZBSBeemm;
2583
2584 if(PlottingSetup::RestrictToMassPeak) {
2585 RcorrJZBSBem = qcdsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2586 LcorrJZBSBem = qcdsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2587 RcorrJZBSBeemm = qcdsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2588 LcorrJZBSBeemm = qcdsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2589
2590 //these are for the ratio
2591 JRcorrJZBSBem = qcdsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2592 JLcorrJZBSBem = qcdsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2593 JRcorrJZBSBeemm = qcdsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2594 JLcorrJZBSBeemm = qcdsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2595
2596 }
2597
2598 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2599
2600 TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
2601 TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
2602
2603 TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2604 TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
2605 if(PlottingSetup::RestrictToMassPeak) {
2606 Bpred->Add(RcorrJZBem,1.0/3.);
2607 Bpred->Add(LcorrJZBem,-1.0/3.);
2608 Bpred->Add(RcorrJZBSBem,1.0/3.);
2609 Bpred->Add(LcorrJZBSBem,-1.0/3.);
2610 Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2611 Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2612
2613 TTbarpred->Scale(1.0/3);
2614 Zjetspred->Add(LcorrJZBem,-1.0/3.);
2615 Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
2616 TTbarpred->Add(RcorrJZBSBem,1.0/3.);
2617 Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
2618 TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
2619
2620 //these are for the ratio
2621 JBpred->Add(JRcorrJZBem,1.0/3.);
2622 JBpred->Add(JLcorrJZBem,-1.0/3.);
2623 JBpred->Add(JRcorrJZBSBem,1.0/3.);
2624 JBpred->Add(JLcorrJZBSBem,-1.0/3.);
2625 JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
2626 JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
2627 } else {
2628 Bpred->Add(RcorrJZBem,1.0);
2629 Bpred->Add(LcorrJZBem,-1.0);
2630
2631 Zjetspred->Add(LcorrJZBem,-1.0);
2632
2633 //these are for the ratio
2634 JBpred->Add(JRcorrJZBem,1.0);
2635 JBpred->Add(JLcorrJZBem,-1.0);
2636 }
2637
2638
2639 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
2640
2641 TLegend *legBpred = make_legend("",0.6,0.55,false);
2642 RcorrJZBeemm->Draw("e1x0,same");
2643 Bpred->Draw("hist,same");
2644 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2645 legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
2646 legBpred->AddEntry(Bpred,"MC predicted","l");
2647 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
2648 if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
2649 legBpred->Draw();
2650 DrawMCPrelim();
2651
2652 //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
2653 string ytitle("ratio");
2654 if ( use_data==1 ) ytitle = "data/pred";
2655 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,"QCD/Bpred",true,use_data!=1,ytitle);
2656
2657 TH1F *allevents = qcdsamples.Draw("allevents","pfJetGoodNum",1,0,100, "internal code", "events", "" ,mc, luminosity);
2658 TH1F *ossf = qcdsamples.Draw("ossf","pfJetGoodNum",1,0,100, "internal code", "events", cutOSSF ,mc, luminosity);
2659 TH1F *osof = qcdsamples.Draw("osof","pfJetGoodNum",1,0,100, "internal code", "events", cutOSOF ,mc, luminosity);
2660 TH1F *njossf = qcdsamples.Draw("njossf","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSSF ,mc, luminosity);
2661 TH1F *njosof = qcdsamples.Draw("njosof","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSOF ,mc, luminosity);
2662
2663 dout << "______________________________________________" << endl;
2664 dout << "QCD contribution: " << endl;
2665 dout << "Total number of events: " << allevents->Integral() << endl;
2666 dout << "OSSF events: " << ossf->Integral() << endl;
2667 dout << "OSOF events: " << osof->Integral() << endl;
2668 dout << "OSSF events with >=3 jets:" << njossf->Integral() << endl;
2669 dout << "OSOF events with >=3 jets:" << njosof->Integral() << endl;
2670 dout << "(note that no mass requirement has been imposed)" << endl;
2671
2672 dout << "______________________________________________" << endl;
2673 dout << "How QCD shows up in the different regions: " << endl;
2674 dout << "OSSF: " << endl;
2675 if(PlottingSetup::RestrictToMassPeak) {
2676 dout << " Z window: \t" << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
2677 dout << " sideband: \t" << RcorrJZBSBeemm->Integral() << " (JZB>0) , " << LcorrJZBSBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBSBeemm->Integral() + LcorrJZBSBeemm->Integral() << endl;
2678 } else {
2679 dout << " " << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
2680 }
2681 dout << "OSOF: " << endl;
2682 if(PlottingSetup::RestrictToMassPeak) {
2683 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
2684 dout << " sideband: \t" << RcorrJZBSBem->Integral() << " (JZB>0) , " << LcorrJZBSBem->Integral() << " (JZB<0) --> total: " << RcorrJZBSBem->Integral() + LcorrJZBSBem->Integral() << endl;
2685 } else {
2686 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
2687 }
2688 dout << "Therefore: " << endl;
2689 if(PlottingSetup::RestrictToMassPeak) {
2690 dout << " Prediction increases by : " << LcorrJZBeemm->Integral() << " + (1.0/3)*(" << RcorrJZBSBeemm->Integral() <<"-"<< LcorrJZBSBeemm->Integral() << ") (SFSB) ";
2691 dout << " + (1.0/3)*(" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
2692 dout << " + (1.0/3)*(" << RcorrJZBSBem->Integral() <<"-"<< LcorrJZBSBem->Integral() << ") (OFSB) ";
2693 dout << " = " << LcorrJZBeemm->Integral() + (1.0/3)*(RcorrJZBSBeemm->Integral() - LcorrJZBSBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() + RcorrJZBSBem->Integral() - LcorrJZBSBem->Integral()) << endl;
2694 } else {
2695 dout << " Prediction increases by : " << LcorrJZBeemm->Integral();
2696 dout << " + (" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
2697 dout << " = " << LcorrJZBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() << endl;
2698 }
2699 dout << " Observation increases by : " << RcorrJZBeemm->Integral() << endl;
2700
2701 dout << endl;
2702 for(int i=0;i<bins.size();i++) {
2703 dout << " JZB > " << bins[i] << " : " << endl;
2704 dout << " Observation increases by : " << RcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
2705 if(PlottingSetup::RestrictToMassPeak) {
2706 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;
2707 } else {
2708 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;
2709 }
2710 }
2711
2712 delete can;
2713 delete allevents;
2714 if(ossf) delete ossf;
2715 if(RcorrJZBem) delete RcorrJZBem;
2716 if(LcorrJZBem) delete LcorrJZBem;
2717 if(RcorrJZBeemm) delete RcorrJZBeemm;
2718 if(LcorrJZBeemm) delete LcorrJZBeemm;
2719 if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBem) delete RcorrJZBSBem;
2720 if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBem) delete LcorrJZBSBem;
2721 if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBeemm) delete RcorrJZBSBeemm;
2722 if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBeemm) delete LcorrJZBSBeemm;
2723 }
2724
2725 void check_ptsanity() {
2726 TCanvas *ptsancan = new TCanvas("ptsancan","ptsancan",600,1800);
2727 TH1F *individualpt1histos[allsamples.collection.size()];
2728 TH1F *individualpt2histos[allsamples.collection.size()];
2729 TH1F *fpt1 = new TH1F("fpt1","fpt1",50,0,50);
2730 fpt1->GetYaxis()->SetRangeUser(0,1);
2731 fpt1->GetXaxis()->SetTitle("p_{T,1}");
2732 fpt1->GetXaxis()->CenterTitle();
2733
2734 TH1F *fpt2 = new TH1F("fpt2","fpt2",50,0,50);
2735 fpt2->GetXaxis()->SetTitle("p_{T,2}");
2736 fpt2->GetXaxis()->CenterTitle();
2737
2738 ptsancan->Divide(1,3);
2739 ptsancan->cd(1);
2740 float maxpt1entry=0;
2741 float maxpt2entry=0;
2742
2743 TLegend *leg = make_legend();
2744 leg->SetX1(0.0);
2745 leg->SetY1(0.0);
2746 leg->SetX2(1.0);
2747 leg->SetY2(1.0);
2748
2749
2750 for(int isample=0;isample<allsamples.collection.size();isample++) {
2751 string nowname=(allsamples.collection)[isample].filename;
2752 cout << "Drawing: " << nowname << " (sample " << isample+1 << " / " << allsamples.collection.size() << ")" << endl;
2753 individualpt1histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt1",50,0,50, "p_{T,1}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
2754 individualpt2histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt2",50,0,50, "p_{T,2}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
2755 individualpt1histos[isample]->SetLineColor(isample+1);
2756 individualpt2histos[isample]->SetLineColor(isample+1);
2757 float currmaxpt1entry=individualpt1histos[isample]->GetMaximum()/individualpt1histos[isample]->Integral();
2758 float currmaxpt2entry=individualpt2histos[isample]->GetMaximum()/individualpt2histos[isample]->Integral();
2759 cout << " pt 1 histo contains; " << individualpt1histos[isample]->Integral() << endl;
2760 cout << " pt 2 histo contains; " << individualpt2histos[isample]->Integral() << endl;
2761 if(currmaxpt1entry>maxpt1entry)maxpt1entry=currmaxpt1entry;
2762 if(currmaxpt2entry>maxpt2entry)maxpt2entry=currmaxpt2entry;
2763 leg->AddEntry(individualpt2histos[isample],((allsamples.collection)[isample].filename).c_str(),"f");
2764 }
2765
2766 fpt1->GetYaxis()->SetRangeUser(0,maxpt1entry);
2767 fpt2->GetYaxis()->SetRangeUser(0,maxpt2entry);
2768
2769 ptsancan->cd(1);
2770 fpt1->Draw();
2771 ptsancan->cd(2);
2772 fpt2->Draw();
2773
2774 for(int isample=0;isample<allsamples.collection.size();isample++) {
2775 ptsancan->cd(1);
2776 individualpt1histos[isample]->DrawNormalized("same,histo");
2777 ptsancan->cd(2);
2778 individualpt2histos[isample]->DrawNormalized("same,histo");
2779 }
2780 ptsancan->cd(3);
2781 leg->Draw();
2782 CompleteSave(ptsancan,"PtSanityCheck");
2783
2784 delete ptsancan;
2785 }
2786
2787 void test() {
2788
2789 TCanvas *testcanv = new TCanvas("testcanv","testcanv");
2790 testcanv->cd();
2791 switch_overunderflow(true);
2792 TH1F *ptdistr = allsamples.Draw("ptdistr","pt1",100,30,200, "p_{T} [GeV]", "events", cutOSSF,data,luminosity);
2793 switch_overunderflow(false);
2794 ptdistr->Draw();
2795 testcanv->SaveAs("test.png");
2796 dout << "HELLO there!" << endl;
2797
2798 }