ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.6
Committed: Tue Mar 13 17:57:36 2012 UTC (13 years, 1 month ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.5: +32 -0 lines
Log Message:
Added mll plot which essentially just plots the mll distribution for the different signal samples

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