ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/Plotting_Functions.C
Revision: 1.119
Committed: Fri Mar 9 17:06:56 2012 UTC (13 years, 2 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.118: +43 -23 lines
Log Message:
Adapted pred plot for overflow bin

File Contents

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