ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.49
Committed: Wed Aug 15 11:46:28 2012 UTC (12 years, 8 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.48: +66 -58 lines
Log Message:
Pimped up the OF/SF comparison plots.

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