ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.4
Committed: Fri Mar 2 08:37:03 2012 UTC (13 years, 2 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.3: +65 -0 lines
Log Message:
Added check to see if all samples go down to the pt cut; this also serves to see which backgrounds increase/decrease when lowering/raising a pt cut

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