ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.48
Committed: Wed Aug 15 09:18:07 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.47: +97 -21 lines
Log Message:
Added some kinematic plots as requested, and ZJets estimate study

File Contents

# User Rev Content
1 buchmann 1.1 #include <iostream>
2     #include <vector>
3     #include <sys/stat.h>
4    
5     #include <TCut.h>
6     #include <TROOT.h>
7     #include <TCanvas.h>
8     #include <TMath.h>
9     #include <TColor.h>
10     #include <TPaveText.h>
11     #include <TRandom.h>
12     #include <TH1.h>
13     #include <TH2.h>
14     #include <TF1.h>
15     #include <TSQLResult.h>
16     #include <TProfile.h>
17     #include <TLegendEntry.h>
18    
19     using namespace std;
20    
21     using namespace PlottingSetup;
22    
23     void todo() {
24     dout << "My to do list: " << endl;
25     dout << " - ExperimentalModule::Poisson_ratio_plot : Get the second part to work!" << endl;
26 buchmann 1.5 dout << " - compare_onpeak_offpeak_signal_distributions: Implement this function ... " << endl;
27 buchmann 1.1 dout << "Info : The trigger requirement is currently set to " << (const char*) passtrig << endl;
28 buchmann 1.4 dout << "Info : The pt requirement is currently set to " << (const char*) passtrig << endl;
29     dout << "Info : The mll requirement is currently set to " << (const char*) cutmass << endl;
30     dout << "Info : The lepton requirement is currently set to " << (const char*) leptoncut << endl;
31 buchmann 1.30 dout << "Info : The weight applied to all MC is " << (const char*) cutWeight << endl;
32 buchmann 1.1 }
33    
34 buchmann 1.28
35    
36 fronga 1.40 void find_one_peak_combination(TCut specialcut, float &MCPeak,float &MCPeakError, float &DataPeak, float &DataPeakError, float &MCSigma, float &MCSigmaError, float &DataSigma, float& DataSigmaError, stringstream &result, bool doPUreweighting = true, string saveas="")
37 buchmann 1.1 {
38     // Temporarily switch off PU reweighting, if asked
39     TCut weightbackup=cutWeight;
40     if ( !doPUreweighting ) cutWeight="1.0";
41 buchmann 1.21
42 buchmann 1.24 int nbins=100;
43     if(PlottingSetup::DoBTag) nbins=25;
44    
45 buchmann 1.1 TCanvas *tempcan = new TCanvas("tempcan","Temporary canvas for peak finding preparations");
46 buchmann 1.28 TH1F *rawJZBeemmMC = allsamples.Draw("rawJZBeemmMC",jzbvariablemc,nbins,-50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&specialcut,mc, luminosity);
47     TH1F *rawJZBeemmData = allsamples.Draw("rawJZBeemmData",jzbvariabledata,nbins, -50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&specialcut,data, luminosity);
48     TH1F *rawJZBemMC = allsamples.Draw("rawJZBemMC",jzbvariablemc,nbins,-50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&specialcut,mc, luminosity);
49     TH1F *rawJZBemData = allsamples.Draw("rawJZBemData",jzbvariabledata,nbins, -50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&specialcut,data, luminosity);
50 buchmann 1.1 TH1F *rawttbarjzbeemmMC;
51    
52     if(method==doKM) {
53     //we only need this histo for the KM fitting...
54 buchmann 1.28 rawttbarjzbeemmMC = allsamples.Draw("rawttbarjzbeemmMC",jzbvariablemc,nbins, -50,50, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&specialcut,mc,luminosity,allsamples.FindSample("TTJet"));
55 fronga 1.40 MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,MCSigmaError,method,saveas);
56     DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,DataSigmaError,method,saveas);
57 buchmann 1.28 delete rawttbarjzbeemmMC;
58 buchmann 1.1 }
59     else {
60     TH1F *reducedMC = (TH1F*)rawJZBeemmMC->Clone();
61     TH1F *reducedData = (TH1F*)rawJZBeemmData->Clone();
62     reducedMC->Add(rawJZBemMC,-1);
63     reducedData->Add(rawJZBemData,-1);
64     //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)
65 fronga 1.40 MCPeak=find_peak(reducedMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,MCSigmaError,method,saveas);
66     DataPeak=find_peak(reducedData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,DataSigmaError,method,saveas);
67 buchmann 1.28 delete reducedMC;
68     delete reducedData;
69 buchmann 1.1 }
70    
71     // Revert to original PU reweighting
72     if ( !doPUreweighting ) cutWeight = weightbackup;
73    
74     // MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
75     // DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
76 fronga 1.40 dout << " We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- " << DataSigmaError << endl;
77     result << " We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- " << DataSigmaError << endl;
78     dout << " We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- " << MCSigmaError << endl;
79     result << " We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- " << MCSigmaError << endl;
80 buchmann 1.28 delete rawJZBeemmData;
81     delete rawJZBeemmMC;
82     delete rawJZBemData;
83     delete rawJZBemMC;
84 buchmann 1.1 delete tempcan;
85     }
86    
87 buchmann 1.28 void find_peaks(float &MCPeak,float &MCPeakError, float &DataPeak, float &DataPeakError, stringstream &result, bool doPUreweighting, stringstream &datajzb, stringstream &mcjzb)
88     {
89 buchmann 1.31
90     bool DoInvidualeemmPeaks=false;
91    
92 buchmann 1.28 float mcpeak, datapeak;
93     float mcpeakerr, datapeakerr;
94    
95     float mceepeak,mcmmpeak;
96     float mceepeakerr,mcmmpeakerr;
97    
98     float datammpeak,dataeepeak;
99     float datammpeakerr,dataeepeakerr;
100    
101 fronga 1.40 float mcSigma,mcSigmaError, dataSigma, dataSigmaError;
102 buchmann 1.28
103     dout << "Finding global peak : " << endl;
104 fronga 1.40 find_one_peak_combination(TCut(""),mcpeak,mcpeakerr, datapeak,datapeakerr,mcSigma,mcSigmaError, dataSigma,dataSigmaError,result,doPUreweighting,"");
105 buchmann 1.30
106 buchmann 1.31 if(DoInvidualeemmPeaks) {
107     dout << "Finding peak for electrons : " << endl;
108 fronga 1.40 find_one_peak_combination(TCut("id1==0"),mceepeak,mceepeakerr,dataeepeak,dataeepeakerr,mcSigma,mcSigmaError,dataSigma,dataSigmaError,result,doPUreweighting,"_ele");
109 buchmann 1.31 dout << "Finding peak for muons : " << endl;
110 fronga 1.40 find_one_peak_combination(TCut("id1==1"),mcmmpeak,mcmmpeakerr,datammpeak,datammpeakerr,mcSigma,mcSigmaError,dataSigma,dataSigmaError,result,doPUreweighting,"_mu");
111 buchmann 1.31
112     datajzb << "(" << jzbvariabledata;
113     mcjzb << "(" << jzbvariablemc;
114    
115     if(dataeepeak>0) datajzb << "- (id1==id2)*(id1==0)*" << TMath::Abs(dataeepeak) << " ";
116     else datajzb << "+ (id1==id2)*(id1==0)*" << TMath::Abs(dataeepeak) << " ";
117    
118     if(datammpeak>0) datajzb << "- (id1==id2)*(id1==1)*" << TMath::Abs(datammpeak) << " ";
119     else datajzb << "+ (id1==id2)*(id1==1)*" << TMath::Abs(datammpeak) << " ";
120    
121     if(datapeak>0) datajzb << "- (id1!=id2)*" << TMath::Abs(datapeak) << " ";
122     else datajzb << "+ (id1!=id2)*" << TMath::Abs(datapeak) << " ";
123    
124     datajzb << ")";
125    
126     if(mceepeak>0) mcjzb << "- (id1==id2)*(id1==0)*" << TMath::Abs(mceepeak) << " ";
127     else mcjzb << "+ (id1==id2)*(id1==0)*" << TMath::Abs(mceepeak) << " ";
128    
129     if(mcmmpeak>0) mcjzb << "- (id1==id2)*(id1==1)*" << TMath::Abs(mcmmpeak) << " ";
130     else mcjzb << "+ (id1==id2)*(id1==1)*" << TMath::Abs(mcmmpeak) << " ";
131    
132     if(mcpeak>0) mcjzb << "- (id1!=id2)*" << TMath::Abs(mcpeak) << " ";
133     else mcjzb << "+ (id1!=id2)*" << TMath::Abs(mcpeak) << " ";
134    
135     mcjzb << ")";
136     } else {
137     datajzb << "(" << jzbvariabledata;
138 buchmann 1.33 mcjzb << "(" << jzbvariablemc;
139 buchmann 1.31
140     if(datapeak>0) datajzb << "- " << TMath::Abs(datapeak) << " ";
141     else datajzb << "+ " << TMath::Abs(datapeak) << " ";
142    
143     datajzb << ")";
144    
145     if(mcpeak>0) mcjzb << "- " << TMath::Abs(mcpeak) << " ";
146     else mcjzb << "+ " << TMath::Abs(mcpeak) << " ";
147    
148     mcjzb << ")";
149     }
150 buchmann 1.36
151 buchmann 1.30
152 buchmann 1.28 }
153    
154 fronga 1.40 void make_special_obs_pred_mll_plot(string datajzb, string mcjzb, float jzbthreshold, float binWidth = 5.0) {
155 buchmann 1.11 float min=70.0;
156     float max=115.0;
157     if(!PlottingSetup::RestrictToMassPeak) {
158 buchmann 1.34 min=20;
159 fronga 1.40 max=300;
160 buchmann 1.11 }
161 fronga 1.40 int nbins=int((max-min)/binWidth);
162 buchmann 1.11
163     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
164    
165 buchmann 1.34 stringstream largerzeroS;
166     largerzeroS << "(" << datajzb << ">" << jzbthreshold << ")";
167     TCut largerzeroD(largerzeroS.str().c_str());
168 buchmann 1.11
169     stringstream smallerzeroS;
170 buchmann 1.34 smallerzeroS << "(" << datajzb << "<-" << jzbthreshold << ")";
171     TCut smallerzeroD(smallerzeroS.str().c_str());
172    
173    
174     stringstream largerzeroMS;
175     largerzeroMS << "(" << mcjzb << ">" << jzbthreshold << ")";
176     TCut largerzeroM(largerzeroMS.str().c_str());
177    
178     TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzeroD,data,luminosity);
179     THStack mcRcorrJZBeemm = allsamples.DrawStack("mcRcorrJZBeemm","mll",nbins,min,max, "m_{ll} [GeV}", "events", cutmass&&cutOSSF&&cutnJets&&largerzeroM,mc,luminosity);
180     TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&smallerzeroD,data,luminosity);
181     TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&largerzeroD,data,luminosity);
182     TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&smallerzeroD,data,luminosity);
183 buchmann 1.11
184     TH1F *RcorrJZBSBem;
185     TH1F *LcorrJZBSBem;
186     TH1F *RcorrJZBSBeemm;
187     TH1F *LcorrJZBSBeemm;
188    
189 buchmann 1.16 // TH1F *RcorrJZBeemmNoS;
190 buchmann 1.11
191     if(PlottingSetup::RestrictToMassPeak) {
192 buchmann 1.34 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&largerzeroD,data, luminosity);
193     LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&smallerzeroD,data, luminosity);
194     RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&largerzeroD,data, luminosity);
195     LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&smallerzeroD,data, luminosity);
196 buchmann 1.11 }
197    
198 fronga 1.40 // Separate predictions
199 fronga 1.43 TH1F* SFN = (TH1F*)LcorrJZBeemm->Clone("SFN");
200     TH1F* OFP = (TH1F*)RcorrJZBem->Clone("OFP");
201     TH1F* OFN = (TH1F*)LcorrJZBem->Clone("OFN");
202     if(PlottingSetup::RestrictToMassPeak) {
203     OFP->Scale(1.0/3.0);
204     OFP->Add(RcorrJZBSBem,1.0/3.);
205     OFP->Add(RcorrJZBSBeemm,1.0/3.);
206     OFN->Scale(1.0/3.0);
207     OFN->Add(LcorrJZBSBem,1.0/3.);
208     OFN->Add(LcorrJZBSBeemm,1.0/3.);
209     }
210    
211     TH1F* Bpred = (TH1F*)SFN->Clone("Bpred");
212     Bpred->Add(OFP);
213     Bpred->Add(OFN,-1);
214 buchmann 1.11 Bpred->SetLineColor(kRed);
215    
216 fronga 1.40 RcorrJZBeemm->SetTitleOffset(1.3,"y");
217 buchmann 1.11 RcorrJZBeemm->Draw();
218     mcRcorrJZBeemm.Draw("same");
219     Bpred->Draw("histo,same");
220     RcorrJZBeemm->Draw("same");
221    
222     TLegend *leg = allsamples.allbglegend();
223     leg->SetX1(0.58);
224     leg->AddEntry(RcorrJZBeemm,"observed (data)","l");
225     leg->AddEntry(Bpred,"predicted (data)","l");
226     leg->Draw("same");
227    
228     stringstream saveas;
229     saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold;
230     CompleteSave(ckin,saveas.str());
231 buchmann 1.34
232 fronga 1.40 // Draw all predictions overlayed
233 fronga 1.43 unsigned int w = gStyle->GetHistLineWidth()+1; // Make line a bit wider, since we dash it
234     SFN->SetLineColor(kGreen+2);
235     SFN->SetLineStyle(2);
236     SFN->SetLineWidth(w);
237     OFP->SetLineColor(kBlue+2);
238     OFP->SetLineStyle(2);
239     OFP->SetLineWidth(w);
240     OFN->SetLineColor(kMagenta+2);
241     OFN->SetLineStyle(3);
242     OFN->SetLineWidth(w);
243 buchmann 1.34
244     RcorrJZBeemm->Draw();
245 fronga 1.43 SFN->Draw("histo,same");
246     OFP->Draw("histo,same");
247     OFN->Draw("histo,same");
248 buchmann 1.34 Bpred->Draw("histo,same");
249     RcorrJZBeemm->Draw("same");
250    
251 fronga 1.40 TLegend *leg2 = make_legend("",0.52,0.7);
252     leg2->AddEntry(RcorrJZBeemm,"observed (data)","lp");
253 buchmann 1.34 leg2->AddEntry(Bpred,"predicted (data)","l");
254 fronga 1.43 leg2->AddEntry(SFN, " SF JZB<0","l");
255     leg2->AddEntry(OFN, " OF JZB<0","l");
256     leg2->AddEntry(OFP, " OF JZB>0","l");
257 buchmann 1.34 leg2->Draw("same");
258    
259     saveas.str("");
260     saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold << "_nomc";
261     CompleteSave(ckin,saveas.str());
262    
263 buchmann 1.11 delete RcorrJZBeemm;
264     delete LcorrJZBeemm;
265     delete RcorrJZBem;
266     delete LcorrJZBem;
267     if(PlottingSetup::RestrictToMassPeak) {
268     delete RcorrJZBSBeemm;
269     delete LcorrJZBSBeemm;
270     delete RcorrJZBSBem;
271     delete LcorrJZBSBem;
272     }
273     delete Bpred;
274     delete ckin;
275     }
276    
277 buchmann 1.1 void make_special_mll_plot(int nbins, float min, float max, bool logscale,string xlabel) {
278    
279     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
280    
281     TH1F *datahistoOSSF = allsamples.Draw("datahistoOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,data,luminosity);
282     THStack mcstackOSSF = allsamples.DrawStack("mcstackOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,mc,luminosity);
283     TH1F *datahistoOSOF = allsamples.Draw("datahistoOSOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&cutnJets&&basiccut,data,luminosity);
284    
285     if(logscale) ckin->SetLogy(1);
286     datahistoOSSF->SetMarkerSize(DataMarkerSize);
287     datahistoOSSF->GetXaxis()->SetTitle(xlabel.c_str());
288     datahistoOSSF->GetXaxis()->CenterTitle();
289     datahistoOSSF->GetYaxis()->SetTitle("events");
290     datahistoOSSF->GetYaxis()->CenterTitle();
291     datahistoOSOF->SetMarkerSize(DataMarkerSize);
292     datahistoOSSF->SetMarkerSize(DataMarkerSize);
293     datahistoOSSF->Draw();
294    
295     mcstackOSSF.Draw("same");
296     datahistoOSSF->Draw("same");
297    
298     datahistoOSOF->SetMarkerColor(TColor::GetColor("#FE642E"));
299     datahistoOSOF->SetLineColor(kRed);
300     datahistoOSOF->SetMarkerStyle(21);
301     datahistoOSOF->Draw("same");
302    
303     // Try to re-arrange legend...
304     TLegend *bgleg = allsamples.allbglegend("",datahistoOSSF);
305     TLegend *kinleg = make_legend();
306     kinleg->AddEntry(datahistoOSSF,"SF (data)","p");
307     kinleg->AddEntry(datahistoOSOF,"OF (data)","p");
308     TIter next(bgleg->GetListOfPrimitives());
309     TObject* obj;
310     // Copy the nice bkgd legend skipping the "data"
311 buchmann 1.16 while ( (obj = next()) )
312 buchmann 1.1 if ( strcmp(((TLegendEntry*)obj)->GetObject()->GetName(),"datahistoOSSF") )
313     kinleg->GetListOfPrimitives()->Add(obj);
314    
315     kinleg->Draw();
316     CompleteSave(ckin,"kin/mll_ossf_osof_distribution");
317    
318     delete datahistoOSOF;
319     delete datahistoOSSF;
320     delete ckin;
321     }
322    
323    
324     void draw_ratio_plot(TH1* hdata, THStack& hmc, float ymin=0.5, float ymax=1.5) {
325    
326     // Make a histogram from stack
327     TIter next(hmc.GetHists());
328     TObject* obj;
329     TH1* hratio = NULL;
330 buchmann 1.16 while ( (obj = next()) ) {
331 buchmann 1.1 if ( !hratio ) {
332     hratio = (TH1*)obj->Clone();
333     hratio->SetName("hratio");
334     } else hratio->Add( (TH1*)obj );
335     }
336     hratio->Divide(hdata);
337     hratio->SetMaximum(ymax);
338     hratio->SetMinimum(ymin);
339     hratio->SetMarkerStyle(2);
340     hratio->SetLineWidth(1);
341     hratio->GetYaxis()->SetLabelSize(0.08);
342     hratio->GetXaxis()->SetLabelSize(0.0);
343    
344     TPad* rpad = new TPad("rpad","",0.15,0.73,0.4,0.88);
345     rpad->SetTopMargin(0.0);
346     rpad->SetBottomMargin(0.0);
347     rpad->SetRightMargin(0.0);
348     rpad->Draw();
349     rpad->cd();
350     // hratio->GetXaxis()->SetNdivisions(0);
351     hratio->GetYaxis()->SetNdivisions(502,false);
352     hratio->Draw("e1x0");
353    
354     TF1* oneline = new TF1("","1.0",0,1000);
355     oneline->SetLineColor(kBlue);
356     oneline->SetLineStyle(1);
357     oneline->SetLineWidth(1);
358     oneline->Draw("same");
359     }
360    
361 pablom 1.46 void make_OFSF_plot(string variable, string addcut, string legendTitle, int nbins, float min, float max, bool logscale,
362     string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false, float legendPosition=0.3) {
363    
364     TCut ibasiccut=basiccut;
365     bool draw_separation_lines=false;
366    
367     if(isPF) ibasiccut=basiccut&&"pfjzb[0]>-998";
368    
369     if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
370    
371     TCut cutSF;
372     TCut cutOF;
373    
374     cutOF=cutOSOF&&cutnJets&&ibasiccut;
375     cutSF=cutOSSF&&cutnJets&&ibasiccut;
376    
377    
378     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
379     ckin->SetLogy(logscale);
380     TH1F *datahistoSF = allsamples.Draw("datahistoSF",variable,nbins,min,max, xlabel, "events",cutSF,data,luminosity);
381     TH1F *datahistoOF = allsamples.Draw("datahistoOF",variable,nbins,min,max, xlabel, "events",cutOF,data,luminosity);
382     string signal("LM3");
383     TH1F* signalhisto = new TH1F("signalhisto",signal.c_str(),nbins,min,max);
384     int idx = signalsamples.FindSample(signal)[0];
385     (signalsamples.collection)[idx].events->Project("signalhisto",variable.c_str(),cutSF);
386     signalhisto->Scale((signalsamples.collection)[idx].weight*luminosity);
387     signalhisto->SetLineColor((signalsamples.collection)[idx].samplecolor);
388     datahistoSF->SetMarkerSize(DataMarkerSize);
389     datahistoOF->SetLineColor(kRed);
390    
391     if ( !logscale ) {
392     datahistoSF->SetMinimum(0); // Defaults
393     datahistoOF->SetMinimum(0); // Defaults
394     } else {
395     datahistoSF->SetMinimum(0.5);
396     datahistoOF->SetMinimum(0.5);
397     }
398     if (logscale) {
399     datahistoSF->SetMaximum(5.3*datahistoSF->GetMaximum());
400     datahistoOF->SetMaximum(5.3*datahistoSF->GetMaximum());
401     } else {
402     datahistoSF->SetMaximum(2.0*datahistoSF->GetMaximum());
403     datahistoOF->SetMaximum(2.0*datahistoOF->GetMaximum());
404     }
405    
406     datahistoSF->GetXaxis()->SetTitle(xlabel.c_str());
407     datahistoOF->GetXaxis()->SetTitle(xlabel.c_str());
408     signalhisto->GetXaxis()->SetTitle(xlabel.c_str());
409     datahistoSF->GetYaxis()->SetTitle("N. Events");
410     datahistoOF->GetYaxis()->SetTitle("N. Events");
411     signalhisto->GetYaxis()->SetTitle("N. Events");
412     datahistoSF->GetXaxis()->CenterTitle();
413     datahistoOF->GetXaxis()->CenterTitle();
414     signalhisto->GetXaxis()->CenterTitle();
415     datahistoSF->GetYaxis()->CenterTitle();
416     datahistoOF->GetYaxis()->CenterTitle();
417     signalhisto->GetYaxis()->CenterTitle();
418    
419     TLegend *mleg = new TLegend(0.2+legendPosition, 0.72, 0.55+legendPosition, 0.87, legendTitle.c_str());
420     mleg->SetFillColor(kWhite);
421     mleg->SetTextFont(42);
422     mleg->SetTextSize(0.048);
423     mleg->SetLineWidth(0);
424     mleg->SetBorderSize(0);
425     mleg->AddEntry(datahistoSF, "S. Flavor", "PL");
426     mleg->AddEntry(datahistoOF, "O. Flavor", "L");
427     mleg->AddEntry(signalhisto, "LM3", "L");
428    
429     datahistoSF->Draw("E1");
430     datahistoOF->Draw("HIST,SAMES");
431     signalhisto->Draw("HIST,SAMES");
432     mleg->Draw();
433     DrawPrelim();
434     CompleteSave(ckin, "./SFOF/" + filename);
435    
436     datahistoSF->Delete();
437     datahistoOF->Delete();
438     signalhisto->Delete();
439     delete mleg;
440     delete ckin;
441    
442     }
443    
444    
445    
446 buchmann 1.1 float lastrange_min=0;
447     float lastrange_max=0;
448    
449     void make_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
450     string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
451     // TCut basiccut("(pfJetGoodNum>=2&&pfJetGoodID[0])&&(pfJetGoodNum>=2&&pfJetGoodID[1])&&(passed_triggers||!is_data)");
452     TCut ibasiccut=basiccut;
453     bool draw_separation_lines=false;
454    
455     if(isPF) ibasiccut=basiccut&&"pfjzb[0]>-998";
456    
457     if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
458    
459     //Step 1: Adapt the variable (if we're dealing with PF we need to adapt the variable!)
460     if(isPF) {
461     if(variable=="mll") variable="pfmll[0]";
462     if(variable=="jetpt[0]") variable="pfJetGoodPt[0]";
463     if(variable=="jeteta[0]") variable="pfJetGoodEta[0]";
464     if(variable=="pt") variable="pfpt[0]";
465     if(variable=="pt1") variable="pfpt1[0]";
466     if(variable=="pt2") variable="pfpt2[0]";
467     if(variable=="eta1") variable="pfeta1[0]";
468     if(variable=="jzb[1]") variable="pfjzb[0]";
469     //if(variable=="pfJetGoodNum") variable="pfJetGoodNum"; // pointless.
470     }
471    
472     //Step 2: Refine the cut
473     TCut cut;
474     cut=cutmass&&cutOSSF&&cutnJets&&ibasiccut;
475     if(filename=="nJets") cut=cutmass&&cutOSSF&&ibasiccut;
476 buchmann 1.22 if(filename=="nJets_osof") cut=cutmass&&cutOSOF&&ibasiccut;
477 buchmann 1.1 if(filename=="nJets_nocuts_except_mll_ossf") cut=cutmass&&cutOSSF;
478     if(filename=="mll") {
479     cut=cutOSSF&&cutnJets&&ibasiccut;
480     draw_separation_lines=true;
481     }
482     if(filename=="mll_ee") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==0";
483     if(filename=="mll_osof") {
484     cut=cutOSOF&&cutnJets&&ibasiccut;
485     draw_separation_lines=true;
486     }
487     if(filename=="mll_mm") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==1";
488 buchmann 1.34 if(Contains(filename,"aboveJZB")) cut=cutOSSF&&cutnJets&&ibasiccut;
489     if(Contains(filename,"mll_ee_above")) cut=cut&&"id1==0";
490     if(Contains(filename,"mll_mm_above")) cut=cut&&"id1==1";
491 buchmann 1.11 if(Contains(filename,"mll_osof_aboveJZB")) cut=cutOSOF&&cutnJets&&ibasiccut;
492 buchmann 1.1 if(filename=="mll_inclusive"||filename=="mll_inclusive_highrange") cut=cutOSSF;
493     if(filename=="mll_inclusive_osof") cut=cutOSOF;
494     if(filename=="mll_inclusive_ee") cut=cutOSSF&&"id1==0";
495     if(filename=="mll_inclusive_mm") cut=cutOSSF&&"id1==1";
496     if(filename=="pfJetGoodEta_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
497     if(filename=="pfJetGoodPt_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
498    
499     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
500     ckin->SetLogy(logscale);
501     TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
502     datahisto->SetMarkerSize(DataMarkerSize);
503 fronga 1.40 if ( !logscale ) datahisto->SetMinimum(0); // Defaults
504     else datahisto->SetMinimum(0.5);
505     // Custom max.
506     if(variable=="TMath::Abs(pfJetDphiMet[0])") datahisto->SetMaximum(1.5*datahisto->GetMaximum());
507 buchmann 1.1 if(variable=="pfJetGoodPt[0]") datahisto->SetMaximum(10*datahisto->GetMaximum());
508     if(variable=="pt") datahisto->SetMaximum(10*datahisto->GetMaximum());
509 buchmann 1.22 if(filename=="mll_inclusive"||filename=="mll_inclusive_mm"||filename=="mll_inclusive_ee") datahisto->SetMinimum(1);
510 buchmann 1.1 if(filename=="mll_osof") datahisto->SetMaximum(10*datahisto->GetMaximum());
511     if(filename=="mll_osof") datahisto->SetMinimum(9);
512 fronga 1.40 if (logscale) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
513     else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
514    
515 buchmann 1.48 cout << "******** Cut used : " << (const char*) cut << endl;
516 buchmann 1.1 if(loadlastminmax) {
517     datahisto->SetMinimum(lastrange_min);
518     datahisto->SetMaximum(lastrange_max);
519     if(logscale) {
520     datahisto->SetMinimum(pow(10,lastrange_min));
521     datahisto->SetMaximum(pow(10,lastrange_max));
522     }
523     }
524    
525 fronga 1.40 // Draw signal by hand (for some reason I don't manage to use the sample class: it adds it to the stack!)
526     string signal("LM3");
527     TH1F* signalhisto = new TH1F("signalhisto",signal.c_str(),nbins,min,max);
528     int idx = signalsamples.FindSample(signal)[0];
529     (signalsamples.collection)[idx].events->Project("signalhisto",variable.c_str(),cut);
530     signalhisto->Scale((signalsamples.collection)[idx].weight*luminosity);
531 fronga 1.42 signalhisto->SetLineColor(kOrange);
532 fronga 1.40
533     THStack mcstack = allsamples.DrawStack("mcstack", variable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
534     datahisto->Draw("e1");
535     ckin->Update();
536 buchmann 1.1 mcstack.Draw("same");
537 fronga 1.40
538 buchmann 1.1 datahisto->Draw("same,e1");
539     TLegend *kinleg = allsamples.allbglegend();
540     kinleg->Draw();
541     if(filename=="mll_osof") {
542     kinleg->SetHeader("Opposite flavor");
543     kinleg->SetX1(0.58);
544     }
545     if(filename=="mll") {
546     kinleg->SetHeader("Same flavor");
547     kinleg->SetX1(0.58);
548     }
549     TText* write_cut = write_cut_on_canvas(decipher_cut(cut,basicqualitycut));
550     write_cut->Draw();
551     TText* write_variable = write_text(0.99,0.01,variable);
552     write_variable->SetTextAlign(31);
553     write_variable->SetTextSize(0.02);
554    
555     TLine *lowerboundary;
556     TLine *upperboundary;
557    
558     if(RestrictToMassPeak&&draw_separation_lines) {
559     Color_t linecolor=kBlue;
560     float linemin=pow(10,ckin->GetUymin());
561     if(filename=="mll_osof") linemin=pow(10,lastrange_min);
562     lowerboundary = new TLine(71,linemin,71,datahisto->GetMaximum());
563     upperboundary = new TLine(111,linemin,111,datahisto->GetMaximum());
564     lowerboundary->SetLineColor(linecolor);
565     lowerboundary->SetLineStyle(2);
566     upperboundary->SetLineColor(linecolor);
567     upperboundary->SetLineStyle(2);
568     }
569    
570     lastrange_min=ckin->GetUymin();
571     lastrange_max=ckin->GetUymax();
572    
573    
574     if ( plotratio ) {
575     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
576     kinpad->cd();
577     kinpad->SetLogy(logscale);
578     datahisto->Draw("e1");
579     mcstack.Draw("same");
580 fronga 1.40 signalhisto->Draw("same");
581 buchmann 1.1 datahisto->Draw("same,e1");
582     datahisto->Draw("same,axis");
583     if(RestrictToMassPeak&&draw_separation_lines) {
584     lowerboundary->Draw("same");
585     upperboundary->Draw("same");
586     }
587    
588 fronga 1.42 kinleg->AddEntry("signalhisto",signal.c_str(),"l");
589 buchmann 1.1 kinleg->Draw();
590     write_cut->Draw();
591     DrawPrelim();
592     string saveas="kin/"+filename;
593     if(isPF) saveas="kin/"+filename+"__PF";
594     save_with_ratio(datahisto,mcstack,kinpad->cd(),saveas);
595     // if(isPF) CompleteSave(with_ratio,"kin/"+filename+"__PF_withratio");
596     // else CompleteSave(with_ratio,"kin/"+filename+"_withratio");
597     // delete with_ratio;
598     } else {
599     if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
600     else CompleteSave(ckin,"kin/"+filename);
601     }
602     datahisto->Delete();
603     delete ckin;
604     }
605    
606 fronga 1.40 void make_JES_plot(TCut cut, string name) {
607 buchmann 1.1
608     int nbins=10;
609     float min=-0.5;
610     float max = 9.5;
611     bool logscale=true;
612     string xlabel="nJets";
613    
614     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
615     ckin->SetLogy(logscale);
616 fronga 1.40 TH1F *datahisto = allsamples.Draw("datahisto","pfJetGoodNum40",nbins,min,max, xlabel, "events",cut,data,luminosity);
617 buchmann 1.1 datahisto->SetMarkerSize(DataMarkerSize);
618 fronga 1.40 THStack mcstack = allsamples.DrawStack("mcstack","pfJetGoodNum40",nbins,min,max, xlabel, "events",cut,mc,luminosity);
619     TH1F *JESup = allsamples.Draw("JESup","pfJetGoodNum40p1sigma",nbins,min,max, xlabel, "events",cut,mc,luminosity);
620     TH1F *JESdn = allsamples.Draw("JESdn","pfJetGoodNum40n1sigma",nbins,min,max, xlabel, "events",cut,mc,luminosity);
621 buchmann 1.1
622     datahisto->SetMinimum(1);
623     datahisto->SetMaximum(5.3*datahisto->GetMaximum()); // in line with kinematic plots style
624    
625     float xs[nbins],ys[nbins],exs[nbins],eys[nbins];
626     for(int i=1;i<JESup->GetNbinsX();i++) {
627     float up=JESup->GetBinContent(i);
628     float dn=JESdn->GetBinContent(i);
629     xs[i]=JESup->GetBinCenter(i);
630     ys[i]=0.5*(up+dn);
631     exs[i]=0.5*JESup->GetBinWidth(i);
632     eys[i]=0.5*TMath::Abs(up-dn);
633     }
634    
635     TGraphAsymmErrors *JESunc = new TGraphAsymmErrors(nbins, xs,ys,exs,exs,eys,eys);
636     JESunc->SetFillColor(TColor::GetColor("#00ADE1"));
637     JESunc->SetFillStyle(3002);
638     datahisto->Draw("e1");
639     mcstack.Draw("same");
640     JESunc->Draw("2");
641     datahisto->Draw("same,e1");
642     TLegend *kinleg = allsamples.allbglegend();
643     kinleg->AddEntry(JESunc,"JES uncertainty","f");
644     kinleg->Draw();
645 fronga 1.40 CompleteSave(ckin,"Systematics/JES"+name);
646 buchmann 1.1 datahisto->Delete();
647     delete ckin;
648    
649     }
650    
651     void do_kinematic_plots(string mcjzb, string datajzb, bool doPF=false)
652     {
653     bool dolog=true;
654     bool nolog=false;
655     if(doPF) write_warning(__FUNCTION__,"Please use caution when trying to produce PF plots; not all versions of the JZB trees have these variables!");
656 buchmann 1.17 float mll_low=50;
657 buchmann 1.2 float mll_hi=160;
658     if(!PlottingSetup::RestrictToMassPeak) {
659 buchmann 1.26 mll_low=20;
660 fronga 1.40 mll_hi=300;
661 buchmann 1.2 }
662 fronga 1.40
663 buchmann 1.48 /*
664 pablom 1.46 make_OFSF_plot("pfJetGoodNum40", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 5, 3, 8, true, "N. jets", "njetsLow", false, false, false, 0.2);
665     make_OFSF_plot("pfJetGoodNum40", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 5, 3, 8, true, "N. jets", "njetsMed", false, false, false, 0.2);
666     make_OFSF_plot("pfJetGoodPt[0]/pfJetGoodPt[1]", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 20, 1, 10, true, "pt_{j}^{1}/pt_{j}^{2}", "jpt1pt2Low", false, false, false, 0.2);
667     make_OFSF_plot("pfJetGoodPt[0]/pfJetGoodPt[1]", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 20, 1, 10, true, "pt_{j}^{1}/pt_{j}^{2}", "jpt1pt2Med", false, false, false, 0.2);
668     make_OFSF_plot("TMath::Abs(pfJetDphiMet[0])", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "|#Delta#phi(jet1,MET)|", "dphijetmetLow", false, false, false, 0.0);
669     make_OFSF_plot("TMath::Abs(pfJetDphiMet[0])", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "|#Delta#phi(jet1,MET)|", "dphijetmetMed", false, false, false, 0.0);
670     make_OFSF_plot("TMath::Abs(dphi)", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "|#Delta#phi(l1,l2)|", "dphiLow", false, false, false, 0.2);
671     make_OFSF_plot("TMath::Abs(dphi)", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "|#Delta#phi(l1,l2)|", "dphiMed", false, false, false, 0.2);
672     make_OFSF_plot("TMath::Abs(dphiMet1)", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "|#Delta#phi(l1,MET)|", "dphiMet1Low", false, false, false, 0.2);
673     make_OFSF_plot("TMath::Abs(dphiMet1)", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "|#Delta#phi(l1,MET)|", "dphiMet1Med", false, false, false, 0.2);
674     make_OFSF_plot("TMath::Abs(dphiMet2)", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "|#Delta#phi(l2,MET)|", "dphiMet2Low", false, false, false, 0.2);
675     make_OFSF_plot("TMath::Abs(dphiMet2)", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "|#Delta#phi(l2,MET)|", "dphiMet2Med", false, false, false, 0.2);
676     make_OFSF_plot("TMath::Min(TMath::Abs(dphiMet1), TMath::Abs(dphiMet2))", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "Min(|#Delta#phi(l,MET)|)", "dphilcLow", false, false, false, 0.2);
677     make_OFSF_plot("TMath::Min(TMath::Abs(dphiMet1), TMath::Abs(dphiMet2))", "mll>40&&mll<70&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "Min(|#Delta#phi(l,MET)|)", "dphilcMed", false, false, false, 0.2);
678     make_OFSF_plot("TMath::Min(TMath::Abs(pfJetDphiMet[0]), TMath::Min(TMath::Abs(pfJetDphiMet[1]), TMath::Abs(pfJetDphiMet[2])))", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "Min(|#Delta#phi(jet,MET)|)", "dphijcLow", false, false, false, 0.2);
679     make_OFSF_plot("TMath::Min(TMath::Abs(pfJetDphiMet[0]), TMath::Min(TMath::Abs(pfJetDphiMet[1]), TMath::Abs(pfJetDphiMet[2])))", "mll>20&&mll<40&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "Min(|#Delta#phi(jet,MET)|)", "dphijcMed", false, false, false, 0.2);
680     make_OFSF_plot("TMath::Min((TMath::Pi()-TMath::Abs(dphiMet1)), (TMath::Pi() - TMath::Abs(dphiMet2)))", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "Min(#Pi - |#Delta#phi(l,MET)|)", "dphilcoLow", false, false, false, 0.2);
681     make_OFSF_plot("TMath::Min((TMath::Pi()-TMath::Abs(dphiMet1)), (TMath::Pi() - TMath::Abs(dphiMet2)))", "mll>20&&mll<40&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "Min(#Pi - |#Delta#phi(l,MET)|)", "dphilcoMed", false, false, false, 0.2);
682     make_OFSF_plot("TMath::Min((TMath::Pi()-TMath::Abs(pfJetDphiMet[0])), TMath::Min( (TMath::Pi()-TMath::Abs(pfJetDphiMet[1])), (TMath::Pi() - TMath::Abs(pfJetDphiMet[2]))))", "mll>20&&mll<40&&met[4]>100", "20 GeV < mll < 40 GeV", 16, 0, 3.2, false, "Min(#Pi - |#Delta#phi(jet,MET)|)", "dphijcoLow", false, false, false, 0.2);
683     make_OFSF_plot("TMath::Min((TMath::Pi()-TMath::Abs(pfJetDphiMet[0])), TMath::Min( (TMath::Pi()-TMath::Abs(pfJetDphiMet[1])), (TMath::Pi() - TMath::Abs(pfJetDphiMet[2]))))", "mll>20&&mll<40&&met[4]>100", "40 GeV < mll < 70 GeV", 16, 0, 3.2, false, "Min(#Pi - |#Delta#phi(jet,MET)|)", "dphijcoMed", false, false, false, 0.2);
684    
685    
686 fronga 1.40 make_kin_plot("met[4]","",70,0,350,dolog,"MET [GeV]","met",doPF,true);
687    
688 buchmann 1.2 make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll",doPF,true);
689     make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof",doPF,true,true);
690     make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee",doPF,true);
691     make_kin_plot("mll","",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm",doPF,true);
692 fronga 1.40 make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive",doPF,true);
693     make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_ee",doPF,true);
694     make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_mm",doPF,true);
695     make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_osof",doPF,true);
696     make_kin_plot("mll","",(int)((350-mll_low))/5,mll_low,350,dolog,"m_{ll} [GeV]","mll_inclusive_highrange",doPF);
697     if(!doPF) make_special_mll_plot((int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]");
698    
699     make_kin_plot("pfJetGoodPt[0]/pfJetGoodPt[1]","",45,1,10,dolog,"pt_{j}^{1}/pt_{j}^{2}","j1j2ratio",doPF,true);
700     make_kin_plot("TMath::Abs(pfJetDphiMet[0])","",32,0,3.2,nolog,"|#Delta#phi(jet1,MET)|","dphiJ1MET",doPF,true);
701    
702     make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets",doPF);
703     make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_osof",doPF);
704     make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_nocuts_except_mll_ossf",doPF);
705    
706 buchmann 1.11 make_kin_plot("numVtx","",(int)(30.5-(-0.5)),-0.5,30.5,nolog,"N(Vtx)","numVtx",doPF);
707 buchmann 1.22 // make_kin_plot("jetpt[0]","",40,0,200,dolog,"leading jet p_{T} [GeV]","pfJetGoodPt_0",doPF);
708     // make_kin_plot("jeteta[0]","",40,-5,5,nolog,"leading jet #eta","pfJetGoodEta_0",doPF);
709 fronga 1.40 make_kin_plot("pt","",50,0,500,dolog,"Z p_{T} [GeV]","Zpt",doPF);
710     make_kin_plot("pt1","",50,0,200,nolog,"p_{T} [GeV]","pt1",doPF);
711     make_kin_plot("pt2","",50,0,200,nolog,"p_{T} [GeV]","pt2",doPF);
712     make_kin_plot("eta1","",40,-3,3,nolog,"#eta_{l}","eta",doPF);
713     make_kin_plot("jzb[1]","",100,-150,200,dolog,"JZB [GeV]","jzb_ossf",doPF);
714 buchmann 1.1 stringstream jzbcut;
715     jzbcut << "((is_data&&("<<datajzb<<")>100)||(!is_data&&("<<mcjzb<<")>100))";
716 buchmann 1.34 make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB100",doPF,true);
717     make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_osof_aboveJZB100",doPF,true);
718     make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_ee_aboveJZB100",doPF,true);
719     make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_mm_aboveJZB100",doPF,true);
720 buchmann 1.11 stringstream jzbcut2;
721     jzbcut2 << "((is_data&&("<<datajzb<<")>150)||(!is_data&&("<<mcjzb<<")>150))";
722 buchmann 1.34 make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB150",doPF,true);
723     make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_osof_aboveJZB150",doPF,true);
724     make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_ee_aboveJZB150",doPF,true);
725     make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_mm_aboveJZB150",doPF,true);
726 buchmann 1.11 stringstream jzbcut3;
727     jzbcut3 << "((is_data&&("<<datajzb<<")>50)||(!is_data&&("<<mcjzb<<")>50))";
728 buchmann 1.34 make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB50",doPF,true);
729     make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_osof_aboveJZB50",doPF,true,true);
730     make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_ee_aboveJZB50",doPF,true);
731     make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_mm_aboveJZB50",doPF,true);
732 fronga 1.40
733     make_kin_plot("mll","met[4]>100",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV] (MET>100GeV)","mll_met100",doPF,true);
734    
735 buchmann 1.34 make_special_obs_pred_mll_plot(datajzb,mcjzb,0);
736     make_special_obs_pred_mll_plot(datajzb,mcjzb,50);
737 fronga 1.40 make_special_obs_pred_mll_plot(datajzb,mcjzb,80);
738 buchmann 1.34 make_special_obs_pred_mll_plot(datajzb,mcjzb,100);
739 fronga 1.40 // make_special_obs_pred_mll_plot(datajzb,mcjzb,150);
740     // make_special_obs_pred_mll_plot(datajzb,mcjzb,200);
741     // make_special_obs_pred_mll_plot(datajzb,mcjzb,250);
742    
743     make_JES_plot(cutmass&&cutOSSF&&basiccut,"_ossf");
744     make_JES_plot(cutmass&&cutOSOF&&basiccut,"_osof");
745 buchmann 1.48 */
746    
747     string regioncut[4] = {"mll>0&&","mll>20&&mll<70&&","mll>70&&mll<110&&","mll>110&&"};
748     string regionname[4] = {"global","lowmass","Zregion","highmass"};
749     bool StoreRatioPlots=false;
750     for(int iregion=0;iregion<4;iregion++) {
751     cout << regionname[iregion] << " : " << regioncut[iregion] << endl;
752    
753     //Z properties
754     make_kin_plot("pt","met[4]>100&&id1==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutOSSF&&cutnJets),40,0,200,dolog,"p_{T}^{ee} [GeV] (MET>100GeV)","Z/ZPT_ee_met100_"+regionname[iregion],doPF,StoreRatioPlots);
755     make_kin_plot("pt","met[4]>100&&id1==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutOSSF&&cutnJets),40,0,200,dolog,"p_{T}^{#mu#mu} [GeV] (MET>100GeV)","Z/ZPT_mm_met100_"+regionname[iregion],doPF,StoreRatioPlots);
756    
757     make_kin_plot("phi","met[4]>100&&id1==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutOSSF&&cutnJets),32,-3.2,3.2,nolog,"#phi^{ee} (MET>100GeV)","Z/ZPhi_ee_met100_"+regionname[iregion],doPF,StoreRatioPlots);
758     make_kin_plot("phi","met[4]>100&&id1==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutOSSF&&cutnJets),32,-3.2,3.2,nolog,"#phi^{#mu#mu} (MET>100GeV)","Z/ZPhi_mm_met100_"+regionname[iregion],doPF,StoreRatioPlots);
759    
760     make_kin_plot("eta","met[4]>100&&id1==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutOSSF&&cutnJets),30,-3.0,3.0,nolog,"#eta^{ee} (MET>100GeV)","Z/ZEta_ee_met100_"+regionname[iregion],doPF,StoreRatioPlots);
761     make_kin_plot("eta","met[4]>100&&id1==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutOSSF&&cutnJets),30,-3.0,3.0,nolog,"#eta^{#mu#mu} (MET>100GeV)","Z/ZEta_mm_met100_"+regionname[iregion],doPF,StoreRatioPlots);
762    
763     // lepton properties
764     make_kin_plot("pt1","met[4]>100&&id1==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),40,0,200,dolog,"p_{T}^{e1} [GeV] (MET>100GeV)","Lepton/LeadingElectronPt_met100_"+regionname[iregion],doPF,StoreRatioPlots);
765     make_kin_plot("pt1","met[4]>100&&id1==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),40,0,200,dolog,"p_{T}^{#mu1} [GeV] (MET>100GeV)","Lepton/LeadingMuonPt_met100_"+regionname[iregion],doPF,StoreRatioPlots);
766     make_kin_plot("pt2","met[4]>100&&id2==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),40,0,200,dolog,"p_{T}^{e2} [GeV] (MET>100GeV)","Lepton/SubLeadingElectronPt_met100_"+regionname[iregion],doPF,StoreRatioPlots);
767     make_kin_plot("pt2","met[4]>100&&id2==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),40,0,200,dolog,"p_{T}^{#mu2} [GeV] (MET>100GeV)","Lepton/SubLeadingMuonPt_met100_"+regionname[iregion],doPF,StoreRatioPlots);
768    
769     make_kin_plot("phi1","met[4]>100&&id1==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),32,-3.2,3.2,nolog,"#phi^{e1} (MET>100GeV)","Lepton/LeadingElectronPhi_met100_"+regionname[iregion],doPF,StoreRatioPlots);
770     make_kin_plot("phi1","met[4]>100&&id1==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),32,-3.2,3.2,nolog,"#phi^{#mu1} (MET>100GeV)","Lepton/LeadingMuonPhi_met100_"+regionname[iregion],doPF,StoreRatioPlots);
771     make_kin_plot("phi2","met[4]>100&&id2==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),32,-3.2,3.2,nolog,"#phi^{e2} (MET>100GeV)","Lepton/SubLeadingElectronPhi_met100_"+regionname[iregion],doPF,StoreRatioPlots);
772     make_kin_plot("phi2","met[4]>100&&id2==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),32,-3.2,3.2,nolog,"#phi^{#mu2} (MET>100GeV)","Lepton/SubLeadingMuonPhi_met100_"+regionname[iregion],doPF,StoreRatioPlots);
773    
774     make_kin_plot("eta1","met[4]>100&&id1==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),30,-3.0,3.0,nolog,"#eta^{e1} (MET>100GeV)","Lepton/LeadingElectronEta_met100_"+regionname[iregion],doPF,StoreRatioPlots);
775     make_kin_plot("eta1","met[4]>100&&id1==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),30,-3.0,3.0,nolog,"#eta^{#mu1} (MET>100GeV)","Lepton/LeadingMuonEta_met100_"+regionname[iregion],doPF,StoreRatioPlots);
776     make_kin_plot("eta2","met[4]>100&&id2==0&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),30,-3.0,3.0,nolog,"#eta^{e2} (MET>100GeV)","Lepton/SubLeadingElectronEta_met100_"+regionname[iregion],doPF,StoreRatioPlots);
777     make_kin_plot("eta2","met[4]>100&&id2==1&&"+regioncut[iregion]+(const char*)TCut(cutmass&&cutnJets),30,-3.0,3.0,nolog,"#eta^{#mu2} (MET>100GeV)","Lepton/SubLeadingMuonEta_met100_"+regionname[iregion],doPF,StoreRatioPlots);
778    
779    
780     }
781 fronga 1.40
782 buchmann 1.1 }
783    
784     void make_comp_plot( string var, string xlabel, string filename, float jzbcut, string mcjzb, string datajzb,
785     int nbins, float xmin, float xmax, bool log,
786     float ymin=0, float ymax=0, bool leftJustified=false ) {
787 fronga 1.40 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- WATCH OUT: the argument in the function changed!
788 buchmann 1.1
789     TCut weightbackup=cutWeight;//backing up the correct weight (restoring below!)
790     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__));
791 fronga 1.40 //if(var=="numVtx") cutWeight=TCut("1.0");
792 buchmann 1.1 TCut jzbData[]= { TCut(TString(datajzb+">"+any2string(jzbcut))),TCut(TString(datajzb+"<-"+any2string(jzbcut))) };
793     TCut jzbMC[] = { TCut(TString(mcjzb+">"+any2string(jzbcut))),TCut(TString(mcjzb+"<-"+any2string(jzbcut))) };
794    
795     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- below: the next ~20 lines changed!
796     int nRegions=4;
797     if(!PlottingSetup::RestrictToMassPeak) {
798     nRegions=2;
799     }
800    
801     string sRegions[] = { "SFZP","OFZP","SFSB","OFSB" };
802     TCut kRegions[] = { cutOSSF&&cutnJets&&cutmass, cutOSOF&&cutnJets&&cutmass,
803     cutOSSF&&cutnJets&&sidebandcut, cutOSOF&&cutnJets&&sidebandcut };
804    
805     //find ymax
806     TH1F *Refdatahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[0]&&jzbData[0],data,luminosity);
807     ymax=int((Refdatahisto->GetMaximum()+2*TMath::Sqrt(Refdatahisto->GetMaximum()))*1.2+0.5);
808     delete Refdatahisto;
809    
810     for ( int iregion=0; iregion<nRegions; ++iregion )
811     for ( int ijzb=0; ijzb<2; ++ijzb ) {
812     TCanvas *ccomp = new TCanvas("ccomp","Comparison plot",600,400);
813     ccomp->SetLogy(log);
814     TH1F *datahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity);
815 fronga 1.40 TH1F *lm3histo = signalsamples.Draw("lm3histo", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb],data,luminosity,signalsamples.FindSample("LM3"));
816 buchmann 1.1 THStack mcstack = allsamples.DrawStack("mcstack",var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb], mc, luminosity);
817     datahisto->SetMarkerSize(DataMarkerSize);
818     if (ymax>ymin) datahisto->SetMaximum(ymax);
819 fronga 1.40 lm3histo->SetLineStyle(2);
820 buchmann 1.1 datahisto->Draw("e1");
821     mcstack.Draw("same");
822     datahisto->Draw("same,e1");
823 fronga 1.40 lm3histo->Draw("hist,same");
824 buchmann 1.1 TLegend *kinleg = allsamples.allbglegend((sRegions[iregion]+(ijzb?"neg":"pos")).c_str());
825     if ( leftJustified ) {
826     Float_t w = kinleg->GetX2()-kinleg->GetX1();
827     kinleg->SetX1(0.2);
828     kinleg->SetX2(0.2+w);
829     }
830 fronga 1.40 kinleg->AddEntry(lm3histo,"LM3","l");
831 buchmann 1.1 kinleg->Draw();
832     TText* write_variable = write_text(0.99,0.01,var);
833     write_variable->SetTextAlign(31);
834     write_variable->SetTextSize(0.02);
835     ccomp->RedrawAxis();
836     CompleteSave(ccomp,"compare/JZBcut_at_"+any2string(jzbcut)+"/"+filename+"/"+filename+sRegions[iregion]+(ijzb?"neg":"pos"));
837     delete datahisto;
838     delete ccomp;
839 fronga 1.40 delete lm3histo;
840 buchmann 1.1 }
841     cutWeight=weightbackup;
842     }
843    
844    
845     void region_comparison_plots(string mcjzb, string datajzb, vector<float> jzb_cuts) {
846     dout << "Creating comparison plots for signal and control regions" << endl;
847     // Compare a few quantities in the signal region and all 7 control regions
848    
849 buchmann 1.33 // switch_overunderflow(true); // switching overflow/underflow bins on
850 buchmann 1.1
851    
852     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- the arguments changed
853 buchmann 1.16 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
854 buchmann 1.1 float jzbcut=jzb_cuts[ijzb]; // Comparison plots are done for this JZB cut
855     float mll_low=50;float mll_high=170;
856     if(!PlottingSetup::RestrictToMassPeak) {
857 fronga 1.40 mll_high=300;
858     mll_low=20;
859 buchmann 1.1 }
860 fronga 1.40 make_comp_plot("pfJetGoodPt[0]/pfJetGoodPt[1]","pt_{j}^{1}/pt_{j}^{2}","j1j2ratio",jzbcut,mcjzb,datajzb,100,0,10,true);
861     make_comp_plot("TMath::Abs(pfJetDphiMet[0])","|#Delta#phi(jet1,MET)|","dphiJ1MET",jzbcut,mcjzb,datajzb,32,0,3.2,false,0,0,true);
862    
863     make_comp_plot("mll","m_{ll} [GeV]","mll",jzbcut,mcjzb,datajzb,56,mll_low,mll_high,false,0,16.);
864 buchmann 1.1 make_comp_plot("met[4]","pfMET [GeV]","pfmet",jzbcut,mcjzb,datajzb,18,0,360,false,0,16.);
865 fronga 1.40 make_comp_plot("pfJetGoodNum40","#(jets)","njets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
866     make_comp_plot("pfJetGoodNumBtag","#(b-jets)","nBjets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
867 buchmann 1.1 make_comp_plot("pt","Z p_{T} [GeV]","Zpt",jzbcut,mcjzb,datajzb,26,0,525,false,0.,21.);
868 fronga 1.40 make_comp_plot("numVtx","#(prim. vertices)","nvtx",jzbcut,mcjzb,datajzb,40,0.,40.,false,0,16.);
869 buchmann 1.1 make_comp_plot("TMath::Abs(dphi)","#Delta#phi(leptons)","dphilep",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
870     make_comp_plot("TMath::Abs(dphi_sumJetVSZ[1])","#Delta#phi(Z,jets)","dphiZjets",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
871 fronga 1.40 make_comp_plot("eta1","#eta_1","eta1",jzbcut,mcjzb,datajzb,10,0.,2.5,false,0,16.);
872     make_comp_plot("eta2","#eta_2","eta2",jzbcut,mcjzb,datajzb,10,0.,2.5,false,0,16.);
873 buchmann 1.1 }
874    
875     switch_overunderflow(false); // switching overflow/underflow bins off
876     }
877    
878    
879    
880     void do_kinematic_PF_plots(string mcjzb, string datajzb)
881     {
882     do_kinematic_plots(mcjzb,datajzb,true);
883     }
884    
885     void signal_bg_comparison()
886     {
887     TCanvas *can = new TCanvas("can","Signal Background Comparison Canvas");
888     can->SetLogy(1);
889    
890     int sbg_nbins=130;
891     float sbg_min=-500; //-110;
892     float sbg_max=800; //jzbHigh;
893    
894     float simulatedlumi=luminosity;//in pb please - adjust to your likings
895    
896 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"));
897 buchmann 1.7 TH1F *JZBplotLM4;
898     if(PlottingSetup::RestrictToMassPeak) JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM4"));
899     else JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM3"));
900 buchmann 1.1 TH1F *JZBplotTtbar = allsamples.Draw("JZBplotTtbar",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("TTJets"));
901    
902     JZBplotTtbar->SetLineColor(allsamples.GetColor("TTJet"));
903     JZBplotZJETs->SetFillColor(allsamples.GetColor("DY"));
904     JZBplotZJETs->SetLineColor(kBlack);
905     JZBplotLM4->SetLineStyle(2);
906     JZBplotZJETs->SetMaximum(JZBplotZJETs->GetMaximum()*5);
907     JZBplotZJETs->SetMinimum(1);
908    
909     JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
910     JZBplotTtbar->SetMinimum(0.01);
911     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
912     JZBplotTtbar->DrawClone("histo");
913     JZBplotZJETs->Draw("histo,same");
914     JZBplotTtbar->SetFillColor(0);
915     JZBplotTtbar->DrawClone("histo,same");
916     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
917     JZBplotLM4->Draw("histo,same");
918    
919    
920     TLegend *signal_bg_comparison_leg2 = make_legend("",0.55,0.75,false);
921     signal_bg_comparison_leg2->AddEntry(JZBplotZJETs,"Z+Jets","f");
922     signal_bg_comparison_leg2->AddEntry(JZBplotTtbar,"t#bar{t}","f");
923 buchmann 1.7 if(PlottingSetup::RestrictToMassPeak) signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM4","f");
924     else signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM3","f");
925 buchmann 1.1 signal_bg_comparison_leg2->Draw();
926     DrawMCPrelim(simulatedlumi);
927     CompleteSave(can,"jzb_bg_vs_signal_distribution");
928    
929     // Define illustrative set of SMS points
930     TCut kSMS1("MassGlu==250&&MassLSP==75");
931     TCut kSMS2("MassGlu==800&&MassLSP==200");
932     TCut kSMS3("MassGlu==1050&&MassLSP==850");
933     TCut kSMS4("MassGlu==1200&&MassLSP==100");
934    
935     //If the scan samples haven't been loaded yet, this is a good point to load them (all of them!)
936     if((scansample.collection).size()<2) define_SMS_sample(false, allsamples, signalsamples, scansample, true); // loading ALL zones for the scans, not only the basic one.
937    
938    
939     TH1F *JZBplotSMS1 = scansample.Draw("JZBplotSMS1",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS1,mc,simulatedlumi,scansample.FindSample("t"));
940     JZBplotSMS1->Scale(JZBplotLM4->Integral()/JZBplotSMS1->Integral());
941    
942     TH1F *JZBplotSMS2 = scansample.Draw("JZBplotSMS2",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS2,mc,simulatedlumi,scansample.FindSample("t"));
943     JZBplotSMS2->Scale(JZBplotLM4->Integral()/JZBplotSMS2->Integral());
944    
945     TH1F *JZBplotSMS3 = scansample.Draw("JZBplotSMS3",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS3,mc,simulatedlumi,scansample.FindSample("t"));
946     JZBplotSMS3->Scale(JZBplotLM4->Integral()/JZBplotSMS3->Integral());
947    
948     TH1F *JZBplotSMS4 = scansample.Draw("JZBplotSMS4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS4,mc,simulatedlumi,scansample.FindSample("t"));
949     JZBplotSMS4->Scale(JZBplotLM4->Integral()/JZBplotSMS4->Integral());
950    
951     // Draw all plots overlaid
952     JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
953     JZBplotTtbar->SetMinimum(0.01);
954     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
955     JZBplotTtbar->DrawClone("histo");
956     JZBplotZJETs->Draw("histo,same");
957     JZBplotTtbar->SetFillColor(0);
958     JZBplotTtbar->DrawClone("histo,same");
959     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
960    
961     JZBplotSMS1->SetLineColor(kRed+1);
962     JZBplotSMS2->SetLineColor(kBlue+1);
963     JZBplotSMS3->SetLineColor(kRed+1);
964     JZBplotSMS4->SetLineColor(kBlue+1);
965     JZBplotSMS3->SetLineStyle(2);
966     JZBplotSMS4->SetLineStyle(2);
967    
968     JZBplotSMS1->Draw("histo,same");
969     JZBplotSMS2->Draw("histo,same");
970     JZBplotSMS3->Draw("histo,same");
971     JZBplotSMS4->Draw("histo,same");
972     JZBplotLM4->SetLineColor(kGreen);JZBplotLM4->Draw("histo,same");
973     TLegend *signal_bg_comparison_leg6 = make_legend("",0.55,0.55,false);
974     signal_bg_comparison_leg6->AddEntry(JZBplotZJETs,"Z+Jets","f");
975     signal_bg_comparison_leg6->AddEntry(JZBplotTtbar,"t#bar{t}","f");
976     signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"","");
977     signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"SMS parameters","");
978     signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"(250,75) [GeV]","f");
979     signal_bg_comparison_leg6->AddEntry(JZBplotSMS2,"(800,200) [GeV]","f");
980     signal_bg_comparison_leg6->AddEntry(JZBplotSMS3,"(1050,850) [GeV]","f");
981     signal_bg_comparison_leg6->AddEntry(JZBplotSMS4,"(1200,100) [GeV]","f");
982     signal_bg_comparison_leg6->AddEntry(JZBplotLM4,"LM4","f");
983     signal_bg_comparison_leg6->Draw();
984     DrawMCPrelim(simulatedlumi);
985     CompleteSave(can,"jzb_bg_vs_signal_distribution_SMS__summary");
986    
987     while((scansample.collection).size() > 1) scansample.RemoveLastSample();
988    
989     }
990    
991     vector<TF1*> do_cb_fit_to_plot(TH1F *histo, float Sigma, float doingfitacrosstheboard=false) {
992     TF1 *BpredFunc = new TF1("BpredFunc",InvCrystalBall,0,1000,5);
993     BpredFunc->SetParameter(0,histo->GetBinContent(1));
994     if(doingfitacrosstheboard) BpredFunc->SetParameter(0,histo->GetMaximum());
995     BpredFunc->SetParameter(1,0.);
996     if(method==1) BpredFunc->SetParameter(2,10*Sigma);//KM
997     else BpredFunc->SetParameter(2,Sigma);//Gaussian based methods
998     if(method==-99) BpredFunc->SetParameter(2,2.0*Sigma);//Kostas
999     BpredFunc->SetParameter(3,1.8);
1000     BpredFunc->SetParameter(4,2.5);
1001     histo->Fit(BpredFunc,"QN0");
1002     BpredFunc->SetLineColor(kBlue);
1003    
1004     TF1 *BpredFuncP = new TF1("BpredFuncP",InvCrystalBallP,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
1005     TF1 *BpredFuncN = new TF1("BpredFuncN",InvCrystalBallN,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
1006    
1007     BpredFuncP->SetParameters(BpredFunc->GetParameters());
1008     BpredFuncP->SetLineColor(kBlue);
1009     BpredFuncP->SetLineStyle(2);
1010    
1011     BpredFuncN->SetParameters(BpredFunc->GetParameters());
1012     BpredFuncN->SetLineColor(kBlue);
1013     BpredFuncN->SetLineStyle(2);
1014    
1015     vector<TF1*> functions;
1016     functions.push_back(BpredFuncN);
1017     functions.push_back(BpredFunc);
1018     functions.push_back(BpredFuncP);
1019     return functions;
1020     }
1021    
1022    
1023     TF1* do_logpar_fit_to_plot(TH1F *osof) {
1024     TCanvas *logpar_fit_can = new TCanvas("logpar_fit_can","Fit canvas for LogPar");
1025     TF1 *logparfunc = new TF1("logparfunc",LogParabola,0,300,3);
1026     TF1 *logparfunc2 = new TF1("logparfunc2",LogParabola,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
1027     TF1 *logparfuncN = new TF1("logparfuncN",LogParabolaN,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
1028     TF1 *logparfuncP = new TF1("logparfuncP",LogParabolaP,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
1029     osof->SetMinimum(0);
1030     osof->Fit(logparfunc,"QR");
1031     osof->Draw();
1032     logparfunc->SetLineWidth(2);
1033     logparfunc2->SetParameters(logparfunc->GetParameters());
1034     logparfuncN->SetParameters(logparfunc->GetParameters());
1035     logparfuncP->SetParameters(logparfunc->GetParameters());
1036     stringstream fitinfo;
1037     fitinfo << "#Chi^{2} / NDF : " << logparfunc->GetChisquare() << " / " << logparfunc->GetNDF();
1038     TText *writefitinfo = write_text(0.8,0.8,fitinfo.str());
1039     writefitinfo->SetTextSize(0.03);
1040     DrawPrelim();
1041     writefitinfo->Draw();
1042     logparfunc->Draw("same");
1043     logparfunc2->Draw("same");
1044     logparfuncN->SetLineStyle(2);
1045     logparfuncP->SetLineStyle(2);
1046     logparfuncN->Draw("same");
1047     logparfuncP->Draw("same");
1048     CompleteSave(logpar_fit_can,"MakingOfBpredFunction/Bpred_Data_LogPar_Fit_To_TTbarPred");
1049     delete logpar_fit_can;
1050     return logparfunc2;
1051     }
1052    
1053     vector<TF1*> do_extended_fit_to_plot(TH1F *prediction, TH1F *Tprediction, TH1F *ossf, TH1F *osof,int isdata) {
1054     /* there are mainly two background contributions: Z+Jets (a) and ttbar (b). So:
1055     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.
1056     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.
1057     Once we have these two components, we use the combined parameters to get the final function and we're done.
1058     */
1059     //Step 1: take the OSSF prediction - OSOF prediction, and fit a crystal ball function to it
1060     TH1F *step1cb = (TH1F*)ossf->Clone("step1cb");
1061     step1cb->Add(osof,-1);
1062     vector<TF1*> functions = do_cb_fit_to_plot(step1cb,PlottingSetup::JZBPeakWidthData);
1063     TF1 *zjetscrystalball = functions[1];
1064    
1065     //Step 2: use the OSOF distribution and look at the [10,100] GeV JZB range, and fit our log parabola
1066     // TH1F *ttbarprediction=(TH1F*)prediction->Clone("ttbarprediction");
1067     // ttbarprediction->Add(ossf,-1);//without the Z+Jets estimate, this is really just the ttbar estimate!
1068     // 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)
1069     TF1 *ttbarlogpar = do_logpar_fit_to_plot(Tprediction);
1070     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1071     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);
1072    
1073    
1074     TF1 *ttbarlogparP = new TF1("ttbarlogparP",LogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
1075     TF1 *ttbarlogparN = new TF1("ttbarlogparN",LogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
1076    
1077     //and now fuse the two!
1078     TF1 *kmlp = new TF1("kmlp", CrystalBallPlusLogParabola, 0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
1079     TF1 *kmlpP= new TF1("kmlpP",CrystalBallPlusLogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
1080     TF1 *kmlpN= new TF1("kmlpN",CrystalBallPlusLogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
1081     double kmlp_pars[10];
1082     for(int i=0;i<5;i++) kmlp_pars[i]=zjetscrystalball->GetParameter(i);
1083     for(int i=0;i<3;i++) kmlp_pars[5+i]=ttbarlogpar->GetParameter(i);
1084     ttbarlogparP->SetParameters(ttbarlogpar->GetParameters());
1085     ttbarlogparN->SetParameters(ttbarlogpar->GetParameters());
1086     kmlp->SetParameters(kmlp_pars);
1087     prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
1088     /*
1089     if you want to start from scratch (without the partial fitting and only fitting the whole thing, some good start values could be :
1090     */
1091     kmlp_pars[0]=kmlp->GetParameter(0);
1092     kmlp_pars[1]=3.6198;
1093     kmlp_pars[2]=16.4664;
1094     kmlp_pars[3]=1.92253;
1095     kmlp_pars[4]=3.56099;
1096     kmlp_pars[5]=5.83;
1097     kmlp_pars[6]=0.000757479;
1098     kmlp_pars[7]=95.6157;
1099     kmlp_pars[8]=0;
1100     kmlp_pars[9]=0;
1101     kmlp->SetParameters(kmlp_pars);
1102     /**/
1103     prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
1104    
1105     kmlpP->SetParameters(kmlp->GetParameters());
1106     kmlpN->SetParameters(kmlp->GetParameters());
1107    
1108     // now that we're done, let's save all of this so we can have a look at it afterwards.
1109     TCanvas *can = new TCanvas("can","Prediction Fit Canvas");
1110     can->SetLogy(1);
1111     prediction->SetMarkerColor(kRed);
1112     prediction->Draw();
1113    
1114     kmlp->SetLineColor(TColor::GetColor("#04B404"));
1115     kmlpP->SetLineColor(TColor::GetColor("#04B404"));
1116     kmlpN->SetLineColor(TColor::GetColor("#04B404"));
1117     kmlp->Draw("same");
1118     kmlpN->SetLineStyle(2);
1119     kmlpP->SetLineStyle(2);
1120     kmlpN->Draw("same");
1121     kmlpP->Draw("same");
1122    
1123     ttbarlogpar->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
1124     ttbarlogpar->Draw("same");
1125     ttbarlogparP->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
1126     ttbarlogparN->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
1127     ttbarlogparP->SetLineStyle(2);
1128     ttbarlogparN->SetLineStyle(2);
1129     ttbarlogparP->Draw("same");
1130     ttbarlogparN->Draw("same");
1131    
1132     functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
1133    
1134     TLegend *analyticalBpredLEG = make_legend("",0.5,0.55);
1135     analyticalBpredLEG->AddEntry(prediction,"predicted","p");
1136     analyticalBpredLEG->AddEntry(functions[1],"Crystal Ball fit","l");
1137     analyticalBpredLEG->AddEntry(functions[0],"1#sigma Crystal Ball fit","l");
1138     analyticalBpredLEG->AddEntry(ttbarlogparN,"TTbar fit","l");
1139     analyticalBpredLEG->AddEntry(ttbarlogpar,"1#sigma TTbar fit","l");
1140     analyticalBpredLEG->AddEntry(kmlp,"Combined function","l");
1141     analyticalBpredLEG->AddEntry(kmlpN,"1#sigma combined function","l");
1142     analyticalBpredLEG->Draw("same");
1143    
1144     if(isdata==0) CompleteSave(can,"MakingOfBpredFunction/Bpred_MC_Analytical_Function_Composition");
1145     if(isdata==1) CompleteSave(can,"MakingOfBpredFunction/Bpred_data_Analytical_Function_Composition");
1146     if(isdata==2) CompleteSave(can,"MakingOfBpredFunction/Bpred_MCBnS_Analytical_Function_Composition");
1147     delete can;
1148    
1149     //and finally: prep return functions
1150     vector<TF1*> return_functions;
1151     return_functions.push_back(kmlpN);
1152     return_functions.push_back(kmlp);
1153     return_functions.push_back(kmlpP);
1154    
1155     return_functions.push_back(ttbarlogparN);
1156     return_functions.push_back(ttbarlogpar);
1157     return_functions.push_back(ttbarlogparP);
1158    
1159     return_functions.push_back(functions[0]);
1160     return_functions.push_back(functions[1]);
1161     return_functions.push_back(functions[2]);
1162    
1163     return return_functions;
1164     }
1165    
1166 buchmann 1.28 void do_prediction_plot(string jzb, TCanvas *globalcanvas, float high, int use_data, bool overlay_signal = false,string subdir="" )
1167 buchmann 1.1 {
1168 buchmann 1.33 // switch_overunderflow(true);
1169 buchmann 1.1 bool is_data=false;
1170     bool use_signal=false;
1171     if(use_data==1) is_data=true;
1172     if(use_data==2) use_signal=true;
1173     int nbins=50;//100;
1174     if(is_data) nbins=50;
1175     float low=0;
1176     float hi=500;
1177 buchmann 1.10
1178 buchmann 1.1 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
1179 buchmann 1.30 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1180     TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1181     TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1182     TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1183 buchmann 1.10
1184 buchmann 1.1 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
1185     blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
1186     blankback->GetXaxis()->CenterTitle();
1187     blankback->GetYaxis()->CenterTitle();
1188    
1189     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
1190     TH1F *RcorrJZBSBem;
1191     TH1F *LcorrJZBSBem;
1192     TH1F *RcorrJZBSBeemm;
1193     TH1F *LcorrJZBSBeemm;
1194    
1195     TH1F *RcorrJZBeemmNoS;
1196    
1197     //these are for the ratio
1198 buchmann 1.10
1199 buchmann 1.30 TH1F *JRcorrJZBeemm = allsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1200     TH1F *JLcorrJZBeemm = allsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1201     TH1F *JRcorrJZBem = allsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1202     TH1F *JLcorrJZBem = allsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1203 buchmann 1.1
1204     TH1F *JRcorrJZBSBem;
1205     TH1F *JLcorrJZBSBem;
1206     TH1F *JRcorrJZBSBeemm;
1207     TH1F *JLcorrJZBSBeemm;
1208    
1209 buchmann 1.30 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);
1210 buchmann 1.1
1211    
1212     if(PlottingSetup::RestrictToMassPeak) {
1213 buchmann 1.30 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1214     LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1215     RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1216     LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1217 buchmann 1.10
1218 buchmann 1.1 //these are for the ratio
1219 buchmann 1.30 JRcorrJZBSBem = allsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1220     JLcorrJZBSBem = allsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
1221     JRcorrJZBSBeemm = allsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1222     JLcorrJZBSBeemm = allsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
1223 buchmann 1.1 }
1224    
1225     TH1F *lm4RcorrJZBeemm;
1226 buchmann 1.30 if(overlay_signal || use_data == 2 || use_data == 1) lm4RcorrJZBeemm = allsamples.Draw("lm4RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,allsamples.FindSample("LM"));
1227 buchmann 1.1
1228     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
1229    
1230     TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
1231     TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
1232    
1233     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
1234     TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
1235 buchmann 1.23
1236 buchmann 1.26 TH1F *BpredSys = new TH1F("Bpredsys","Bpredsys",PlottingSetup::global_ratio_binning.size()-1,&PlottingSetup::global_ratio_binning[0]);
1237 buchmann 1.23 ClearHisto(BpredSys);
1238    
1239 buchmann 1.1 if(PlottingSetup::RestrictToMassPeak) {
1240     Bpred->Add(RcorrJZBem,1.0/3.);
1241     Bpred->Add(LcorrJZBem,-1.0/3.);
1242     Bpred->Add(RcorrJZBSBem,1.0/3.);
1243     Bpred->Add(LcorrJZBSBem,-1.0/3.);
1244     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
1245     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
1246    
1247     TTbarpred->Scale(1.0/3);
1248     Zjetspred->Add(LcorrJZBem,-1.0/3.);
1249     Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
1250     TTbarpred->Add(RcorrJZBSBem,1.0/3.);
1251     Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
1252     TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
1253    
1254     //these are for the ratio
1255     JBpred->Add(JRcorrJZBem,1.0/3.);
1256     JBpred->Add(JLcorrJZBem,-1.0/3.);
1257     JBpred->Add(JRcorrJZBSBem,1.0/3.);
1258     JBpred->Add(JLcorrJZBSBem,-1.0/3.);
1259     JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
1260     JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
1261 buchmann 1.23
1262     //Systematics:
1263 buchmann 1.26 AddSquared(BpredSys,JLcorrJZBeemm,zjetsestimateuncertONPEAK*zjetsestimateuncertONPEAK);
1264     AddSquared(BpredSys,JRcorrJZBem,emuncertONPEAK*emuncertONPEAK*(1.0/9));
1265     AddSquared(BpredSys,JLcorrJZBem,emuncertONPEAK*emuncertONPEAK*(1.0/9));
1266     AddSquared(BpredSys,JRcorrJZBSBem,emsidebanduncertONPEAK*emsidebanduncertONPEAK*(1.0/9));
1267     AddSquared(BpredSys,JLcorrJZBSBem,emsidebanduncertONPEAK*emsidebanduncertONPEAK*(1.0/9));
1268     AddSquared(BpredSys,JRcorrJZBSBeemm,eemmsidebanduncertONPEAK*eemmsidebanduncertONPEAK*(1.0/9));
1269     AddSquared(BpredSys,JLcorrJZBSBeemm,eemmsidebanduncertONPEAK*eemmsidebanduncertONPEAK*(1.0/9));
1270 buchmann 1.1 } else {
1271     Bpred->Add(RcorrJZBem,1.0);
1272     Bpred->Add(LcorrJZBem,-1.0);
1273    
1274     Zjetspred->Add(LcorrJZBem,-1.0);
1275    
1276     //these are for the ratio
1277     JBpred->Add(JRcorrJZBem,1.0);
1278     JBpred->Add(JLcorrJZBem,-1.0);
1279 buchmann 1.23
1280     //Systematics
1281 buchmann 1.26 AddSquared(BpredSys,JLcorrJZBeemm,zjetsestimateuncertOFFPEAK*zjetsestimateuncertOFFPEAK);
1282     AddSquared(BpredSys,JRcorrJZBem,emuncertOFFPEAK*emuncertOFFPEAK);
1283     AddSquared(BpredSys,JLcorrJZBem,emuncertOFFPEAK*emuncertOFFPEAK);
1284 buchmann 1.23
1285 buchmann 1.1 }
1286    
1287 buchmann 1.23 SQRT(BpredSys);
1288 buchmann 1.26 BpredSys->Divide(JBpred);
1289 buchmann 1.23
1290 buchmann 1.1
1291     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
1292     TH1F *Tpred = (TH1F*)RcorrJZBem->Clone("Bpred");
1293     Tpred->Add(LcorrJZBem,-1.0);
1294     if(PlottingSetup::RestrictToMassPeak) {
1295     Tpred->Add(RcorrJZBSBem,1.0);
1296     Tpred->Add(LcorrJZBSBem,-1.0);
1297     Tpred->Add(RcorrJZBSBeemm,1.0);
1298     Tpred->Add(LcorrJZBSBeemm,-1.0);
1299     }
1300    
1301     globalcanvas->cd();
1302     globalcanvas->SetLogy(1);
1303    
1304     RcorrJZBeemm->SetMarkerStyle(20);
1305     RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
1306     RcorrJZBeemm->SetMinimum(0.1);
1307    
1308     Bpred->SetLineColor(kRed);
1309     Bpred->SetStats(0);
1310    
1311     int versok=false;
1312     if(gROOT->GetVersionInt()>=53000) versok=true;
1313    
1314    
1315     if ( overlay_signal || use_data==2 ) lm4RcorrJZBeemm->SetLineColor(TColor::GetColor("#088A08"));
1316     RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
1317    
1318     TLegend *legBpred = make_legend("",0.6,0.55);
1319     TLegend *legBpred2 = make_legend("",0.6,0.55);
1320    
1321    
1322     vector<TF1*> analytical_function;
1323     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1324     kinpad->cd();
1325     kinpad->SetLogy(1);
1326    
1327     string Bpredsaveas="Bpred_Data";
1328     blankback->SetMaximum(5*RcorrJZBeemm->GetMaximum());
1329     blankback->SetMinimum(0.1);
1330     if(use_data!=1) blankback->SetMinimum(0.1);
1331     blankback->Draw();
1332     if(use_data==1)
1333     {
1334 buchmann 1.14 //Bpred->SetLineWidth(3); //paper style.overruled.
1335     //lm4RcorrJZBeemm->SetLineWidth(3); //paper style.overruled.
1336 buchmann 1.1 analytical_function = do_extended_fit_to_plot(Bpred,Tpred,LcorrJZBeemm,LcorrJZBem,is_data);
1337     kinpad->cd();//necessary because the extended fit function creates its own canvas
1338     RcorrJZBeemm->Draw("e1x0,same");
1339    
1340     Bpred->Draw("hist,same");
1341 buchmann 1.14 //analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
1342 buchmann 1.1 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1343 buchmann 1.10 lm4RcorrJZBeemm->Draw("hist,same");
1344 buchmann 1.1 legBpred->AddEntry(RcorrJZBeemm,"observed","p");
1345     legBpred->AddEntry(Bpred,"predicted","l");
1346 buchmann 1.24 // legBpred->AddEntry(analytical_function[1],"predicted fit","l");
1347     // legBpred->AddEntry(analytical_function[2],"stat. uncert.","l");
1348 buchmann 1.34 legBpred->AddEntry(lm4RcorrJZBeemm,(allsamples.collection[allsamples.FindSample("LM")[0]].samplename).c_str(),"l");
1349 buchmann 1.1 legBpred->Draw();
1350     DrawPrelim();
1351    
1352     //this plot shows what the prediction is composed of
1353 buchmann 1.10 TPad *predcomppad = new TPad("predcomppad","predcomppad",0,0,1,1);
1354     float CurrentBpredLineWidth=Bpred->GetLineWidth();
1355     Bpred->SetLineWidth(2);
1356     predcomppad->cd();
1357     predcomppad->SetLogy(1);
1358    
1359     TH1F *jzbnegative = (TH1F*)LcorrJZBeemm->Clone("jzbnegative");
1360     TH1F *sidebandsemu = (TH1F*)Bpred->Clone("sidebandsemu");
1361     sidebandsemu->Add(jzbnegative,-1);
1362    
1363     jzbnegative->SetFillColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
1364     jzbnegative->SetLineColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
1365     sidebandsemu->SetLineColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
1366     sidebandsemu->SetFillColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
1367    
1368 buchmann 1.1 THStack predcomposition("predcomposition","prediction composition");
1369 buchmann 1.10 predcomposition.Add(sidebandsemu);
1370     predcomposition.Add(jzbnegative);
1371 buchmann 1.1 blankback->Draw();
1372     RcorrJZBeemm->Draw("e1x0,same");
1373     predcomposition.Draw("histo,same");//
1374     Bpred->Draw("hist,same");
1375 buchmann 1.10 // analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
1376 buchmann 1.1 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1377 buchmann 1.14 // lm4RcorrJZBeemm->SetLineColor(kOrange+1);
1378 buchmann 1.10 lm4RcorrJZBeemm->SetLineWidth(2);
1379 buchmann 1.14 //lm4RcorrJZBeemm->SetLineWidth(2); // paper style. overruled.
1380 buchmann 1.10 lm4RcorrJZBeemm->Draw("histo,same");
1381 buchmann 1.1 DrawPrelim();
1382 buchmann 1.10 TLegend *speciallegBpred = make_legend("",0.45,0.55);
1383 buchmann 1.14 //TLegend *speciallegBpred = make_legend("",0.35,0.55); // paper style. overruled.
1384 buchmann 1.10 speciallegBpred->AddEntry(RcorrJZBeemm,"Data","pl");
1385     speciallegBpred->AddEntry(Bpred,"Total background","l");
1386     speciallegBpred->AddEntry(jzbnegative,"JZB<0 (data)","f");
1387 buchmann 1.30 if(PlottingSetup::RestrictToMassPeak) speciallegBpred->AddEntry(sidebandsemu,"Sidebands/e#mu (data)","f");
1388     else speciallegBpred->AddEntry(sidebandsemu,"e#mu (data)","f");
1389 buchmann 1.10 // speciallegBpred->AddEntry(lm4RcorrJZBeemmC,"LM4","l");
1390     speciallegBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1391     speciallegBpred->Draw();
1392 buchmann 1.24 save_with_ratio(JRcorrJZBeemm,JBpred,predcomppad,subdir+"Bpred_Data_____PredictionComposition",true,true,"data/pred",BpredSys);
1393 buchmann 1.10
1394     TCanvas *specialcanv = new TCanvas("specialcanv","specialcanv");
1395 buchmann 1.30 specialcanv->SetLogy(1);
1396     // THStack kostack = allsamples.DrawStack("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,!is_data, luminosity,use_signal);
1397 buchmann 1.1 blankback->Draw();
1398 buchmann 1.30 // kostack.Draw("same");
1399     predcomposition.Draw();
1400 buchmann 1.1 Bpred->Draw("hist,same");
1401 buchmann 1.30 //analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
1402 buchmann 1.1 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1403     legBpred->Draw();
1404     DrawPrelim();
1405 buchmann 1.12 CompleteSave(specialcanv,subdir+"Bpred_Data_____PredictionCompositioninMC");
1406 buchmann 1.10 Bpred->SetLineWidth((int)CurrentBpredLineWidth);
1407 buchmann 1.1
1408 buchmann 1.34
1409     //for(int i=1;i<=Bpred->GetNbinsX();i++) cout << Bpred->GetBinLowEdge(i) << ";" << Bpred->GetBinLowEdge(i)+Bpred->GetBinWidth(i) << ";;" << RcorrJZBeemm->GetBinContent(i) << ";" << LcorrJZBeemm->GetBinContent(i) << ";" << RcorrJZBem->GetBinContent(i) << ";" << LcorrJZBem->GetBinContent(i) << endl;
1410    
1411 buchmann 1.10 delete speciallegBpred;
1412 buchmann 1.1 delete Zjetspred;
1413     delete TTbarpred;
1414    
1415     kinpad->cd();
1416     }
1417     if(use_data==0) {
1418     RcorrJZBeemm->Draw("e1x0,same");
1419 buchmann 1.14 //Bpred->SetLineWidth(3); // paper style. overruled.
1420 buchmann 1.1 Bpred->Draw("hist,same");
1421     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1422 buchmann 1.10 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
1423 buchmann 1.18 legBpred->AddEntry(Bpred,"MC predicted","l");
1424 buchmann 1.1 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
1425     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
1426     if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1427     legBpred->Draw();
1428     DrawMCPrelim();
1429     Bpredsaveas="Bpred_MC";
1430     // CompleteSave(globalcanvas,"Bpred_MC"); // done below in save_with_ratio
1431     }
1432     if(use_data==2) {
1433     RcorrJZBeemm->Draw("e1x0,same");
1434 buchmann 1.14 //Bpred->SetLineWidth(3); // paper style. overruled.
1435 buchmann 1.1 Bpred->Draw("hist,same");
1436     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1437 buchmann 1.10 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
1438 buchmann 1.1 legBpred->AddEntry(Bpred,"MC predicted","l");
1439 buchmann 1.10 legBpred2->AddEntry(RcorrJZBeemm,"MC true","p");
1440 buchmann 1.1 legBpred2->AddEntry(Bpred,"MC predicted","l");
1441     {
1442     if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
1443     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
1444     legBpred->Draw();
1445     DrawMCPrelim();
1446     Bpredsaveas="Bpred_MCwithS";
1447     // CompleteSave(globalcanvas,"Bpred_MCwithS"); // done below in save_with_ratio
1448     }
1449     {
1450 buchmann 1.14 //lm4RcorrJZBeemm->SetLineWidth(3); //paper style. overruled.
1451     //RcorrJZBeemmNoS->SetLineWidth(3); //paper style. overruled.
1452     //lm4RcorrJZBeemm->SetLineStyle(2); //paper style. overruled.
1453     //RcorrJZBeemmNoS->SetLineStyle(3); //paper style. overruled.
1454     //lm4RcorrJZBeemm->SetLineColor(kOrange+1); //paper style. overruled.
1455    
1456 buchmann 1.1 RcorrJZBeemmNoS->SetLineStyle(2);
1457     legBpred2->AddEntry(RcorrJZBeemmNoS,"MC B","l");
1458     legBpred2->AddEntry(lm4RcorrJZBeemm,"MC S","l");
1459     legBpred2->Draw();
1460     RcorrJZBeemmNoS->SetLineColor(TColor::GetColor("#61210B"));
1461     RcorrJZBeemmNoS->Draw("histo,same");
1462     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1463     lm4RcorrJZBeemm->Draw("histo,same");
1464     DrawMCPrelim();
1465     Bpredsaveas="Bpred_MCwithS__plus";
1466     // CompleteSave(globalcanvas,"Bpred_MCwithS__plus"); // done below in save_with_ratio
1467     }
1468     }
1469    
1470    
1471     //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
1472     string ytitle("ratio");
1473     if ( use_data==1 ) ytitle = "data/pred";
1474 buchmann 1.8 //save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,Bpredsaveas,true,use_data!=1,ytitle);
1475 fronga 1.41 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,subdir+Bpredsaveas,true,false,ytitle,BpredSys);//not extending the y range anymore up to 4
1476 buchmann 1.1
1477    
1478     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1479 buchmann 1.24 // The part below is meaningless for the offpeak analysis (it's a comparison of the different estimates but there is but one estimate!)
1480 buchmann 1.11 if(PlottingSetup::RestrictToMassPeak) {
1481     TH1F *Bpredem = (TH1F*)LcorrJZBeemm->Clone("Bpredem");
1482     Bpredem->Add(RcorrJZBem);
1483     Bpredem->Add(LcorrJZBem,-1);
1484     TH1F *BpredSBem = (TH1F*)LcorrJZBeemm->Clone("BpredSBem");
1485     BpredSBem->Add(RcorrJZBSBem);
1486     Bpred->Add(LcorrJZBSBem,-1);
1487     TH1F *BpredSBeemm = (TH1F*)LcorrJZBeemm->Clone("BpredSBeemm");
1488     BpredSBeemm->Add(RcorrJZBSBeemm);
1489     BpredSBeemm->Add(LcorrJZBSBeemm,-1.0);
1490     globalcanvas->cd();
1491     globalcanvas->SetLogy(1);
1492    
1493     RcorrJZBeemm->SetMarkerStyle(20);
1494     RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
1495     blankback->Draw();
1496     RcorrJZBeemm->Draw("e1x0,same");
1497     RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
1498    
1499     Bpredem->SetLineColor(kRed+1);
1500     Bpredem->SetStats(0);
1501     Bpredem->Draw("hist,same");
1502    
1503     BpredSBem->SetLineColor(kGreen+2);//TColor::GetColor("#0B6138"));
1504     BpredSBem->SetLineStyle(2);
1505     BpredSBem->Draw("hist,same");
1506    
1507     BpredSBeemm->SetLineColor(kBlue+1);
1508     BpredSBeemm->SetLineStyle(3);
1509     BpredSBeemm->Draw("hist,same");
1510     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
1511    
1512     TLegend *legBpredc = make_legend("",0.6,0.55);
1513     if(use_data==1)
1514     {
1515     legBpredc->AddEntry(RcorrJZBeemm,"observed","p");
1516     legBpredc->AddEntry(Bpredem,"OFZP","l");
1517     legBpredc->AddEntry(BpredSBem,"OFSB","l");
1518     legBpredc->AddEntry(BpredSBeemm,"SFSB","l");
1519     legBpredc->Draw();
1520 buchmann 1.12 CompleteSave(globalcanvas,subdir+"Bpred_Data_comparison");
1521 buchmann 1.11 }
1522     if(use_data==0) {
1523     legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
1524     legBpredc->AddEntry(Bpredem,"MC OFZP","l");
1525     legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
1526     legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
1527     legBpredc->Draw();
1528 buchmann 1.12 CompleteSave(globalcanvas,subdir+"Bpred_MC_comparison");
1529 buchmann 1.11 }
1530     if(use_data==2) {
1531     legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
1532     legBpredc->AddEntry(Bpredem,"MC OFZP","l");
1533     legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
1534     legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
1535     if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
1536     legBpredc->Draw();
1537 buchmann 1.12 CompleteSave(globalcanvas,subdir+"Bpred_MCwithS_comparison");
1538 buchmann 1.11 }
1539     }
1540 buchmann 1.1
1541 buchmann 1.31 TFile *f = new TFile("tester.root","RECREATE");
1542     RcorrJZBeemm->Write();
1543     Bpred->Write();
1544     f->Close();
1545    
1546 buchmann 1.1 delete RcorrJZBeemm;
1547     delete LcorrJZBeemm;
1548     delete RcorrJZBem;
1549     delete LcorrJZBem;
1550    
1551     delete JRcorrJZBeemm;
1552     delete JLcorrJZBeemm;
1553     delete JRcorrJZBem;
1554     delete JLcorrJZBem;
1555    
1556     delete blankback;
1557    
1558 buchmann 1.30 delete BpredSys;
1559 buchmann 1.1 if(PlottingSetup::RestrictToMassPeak) {
1560     delete RcorrJZBSBem;
1561     delete LcorrJZBSBem;
1562     delete RcorrJZBSBeemm;
1563     delete LcorrJZBSBeemm;
1564    
1565     delete JRcorrJZBSBem;
1566     delete JLcorrJZBSBem;
1567     delete JRcorrJZBSBeemm;
1568     delete JLcorrJZBSBeemm;
1569     }
1570     if(overlay_signal || use_data==2) delete lm4RcorrJZBeemm;
1571 buchmann 1.10 switch_overunderflow(false);
1572 buchmann 1.1 }
1573    
1574     void do_prediction_plots(string mcjzb, string datajzb, float DataSigma, float MCSigma, bool overlay_signal ) {
1575     TCanvas *globalcanvas = new TCanvas("globalcanvas","Prediction Canvas");
1576 buchmann 1.28 do_prediction_plot(datajzb,globalcanvas,jzbHigh ,data,overlay_signal);
1577 buchmann 1.14 if ( !PlottingSetup::Approved ) {
1578 buchmann 1.28 do_prediction_plot(mcjzb,globalcanvas,jzbHigh ,mc,overlay_signal);
1579     do_prediction_plot(mcjzb,globalcanvas,jzbHigh ,mcwithsignal,overlay_signal);
1580 buchmann 1.14 } else {
1581     write_info(__FUNCTION__,"You set approved to true, therefore not producing prediction/observation plots for MC with and without signal.");
1582 buchmann 1.15 }
1583 buchmann 1.1 }
1584    
1585     void do_ratio_plot(int is_data,vector<float> binning, string jzb, TCanvas *can, float high=-9999) {
1586     bool do_data=0;
1587     bool dosignal=0;
1588     if(is_data==1) do_data=1;
1589     if(is_data==2) dosignal=1;
1590     TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1591     TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1592     TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1593     TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1594    
1595     TH1F *RcorrJZBSBem;
1596     TH1F *LcorrJZBSBem;
1597     TH1F *RcorrJZBSBeemm;
1598     TH1F *LcorrJZBSbeemm;
1599    
1600     if(PlottingSetup::RestrictToMassPeak) {
1601     RcorrJZBSBem = allsamples.Draw("RcorrJZBSbem",jzb.c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1602     LcorrJZBSBem = allsamples.Draw("LcorrJZBSbem",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,do_data, luminosity,dosignal);
1603     RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSbeemm",jzb.c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1604     LcorrJZBSbeemm = allsamples.Draw("LcorrJZBSbeemm",("-"+jzb).c_str(),binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,do_data, luminosity,dosignal);
1605     }
1606    
1607    
1608    
1609    
1610     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1611     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
1612     if(PlottingSetup::RestrictToMassPeak) {
1613     Bpred->Add(RcorrJZBem,1.0/3);
1614     Bpred->Add(LcorrJZBem,-1.0/3);
1615     Bpred->Add(RcorrJZBSBem,1.0/3);
1616     Bpred->Add(LcorrJZBSBem,-1.0/3);
1617     Bpred->Add(RcorrJZBSBeemm,1.0/3);
1618     Bpred->Add(LcorrJZBSbeemm,-1.0/3);
1619     } else {
1620     Bpred->Add(RcorrJZBem,1.0);
1621     Bpred->Add(LcorrJZBem,-1.0);
1622     }
1623    
1624     can->cd();
1625     can->SetLogy(0);
1626     Bpred->SetLineColor(kRed);
1627     Bpred->SetStats(0);
1628     if(high>0) Bpred->GetXaxis()->SetRangeUser(0,high);
1629     TH1F *JZBratioforfitting=(TH1F*)RcorrJZBeemm->Clone("JZBratioforfitting");
1630     JZBratioforfitting->Divide(Bpred);
1631     TGraphAsymmErrors *JZBratio = histRatio(RcorrJZBeemm,Bpred,is_data,binning,false);
1632    
1633    
1634     JZBratio->SetTitle("");
1635     JZBratio->GetYaxis()->SetRangeUser(0.0,9.0);
1636     // if(is_data==1) JZBratio->GetXaxis()->SetRangeUser(0,jzbHigh );
1637    
1638     TF1 *pol0 = new TF1("pol0","[0]",0,1000);
1639     TF1 *pol0d = new TF1("pol0","[0]",0,1000);
1640     // straightline_fit->SetParameter(0,1);
1641     JZBratioforfitting->Fit(pol0,"Q0R","",0,30);
1642     pol0d->SetParameter(0,pol0->GetParameter(0));
1643    
1644     JZBratio->GetYaxis()->SetTitle("Observed/Predicted");
1645     JZBratio->GetXaxis()->SetTitle("JZB [GeV]");
1646     if ( high>0 ) JZBratio->GetXaxis()->SetRangeUser(0.0,high);
1647     JZBratio->GetYaxis()->SetNdivisions(519);
1648     JZBratio->GetYaxis()->SetRangeUser(0.0,4.0);
1649     JZBratio->GetYaxis()->CenterTitle();
1650     JZBratio->GetXaxis()->CenterTitle();
1651     JZBratio->SetMarkerSize(DataMarkerSize);
1652     JZBratio->Draw("AP");
1653     /////----------------------------
1654     TPaveText *writeresult = new TPaveText(0.15,0.78,0.49,0.91,"blNDC");
1655     writeresult->SetFillStyle(4000);
1656     writeresult->SetFillColor(kWhite);
1657     writeresult->SetTextFont(42);
1658     writeresult->SetTextSize(0.03);
1659     writeresult->SetTextAlign(12);
1660     ostringstream jzb_agreement_data_text;
1661     jzb_agreement_data_text<< setprecision(2) << "mean =" << pol0->GetParameter(0) << " #pm " << setprecision(1) << pol0->GetParError(0);
1662     if(is_data==1) fitresultconstdata=pol0->GetParameter(0);// data
1663     if(is_data==0) fitresultconstmc=pol0->GetParameter(0); // monte carlo, no signal
1664     /* if(is_data) writeresult->AddText("Data closure test");
1665     else writeresult->AddText("MC closure test");
1666     */
1667     writeresult->AddText(jzb_agreement_data_text.str().c_str());
1668     // writeresult->Draw("same");
1669     // pol0d->Draw("same");
1670     TF1 *topline = new TF1("","1.5",0,1000);
1671     TF1 *bottomline = new TF1("","0.5",0,1000);
1672     topline->SetLineColor(kBlue);
1673     topline->SetLineStyle(2);
1674     bottomline->SetLineColor(kBlue);
1675     bottomline->SetLineStyle(2);
1676     // topline->Draw("same");
1677     // bottomline->Draw("same");
1678     TF1 *oneline = new TF1("","1.0",0,1000);
1679     oneline->SetLineColor(kBlue);
1680     oneline->SetLineStyle(1);
1681     oneline->Draw("same");
1682     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.
1683     if(is_data==1) DrawPrelim();
1684     else DrawMCPrelim();
1685     TLegend *leg = new TLegend(0.55,0.75,0.89,0.89);
1686     leg->SetTextFont(42);
1687     leg->SetTextSize(0.04);
1688     // if(is_data==1) leg->SetHeader("Ratio (data)");
1689     // else leg->SetHeader("Ratio (MC)");
1690    
1691     TString MCtitle("MC ");
1692     if (is_data==1) MCtitle = "";
1693    
1694     leg->SetFillStyle(4000);
1695     leg->SetFillColor(kWhite);
1696     leg->SetTextFont(42);
1697     // leg->AddEntry(topline,"+20\% sys envelope","l");
1698     leg->AddEntry(JZBratio,MCtitle+"obs / "+MCtitle+"pred","p");
1699     leg->AddEntry(oneline,"ratio = 1","l");
1700     // leg->AddEntry(pol0d,"fit in [0,30] GeV","l");
1701     // leg->AddEntry(bottomline,"#pm50% envelope","l");
1702    
1703    
1704     //leg->Draw("same"); // no longer drawing legend
1705    
1706     if(is_data==1) CompleteSave(can, "jzb_ratio_data");
1707     if(is_data==0) CompleteSave(can, "jzb_ratio_mc");
1708     if(is_data==2) CompleteSave(can, "jzb_ratio_mc_BandS");//special case, MC with signal!
1709    
1710     delete RcorrJZBeemm;
1711     delete LcorrJZBeemm;
1712     delete RcorrJZBem;
1713     delete LcorrJZBem;
1714    
1715     delete RcorrJZBSBem;
1716     delete LcorrJZBSBem;
1717     delete RcorrJZBSBeemm;
1718     delete LcorrJZBSbeemm;
1719     }
1720    
1721     void do_ratio_plots(string mcjzb,string datajzb,vector<float> ratio_binning) {
1722     TCanvas *globalc = new TCanvas("globalc","Ratio Plot Canvas");
1723     globalc->SetLogy(0);
1724    
1725     do_ratio_plot(mc,ratio_binning,mcjzb,globalc, jzbHigh );
1726     do_ratio_plot(data,ratio_binning,datajzb,globalc, jzbHigh );
1727     do_ratio_plot(mcwithsignal,ratio_binning,mcjzb,globalc, jzbHigh );
1728     }
1729    
1730     string give_jzb_expression(float peak, int type) {
1731     stringstream val;
1732     if(type==data) {
1733     if(peak<0) val << jzbvariabledata << "+" << TMath::Abs(peak);
1734     if(peak>0) val << jzbvariabledata << "-" << TMath::Abs(peak);
1735     if(peak==0) val << jzbvariabledata;
1736     }
1737     if(type==mc) {
1738     if(peak<0) val << jzbvariablemc << "+" << TMath::Abs(peak);
1739     if(peak>0) val << jzbvariablemc << "-" << TMath::Abs(peak);
1740     if(peak==0) val << jzbvariablemc;
1741     }
1742     return val.str();
1743     }
1744    
1745    
1746     void lepton_comparison_plots() {
1747     Float_t ymin = 1.e-5, ymax = 0.25;
1748     TCanvas *can = new TCanvas("can","Lepton Comparison Canvas");
1749     can->SetLogy(1);
1750 buchmann 1.3 TH1F *eemc = allsamples.Draw("eemc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",mc, luminosity,allsamples.FindSample("/DY"));
1751     TH1F *mmmc = allsamples.Draw("mmmc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",mc, luminosity,allsamples.FindSample("/DY"));
1752 buchmann 1.1 eemc->SetLineColor(kBlue);
1753     mmmc->SetLineColor(kRed);
1754     eemc->SetMinimum(0.1);
1755     eemc->SetMaximum(10*eemc->GetMaximum());
1756     eemc->Draw("histo");
1757     mmmc->Draw("histo,same");
1758     TLegend *leg = make_legend();
1759     leg->AddEntry(eemc,"ZJets->ee (MC)","l");
1760     leg->AddEntry(mmmc,"ZJets->#mu#mu (MC)","l");
1761     leg->Draw("same");
1762     CompleteSave(can, "lepton_comparison/mll_effratio_mc");
1763    
1764     TH1F *eed = allsamples.Draw("eed","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
1765     TH1F *mmd = allsamples.Draw("mmd","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
1766     eed->SetLineColor(kBlue);
1767     mmd->SetLineColor(kRed);
1768     eed->SetMinimum(0.1);
1769     eed->SetMaximum(10*eed->GetMaximum());
1770     eed->Draw("histo");
1771     mmd->Draw("histo,same");
1772     TLegend *leg2 = make_legend();
1773     leg2->AddEntry(eed,"ZJets->ee (data)","l");
1774     leg2->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
1775     leg2->Draw();
1776     CompleteSave(can, "lepton_comparison/mll_effratio_data");
1777    
1778     TH1F *jeed = allsamples.Draw("jeed",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
1779     TH1F *jmmd = allsamples.Draw("jmmd",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
1780     TH1F *jeemmd = allsamples.Draw("jeemmd",jzbvariabledata,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
1781     dout << "ee : " << jeed->GetMean() << "+/-" << jeed->GetMeanError() << endl;
1782     dout << "ee : " << jmmd->GetMean() << "+/-" << jmmd->GetMeanError() << endl;
1783     dout << "eemd : " << jeemmd->GetMean() << "+/-" << jeemmd->GetMeanError() << endl;
1784     jeemmd->SetLineColor(kBlack);
1785     jeemmd->SetMarkerStyle(25);
1786     jeed->SetLineColor(kBlue);
1787     jmmd->SetLineColor(kRed);
1788     jeed->SetMinimum(0.1);
1789     jeed->SetMaximum(10*eed->GetMaximum());
1790     TH1* njeemmd = jeemmd->DrawNormalized();
1791     njeemmd->SetMinimum(ymin);
1792     njeemmd->SetMaximum(ymax);
1793    
1794     jeed->DrawNormalized("histo,same");
1795     jmmd->DrawNormalized("histo,same");
1796     jeemmd->DrawNormalized("same");
1797     TLegend *jleg2 = make_legend(" ");
1798     jleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
1799     jleg2->AddEntry(jeed,"ee","l");
1800     jleg2->AddEntry(jmmd,"#mu#mu","l");
1801     jleg2->Draw();
1802     CompleteSave(can,"lepton_comparison/jzb_effratio_data");
1803    
1804     TPad *eemmpad = new TPad("eemmpad","eemmpad",0,0,1,1);
1805     eemmpad->cd();
1806     eemmpad->SetLogy(1);
1807     jeed->Draw("histo");
1808     jmmd->Draw("histo,same");
1809     TLegend *eemmlegend = make_legend(" ");
1810     eemmlegend->AddEntry(jeed,"ee","l");
1811     eemmlegend->AddEntry(jmmd,"#mu#mu","l");
1812     eemmlegend->Draw();
1813     DrawPrelim();
1814     save_with_ratio(jeed,jmmd,eemmpad->cd(),"lepton_comparison/jzb_Comparing_ee_mm_data");
1815    
1816 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"));
1817     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"));
1818     TH1F *zjeemmd = allsamples.Draw("zjeemmd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets, mc, luminosity,allsamples.FindSample("/DY"));
1819 buchmann 1.1 dout << "Z+Jets ee : " << zjeed->GetMean() << "+/-" << zjeed->GetMeanError() << endl;
1820     dout << "Z+Jets ee : " << zjmmd->GetMean() << "+/-" << zjmmd->GetMeanError() << endl;
1821     dout << "Z+Jets eemd : " << zjeemmd->GetMean() << "+/-" << zjeemmd->GetMeanError() << endl;
1822     zjeemmd->SetLineColor(kBlack);
1823     zjeemmd->SetMarkerStyle(25);
1824     zjeed->SetLineColor(kBlue);
1825     zjmmd->SetLineColor(kRed);
1826     zjeed->SetMinimum(0.1);
1827     zjeed->SetMaximum(10*eed->GetMaximum());
1828    
1829     TH1* nzjeemmd = zjeemmd->DrawNormalized();
1830     nzjeemmd->SetMinimum(ymin);
1831     nzjeemmd->SetMaximum(ymax);
1832     zjeed->DrawNormalized("histo,same");
1833     zjmmd->DrawNormalized("histo,same");
1834     zjeemmd->DrawNormalized("same");
1835     TLegend *zjleg2 = make_legend("Z+jets MC");
1836     zjleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
1837     zjleg2->AddEntry(jeed,"ee","l");
1838     zjleg2->AddEntry(jmmd,"#mu#mu","l");
1839     zjleg2->Draw();
1840     CompleteSave(can,"lepton_comparison/jzb_effratio_ZJets");
1841    
1842     TH1F *ld = allsamples.Draw("ld","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
1843     ld->DrawNormalized("e1");
1844     eed->DrawNormalized("histo,same");
1845     mmd->DrawNormalized("histo,same");
1846     TLegend *leg3 = make_legend();
1847     leg3->AddEntry(ld,"ZJets->ll (data)","p");
1848     leg3->AddEntry(eed,"ZJets->ee (data)","l");
1849     leg3->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
1850     leg3->Draw();
1851     CompleteSave(can,"lepton_comparison/mll_effratio_data__all_compared");
1852     /*
1853     TH1F *jzbld = allsamples.Draw("jzbld",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1854     TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1855     */
1856     TH1F *jzbld = allsamples.Draw("jzbld",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1857     TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1858     jzbld->SetMarkerColor(kBlack);
1859     jzbld->SetMarkerStyle(26);
1860     jzbemd->SetMarkerStyle(25);
1861     jzbemd->SetMarkerColor(kRed);
1862     jzbemd->SetLineColor(kRed);
1863     jzbld->SetMinimum(0.35);
1864     jzbld->Draw("e1");
1865     jzbemd->Draw("e1,same");
1866     TLegend *leg4 = make_legend();
1867     leg4->AddEntry(jzbld,"SFZP","p");
1868     leg4->AddEntry(jzbemd,"OFZP","p");
1869     leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
1870     leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
1871     leg4->Draw();
1872     CompleteSave(can,"lepton_comparison/jzb_eemumu_emu_data");
1873    
1874     TH1F *ttbarjzbld = allsamples.Draw("ttbarjzbld",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
1875     TH1F *ttbarjzbemd = allsamples.Draw("ttbarjzbemd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
1876     ttbarjzbld->SetLineColor(allsamples.GetColor("TTJet"));
1877     ttbarjzbemd->SetLineColor(allsamples.GetColor("TTJet"));
1878     ttbarjzbld->Draw("histo");
1879     ttbarjzbemd->SetLineStyle(2);
1880     ttbarjzbemd->Draw("histo,same");
1881     TLegend *leg5 = make_legend();
1882     leg5->AddEntry(ttbarjzbld,"t#bar{t}->(ee or #mu#mu)","l");
1883     leg5->AddEntry(ttbarjzbemd,"t#bar{t}->e#mu","l");
1884     leg5->Draw();
1885     CompleteSave(can,"lepton_comparison/ttbar_emu_mc");
1886    
1887     }
1888    
1889     bool is_OF(TCut cut) {
1890     string scut = (const char*) cut;
1891     if((int)scut.find("id1!=id2")>-1) return true;
1892     if((int)scut.find("id1==id2")>-1) return false;
1893     return false;
1894     }
1895    
1896     bool is_ZP(TCut cut) {
1897     string scut = (const char*) cut;
1898     if((int)scut.find("91")>-1) return true;
1899     return false;
1900     }
1901    
1902    
1903     void draw_pure_jzb_histo(TCut cut,string datavariable, string mcvariable, string savename, TCanvas *can,vector<float> binning) {
1904     TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
1905     jzbpad->cd();
1906     jzbpad->SetLogy(1);
1907     string xlabel="JZB [GeV]";
1908    
1909     TH1F *datahisto = allsamples.Draw("datahisto",datavariable,binning, xlabel, "events",cut,data,luminosity);
1910     THStack mcstack = allsamples.DrawStack("mcstack",mcvariable,binning, xlabel, "events",cut,mc,luminosity);
1911    
1912     datahisto->SetMinimum(0.1);
1913     datahisto->SetMarkerSize(DataMarkerSize);
1914     datahisto->Draw("e1");
1915     mcstack.Draw("same");
1916     datahisto->Draw("same,e1");
1917    
1918     TLegend *leg;
1919 fronga 1.41 if (!PlottingSetup::RestrictToMassPeak) {
1920     if(is_OF(cut)) leg = allsamples.allbglegend("Opposite flavor",datahisto);
1921     else leg = allsamples.allbglegend("Same flavor",datahisto);
1922     } else {
1923     if(is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("OFZP",datahisto);
1924     else if(!is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("SFZP",datahisto);
1925     else if( is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("OFSB",datahisto);
1926     else if(!is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("SFSB",datahisto);
1927     else {
1928     std::cerr << "Unable to decode cut: " << cut.GetTitle() << std::endl;
1929     exit(-1);
1930     }
1931     }
1932 buchmann 1.1 leg->Draw();
1933     string write_cut = decipher_cut(cut,"");
1934     TText *writeline1 = write_cut_on_canvas(write_cut.c_str());
1935     writeline1->SetTextSize(0.035);
1936     writeline1->Draw();
1937 buchmann 1.12 if(!Contains(savename,"Dibosons")) save_with_ratio(datahisto,mcstack,jzbpad->cd(),("jzb/"+savename));
1938     else save_with_ratio(datahisto,mcstack,jzbpad->cd(),savename);
1939 buchmann 1.1 TPad *jzbpad2 = new TPad("jzbpad2","jzbpad2",0,0,1,1);
1940     jzbpad2->cd();
1941     jzbpad2->SetLogy(1);
1942     datahisto->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
1943     datahisto->SetMinimum(0.1);
1944     datahisto->SetMarkerSize(DataMarkerSize);
1945     datahisto->Draw("e1");
1946     mcstack.Draw("same");
1947     datahisto->Draw("same,e1");
1948     leg->SetHeader("");
1949     leg->Draw();
1950     writeline1->SetTextSize(0.035);
1951     writeline1->Draw();
1952     DrawPrelim();
1953 buchmann 1.12 if(!Contains(savename,"Dibosons")) save_with_ratio(datahisto,mcstack,jzbpad2->cd(),("jzb/PositiveSideOnly/"+savename+""));
1954     else save_with_ratio(datahisto,mcstack,jzbpad2->cd(),(savename+"__PosOnly"));
1955 buchmann 1.1 datahisto->Delete();
1956     mcstack.Delete();
1957     }
1958    
1959     Double_t GausR(Double_t *x, Double_t *par) {
1960     return gRandom->Gaus(x[0],par[0]);
1961     }
1962 buchmann 1.12
1963     void produce_stretched_jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1964     TCanvas *dican = new TCanvas("dican","JZB Plots Canvas");
1965     float max=jzbHigh ;
1966     float min=-120;
1967     int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
1968     int coarserbins=int(nbins/2.0);
1969     int rebinnedbins=int(nbins/4.0);
1970 buchmann 1.1
1971 buchmann 1.12 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
1972     for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
1973     for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
1974     for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
1975    
1976     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP",dican,binning);
1977     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP",dican,binning);
1978     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_SFZP",dican,binning);
1979     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_SFZP",dican,binning);
1980     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_OFZP",dican,binning);
1981     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_OFZP",dican,binning);
1982     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB",dican,binning);
1983     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB",dican,binning);
1984    
1985     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP_coarse",dican,coarse_binning);
1986     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP_coarse",dican,coarse_binning);
1987     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB_coarse",dican,coarse_binning);
1988     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB_coarse",dican,coarse_binning);
1989    
1990     delete dican;
1991     }
1992    
1993    
1994     void diboson_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1995     vector<int> SamplesToBeModified = allsamples.FindSampleBySampleName("WW/WZ/ZZ");
1996    
1997     if(SamplesToBeModified.size()==0 || SamplesToBeModified[0]==-1) {
1998     write_error(__FUNCTION__,"Could not find any diboson samples - aborting diboson plots");
1999     return;
2000     }
2001    
2002     float stretchfactor = 100.0;
2003     vector<string> labels;
2004    
2005    
2006     dout << "Going to increase the cross section for diboson samples ... " << endl;
2007 buchmann 1.16 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
2008 buchmann 1.12 float origxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
2009     (allsamples.collection)[SamplesToBeModified[i]].xs=origxs*stretchfactor;
2010     dout << " Increased xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].filename << " from " << origxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ")" << endl;
2011     labels.push_back((allsamples.collection)[SamplesToBeModified[i]].samplename);
2012     (allsamples.collection)[SamplesToBeModified[i]].samplename=any2string(int(stretchfactor))+" x "+(allsamples.collection)[SamplesToBeModified[i]].samplename;
2013     dout << " (also renamed it to " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " )" << endl;
2014     }
2015    
2016     dout << "Going to produce JZB plots" << endl;
2017 buchmann 1.13 produce_stretched_jzb_plots(mcjzb,datajzb,ratio_binning);
2018 buchmann 1.12 TCanvas *gloca = new TCanvas("gloca","gloca");
2019    
2020     dout << "Going to produce prediction plots" << endl;
2021 buchmann 1.28 do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do only MC plots, no signal
2022     do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do MC plots with signal
2023 buchmann 1.12 delete gloca;
2024    
2025     dout << "Going to reset the cross section for diboson samples ... " << endl;
2026 buchmann 1.16 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
2027 buchmann 1.12 float Upxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
2028     (allsamples.collection)[SamplesToBeModified[i]].xs=(allsamples.collection)[SamplesToBeModified[i]].xs*(1.0/stretchfactor);
2029     string Upname=(allsamples.collection)[SamplesToBeModified[i]].samplename;
2030     (allsamples.collection)[SamplesToBeModified[i]].samplename=labels[i];
2031     dout << " Reset xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " from " << Upxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ") and reset the correct name (from " << Upname << ")" << endl;
2032    
2033     }
2034    
2035     }
2036 buchmann 1.35
2037    
2038     void draw_normalized_data_vs_data_histo(TCut cut1, TCut cut2, string variable, string legentry1, string legentry2, string savename, TCanvas *can,vector<float> binning) {
2039     TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
2040     jzbpad->cd();
2041     jzbpad->SetLogy(1);
2042     string xlabel="JZB [GeV]";
2043    
2044     TH1F *datahisto1 = allsamples.Draw("datahisto1",variable,binning, xlabel, "events",cut1,data,luminosity);
2045     datahisto1->SetLineColor(kRed);
2046     datahisto1->SetMarkerColor(kRed);
2047     TH1F *datahisto2 = allsamples.Draw("datahisto2",variable,binning, xlabel, "events",cut2,data,luminosity);
2048     datahisto2->SetLineColor(kBlue);
2049     datahisto2->SetMarkerColor(kBlue);
2050    
2051     datahisto2->SetMarkerSize(DataMarkerSize);
2052     datahisto1->DrawNormalized("e1");
2053     datahisto2->DrawNormalized("histo,same");
2054     datahisto1->DrawNormalized("same,e1");
2055    
2056     TLegend *leg = make_legend();
2057     leg->AddEntry(datahisto1,legentry1.c_str());
2058     leg->AddEntry(datahisto2,legentry2.c_str());
2059     leg->Draw();
2060    
2061     save_with_ratio(datahisto1,datahisto2,jzbpad->cd(),("jzb/"+savename));
2062    
2063     datahisto1->Delete();
2064     datahisto2->Delete();
2065     }
2066    
2067    
2068 buchmann 1.1 void jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
2069     TCanvas *can = new TCanvas("can","JZB Plots Canvas");
2070     float max=jzbHigh ;
2071     float min=-120;
2072     int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
2073     int coarserbins=int(nbins/2.0);
2074     int rebinnedbins=int(nbins/4.0);
2075    
2076     vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
2077     for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
2078     for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
2079     for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
2080    
2081 buchmann 1.14 if ( !PlottingSetup::Approved ) {
2082     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP",can,binning);
2083     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP",can,binning);
2084     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_SFZP",can,binning);
2085     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_SFZP",can,binning);
2086     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_OFZP",can,binning);
2087     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_OFZP",can,binning);
2088     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2089     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB",can,binning);
2090     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB",can,binning);
2091 buchmann 1.35 draw_normalized_data_vs_data_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,"ee","mm","jzb_ee_vs_mm",can,binning);
2092     draw_normalized_data_vs_data_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,"ee","mm","jzb_ee_vs_mm_coarse",can,coarse_binning);
2093 buchmann 1.36 draw_normalized_data_vs_data_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,"ee","mm","jzb_ee_vs_mm_coarsest",can,coarsest_binning);
2094 buchmann 1.35
2095 buchmann 1.14 }
2096 buchmann 1.1
2097     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarse",can,coarse_binning);
2098 buchmann 1.14 if ( !PlottingSetup::Approved ) {
2099     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarse",can,coarse_binning);
2100     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2101     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarse",can,coarse_binning);
2102     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarse",can,coarse_binning);
2103     }
2104 buchmann 1.12 delete can;
2105 buchmann 1.1 }
2106    
2107    
2108     void calculate_all_yields(string mcdrawcommand,vector<float> jzb_cuts) {
2109     dout << "Calculating background yields in MC:" << endl;
2110     jzb_cuts.push_back(14000);
2111     TH1F *allbgs = allsamples.Draw("allbgs",jzbvariablemc,jzb_cuts, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc,luminosity);
2112     float cumulative=0;
2113     for(int i=allbgs->GetNbinsX();i>=1;i--) {
2114     cumulative+=allbgs->GetBinContent(i);
2115     dout << "Above " << allbgs->GetBinLowEdge(i) << " GeV/c : " << cumulative << endl;
2116     }
2117     }
2118    
2119    
2120     TCut give_jzb_expression(string mcjzb, float jzbcut, string posneg="pos") {
2121     stringstream res;
2122     res << "(" << mcjzb;
2123     if(posneg=="pos") res << ">";
2124     else res << "<-";
2125     res << jzbcut << ")";
2126     return TCut(res.str().c_str());
2127     }
2128    
2129     string sigdig(float number, int nsigdig=3, float min=0) {
2130     //this function tries to extract n significant digits, and if the number is below (min), it returns "<min"
2131     if(number<min) return "< "+any2string(min);
2132     stringstream sol;
2133     sol << setprecision(nsigdig) << number;
2134    
2135     return sol.str();
2136     }
2137    
2138     string jzb_tex_command(string region, string posneg) {
2139     if(posneg=="pos") posneg="POS";
2140     else posneg="NEG";
2141     stringstream texcommand;
2142     texcommand<<"\\"<<region <<"JZB"<<posneg;
2143     return texcommand.str();
2144     }
2145     // \SFZPJZBPOS
2146     // Sample & \OFZPJZBPOS & \OFZPJZBNEG & \SFZPJZBPOS & \SFZPJZBNEG & \OFSBJZBPOS & \OFSBJZBNEG & \SFSBJZBPOS & \SFSBJZBNEG \\\hline
2147    
2148     void compute_MC_yields(string mcjzb,vector<float> jzb_cuts) {
2149     dout << "Calculating background yields in MC:" << endl;
2150    
2151     TCanvas *yica = new TCanvas("yica","yield canvas");
2152    
2153     int nRegions=4;
2154     if(!PlottingSetup::RestrictToMassPeak) nRegions=2;
2155     string tsRegions[] = {"SFZP","OFZP","SFSB","OFSB"};
2156     string posneg[] = {"pos","neg"};
2157     TCut tkRegions[] = {cutOSSF&&cutnJets&&cutmass,cutOSOF&&cutnJets&&cutmass,cutOSSF&&cutnJets&&sidebandcut,cutOSOF&&cutnJets&&sidebandcut};
2158    
2159 buchmann 1.16 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
2160 buchmann 1.1 TCut jzbMC[] = { give_jzb_expression(mcjzb,jzb_cuts[ijzb],"pos"), give_jzb_expression(mcjzb,jzb_cuts[ijzb],"neg") };
2161     dout << "_________________________________________________________" << endl;
2162     dout << "Table for JZB> " << jzb_cuts[ijzb] << endl;
2163 buchmann 1.16 for(int isample=0;isample<(int)(allsamples.collection).size();isample++) {
2164 buchmann 1.1 if(!(allsamples.collection)[isample].is_data) dout << (allsamples.collection)[isample].samplename << " & ";
2165     else dout << "Sample & ";
2166     for(int iregion=0;iregion<nRegions;iregion++) {
2167     for(int ipos=0;ipos<2;ipos++) {
2168     if((allsamples.collection)[isample].is_data) dout << jzb_tex_command(tsRegions[iregion],posneg[ipos]) << " & ";
2169     else {
2170     vector<int> specific;specific.push_back(isample);
2171     TH1F *shisto = allsamples.Draw("shisto","mll",1,0,500,"tester","events",tkRegions[iregion]&&jzbMC[ipos],mc,luminosity,specific);
2172     dout << sigdig(shisto->Integral(),3,0.05) <<" & ";
2173     delete shisto;
2174     }
2175     }//end of ipos
2176     }//end of iregion
2177     dout << " \\\\" << endl;
2178     }//end of isample
2179     }//end of ijzb
2180     dout << " \\hline" << endl;
2181    
2182     delete yica;
2183     }
2184    
2185     void draw_ttbar_and_zjets_shape_for_one_configuration(string mcjzb, string datajzb, int leptontype=-1, int scenario=0,bool floating=false) {
2186     //Step 1: Establishing cuts
2187     stringstream jetcutstring;
2188     string writescenario="";
2189    
2190     if(scenario==0) jetcutstring << "(pfJetGoodNum>=3)&&"<<(const char*) basicqualitycut;
2191     if(scenario==1) jetcutstring << "(pfJetPt[0]>50&&pfJetPt[1]>50)&&"<<(const char*)basicqualitycut;
2192     TCut jetcut(jetcutstring.str().c_str());
2193     string leptoncut="mll>0";
2194     if(leptontype==0||leptontype==1) {
2195     if(leptontype==0) {
2196     leptoncut="id1==0";
2197     writescenario="__ee";
2198     }
2199     else {
2200     leptoncut="id1==1";
2201     writescenario="__ee";
2202     }
2203     }
2204     TCut lepcut(leptoncut.c_str());
2205    
2206     TCanvas *c5 = new TCanvas("c5","c5",1500,500);
2207     TCanvas *c6 = new TCanvas("c6","c6");
2208     c5->Divide(3,1);
2209    
2210     //STEP 2: Extract Zjets shape in data
2211     c5->cd(1);
2212     c5->cd(1)->SetLogy(1);
2213     TCut massat40("mll>40");
2214     TH1F *ossfleft = allsamples.Draw("ossfleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
2215     TH1F *osofleft = allsamples.Draw("osofleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
2216     ossfleft->SetLineColor(kRed);
2217     ossfleft->SetMarkerColor(kRed);
2218     ossfleft->Add(osofleft,-1);
2219     vector<TF1*> functions = do_cb_fit_to_plot(ossfleft,10);
2220     ossfleft->SetMarkerSize(DataMarkerSize);
2221     ossfleft->Draw();
2222     functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
2223     TF1 *zjetsfunc = (TF1*) functions[1]->Clone();
2224     TF1 *zjetsfuncN = (TF1*) functions[0]->Clone();
2225     TF1 *zjetsfuncP = (TF1*) functions[2]->Clone();
2226     zjetsfunc->Draw("same");zjetsfuncN->Draw("same");zjetsfuncP->Draw("same");
2227     TLegend *leg1 = new TLegend(0.6,0.6,0.89,0.80);
2228     leg1->SetFillColor(kWhite);
2229     leg1->SetLineColor(kWhite);
2230     leg1->AddEntry(ossfleft,"OSSF (sub),JZB<peak","p");
2231     leg1->AddEntry(zjetsfunc,"OSSF fit ('zjets')","l");
2232     leg1->Draw("same");
2233     TText *titleleft = write_title("Extracting Z+Jets shape");
2234     titleleft->Draw();
2235    
2236     //Step 3: Extract ttbar shape (in data or MC?)
2237     c5->cd(2);
2238     c5->cd(2)->SetLogy(1);
2239     TH1F *osof;
2240     TText *titlecenter;
2241     bool frommc=false;
2242     if(frommc) {
2243     osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,mc,luminosity,allsamples.FindSample("TTJets"));
2244     titlecenter = write_title("Extracting ttbar shape (from ossf MC)");
2245     }
2246     else {
2247     osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
2248     titlecenter = write_title("Extracting ttbar shape (from osof data)");
2249     }
2250     osof->SetMarkerSize(DataMarkerSize);
2251     osof->Draw();
2252     vector<TF1*> ttbarfunctions = do_cb_fit_to_plot(osof,35,true);
2253     ttbarfunctions[0]->SetLineColor(kRed); ttbarfunctions[0]->SetLineStyle(2); ttbarfunctions[0]->Draw("same");
2254     ttbarfunctions[1]->SetLineColor(kRed); ttbarfunctions[1]->Draw("same");
2255     ttbarfunctions[2]->SetLineColor(kRed); ttbarfunctions[2]->SetLineStyle(2); ttbarfunctions[2]->Draw("same");
2256    
2257     TLegend *leg2 = new TLegend(0.15,0.8,0.4,0.89);
2258     leg2->SetFillColor(kWhite);
2259     leg2->SetLineColor(kWhite);
2260     if(frommc) {
2261     leg2->AddEntry(osof,"t#bar{t} OSSF, MC","p");
2262     leg2->AddEntry(ttbarfunctions[1],"Fit to t#bar{t} OSSF,MC","l");
2263     } else {
2264     leg2->AddEntry(osof,"OSOF","p");
2265     leg2->AddEntry(ttbarfunctions[1],"Fit to OSOF","l");
2266     }
2267     leg2->Draw("same");
2268     titlecenter->Draw();
2269    
2270     //--------------------------------------------------------------------------------------------------------------------------------
2271     //STEP 4: Present it!
2272     // actually: if we wanna let it float we need to do that first :-)
2273     c5->cd(3);
2274     c5->cd(3)->SetLogy(1);
2275     TH1F *observed = allsamples.Draw("observed",datajzb,100,0,500, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
2276     observed->SetMarkerSize(DataMarkerSize);
2277    
2278     TF1 *logparc = new TF1("logparc",InvCrystalBall,0,1000,5); logparc->SetLineColor(kRed);
2279     TF1 *logparcn = new TF1("logparcn",InvCrystalBallN,0,1000,5); logparcn->SetLineColor(kRed); logparcn->SetLineStyle(2);
2280     TF1 *logparcp = new TF1("logparcp",InvCrystalBallP,0,1000,5); logparcp->SetLineColor(kRed); logparcp->SetLineStyle(2);
2281    
2282     TF1 *zjetsc = new TF1("zjetsc",InvCrystalBall,0,1000,5); zjetsc->SetLineColor(kBlue);
2283     TF1 *zjetscn = new TF1("zjetscn",InvCrystalBallN,0,1000,5); zjetscn->SetLineColor(kBlue); zjetscn->SetLineStyle(2);
2284     TF1 *zjetscp = new TF1("zjetscp",InvCrystalBallP,0,1000,5); zjetscp->SetLineColor(kBlue); zjetscp->SetLineStyle(2);
2285    
2286     TF1 *ZplusJetsplusTTbar = new TF1("ZplusJetsplusTTbar", DoubleInvCrystalBall,0,1000,10); ZplusJetsplusTTbar->SetLineColor(kBlue);
2287     TF1 *ZplusJetsplusTTbarP= new TF1("ZplusJetsplusTTbarP",DoubleInvCrystalBallP,0,1000,10); ZplusJetsplusTTbarP->SetLineColor(kBlue); ZplusJetsplusTTbarP->SetLineStyle(2);
2288     TF1 *ZplusJetsplusTTbarN= new TF1("ZplusJetsplusTTbarN",DoubleInvCrystalBallN,0,1000,10); ZplusJetsplusTTbarN->SetLineColor(kBlue); ZplusJetsplusTTbarN->SetLineStyle(2);
2289    
2290     zjetsc->SetParameters(zjetsfunc->GetParameters());
2291     zjetscp->SetParameters(zjetsfunc->GetParameters());
2292     zjetscn->SetParameters(zjetsfunc->GetParameters());
2293    
2294     TH1F *observeda = allsamples.Draw("observeda",datajzb,53,80,jzbHigh, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
2295     //blublu
2296     logparc->SetParameters(ttbarfunctions[1]->GetParameters());
2297     logparcn->SetParameters(ttbarfunctions[1]->GetParameters());
2298     logparcp->SetParameters(ttbarfunctions[1]->GetParameters());
2299     if(floating) {
2300     dout << "TTbar contribution assumed (before fitting) : " << logparc->GetParameter(0) << endl;
2301     logparc->SetParameters(ttbarfunctions[1]->GetParameters());
2302     for(int i=0;i<10;i++) {
2303     if(i<5) ZplusJetsplusTTbar->FixParameter(i,zjetsfunc->GetParameter(i));
2304     if(i>=5) {
2305     if (i>5) ZplusJetsplusTTbar->FixParameter(i,logparc->GetParameter(i-5));
2306     if (i==5) ZplusJetsplusTTbar->SetParameter(i,logparc->GetParameter(i-5));
2307     }
2308     }//end of setting parameters
2309     observeda->Draw("same");
2310     ZplusJetsplusTTbar->Draw("same");
2311     observeda->Fit(ZplusJetsplusTTbar);
2312     dout << "--> Quality of Z+Jets / TTbar fit : chi2/ndf = " << ZplusJetsplusTTbar->GetChisquare() << "/" << ZplusJetsplusTTbar->GetNDF() << endl;
2313     ZplusJetsplusTTbar->Draw("same");
2314     ZplusJetsplusTTbarP->SetParameters(ZplusJetsplusTTbar->GetParameters());
2315     ZplusJetsplusTTbarN->SetParameters(ZplusJetsplusTTbar->GetParameters());
2316     dout << "TTbar contribution found (after fitting) : " << ZplusJetsplusTTbar->GetParameter(5) << endl;
2317     float factor = ZplusJetsplusTTbar->GetParameter(5) / logparc->GetParameter(0);
2318     dout << "FACTOR: " << factor << endl;
2319     logparc->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
2320     logparcn->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
2321     logparcp->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
2322     }
2323    
2324     c5->cd(3);
2325     c5->cd(3)->SetLogy(1);
2326     observed->Draw();
2327     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2328     logparc->Draw("same");
2329     logparcn->Draw("same");
2330     logparcp->Draw("same");
2331    
2332     TLegend *leg3 = new TLegend(0.6,0.6,0.89,0.80);
2333     leg3->SetFillColor(kWhite);
2334     leg3->SetLineColor(kWhite);
2335     leg3->AddEntry(observed,"OSSF,JZB>peak","p");
2336     leg3->AddEntry(ttbarfunctions[1],"OSOF fit ('ttbar')","l");
2337     leg3->AddEntry(zjetsfunc,"OSSF,JZB<0 fit ('zjets')","l");
2338     leg3->Draw("same");
2339     TText *titleright = write_title("Summary of shapes and observed shape");
2340     titleright->Draw();
2341    
2342     c6->cd()->SetLogy(1);
2343     observed->Draw();
2344     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2345     logparc->Draw("same");
2346     logparcn->Draw("same");
2347     logparcp->Draw("same");
2348     leg3->Draw("same");
2349     titleright->Draw();
2350    
2351     if(scenario==0) {
2352     CompleteSave(c5,"Shapes2/Making_of___3jetsabove30"+writescenario);
2353     CompleteSave(c5->cd(1),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd1");
2354     CompleteSave(c5->cd(2),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd2");
2355     CompleteSave(c5->cd(3),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd3");
2356     CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30"+writescenario);
2357     } else {
2358     CompleteSave(c5,"Shapes2/Making_of___2jetsabove50"+writescenario);
2359     CompleteSave(c5->cd(1),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd1");
2360     CompleteSave(c5->cd(2),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd2");
2361     CompleteSave(c5->cd(3),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd3");
2362     CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50"+writescenario);
2363     }
2364     dout << "Statistics about our fits: " << endl;
2365     dout << "Z+Jets shape: Chi2/ndf = " << zjetsfunc->GetChisquare() << "/" << ossfleft->GetNbinsX() << endl;
2366     dout << "ttbar shape: Chi2/ndf = " << ttbarfunctions[1]->GetChisquare() << "/" << osof->GetNbinsX() << endl;
2367    
2368     c6->cd();
2369     TLegend *additionallegend = new TLegend(0.6,0.6,0.89,0.89);
2370     additionallegend->SetFillColor(kWhite);
2371     additionallegend->SetLineColor(kWhite);
2372     additionallegend->AddEntry(observed,"Data","p");
2373     additionallegend->AddEntry(ZplusJetsplusTTbar,"Fitted Z+jets & TTbar","l");
2374     additionallegend->AddEntry(zjetsc,"Z+jets","l");
2375     additionallegend->AddEntry(logparc,"TTbar","l");
2376     observed->Draw();
2377     ZplusJetsplusTTbar->SetLineColor(kGreen);
2378     ZplusJetsplusTTbarP->SetLineColor(kGreen);
2379     ZplusJetsplusTTbarN->SetLineColor(kGreen);
2380     ZplusJetsplusTTbarP->SetLineStyle(2);
2381     ZplusJetsplusTTbarN->SetLineStyle(2);
2382     TF1 *ZplusJetsplusTTbar2 = new TF1("ZplusJetsplusTTbar2",DoubleInvCrystalBall,0,1000,10);
2383     ZplusJetsplusTTbar2->SetParameters(ZplusJetsplusTTbar->GetParameters());
2384     ZplusJetsplusTTbar2->SetLineColor(kGreen);
2385     ZplusJetsplusTTbarP->SetFillColor(TColor::GetColor("#81F781"));
2386     ZplusJetsplusTTbarN->SetFillColor(kWhite);
2387     ZplusJetsplusTTbarP->Draw("fcsame");
2388     ZplusJetsplusTTbarN->Draw("fcsame");
2389     TH1F *hZplusJetsplusTTbar = (TH1F*)ZplusJetsplusTTbar2->GetHistogram();
2390     TH1F *hZplusJetsplusTTbarN = (TH1F*)ZplusJetsplusTTbarN->GetHistogram();
2391     TH1F *hZplusJetsplusTTbarP = (TH1F*)ZplusJetsplusTTbarP->GetHistogram();
2392     hZplusJetsplusTTbar->SetMarkerSize(0);
2393     hZplusJetsplusTTbarP->SetMarkerSize(0);
2394     hZplusJetsplusTTbarN->SetMarkerSize(0);
2395     for (int i=1;i<=hZplusJetsplusTTbar->GetNbinsX();i++) {
2396     float newerror=hZplusJetsplusTTbarP->GetBinContent(i)-hZplusJetsplusTTbar->GetBinContent(i);
2397     hZplusJetsplusTTbar->SetBinError(i,newerror);
2398     if(hZplusJetsplusTTbar->GetBinContent(i)<0.05) hZplusJetsplusTTbar->SetBinContent(i,0); //avoiding a displaying probolem
2399     }
2400     hZplusJetsplusTTbarP->SetFillColor(kGreen);
2401     hZplusJetsplusTTbarN->SetFillColor(kWhite);
2402     hZplusJetsplusTTbarN->Draw("same");
2403    
2404     ZplusJetsplusTTbar2->SetMarkerSize(0);
2405     ZplusJetsplusTTbar2->Draw("same");
2406    
2407     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2408     logparc->Draw("same");
2409     logparcn->Draw("same");
2410     logparcp->Draw("same");
2411     additionallegend->Draw("same");
2412     if(scenario==0) {
2413     CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30__allfits__"+writescenario);
2414     } else {
2415     CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50__allfits__"+writescenario);
2416     }
2417     //--------------------------------------------------------------------------------------------------------------------------------
2418     }
2419    
2420     void draw_ttbar_and_zjets_shape(string mcjzb, string datajzb) {
2421     int all_leptons=-1;
2422 buchmann 1.16 int threejetswith30gev=0;
2423     /*
2424     int twojetswith50gev=1;
2425 buchmann 1.1 int electrons_only=0;
2426     int mu_only=1;
2427 buchmann 1.16
2428 buchmann 1.1 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,twojetswith50gev);
2429     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev);
2430    
2431     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,twojetswith50gev);
2432     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,threejetswith30gev);
2433    
2434     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,twojetswith50gev);
2435     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,threejetswith30gev);
2436     */
2437    
2438     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev,true);
2439     }
2440    
2441 buchmann 1.32 float find_one_correction_factor(string FindKeyword, bool dodata, TCut SpecialCut, string SaveAs) {
2442 buchmann 1.1 TCanvas *cancorr = new TCanvas("cancorr","Canvas for Response Correction");
2443     cancorr->SetLogz();
2444     cancorr->SetRightMargin(0.13);
2445 buchmann 1.45 TCut zptforresponsepresentation(Restrmasscut&&SpecialCut&&passtrig);
2446 fronga 1.40
2447     if(PlottingSetup::DoBTag) zptforresponsepresentation=zptforresponsepresentation&&PlottingSetup::bTagRequirement;
2448     TH2F *niceresponseplotd = new TH2F("niceresponseplotd","",100,0,600,100,0,5);
2449     niceresponseplotd->Sumw2();
2450     TH2F* emuResponse = (TH2F*)niceresponseplotd->Clone("emuResponse");
2451 buchmann 1.27 vector<int> SampleIndices=allsamples.FindSample(FindKeyword);
2452 buchmann 1.33 for(int iSample=0;iSample<(int)SampleIndices.size();iSample++) {
2453 buchmann 1.32 if((allsamples.collection)[SampleIndices[iSample]].is_data && !dodata) continue;
2454     if((allsamples.collection)[SampleIndices[iSample]].is_data ==false && dodata) continue;
2455    
2456 buchmann 1.30 dout << " Response correction : Using sample " << (allsamples.collection)[SampleIndices[iSample]].filename << " for " << FindKeyword << endl;
2457 fronga 1.40 (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+niceresponseplotd",(zptforresponsepresentation&&cutOSSF)*cutWeight);
2458     (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+emuResponse",(zptforresponsepresentation&&cutOSOF)*cutWeight);
2459 buchmann 1.27 }
2460 fronga 1.40 niceresponseplotd->Add(emuResponse,-1);
2461    
2462 buchmann 1.1 niceresponseplotd->SetStats(0);
2463     niceresponseplotd->GetXaxis()->SetTitle("Z p_{T} [GeV]");
2464     niceresponseplotd->GetYaxis()->SetTitle("Response");
2465     niceresponseplotd->GetXaxis()->CenterTitle();
2466     niceresponseplotd->GetYaxis()->CenterTitle();
2467     niceresponseplotd->Draw("COLZ");
2468     TProfile * profd = (TProfile*)niceresponseplotd->ProfileX();
2469 fronga 1.40 profd->Rebin(2);
2470 buchmann 1.1 profd->SetMarkerSize(DataMarkerSize);
2471 fronga 1.40 profd->Fit("pol0","","same,e1",100,400);
2472 buchmann 1.1 DrawPrelim();
2473 buchmann 1.27 string stitle="Data";
2474     if(!Contains(FindKeyword,"Data")) stitle="MC";
2475     TText* title = write_text(0.5,0.7,stitle.c_str());
2476 buchmann 1.1 title->SetTextAlign(12);
2477     title->Draw();
2478     TF1 *datapol=(TF1*)profd->GetFunction("pol0");
2479 buchmann 1.27 float correction=datapol->GetParameter(0);
2480     stringstream resstring;
2481     resstring<<"Response: "<<std::setprecision(2)<<100*correction<<" %";
2482     TText* restitle = write_text(0.5,0.65,resstring.str());
2483 buchmann 1.1 restitle->SetTextAlign(12);
2484     restitle->SetTextSize(0.03);
2485     restitle->Draw();
2486 buchmann 1.27 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_New_"+SaveAs);
2487     delete cancorr;
2488     delete niceresponseplotd;
2489 fronga 1.40 delete profd;
2490 buchmann 1.27 return correction;
2491     }
2492    
2493     void find_correction_factors(string &jzbvardata,string &jzbvarmc) {
2494    
2495 buchmann 1.30 dout << "Computing response corrections: " << endl;
2496 buchmann 1.27 //Step 1 : Get results
2497 buchmann 1.32 float datacorrection=find_one_correction_factor("Data",true,"","Data");
2498     float mccorrection=find_one_correction_factor("DY",false,"","MC");
2499 buchmann 1.1
2500 buchmann 1.32 float dataEEcorrection=find_one_correction_factor("Data",true,"id1==0","Data_ee");
2501     float mcEEcorrection=find_one_correction_factor("DY",false,"id1==0","MC_ee");
2502 buchmann 1.27
2503 buchmann 1.32 float dataMMcorrection=find_one_correction_factor("Data",true,"id1==1","Data_mm");
2504     float mcMMcorrection=find_one_correction_factor("DY",false,"id1==1","MC_mm");
2505 buchmann 1.27
2506     cout << "Corrections : " << endl;
2507     cout << " Data : " << datacorrection << endl;
2508     cout << " ee (" << dataEEcorrection << ") , mm (" << dataMMcorrection << ")" << endl;
2509     cout << " MC : " << mccorrection << endl;
2510     cout << " ee (" << mcEEcorrection << ") , mm (" << mcMMcorrection << ")" << endl;
2511    
2512     //Step 2: Processing the result and making it into something useful :-)
2513 buchmann 1.1 stringstream jzbvardatas;
2514 buchmann 1.27 jzbvardatas << "(";
2515    
2516     if(dataEEcorrection>=1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]-" << dataEEcorrection-1 << "*pt))";
2517     if(dataEEcorrection<1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-dataEEcorrection << "*pt))";
2518    
2519     if(dataMMcorrection>=1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]-" << dataMMcorrection-1 << "*pt))";
2520     if(dataMMcorrection<1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-dataMMcorrection << "*pt))";
2521    
2522     float averagecorrection=(dataMMcorrection+dataEEcorrection)/2.0;
2523    
2524 buchmann 1.30 if(datacorrection>=1) jzbvardatas<<"+((id1!=id2)*(jzb[1]-" << datacorrection-1 << "*pt))";
2525     if(datacorrection<1) jzbvardatas<<"+((id1!=id2)*(jzb[1]+" << 1-datacorrection << "*pt))";
2526 buchmann 1.27
2527     jzbvardatas << ")";
2528 buchmann 1.1 jzbvardata=jzbvardatas.str();
2529 buchmann 1.27
2530 buchmann 1.1 stringstream jzbvarmcs;
2531 buchmann 1.27 jzbvarmcs << "(";
2532    
2533     if(mcEEcorrection>=1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]-" << mcEEcorrection-1 << "*pt))";
2534     if(mcEEcorrection<1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-mcEEcorrection << "*pt))";
2535    
2536     if(mcMMcorrection>=1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]-" << mcMMcorrection-1 << "*pt))";
2537     if(mcMMcorrection<1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-mcMMcorrection << "*pt))";
2538    
2539     float averagemccorrection=(mcMMcorrection+mcEEcorrection)/2.0;
2540    
2541 buchmann 1.30 if(mccorrection>=1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]-" << mccorrection-1 << "*pt))";
2542     if(mccorrection<1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]+" << 1-mccorrection << "*pt))";
2543 buchmann 1.27
2544     jzbvarmcs << ")";
2545 buchmann 1.1 jzbvarmc=jzbvarmcs.str();
2546 buchmann 1.27
2547 buchmann 1.1 dout << "JZB Z pt correction summary : " << endl;
2548     dout << " Data: The response is " << datacorrection << " --> jzb variable is now : " << jzbvardata << endl;
2549     dout << " MC : The response is " << mccorrection << " --> jzb variable is now : " << jzbvarmc << endl;
2550 buchmann 1.27
2551 buchmann 1.1 }
2552    
2553     void pick_up_events(string cut) {
2554     dout << "Picking up events with cut " << cut << endl;
2555     allsamples.PickUpEvents(cut);
2556     }
2557    
2558 buchmann 1.18 void save_template(string mcjzb, string datajzb,vector<float> jzb_cuts,float MCPeakError,float DataPeakError, vector<float> jzb_shape_limit_bins) {
2559 buchmann 1.1 dout << "Saving configuration template!" << endl;
2560     ofstream configfile;
2561     configfile.open("../DistributedModelCalculations/last_configuration.C");
2562     configfile<<"#include <iostream>\n";
2563     configfile<<"#include <vector>\n";
2564     configfile<<"#ifndef SampleClassLoaded\n";
2565     configfile<<"#include \"SampleClass.C\"\n";
2566     configfile<<"#endif\n";
2567     configfile<<"#define SetupLoaded\n";
2568     configfile<<"#ifndef ResultLibraryClassLoaded\n";
2569     configfile<<"#include \"ResultLibraryClass.C\"\n";
2570     configfile<<"#endif\n";
2571    
2572     configfile<<"\nusing namespace std;\n\n";
2573    
2574     configfile<<"namespace PlottingSetup { \n";
2575     configfile<<"string datajzb=\"datajzb_ERROR\";\n";
2576     configfile<<"string mcjzb=\"mcjzb_ERROR\";\n";
2577     configfile<<"vector<float>jzb_cuts;\n";
2578 buchmann 1.18 configfile<<"vector<float>jzb_shape_limit_bins;\n";
2579 buchmann 1.1 configfile<<"float MCPeakError=-999;\n";
2580 buchmann 1.11 configfile<<"float DataPeakError=-999;\n";
2581 buchmann 1.1 configfile<<"}\n\n";
2582    
2583     configfile<<"void read_config() {\n";
2584     configfile<<"datajzb=\""<<datajzb<<"\";\n";
2585     configfile<<"mcjzb=\""<<mcjzb<<"\";\n\n";
2586 buchmann 1.11 configfile<<"\n\nMCPeakError="<<MCPeakError<<";\n";
2587     configfile<<"DataPeakError="<<DataPeakError<<";\n\n";
2588 buchmann 1.16 for(int i=0;i<(int)jzb_cuts.size();i++) configfile<<"jzb_cuts.push_back("<<jzb_cuts[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2589 buchmann 1.1 configfile<<"\n\n";
2590 buchmann 1.16 for(int i=0;i<(int)Nobs.size();i++) configfile<<"Nobs.push_back("<<Nobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2591     for(int i=0;i<(int)Npred.size();i++) configfile<<"Npred.push_back("<<Npred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2592     for(int i=0;i<(int)Nprederr.size();i++) configfile<<"Nprederr.push_back("<<Nprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2593 buchmann 1.1 configfile<<"\n\n";
2594 buchmann 1.16 for(int i=0;i<(int)flippedNobs.size();i++) configfile<<"flippedNobs.push_back("<<flippedNobs[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2595     for(int i=0;i<(int)flippedNpred.size();i++) configfile<<"flippedNpred.push_back("<<flippedNpred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2596 buchmann 1.21 for(int i=0;i<(int)flippedNprederr.size();i++) configfile<<"flippedNprederr.push_back("<<flippedNprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2597 buchmann 1.18 for(int i=0;i<(int)jzb_shape_limit_bins.size();i++) configfile<<"jzb_shape_limit_bins.push_back("<<jzb_shape_limit_bins[i]<<"); // JZB shape bin boundary at " << jzb_shape_limit_bins[i] << "\n";
2598     configfile<<"\n\n";
2599 buchmann 1.1 configfile<<"\n\n";
2600     configfile<<"luminosity="<<luminosity<<";\n";
2601 buchmann 1.5 configfile<<"RestrictToMassPeak="<<RestrictToMassPeak<<";//defines the type of analysis we're running\n";
2602 buchmann 1.1
2603     configfile<<"\n\ncout << \"Configuration successfully loaded!\" << endl; \n \n } \n \n";
2604    
2605     configfile.close();
2606    
2607     }
2608    
2609     float get_nonzero_minimum(TH1F *histo) {
2610     float min=histo->GetMaximum();
2611     for(int ibin=1;ibin<=histo->GetNbinsX();ibin++) {
2612     float curcont=histo->GetBinContent(ibin);
2613     if(curcont<min&&curcont>0) min=curcont;
2614     }
2615     return min;
2616     }
2617    
2618     void draw_all_ttbar_histos(TCanvas *can, vector<TH1F*> histos, string drawoption="", float manualmin=-9) {
2619     can->cd();
2620     float min=1;
2621     float max=histos[0]->GetMaximum();
2622     if(manualmin>=0) min=manualmin;
2623     else {
2624 buchmann 1.16 for(int i=1;i<(int)histos.size();i++) {
2625 buchmann 1.1 float curmin=get_nonzero_minimum(histos[i]);
2626     float curmax=histos[i]->GetMaximum();
2627     if(curmin<min) min=curmin;
2628     if(curmax>max) max=curmax;
2629     }
2630     }
2631     histos[0]->GetYaxis()->SetRangeUser(min,4*max);
2632     histos[0]->Draw(drawoption.c_str());
2633     stringstream drawopt;
2634     drawopt << drawoption << ",same";
2635 buchmann 1.16 for(int i=1;i<(int)histos.size();i++) {
2636 buchmann 1.1 histos[i]->Draw(drawopt.str().c_str());
2637     }
2638     }
2639    
2640     void ttbar_sidebands_comparison(string mcjzb, vector<float> binning, string prestring) {
2641     //in the case of the on peak analysis, we compare the 3 control regions to the real value
2642     //in the case of the OFF peak analysis, we compare our control region to the real value
2643     TCut weightbackup=cutWeight;
2644 buchmann 1.34
2645     bool doPURW=false;
2646    
2647    
2648     if(!doPURW) {
2649 fronga 1.40 dout << "Not doing PU reweighting for ttbar closure test" << endl;
2650 buchmann 1.34 cutWeight="1.0";
2651     // Do it without PU re-weighting
2652     float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
2653     stringstream resultsNoPU;
2654     stringstream noPUdatajzb;
2655     stringstream noPUmcjzb;
2656    
2657     stringstream mcjzbnoPU;
2658     find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,true,noPUdatajzb,noPUmcjzb);
2659 buchmann 1.36 mcjzb = noPUmcjzb.str();
2660 buchmann 1.34 }
2661    
2662 fronga 1.40
2663 buchmann 1.1 float simulatedlumi = luminosity; //in pb please - adjust to your likings
2664    
2665 fronga 1.40 TH1F *TZem = systsamples.Draw("TZem", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2666 buchmann 1.1 TH1F *nTZem = systsamples.Draw("nTZem","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2667     TH1F *TSem;
2668     TH1F *nTSem;
2669 fronga 1.40 TH1F *TZeemm = systsamples.Draw("TZeemm", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2670 buchmann 1.1 TH1F *nTZeemm = systsamples.Draw("nTZeemm","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2671     TH1F *TSeemm;
2672     TH1F *nTSeemm;
2673    
2674     if(PlottingSetup::RestrictToMassPeak) {
2675 fronga 1.40 TSem = systsamples.Draw("TSem", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2676     nTSem = systsamples.Draw("nTSem", "-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2677     TSeemm = systsamples.Draw("TSeemm", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2678 buchmann 1.1 nTSeemm = systsamples.Draw("nTSeemm","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2679     }
2680    
2681     TCanvas *tcan = new TCanvas("tcan","tcan");
2682     tcan->SetLogy(1);
2683    
2684     TZeemm->SetLineColor(kBlack);
2685     TZem->SetLineColor(kRed);
2686     TZeemm->SetMarkerColor(kBlack);
2687     TZem->SetMarkerColor(kRed);
2688    
2689    
2690     if(PlottingSetup::RestrictToMassPeak) {
2691     TSem->SetLineColor(TColor::GetColor("#00A616"));
2692     TSeemm->SetLineColor(kMagenta+2);
2693     TSem->SetMarkerColor(TColor::GetColor("#00A616"));
2694     TSeemm->SetMarkerColor(kMagenta+2);
2695     TSem->SetLineStyle(2);
2696     TSeemm->SetLineStyle(3);
2697     }
2698    
2699     vector<TH1F*> histos;
2700 buchmann 1.31 TZem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2701     TZeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2702 buchmann 1.1 histos.push_back(TZem);
2703     histos.push_back(TZeemm);
2704     if(PlottingSetup::RestrictToMassPeak) {
2705 buchmann 1.31 TSeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2706     TSem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2707 buchmann 1.1 histos.push_back(TSem);
2708     histos.push_back(TSeemm);
2709     }
2710 fronga 1.40 draw_all_ttbar_histos(tcan,histos,"histo",1);
2711 buchmann 1.1
2712     TLegend *leg = make_legend("MC t#bar{t}",0.6,0.65,false);
2713     leg->AddEntry(TZeemm,"SFZP","l");
2714     leg->AddEntry(TZem,"OFZP","l");
2715     if(PlottingSetup::RestrictToMassPeak) {
2716     leg->AddEntry(TSeemm,"SFSB","l");
2717     leg->AddEntry(TSem,"OFSB","l");
2718     }
2719     leg->Draw("same");
2720     DrawMCPrelim(simulatedlumi);
2721     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison");
2722     TH1F *TZemcopy = (TH1F*)TZem->Clone("TZemcopy");
2723     TH1F *TZeemmcopy = (TH1F*)TZeemm->Clone("TZeemmcopy");
2724 buchmann 1.11 TH1F *TSeemmcopy;
2725     TH1F *TSemcopy;
2726     if(PlottingSetup::RestrictToMassPeak) {
2727     TSeemmcopy = (TH1F*)TSeemm->Clone("TSeemmcopy");
2728     TSemcopy = (TH1F*)TSem->Clone("TSemcopy");
2729     }
2730 buchmann 1.1
2731     TZem->Divide(TZeemm);
2732     TZem->SetMarkerStyle(21);
2733     if(PlottingSetup::RestrictToMassPeak) {
2734     TSem->Divide(TZeemm);
2735     TSeemm->Divide(TZeemm);
2736     TSem->SetMarkerStyle(24);
2737     TSeemm->SetMarkerStyle(32);
2738 fronga 1.40 }
2739 buchmann 1.1
2740     tcan->SetLogy(0);
2741     TZem->GetYaxis()->SetRangeUser(0,2.5);
2742     TZem->GetYaxis()->SetTitle("ratio");
2743     TZem->Draw();
2744     if(PlottingSetup::RestrictToMassPeak) {
2745     TSem->Draw("same");
2746     TSeemm->Draw("same");
2747     }
2748    
2749 buchmann 1.33 float linepos=emuncertONPEAK;
2750     if(!PlottingSetup::RestrictToMassPeak) linepos=emuncertOFFPEAK;
2751    
2752 buchmann 1.1 TLine *top = new TLine(binning[0],1.0+linepos,binning[binning.size()-1],1.0+linepos);
2753     TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
2754     TLine *bottom = new TLine(binning[0],1.0-linepos,binning[binning.size()-1],1.0-linepos);
2755    
2756 buchmann 1.11 /*write_warning(__FUNCTION__,"These two lines are to be removed!");
2757     TLine *topalt = new TLine(binning[0],1.0+0.1,binning[binning.size()-1],1.0+0.1);
2758     TLine *bottomalt = new TLine(binning[0],1.0-0.1,binning[binning.size()-1],1.0-0.1);
2759     topalt->SetLineColor(kRed);topalt->SetLineStyle(3);
2760     bottomalt->SetLineColor(kRed);bottomalt->SetLineStyle(3);
2761     topalt->Draw("same");bottomalt->Draw("same");*/
2762    
2763    
2764 buchmann 1.1 top->SetLineColor(kBlue);top->SetLineStyle(2);
2765     bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2766     center->SetLineColor(kBlue);
2767    
2768     top->Draw("same");
2769     center->Draw("same");
2770     bottom->Draw("same");
2771    
2772     TLegend *leg2 = make_legend("MC t#bar{t}",0.55,0.75,false);
2773     leg2->AddEntry(TZem,"OFZP / SFZP","ple");
2774     if(PlottingSetup::RestrictToMassPeak) {
2775     leg2->AddEntry(TSeemm,"SFSB / SFZP","ple");
2776     leg2->AddEntry(TSem,"OFSB / SFZP","ple");
2777     }
2778     leg2->AddEntry(bottom,"syst. envelope","l");
2779     leg2->SetX1(0.25);leg2->SetX2(0.6);
2780     leg2->SetY1(0.65);
2781    
2782     leg2->Draw("same");
2783    
2784     DrawMCPrelim(simulatedlumi);
2785     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison_ratio");
2786    
2787 fronga 1.40 if (0) { // Turn this off: we don't need this
2788    
2789     ///-------------- second part: only look at the quantity we actually care about!
2790     TH1F *leftsfzp = (TH1F*)nTZeemm->Clone("leftsfzp");
2791     TH1F *rightsfzp = (TH1F*)TZeemmcopy->Clone("rightsfzp");
2792     rightsfzp->Add(leftsfzp,-1);
2793     TH1F *leftofzp = (TH1F*)nTZem->Clone("leftofzp");
2794     TH1F *rightofzp = (TH1F*)TZemcopy->Clone("rightofzp");
2795     rightofzp->Add(leftofzp,-1);
2796     TH1F *leftofsb;
2797     TH1F *rightofsb;
2798     TH1F *leftsfsb;
2799     TH1F *rightsfsb;
2800     if(PlottingSetup::RestrictToMassPeak) {
2801     leftofsb = (TH1F*)nTSem->Clone("leftofsb");
2802     rightofsb = (TH1F*)TSemcopy->Clone("rightofsb");
2803     rightofsb->Add(leftofsb,-1);
2804     leftsfsb = (TH1F*)nTSeemm->Clone("leftsfsb");
2805     rightsfsb = (TH1F*)TSeemmcopy->Clone("rightsfsb");
2806     rightsfsb->Add(leftsfsb,-1);
2807     }
2808 buchmann 1.1
2809 fronga 1.40 tcan->SetLogy(1);
2810     rightsfzp->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
2811     rightsfzp->GetYaxis()->SetTitle("#deltaJZB / 25 GeV");
2812     rightsfzp->Draw("histo");
2813     rightofzp->Draw("histo,same");
2814     if(PlottingSetup::RestrictToMassPeak) {
2815     rightofsb->Draw("histo,same");
2816     rightsfsb->Draw("histo,same");
2817     }
2818     DrawMCPrelim(simulatedlumi);
2819    
2820     TLegend *legA = make_legend("MC t#bar{t}",0.6,0.65,false);
2821     legA->AddEntry(rightsfzp,"SFZP","l");
2822     legA->AddEntry(rightofzp,"OFZP","l");
2823     if(PlottingSetup::RestrictToMassPeak) {
2824     legA->AddEntry(rightofsb,"SFSB","l");
2825     legA->AddEntry(rightsfsb,"OFSB","l");
2826     }
2827     legA->Draw();
2828 buchmann 1.1
2829 fronga 1.40 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison");
2830 buchmann 1.1
2831 fronga 1.40 tcan->SetLogy(0);
2832     rightofzp->Divide(rightsfzp);
2833     rightofzp->GetXaxis()->SetRangeUser(0.0,binning[binning.size()-1]);
2834     rightofzp->GetYaxis()->SetRangeUser(0.0,2.5);
2835     rightofzp->GetYaxis()->SetTitle("#deltaJZB ratio");
2836     rightofzp->Draw();
2837     if(PlottingSetup::RestrictToMassPeak) {
2838     rightofsb->Divide(rightsfzp);
2839     rightsfsb->Divide(rightsfzp);
2840     rightofsb->Draw("same");
2841     rightsfsb->Draw("same");
2842     }
2843 buchmann 1.1
2844 fronga 1.40 TLine *top2 = new TLine(0.0,1.0+linepos,binning[binning.size()-1],1.0+linepos);
2845     TLine *center2 = new TLine(0.0,1.0,binning[binning.size()-1],1.0);
2846     TLine *bottom2 = new TLine(0.0,1.0-linepos,binning[binning.size()-1],1.0-linepos);
2847    
2848     top2->SetLineColor(kBlue);top2->SetLineStyle(2);
2849     bottom2->SetLineColor(kBlue);bottom2->SetLineStyle(2);
2850     center2->SetLineColor(kBlue);
2851    
2852     top2->Draw("same");
2853     center2->Draw("same");
2854     bottom2->Draw("same");
2855 buchmann 1.1
2856 fronga 1.40 rightofzp->SetMarkerStyle(21);
2857     if(PlottingSetup::RestrictToMassPeak) {
2858     rightofsb->SetMarkerStyle(24);
2859     rightsfsb->SetMarkerStyle(32);
2860     }
2861 buchmann 1.1
2862 fronga 1.40 TLegend *leg3 = make_legend("MC t#bar{t}",0.55,0.75,false);
2863     leg3->AddEntry(rightofzp,"OFZP / SFZP","ple");
2864     if(PlottingSetup::RestrictToMassPeak) {
2865     leg3->AddEntry(rightsfsb,"SFSB / SFZP","ple");
2866     leg3->AddEntry(rightofsb,"OFSB / SFZP","ple");
2867     }
2868     leg3->AddEntry(bottom,"syst. envelope","l");
2869     leg3->SetX1(0.25);leg3->SetX2(0.6);
2870     leg3->SetY1(0.65);
2871 buchmann 1.1
2872 fronga 1.40 leg3->Draw("same");
2873 buchmann 1.1
2874 fronga 1.40 DrawMCPrelim(simulatedlumi);
2875     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison_ratio");
2876 buchmann 1.1
2877     }
2878    
2879     delete TZem;
2880     delete nTZem;
2881     delete TZeemm;
2882     delete nTZeemm;
2883     if(PlottingSetup::RestrictToMassPeak) {
2884     delete TSem;
2885     delete nTSem;
2886     delete TSeemm;
2887     delete nTSeemm;
2888     }
2889    
2890     delete tcan;
2891     cutWeight=weightbackup;
2892     }
2893    
2894     void ttbar_sidebands_comparison(string mcjzb, vector<float> jzb_binning) {
2895     vector<float> nicer_binning;
2896 buchmann 1.32
2897 buchmann 1.33 /* nicer_binning.push_back(-400);
2898 buchmann 1.31 nicer_binning.push_back(-250);
2899     nicer_binning.push_back(-200);
2900     nicer_binning.push_back(-150);
2901     nicer_binning.push_back(-100);
2902     nicer_binning.push_back(-50);
2903     nicer_binning.push_back(-20);
2904    
2905     nicer_binning.push_back(0);
2906     nicer_binning.push_back(20);
2907     nicer_binning.push_back(50);
2908     nicer_binning.push_back(100);
2909     nicer_binning.push_back(150);
2910     nicer_binning.push_back(200);
2911     nicer_binning.push_back(250);
2912 buchmann 1.33 nicer_binning.push_back(400);*/
2913    
2914 buchmann 1.1 nicer_binning.push_back(-100);
2915     nicer_binning.push_back(-50);
2916     nicer_binning.push_back(-25);
2917     nicer_binning.push_back(0);
2918     nicer_binning.push_back(25);
2919     nicer_binning.push_back(50);
2920     nicer_binning.push_back(75);
2921     nicer_binning.push_back(100);
2922     nicer_binning.push_back(125);
2923     nicer_binning.push_back(150);
2924 fronga 1.40 //nicer_binning.push_back(175);
2925 buchmann 1.1 nicer_binning.push_back(200);
2926 fronga 1.40 nicer_binning.push_back(250);
2927     nicer_binning.push_back(300);
2928 buchmann 1.1 nicer_binning.push_back(400);
2929 buchmann 1.33
2930 buchmann 1.1 ttbar_sidebands_comparison(mcjzb,nicer_binning, "ttbar/");
2931     }
2932    
2933    
2934 buchmann 1.34 void zjets_prediction_comparison(string mcjzbWithPUa) {
2935 buchmann 1.20 TCanvas *zcan = new TCanvas("zcan","zcan");
2936 buchmann 1.36 // zcan->SetLogy(1);
2937 buchmann 1.20 TCut weightbackup=cutWeight;
2938 buchmann 1.36
2939     bool UsePURW=false;
2940    
2941    
2942     string mcjzb;
2943     if(UsePURW) {
2944     mcjzb=mcjzbWithPUa;
2945     } else {
2946     // Do it without PU re-weighting
2947     float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
2948     stringstream resultsNoPU;
2949     stringstream noPUdatajzb;
2950     stringstream noPUmcjzb;
2951    
2952     find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,false,noPUdatajzb,noPUmcjzb);
2953     dout << "The peak corrected JZB expression for MC without pileup is : " << noPUmcjzb.str() << endl;
2954    
2955     mcjzb = noPUmcjzb.str();
2956    
2957     cutWeight="1.0";
2958     }
2959 buchmann 1.34
2960 buchmann 1.25
2961     vector<float> binning;
2962     binning.push_back(0);
2963 buchmann 1.33 binning.push_back(10);
2964 buchmann 1.34 binning.push_back(20);
2965     binning.push_back(40);
2966 fronga 1.40 binning.push_back(60);
2967 buchmann 1.36 // binning.push_back(50);
2968     // binning.push_back(60);
2969     // binning.push_back(70);
2970     // binning.push_back(80);
2971     // binning.push_back(90);
2972 buchmann 1.25 binning.push_back(100);
2973 buchmann 1.36
2974 buchmann 1.1 float simulatedlumi = luminosity;//in pb please - adjust to your likings
2975    
2976     TCut kPos((mcjzb+">0").c_str());
2977     TCut kNeg((mcjzb+"<0").c_str());
2978     string var( "abs("+mcjzb+")" );
2979 buchmann 1.36
2980     TCut notTau("abs(genMID1)!=15");
2981     TCut ONLYTau("mll>20");
2982    
2983 buchmann 1.1
2984 buchmann 1.36 TH1F *hJZBpos = systsamples.Draw("hJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2985     TH1F *hJZBneg = systsamples.Draw("hJZBneg",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2986    
2987 buchmann 1.1 hJZBpos->SetLineColor(kBlack);
2988     hJZBneg->SetLineColor(kRed);
2989    
2990 buchmann 1.25 hJZBpos->SetMinimum(1.0);
2991 buchmann 1.1 hJZBpos->Draw("e1");
2992     hJZBneg->Draw("same,hist");
2993     hJZBpos->Draw("same,e1"); // So it's on top...
2994    
2995 buchmann 1.36 TLegend *leg = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.55,0.75,false);
2996 buchmann 1.1 leg->AddEntry(hJZBpos,"Observed","pe");
2997     leg->AddEntry(hJZBneg,"Predicted","l");
2998     leg->Draw("same");
2999     DrawMCPrelim(simulatedlumi);
3000 buchmann 1.36 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction");
3001 buchmann 1.1
3002     TH1F* hratio = (TH1F*)hJZBpos->Clone("hratio");
3003     hratio->Divide(hJZBneg);
3004    
3005 buchmann 1.30 for(int i=1;i<=hJZBpos->GetNbinsX();i++) {
3006 buchmann 1.36 cout << "Positive: " << hJZBpos->GetBinContent(i) << " vs Negative : " << hJZBneg->GetBinContent(i) << " (ratio : " << hJZBpos->GetBinContent(i) / hJZBneg->GetBinContent(i) << endl;
3007 buchmann 1.30 }
3008    
3009 buchmann 1.1 zcan->SetLogy(0);
3010 fronga 1.40 hratio->GetYaxis()->SetRangeUser(0,2.0);
3011 buchmann 1.1 hratio->GetYaxis()->SetTitle("Observed/Predicted");
3012     hratio->Draw("e1");
3013    
3014 buchmann 1.25 TLine *top = new TLine(binning[0],1.25,binning[binning.size()-1],1.25);
3015     TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
3016     TLine *bottom = new TLine(binning[0],0.75,binning[binning.size()-1],0.75);
3017 buchmann 1.1
3018    
3019     top->SetLineColor(kBlue);top->SetLineStyle(2);
3020     bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
3021     center->SetLineColor(kBlue);
3022    
3023     top->Draw("same");
3024     center->Draw("same");
3025     bottom->Draw("same");
3026    
3027 buchmann 1.36 TLegend *leg2 = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.25,0.75,false);
3028 buchmann 1.1 leg2->AddEntry(hratio,"obs / pred","pe");
3029     leg2->AddEntry(bottom,"syst. envelope","l");
3030     leg2->Draw("same");
3031     DrawMCPrelim(simulatedlumi);
3032 buchmann 1.36 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction_ratio");
3033    
3034     TCut reducedNJets(cutnJets);
3035    
3036     TH1F *TAUhJZBpos = systsamples.Draw("TAUhJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
3037     TH1F *LcorrJZBeemm = systsamples.Draw("LcorrJZBeemm",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
3038     TH1F *RcorrJZBem = systsamples.Draw("RcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
3039     TH1F *LcorrJZBem = systsamples.Draw("LcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
3040    
3041     TH1F *RcorrJZBSBem;
3042     TH1F *LcorrJZBSBem;
3043     TH1F *RcorrJZBSBeemm;
3044     TH1F *LcorrJZBSBeemm;
3045    
3046     if(PlottingSetup::RestrictToMassPeak) {
3047     RcorrJZBSBem = systsamples.Draw("RcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
3048     LcorrJZBSBem = systsamples.Draw("LcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
3049     RcorrJZBSBeemm = systsamples.Draw("RcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
3050     LcorrJZBSBeemm = systsamples.Draw("LcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
3051     }
3052    
3053     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
3054     if(PlottingSetup::RestrictToMassPeak) {
3055     Bpred->Add(RcorrJZBem,1.0/3.);
3056     Bpred->Add(LcorrJZBem,-1.0/3.);
3057     Bpred->Add(RcorrJZBSBem,1.0/3.);
3058     Bpred->Add(LcorrJZBSBem,-1.0/3.);
3059     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
3060     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
3061     } else {
3062     Bpred->Add(RcorrJZBem,1.0);
3063     Bpred->Add(LcorrJZBem,-1.0);
3064     }
3065    
3066     Bpred->SetLineColor(kRed);
3067    
3068     TAUhJZBpos->SetLineColor(kBlack);
3069     Bpred->SetLineColor(kRed);
3070    
3071     TAUhJZBpos->SetMinimum(1.0);
3072     TAUhJZBpos->Draw("e1");
3073     Bpred->Draw("same,hist");
3074     TAUhJZBpos->Draw("same,e1");
3075    
3076     TLegend *TAUleg = make_legend("MC Z+jets #rightarrow ee,#mu#mu,#tau#tau",0.55,0.75,false);
3077     TAUleg->AddEntry(TAUhJZBpos,"Observed","pe");
3078     TAUleg->AddEntry(Bpred,"Predicted","l");
3079     TAUleg->Draw("same");
3080     DrawMCPrelim(simulatedlumi);
3081     CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction");
3082    
3083     TH1F* TAUhratio = (TH1F*)TAUhJZBpos->Clone("TAUhratio");
3084     TAUhratio->Divide(Bpred);
3085    
3086     for(int i=1;i<=TAUhJZBpos->GetNbinsX();i++) {
3087     cout << "ee/mm/tautau observed: " << TAUhJZBpos->GetBinContent(i) << " vs predicted : " << Bpred->GetBinContent(i) << " (ratio : " << TAUhJZBpos->GetBinContent(i) / Bpred->GetBinContent(i) << endl;
3088     }
3089    
3090     zcan->SetLogy(0);
3091     TAUhratio->GetYaxis()->SetRangeUser(0,2.5);
3092     TAUhratio->GetYaxis()->SetTitle("Observed/Predicted");
3093     TAUhratio->Draw("e1");
3094    
3095     top->Draw("same");
3096     center->Draw("same");
3097     bottom->Draw("same");
3098    
3099     TLegend *TAUleg2 = make_legend("MC Z+jets #rightarrow #tau#tau",0.25,0.75,false);
3100     TAUleg2->AddEntry(TAUhratio,"obs / pred","pe");
3101     TAUleg2->AddEntry(bottom,"syst. envelope","l");
3102     TAUleg2->Draw("same");
3103     DrawMCPrelim(simulatedlumi);
3104     CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction_ratio");
3105    
3106     delete Bpred;
3107     delete TAUhJZBpos;
3108     delete LcorrJZBeemm;
3109     delete RcorrJZBem;
3110     delete LcorrJZBem;
3111    
3112     if(PlottingSetup::RestrictToMassPeak) {
3113     delete RcorrJZBSBem;
3114     delete LcorrJZBSBem;
3115     delete RcorrJZBSBeemm;
3116     delete LcorrJZBSBeemm;
3117     }
3118    
3119 buchmann 1.1
3120     delete zcan;
3121     cutWeight=weightbackup;
3122    
3123     }
3124    
3125    
3126    
3127     void sideband_assessment(string datajzb, float min=30.0, float max=50.0) {
3128     tout << endl << endl;
3129     stringstream bordercut;
3130     bordercut << "(TMath::Abs(" << datajzb << ")<" << max << ")&&(TMath::Abs(" << datajzb << ")>" << min << ")";
3131     tout << bordercut.str().c_str() << endl;
3132     TH1F *ofsb = allsamples.Draw("ofsb",datajzb,100, 0,100, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
3133     TH1F *ofzp = allsamples.Draw("ofzp",datajzb,100, 0,100, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
3134     float OFSB = ofsb->Integral();
3135     float OFZP = ofzp->Integral();
3136    
3137     tout << "\\begin{table}[hbtp]" << endl;
3138     tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
3139     tout << "\\begin{center}" << endl;
3140     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;
3141     tout << "\\begin{tabular}{l|cc}" << endl;
3142     tout << "\\hline" << endl;
3143     tout << "& {\\OFZP} & {\\OFSB} \\\\\\hline" << endl;
3144 buchmann 1.25 tout << "\\#(events) & "<<OFZP<<" & "<<OFSB<<"\\\\ \\hline" << endl;
3145 buchmann 1.1 tout << "\\end{tabular}" << endl;
3146     tout << "\\end{center}" << endl;
3147     tout << "\\end{table}" << endl;
3148    
3149    
3150     }
3151    
3152     void make_table(samplecollection &coll, string jzbexpr, bool is_data, vector<float> jzb_cuts, string subselection="none") {
3153    
3154     vector<float> jzbcutprediction;
3155     vector<float> metcutprediction;
3156    
3157     vector<float> jzbcutobservation;
3158     vector<float> metcutobservation;
3159    
3160     TCanvas *cannie = new TCanvas("cannie","cannie");
3161    
3162 buchmann 1.16 for(int icut=0;icut<(int)jzb_cuts.size();icut++) {
3163 buchmann 1.1 float currcut=jzb_cuts[icut];
3164     int nbins=1;float low=currcut;
3165     vector<int> mysample;
3166     if(subselection!="none") mysample=coll.FindSample(subselection);
3167     TH1F *RcorrJZBeemm = coll.Draw("RcorrJZBeemm",jzbexpr,1,currcut,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3168     TH1F *LcorrJZBeemm = coll.Draw("LcorrJZBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3169     TH1F *RcorrJZBem = coll.Draw("RcorrJZBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3170     TH1F *LcorrJZBem = coll.Draw("LcorrJZBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3171    
3172     TH1F *RcorrJZBSBem;
3173     TH1F *LcorrJZBSBem;
3174     TH1F *RcorrJZBSBeemm;
3175     TH1F *LcorrJZBSBeemm;
3176    
3177     if(PlottingSetup::RestrictToMassPeak) {
3178     RcorrJZBSBem = coll.Draw("RcorrJZBSBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3179     LcorrJZBSBem = coll.Draw("LcorrJZBSBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3180     RcorrJZBSBeemm = coll.Draw("RcorrJZBSBeemm",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3181     LcorrJZBSBeemm = coll.Draw("LcorrJZBSBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3182     }
3183    
3184     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
3185     if(PlottingSetup::RestrictToMassPeak) {
3186     Bpred->Add(RcorrJZBem,1.0/3.);
3187     Bpred->Add(LcorrJZBem,-1.0/3.);
3188     Bpred->Add(RcorrJZBSBem,1.0/3.);
3189     Bpred->Add(LcorrJZBSBem,-1.0/3.);
3190     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
3191     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
3192     } else {
3193     Bpred->Add(RcorrJZBem,1.0);
3194     Bpred->Add(LcorrJZBem,-1.0);
3195     }
3196    
3197     jzbcutobservation.push_back(RcorrJZBeemm->Integral());
3198     jzbcutprediction.push_back(Bpred->Integral());
3199    
3200     delete RcorrJZBeemm;
3201     delete LcorrJZBeemm;
3202     delete RcorrJZBem;
3203     delete LcorrJZBem;
3204     delete RcorrJZBSBem;
3205     delete LcorrJZBSBem;
3206     delete RcorrJZBSBeemm;
3207     delete LcorrJZBSBeemm;
3208    
3209     TH1F *MetObs = coll.Draw("MetObs",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3210     TH1F *MetPred = coll.Draw("MetPred",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3211    
3212     metcutobservation.push_back(MetObs->Integral());
3213     metcutprediction.push_back(MetPred->Integral());
3214     delete MetObs;
3215     delete MetPred;
3216     }//end of cut loop
3217    
3218     //prediction part
3219     if(is_data) cout << "Data prediction & ";
3220     if(subselection!="none") cout << subselection << " prediction &";
3221 buchmann 1.16 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutprediction[ij] << " vs " << metcutprediction[ij] << " & ";
3222 buchmann 1.1
3223     cout << endl;
3224     //observation part
3225     if(is_data) cout << "Data observation & ";
3226     if(subselection!="none") cout << subselection << " observation &";
3227 buchmann 1.16 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutobservation[ij] << " vs " << metcutobservation[ij] << " & ";
3228 buchmann 1.1 cout << endl;
3229     cout << "_________________________________________________________________" << endl;
3230     delete cannie;
3231     }
3232    
3233     void met_jzb_cut(string datajzb, string mcjzb, vector<float> jzb_cut) {
3234     /*we want a table like this:
3235     __________________ 50 | 100 | ...
3236     | Data prediction | a vs b | a vs b | ...
3237     | Data observed | a vs b | a vs b | ...
3238     --------------------------------------
3239     --------------------------------------
3240     | LM4 prediction | a vs b | a vs b | ...
3241     | LM4 observed | a vs b | a vs b | ...
3242     | LM8 prediction | a vs b | a vs b | ...
3243     | LM8 observed | a vs b | a vs b | ...
3244    
3245     where a is the result for a jzb cut at X, and b is the result for a met cut at X
3246     */
3247     make_table(allsamples,datajzb, true,jzb_cut,"none");
3248     make_table(signalsamples,mcjzb, false,jzb_cut,"LM4");
3249     make_table(signalsamples,mcjzb, false,jzb_cut,"LM8");
3250     }
3251    
3252    
3253     //________________________________________________________________________________________
3254     // JZB Efficiency plot (efficiency of passing reco. JZB cut as function of generator JZB cut)
3255     void JZBSelEff(string mcjzb, TTree* events, string informalname, vector<float> jzb_bins) {
3256    
3257     float min = 0, max = 400;
3258     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};
3259     int nbins = sizeof(xbins)/sizeof(float)-1;
3260     int markers[] = { 20, 26, 21, 24, 22, 25, 28 };
3261    
3262 buchmann 1.14
3263     TH1F* heff = new TH1F("heff", "JZB eff ; generator JZB [GeV]; efficiency",nbins,xbins);
3264     TH1F* hgen = new TH1F("hgen", "JZB gen ; generator JZB [GeV]; efficiency",nbins,xbins);
3265     TH1F* hreco = new TH1F("hreco","JZB reco ; generator JZB [GeV]; efficiency",nbins,xbins);
3266 buchmann 1.1
3267     TCut kgen(genMassCut&&"genZPt>0&&genNjets>2&&abs(genMID)==23"&&cutOSSF);
3268     TCut kreco(cutmass);
3269    
3270     TF1* func = new TF1("func","0.5*[2]*(TMath::Erf((x-[1])/[0])+1)",min,max);
3271     func->SetParNames("epsilon","x_{1/2}","sigma");
3272     func->SetParameter(0,50.);
3273     func->SetParameter(1,0.);
3274     func->SetParameter(2,1.);
3275     gStyle->SetOptStat(0);
3276     gStyle->SetOptFit(0);
3277    
3278     TCanvas *can = new TCanvas("can","Canvas for JZB Efficiency",600,600);
3279     can->SetGridx(1);
3280     can->SetGridy(1);
3281 buchmann 1.14 can->SetLeftMargin(0.16);
3282     can->SetRightMargin(0.05);
3283 buchmann 1.1 TLegend *leg = make_legend("",0.6,0.2,false,0.89,0.5);
3284 buchmann 1.14 leg->SetBorderSize(1);
3285     leg->SetLineColor(kBlack);
3286     leg->SetTextFont(62);
3287 buchmann 1.1
3288 buchmann 1.16 for ( int icut=0; icut<(int)jzb_bins.size(); ++icut ) {
3289 buchmann 1.1
3290     ostringstream selection;
3291     selection << mcjzb << ">" << jzb_bins[icut];
3292     TCut ksel(selection.str().c_str());
3293     events->Draw("genJZB>>hgen", kgen&&kreco, "goff");
3294     events->Draw("genJZB>>hreco",kgen&&kreco&&ksel,"goff");
3295    
3296     // Loop over steps to get efficiency curve
3297     for ( Int_t iBin = 0; iBin<nbins-1; ++iBin ) {
3298     Float_t eff = hreco->GetBinContent(iBin+1)/hgen->GetBinContent(iBin+1);
3299     heff->SetBinContent(iBin+1,eff);
3300     heff->SetBinError(iBin+1,TMath::Sqrt(eff*(1-eff)/hgen->GetBinContent(iBin+1)));
3301     }
3302    
3303     heff->GetXaxis()->SetRangeUser(min, max);
3304 buchmann 1.14 // heff->GetXaxis()->SetLabelSize(0.05); // paper style. overruled.
3305     // heff->GetYaxis()->SetLabelSize(0.05); // paper style. overruled.
3306     // heff->GetXaxis()->SetTitleSize(0.06); // paper style. overruled.
3307     // heff->GetYaxis()->SetTitleSize(0.06); // paper style. overruled.
3308 buchmann 1.1 heff->SetMarkerStyle(markers[icut]);
3309     heff->Fit("func","Q+","same");
3310    
3311     // Print values
3312     dout << "+++ For " << selection.str() << std::endl;
3313     for ( int i=0; i<func->GetNpar(); ++i )
3314     dout << " " << func->GetParName(i) << " " << func->GetParameter(i) << " \\pm " << func->GetParError(i) << std::endl;
3315     char hname[256]; sprintf(hname,"heff%d",icut);
3316    
3317     // Store plot
3318     TH1F* h = (TH1F*)heff->Clone(hname);
3319 buchmann 1.14 h->SetNdivisions(505,"X");
3320 buchmann 1.1 if ( icut) h->Draw("same");
3321     else h->Draw();
3322     char htitle[256]; sprintf(htitle,"JZB > %3.0f GeV", jzb_bins[icut]);
3323     leg->AddEntry(h,htitle,"p");
3324    
3325     }
3326    
3327     leg->Draw();
3328     DrawMCPrelim(0.0);
3329     CompleteSave(can, "Systematics/jzb_efficiency_curve"+informalname );
3330    
3331     delete hgen;
3332     delete hreco;
3333     delete heff;
3334     }
3335    
3336     //________________________________________________________________________________________
3337     // Calls the above function for each signal sample
3338     void plot_jzb_sel_eff(string mcjzb, samplecollection &signalsamples, vector<float> bins )
3339     {
3340 buchmann 1.16 for (int isignal=0; isignal<(int)signalsamples.collection.size();isignal++) {
3341 buchmann 1.1 dout << "JZB selection efficiency curve: " << std::endl;
3342     JZBSelEff(mcjzb,(signalsamples.collection)[isignal].events,(signalsamples.collection)[isignal].samplename,bins); // Only for some selected samples
3343     }
3344     }
3345 buchmann 1.3
3346     void qcd_plots(string datajzb, string mcjzb, vector<float> bins) {
3347     // What this function aims to do:
3348     // Illustrate cut flow for QCD (requiring only one lepton, requiring etc.)
3349     // 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.
3350     TCanvas *can = new TCanvas("can","can");
3351     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
3352     kinpad->cd();
3353    
3354     string jzb=mcjzb;
3355    
3356     float hi=400;
3357     bool use_signal=false;
3358     bool use_data=false;
3359    
3360     bool is_data=false;
3361     int nbins=50;//100;
3362     float low=0;
3363     float high=500;
3364     int versok=false;
3365     if(gROOT->GetVersionInt()>=53000) versok=true;
3366    
3367     TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
3368     TH1F *RcorrJZBeemm = qcdsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3369     TH1F *LcorrJZBeemm = qcdsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3370     TH1F *RcorrJZBem = qcdsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3371     TH1F *LcorrJZBem = qcdsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3372     blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
3373     blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
3374     blankback->GetXaxis()->CenterTitle();
3375     blankback->GetYaxis()->CenterTitle();
3376    
3377     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
3378     TH1F *RcorrJZBSBem;
3379     TH1F *LcorrJZBSBem;
3380     TH1F *RcorrJZBSBeemm;
3381     TH1F *LcorrJZBSBeemm;
3382    
3383 buchmann 1.16 // TH1F *RcorrJZBeemmNoS;
3384 buchmann 1.3
3385     //these are for the ratio
3386     TH1F *JRcorrJZBeemm = qcdsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3387     TH1F *JLcorrJZBeemm = qcdsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3388     TH1F *JRcorrJZBem = qcdsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3389     TH1F *JLcorrJZBem = qcdsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3390    
3391     TH1F *JRcorrJZBSBem;
3392     TH1F *JLcorrJZBSBem;
3393     TH1F *JRcorrJZBSBeemm;
3394     TH1F *JLcorrJZBSBeemm;
3395    
3396     if(PlottingSetup::RestrictToMassPeak) {
3397     RcorrJZBSBem = qcdsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3398     LcorrJZBSBem = qcdsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3399     RcorrJZBSBeemm = qcdsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3400     LcorrJZBSBeemm = qcdsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3401    
3402     //these are for the ratio
3403     JRcorrJZBSBem = qcdsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3404     JLcorrJZBSBem = qcdsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3405     JRcorrJZBSBeemm = qcdsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3406     JLcorrJZBSBeemm = qcdsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3407    
3408     }
3409    
3410     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
3411    
3412     TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
3413     TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
3414    
3415     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
3416     TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
3417     if(PlottingSetup::RestrictToMassPeak) {
3418     Bpred->Add(RcorrJZBem,1.0/3.);
3419     Bpred->Add(LcorrJZBem,-1.0/3.);
3420     Bpred->Add(RcorrJZBSBem,1.0/3.);
3421     Bpred->Add(LcorrJZBSBem,-1.0/3.);
3422     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
3423     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
3424    
3425     TTbarpred->Scale(1.0/3);
3426     Zjetspred->Add(LcorrJZBem,-1.0/3.);
3427     Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
3428     TTbarpred->Add(RcorrJZBSBem,1.0/3.);
3429     Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
3430     TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
3431    
3432     //these are for the ratio
3433     JBpred->Add(JRcorrJZBem,1.0/3.);
3434     JBpred->Add(JLcorrJZBem,-1.0/3.);
3435     JBpred->Add(JRcorrJZBSBem,1.0/3.);
3436     JBpred->Add(JLcorrJZBSBem,-1.0/3.);
3437     JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
3438     JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
3439     } else {
3440     Bpred->Add(RcorrJZBem,1.0);
3441     Bpred->Add(LcorrJZBem,-1.0);
3442    
3443     Zjetspred->Add(LcorrJZBem,-1.0);
3444    
3445     //these are for the ratio
3446     JBpred->Add(JRcorrJZBem,1.0);
3447     JBpred->Add(JLcorrJZBem,-1.0);
3448     }
3449    
3450    
3451     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
3452 buchmann 1.1
3453 buchmann 1.3 TLegend *legBpred = make_legend("",0.6,0.55,false);
3454     RcorrJZBeemm->Draw("e1x0,same");
3455     Bpred->Draw("hist,same");
3456     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
3457     legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
3458     legBpred->AddEntry(Bpred,"MC predicted","l");
3459     if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
3460     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
3461     legBpred->Draw();
3462     DrawMCPrelim();
3463    
3464     //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
3465     string ytitle("ratio");
3466     if ( use_data==1 ) ytitle = "data/pred";
3467 buchmann 1.25 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,"QCD/Bpred",true,false,ytitle);
3468 buchmann 1.3
3469     TH1F *allevents = qcdsamples.Draw("allevents","pfJetGoodNum",1,0,100, "internal code", "events", "" ,mc, luminosity);
3470     TH1F *ossf = qcdsamples.Draw("ossf","pfJetGoodNum",1,0,100, "internal code", "events", cutOSSF ,mc, luminosity);
3471     TH1F *osof = qcdsamples.Draw("osof","pfJetGoodNum",1,0,100, "internal code", "events", cutOSOF ,mc, luminosity);
3472     TH1F *njossf = qcdsamples.Draw("njossf","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSSF ,mc, luminosity);
3473     TH1F *njosof = qcdsamples.Draw("njosof","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSOF ,mc, luminosity);
3474    
3475     dout << "______________________________________________" << endl;
3476     dout << "QCD contribution: " << endl;
3477     dout << "Total number of events: " << allevents->Integral() << endl;
3478     dout << "OSSF events: " << ossf->Integral() << endl;
3479     dout << "OSOF events: " << osof->Integral() << endl;
3480     dout << "OSSF events with >=3 jets:" << njossf->Integral() << endl;
3481     dout << "OSOF events with >=3 jets:" << njosof->Integral() << endl;
3482     dout << "(note that no mass requirement has been imposed)" << endl;
3483    
3484     dout << "______________________________________________" << endl;
3485     dout << "How QCD shows up in the different regions: " << endl;
3486     dout << "OSSF: " << endl;
3487     if(PlottingSetup::RestrictToMassPeak) {
3488     dout << " Z window: \t" << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
3489     dout << " sideband: \t" << RcorrJZBSBeemm->Integral() << " (JZB>0) , " << LcorrJZBSBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBSBeemm->Integral() + LcorrJZBSBeemm->Integral() << endl;
3490     } else {
3491     dout << " " << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
3492     }
3493     dout << "OSOF: " << endl;
3494     if(PlottingSetup::RestrictToMassPeak) {
3495     dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
3496     dout << " sideband: \t" << RcorrJZBSBem->Integral() << " (JZB>0) , " << LcorrJZBSBem->Integral() << " (JZB<0) --> total: " << RcorrJZBSBem->Integral() + LcorrJZBSBem->Integral() << endl;
3497     } else {
3498     dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
3499     }
3500     dout << "Therefore: " << endl;
3501     if(PlottingSetup::RestrictToMassPeak) {
3502     dout << " Prediction increases by : " << LcorrJZBeemm->Integral() << " + (1.0/3)*(" << RcorrJZBSBeemm->Integral() <<"-"<< LcorrJZBSBeemm->Integral() << ") (SFSB) ";
3503     dout << " + (1.0/3)*(" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
3504     dout << " + (1.0/3)*(" << RcorrJZBSBem->Integral() <<"-"<< LcorrJZBSBem->Integral() << ") (OFSB) ";
3505     dout << " = " << LcorrJZBeemm->Integral() + (1.0/3)*(RcorrJZBSBeemm->Integral() - LcorrJZBSBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() + RcorrJZBSBem->Integral() - LcorrJZBSBem->Integral()) << endl;
3506     } else {
3507     dout << " Prediction increases by : " << LcorrJZBeemm->Integral();
3508     dout << " + (" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
3509     dout << " = " << LcorrJZBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() << endl;
3510     }
3511     dout << " Observation increases by : " << RcorrJZBeemm->Integral() << endl;
3512    
3513     dout << endl;
3514 buchmann 1.16 for(int i=0;i<(int)bins.size();i++) {
3515 buchmann 1.3 dout << " JZB > " << bins[i] << " : " << endl;
3516     dout << " Observation increases by : " << RcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
3517     if(PlottingSetup::RestrictToMassPeak) {
3518     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;
3519     } else {
3520     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;
3521     }
3522     }
3523    
3524     delete can;
3525     delete allevents;
3526     if(ossf) delete ossf;
3527     if(RcorrJZBem) delete RcorrJZBem;
3528     if(LcorrJZBem) delete LcorrJZBem;
3529     if(RcorrJZBeemm) delete RcorrJZBeemm;
3530     if(LcorrJZBeemm) delete LcorrJZBeemm;
3531     if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBem) delete RcorrJZBSBem;
3532     if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBem) delete LcorrJZBSBem;
3533     if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBeemm) delete RcorrJZBSBeemm;
3534     if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBeemm) delete LcorrJZBSBeemm;
3535     }
3536 buchmann 1.1
3537 buchmann 1.4 void check_ptsanity() {
3538     TCanvas *ptsancan = new TCanvas("ptsancan","ptsancan",600,1800);
3539     TH1F *individualpt1histos[allsamples.collection.size()];
3540     TH1F *individualpt2histos[allsamples.collection.size()];
3541     TH1F *fpt1 = new TH1F("fpt1","fpt1",50,0,50);
3542     fpt1->GetYaxis()->SetRangeUser(0,1);
3543     fpt1->GetXaxis()->SetTitle("p_{T,1}");
3544     fpt1->GetXaxis()->CenterTitle();
3545    
3546     TH1F *fpt2 = new TH1F("fpt2","fpt2",50,0,50);
3547     fpt2->GetXaxis()->SetTitle("p_{T,2}");
3548     fpt2->GetXaxis()->CenterTitle();
3549    
3550     ptsancan->Divide(1,3);
3551     ptsancan->cd(1);
3552     float maxpt1entry=0;
3553     float maxpt2entry=0;
3554    
3555     TLegend *leg = make_legend();
3556     leg->SetX1(0.0);
3557     leg->SetY1(0.0);
3558     leg->SetX2(1.0);
3559     leg->SetY2(1.0);
3560    
3561    
3562 buchmann 1.16 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
3563 buchmann 1.4 string nowname=(allsamples.collection)[isample].filename;
3564     cout << "Drawing: " << nowname << " (sample " << isample+1 << " / " << allsamples.collection.size() << ")" << endl;
3565     individualpt1histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt1",50,0,50, "p_{T,1}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
3566     individualpt2histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt2",50,0,50, "p_{T,2}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
3567     individualpt1histos[isample]->SetLineColor(isample+1);
3568     individualpt2histos[isample]->SetLineColor(isample+1);
3569     float currmaxpt1entry=individualpt1histos[isample]->GetMaximum()/individualpt1histos[isample]->Integral();
3570     float currmaxpt2entry=individualpt2histos[isample]->GetMaximum()/individualpt2histos[isample]->Integral();
3571     cout << " pt 1 histo contains; " << individualpt1histos[isample]->Integral() << endl;
3572     cout << " pt 2 histo contains; " << individualpt2histos[isample]->Integral() << endl;
3573     if(currmaxpt1entry>maxpt1entry)maxpt1entry=currmaxpt1entry;
3574     if(currmaxpt2entry>maxpt2entry)maxpt2entry=currmaxpt2entry;
3575     leg->AddEntry(individualpt2histos[isample],((allsamples.collection)[isample].filename).c_str(),"f");
3576     }
3577    
3578     fpt1->GetYaxis()->SetRangeUser(0,maxpt1entry);
3579     fpt2->GetYaxis()->SetRangeUser(0,maxpt2entry);
3580    
3581     ptsancan->cd(1);
3582     fpt1->Draw();
3583     ptsancan->cd(2);
3584     fpt2->Draw();
3585    
3586 buchmann 1.16 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
3587 buchmann 1.4 ptsancan->cd(1);
3588     individualpt1histos[isample]->DrawNormalized("same,histo");
3589     ptsancan->cd(2);
3590     individualpt2histos[isample]->DrawNormalized("same,histo");
3591     }
3592     ptsancan->cd(3);
3593     leg->Draw();
3594     CompleteSave(ptsancan,"PtSanityCheck");
3595    
3596     delete ptsancan;
3597     }
3598    
3599 buchmann 1.6 void do_mlls_plot(string mcjzb) {
3600     cout << "At this point we'd plot the mll distribution" << endl;
3601     TCanvas *sigcan = new TCanvas("sigcan","sigcan");
3602 buchmann 1.16 for(int isig=0;isig<(int)(signalsamples.collection).size();isig++) {
3603 buchmann 1.6 if(!(signalsamples.collection)[isig].events) continue;
3604     string nowname=(signalsamples.collection)[isig].filename;
3605     TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets,mc,luminosity,signalsamples.FindSample(nowname));
3606     // TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events","",mc,luminosity,signalsamples.FindSample(nowname));
3607     mll->SetLineColor(TColor::GetColor("#04B404"));
3608     stringstream poscutS;
3609     poscutS << "((" << mcjzb <<")>50)";
3610     TCut poscut(poscutS.str().c_str());
3611     TH1F *mllP = signalsamples.Draw("mllhistoP","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets&&poscut,mc,luminosity,signalsamples.FindSample(nowname));
3612     mllP->SetLineColor(TColor::GetColor("#0040FF"));
3613     mll->Draw("histo");
3614     mllP->Draw("histo,same");
3615     TLegend *leg = make_legend();
3616     leg->SetY1(0.8);
3617     leg->AddEntry(mll,(signalsamples.collection)[isig].samplename.c_str(),"L");
3618     leg->AddEntry(mllP,((signalsamples.collection)[isig].samplename+", JZB>50").c_str(),"L");
3619     leg->Draw();
3620     TLine *lin = new TLine(71.2,0,71.2,mll->GetMaximum());
3621     TLine *lin2 = new TLine(111.2,0,111.2,mll->GetMaximum());
3622     lin->Draw("same");
3623     lin2->Draw("same");
3624    
3625     CompleteSave(sigcan,"MllShape/"+(signalsamples.collection)[isig].samplename);
3626     delete mll;
3627     delete mllP;
3628     }
3629     }
3630    
3631 buchmann 1.47 void met_vs_jzb_plots(string datajzb, string mcjzb) {
3632 buchmann 1.9
3633     TCanvas *canmetjzb = new TCanvas("canmet","MET vs JZB canvas");
3634     canmetjzb->SetRightMargin(0.16);
3635    
3636     vector<string> findme;
3637     findme.push_back("DY");
3638     findme.push_back("TTJets");
3639     findme.push_back("LM");
3640 buchmann 1.48 /*
3641 buchmann 1.16 for(int ifind=0;ifind<(int)findme.size();ifind++) {
3642 buchmann 1.9 vector<int> selsamples = allsamples.FindSample(findme[ifind]);
3643     TH2F *metvsjzb = new TH2F("metvsjzb","metvsjzb",200,0,100,400,-100,100);
3644 buchmann 1.16 for(int isel=0;isel<(int)selsamples.size();isel++) {
3645 buchmann 1.47 dout << "Producing MET:JZB plot ... working on sample: " << allsamples.collection[selsamples[isel]].filename << endl;
3646     allsamples.collection[selsamples[isel]].events->Draw("jzb[1]:met[4]>>+metvsjzb",cutmass&&cutOSSF&&cutnJets);
3647 buchmann 1.9 }
3648     metvsjzb->Scale(allsamples.collection[selsamples[0]].weight);
3649     metvsjzb->SetStats(0);
3650     metvsjzb->GetXaxis()->SetTitle("MET (GeV)");
3651     metvsjzb->GetYaxis()->SetTitle("JZB (GeV)");
3652     metvsjzb->GetXaxis()->CenterTitle();
3653     metvsjzb->GetYaxis()->CenterTitle();
3654     metvsjzb->Draw("COLZ");
3655     TText* title = write_text(0.5,0.95,allsamples.collection[selsamples[0]].samplename);
3656     title->SetTextAlign(12);
3657     title->Draw();
3658     CompleteSave(canmetjzb,(string)"METvsJZBplots/"+findme[ifind]);
3659     }
3660 buchmann 1.48 */
3661 buchmann 1.47
3662     dout << "About to produce MET plot for DY split up by JZB" << endl;
3663    
3664     int nbins=14;
3665     float low=0;
3666     float high=140;
3667    
3668     stringstream sLEFT;
3669     sLEFT << "((" << mcjzb << ")<0)";
3670     TCut LEFT(sLEFT.str().c_str());
3671     stringstream sRIGHT;
3672     sRIGHT << "((" << mcjzb << ")>0)";
3673     TCut RIGHT(sRIGHT.str().c_str());
3674    
3675     TH1F *metleft = allsamples.Draw("metleft","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
3676     TH1F *metleftO = allsamples.Draw("metleftO","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
3677     TH1F *metright = allsamples.Draw("metright","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
3678     TH1F *metrightO = allsamples.Draw("metrightO","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
3679    
3680 buchmann 1.48
3681     TH1F *Bpred = (TH1F*)metleft->Clone("Bpred");
3682     Bpred->Add(metleftO,-1);
3683     Bpred->Add(metrightO);
3684     TH1F *obs = (TH1F*)metright->Clone("obs");
3685    
3686 buchmann 1.47 metleft->Add(metleftO,-1);
3687     metright->Add(metrightO,-1);
3688    
3689     metleft->SetLineColor(kRed);
3690     metright->SetLineColor(kBlack);
3691     TPad *metpad = new TPad("metpad","metpad",0,0,1,1);
3692     metpad->cd();
3693     metpad->SetLogy(1);
3694     metleft->Draw("histo");
3695     metright->Draw("same");
3696     TLegend *lg = make_legend();
3697     lg->SetX1(0.5);
3698 buchmann 1.48 lg->SetY1(0.7);
3699 buchmann 1.47 lg->AddEntry(metright,"JZB>0 (OSOF corrected)","P");
3700     lg->AddEntry(metleft,"JZB<0 (OSOF corrected)","L");
3701 buchmann 1.48 lg->SetHeader("DY");
3702    
3703 buchmann 1.47 lg->Draw();
3704     save_with_ratio(metright,metleft,metpad->cd(),"METvsJZBplots/ComparingLeftToRightinMETspectrum");
3705 buchmann 1.48
3706     TPad *metpad3 = new TPad("metpad3","metpad3",0,0,1,1);
3707     metpad3->cd();
3708     metpad3->SetLogy(1);
3709     Bpred->SetLineColor(kRed);
3710     Bpred->Draw("histo");
3711     obs->SetLineColor(kBlack);
3712     obs->Draw("same");
3713     TLegend *lg2 = make_legend();
3714     lg2->SetX1(0.5);
3715     lg2->SetY1(0.7);
3716     lg2->AddEntry(obs,"observed","P");
3717     lg2->AddEntry(Bpred,"predicted","L");
3718     lg2->SetHeader("DY");
3719    
3720     lg2->Draw();
3721    
3722     save_with_ratio(obs,Bpred,metpad3->cd(),"METvsJZBplots/ComparingPredObsinMET");
3723    
3724 buchmann 1.47 TPad *metpad2 = new TPad("metpad2","metpad2",0,0,1,1);
3725 buchmann 1.48 metpad2->cd();
3726     metpad2->SetLogy(1);
3727 buchmann 1.47
3728     TH1F *metlefta = allsamples.Draw("metlefta","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
3729     TH1F *metleftOa = allsamples.Draw("metleftOa","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
3730     TH1F *metrighta = allsamples.Draw("metrighta","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
3731     TH1F *metrightOa = allsamples.Draw("metrightOa","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
3732    
3733     metlefta->Add(metleftOa,-1);
3734     metrighta->Add(metrightOa,-1);
3735    
3736     metlefta->SetLineColor(kRed);
3737     metpad2->cd();
3738     metlefta->Draw("histo");
3739     metrighta->Draw("same");
3740     lg->Draw();
3741     save_with_ratio(metrighta,metlefta,metpad2->cd(),"METvsJZBplots/ComparingLeftToRightinMET_type1_spectrum");
3742    
3743 buchmann 1.48 delete Bpred;
3744     delete obs;
3745    
3746     float newhigh=300;
3747     int newNBins=30;
3748    
3749     TPad *metpad4 = new TPad("metpad4","metpad4",0,0,1,1);
3750     TH1F *Ametleft = allsamples.Draw("Ametleft","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity);
3751     TH1F *AmetleftO = allsamples.Draw("AmetleftO","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity);
3752     TH1F *Ametright = allsamples.Draw("Ametright","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity);
3753     TH1F *AmetrightO = allsamples.Draw("AmetrightO","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity);
3754    
3755     TH1F *aBpred = (TH1F*)Ametleft->Clone("aBpred");
3756     aBpred->Add(AmetleftO,-1);
3757     aBpred->Add(AmetrightO);
3758     aBpred->SetLineColor(kRed);
3759    
3760     TH1F *aobs = (TH1F*)Ametright->Clone("aobs");
3761     metpad4->cd();
3762     metpad4->SetLogy(1);
3763     aobs->Draw();
3764     aBpred->Draw("histo,same");
3765     aobs->Draw("same");
3766     lg->SetHeader("All MC");
3767     lg->Draw();
3768     save_with_ratio(aobs,aBpred,metpad4->cd(),"METvsJZBplots/ComparingPredObsinMET_ALLSAMPLES");
3769    
3770 buchmann 1.47
3771     delete lg;
3772     delete canmetjzb;
3773     delete metleft;
3774     delete metleftO;
3775     delete metright;
3776     delete metrightO;
3777 buchmann 1.9 }
3778    
3779    
3780 buchmann 1.1 void test() {
3781    
3782     TCanvas *testcanv = new TCanvas("testcanv","testcanv");
3783     testcanv->cd();
3784 buchmann 1.33 // switch_overunderflow(true);
3785 buchmann 1.1 TH1F *ptdistr = allsamples.Draw("ptdistr","pt1",100,30,200, "p_{T} [GeV]", "events", cutOSSF,data,luminosity);
3786     switch_overunderflow(false);
3787     ptdistr->Draw();
3788     testcanv->SaveAs("test.png");
3789     dout << "HELLO there!" << endl;
3790    
3791     }