ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/Plotting_Functions.C
Revision: 1.110
Committed: Wed Dec 7 16:16:28 2011 UTC (13 years, 5 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.109: +48 -24 lines
Log Message:
Several new features: Bpred_Data now has a new version showing the two contributions: Z+Jets and TTbar prediction; several plots now have fixed binning size that makes sense (i.e. 5 GeV bins instead of like 5.2398754839 GeV); enabled SMS signal vs bg plot (loading all SMS zones, and unloading them) [keep in mind that you need to have ScanSampleDirectory set to 'SMS/' in Setup.C for this to work in the first place]

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