ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.79
Committed: Wed Jan 23 16:50:48 2013 UTC (12 years, 3 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.78: +195 -22 lines
Log Message:
Updated ratio plots to new format (which doesn't each the tvirtualpad you pass it); added systematic plots (for scale and matching)

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 buchmann 1.57 void find_one_peak_combination(TCut specialcut, bool SwitchOffNJetsCut, 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.57 TCut nJetsCut(cutnJets);
46     if(SwitchOffNJetsCut) nJetsCut=specialcut;
47    
48 buchmann 1.1 TCanvas *tempcan = new TCanvas("tempcan","Temporary canvas for peak finding preparations");
49 buchmann 1.57 TH1F *rawJZBeemmMC = allsamples.Draw("rawJZBeemmMC",jzbvariablemc,nbins,-50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&nJetsCut&&specialcut,mc, luminosity);
50     TH1F *rawJZBeemmData = allsamples.Draw("rawJZBeemmData",jzbvariabledata,nbins, -50,50, "JZB [GeV]", "events", cutmass&&cutOSSF&&nJetsCut&&specialcut,data, luminosity);
51     TH1F *rawJZBemMC = allsamples.Draw("rawJZBemMC",jzbvariablemc,nbins,-50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&nJetsCut&&specialcut,mc, luminosity);
52     TH1F *rawJZBemData = allsamples.Draw("rawJZBemData",jzbvariabledata,nbins, -50,50, "JZB [GeV]", "events", cutmass&&cutOSOF&&nJetsCut&&specialcut,data, luminosity);
53 buchmann 1.1 TH1F *rawttbarjzbeemmMC;
54    
55     if(method==doKM) {
56     //we only need this histo for the KM fitting...
57 buchmann 1.57 rawttbarjzbeemmMC = allsamples.Draw("rawttbarjzbeemmMC",jzbvariablemc,nbins, -50,50, "JZB [GeV]", "events",cutmass&&cutOSSF&&nJetsCut&&specialcut,mc,luminosity,allsamples.FindSample("TTJet"));
58 fronga 1.40 MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,MCSigmaError,method,saveas);
59     DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,DataSigmaError,method,saveas);
60 buchmann 1.28 delete rawttbarjzbeemmMC;
61 buchmann 1.1 }
62     else {
63     TH1F *reducedMC = (TH1F*)rawJZBeemmMC->Clone();
64     TH1F *reducedData = (TH1F*)rawJZBeemmData->Clone();
65     reducedMC->Add(rawJZBemMC,-1);
66     reducedData->Add(rawJZBemData,-1);
67     //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)
68 fronga 1.40 MCPeak=find_peak(reducedMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,MCSigmaError,method,saveas);
69     DataPeak=find_peak(reducedData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,DataSigmaError,method,saveas);
70 buchmann 1.28 delete reducedMC;
71     delete reducedData;
72 buchmann 1.1 }
73    
74     // Revert to original PU reweighting
75     if ( !doPUreweighting ) cutWeight = weightbackup;
76    
77     // MCPeak=find_peak(rawJZBeemmMC, rawttbarjzbeemmMC, -40, 40, mc, MCPeakError,MCSigma,method);
78     // DataPeak=find_peak(rawJZBeemmData, rawJZBeemmData, -40, 40, data, DataPeakError,DataSigma,method);
79 fronga 1.40 dout << " We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- " << DataSigmaError << endl;
80     result << " We have found the peak in Data at " << DataPeak << " +/- " << DataPeakError << " with sigma=" << DataSigma << " +/- " << DataSigmaError << endl;
81     dout << " We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- " << MCSigmaError << endl;
82     result << " We have found the peak in MC at " << MCPeak << " +/- " << MCPeakError << " with sigma=" << MCSigma << " +/- " << MCSigmaError << endl;
83 buchmann 1.28 delete rawJZBeemmData;
84     delete rawJZBeemmMC;
85     delete rawJZBemData;
86     delete rawJZBemMC;
87 buchmann 1.1 delete tempcan;
88     }
89    
90 buchmann 1.57 void find_peaks(float &MCPeak,float &MCPeakError, float &DataPeak, float &DataPeakError, stringstream &result, bool doPUreweighting, stringstream &datajzb, stringstream &mcjzb, string sSpecialCut="", bool SwitchOffNJetsCut=false)
91 buchmann 1.28 {
92 buchmann 1.66 bool overunderflowstatus=addoverunderflowbins;
93 buchmann 1.53 switch_overunderflow(false);
94 buchmann 1.57
95     TCut SpecialCut("mll>=0");
96     if(sSpecialCut!="") SpecialCut=TCut(sSpecialCut.c_str());
97    
98 buchmann 1.31 bool DoInvidualeemmPeaks=false;
99    
100 buchmann 1.28 float mcpeak, datapeak;
101     float mcpeakerr, datapeakerr;
102    
103     float mceepeak,mcmmpeak;
104     float mceepeakerr,mcmmpeakerr;
105    
106     float datammpeak,dataeepeak;
107     float datammpeakerr,dataeepeakerr;
108    
109 fronga 1.40 float mcSigma,mcSigmaError, dataSigma, dataSigmaError;
110 buchmann 1.28
111     dout << "Finding global peak : " << endl;
112 buchmann 1.57 find_one_peak_combination(SpecialCut,SwitchOffNJetsCut,mcpeak,mcpeakerr, datapeak,datapeakerr,mcSigma,mcSigmaError, dataSigma,dataSigmaError,result,doPUreweighting,"");
113 buchmann 1.30
114 buchmann 1.31 if(DoInvidualeemmPeaks) {
115     dout << "Finding peak for electrons : " << endl;
116 buchmann 1.57 find_one_peak_combination(SpecialCut&&TCut("id1==0"),SwitchOffNJetsCut,mceepeak,mceepeakerr,dataeepeak,dataeepeakerr,mcSigma,mcSigmaError,dataSigma,dataSigmaError,result,doPUreweighting,"_ele");
117 buchmann 1.31 dout << "Finding peak for muons : " << endl;
118 buchmann 1.57 find_one_peak_combination(SpecialCut&&TCut("id1==1"),SwitchOffNJetsCut,mcmmpeak,mcmmpeakerr,datammpeak,datammpeakerr,mcSigma,mcSigmaError,dataSigma,dataSigmaError,result,doPUreweighting,"_mu");
119 buchmann 1.31
120     datajzb << "(" << jzbvariabledata;
121     mcjzb << "(" << jzbvariablemc;
122    
123     if(dataeepeak>0) datajzb << "- (id1==id2)*(id1==0)*" << TMath::Abs(dataeepeak) << " ";
124     else datajzb << "+ (id1==id2)*(id1==0)*" << TMath::Abs(dataeepeak) << " ";
125    
126     if(datammpeak>0) datajzb << "- (id1==id2)*(id1==1)*" << TMath::Abs(datammpeak) << " ";
127     else datajzb << "+ (id1==id2)*(id1==1)*" << TMath::Abs(datammpeak) << " ";
128    
129     if(datapeak>0) datajzb << "- (id1!=id2)*" << TMath::Abs(datapeak) << " ";
130     else datajzb << "+ (id1!=id2)*" << TMath::Abs(datapeak) << " ";
131    
132     datajzb << ")";
133    
134     if(mceepeak>0) mcjzb << "- (id1==id2)*(id1==0)*" << TMath::Abs(mceepeak) << " ";
135     else mcjzb << "+ (id1==id2)*(id1==0)*" << TMath::Abs(mceepeak) << " ";
136    
137     if(mcmmpeak>0) mcjzb << "- (id1==id2)*(id1==1)*" << TMath::Abs(mcmmpeak) << " ";
138     else mcjzb << "+ (id1==id2)*(id1==1)*" << TMath::Abs(mcmmpeak) << " ";
139    
140     if(mcpeak>0) mcjzb << "- (id1!=id2)*" << TMath::Abs(mcpeak) << " ";
141     else mcjzb << "+ (id1!=id2)*" << TMath::Abs(mcpeak) << " ";
142    
143     mcjzb << ")";
144 buchmann 1.56
145 buchmann 1.31 } else {
146     datajzb << "(" << jzbvariabledata;
147 buchmann 1.33 mcjzb << "(" << jzbvariablemc;
148 buchmann 1.31
149     if(datapeak>0) datajzb << "- " << TMath::Abs(datapeak) << " ";
150     else datajzb << "+ " << TMath::Abs(datapeak) << " ";
151    
152     datajzb << ")";
153    
154     if(mcpeak>0) mcjzb << "- " << TMath::Abs(mcpeak) << " ";
155     else mcjzb << "+ " << TMath::Abs(mcpeak) << " ";
156    
157     mcjzb << ")";
158     }
159 buchmann 1.36
160 buchmann 1.56 MCPeak=mcpeak;
161     MCPeakError=mcpeakerr;
162     DataPeak=datapeak;
163     DataPeakError=datapeakerr;
164 buchmann 1.66 switch_overunderflow(overunderflowstatus);
165 buchmann 1.28 }
166    
167 fronga 1.40 void make_special_obs_pred_mll_plot(string datajzb, string mcjzb, float jzbthreshold, float binWidth = 5.0) {
168 buchmann 1.11 float min=70.0;
169     float max=115.0;
170     if(!PlottingSetup::RestrictToMassPeak) {
171 buchmann 1.34 min=20;
172 fronga 1.40 max=300;
173 buchmann 1.11 }
174 fronga 1.40 int nbins=int((max-min)/binWidth);
175 buchmann 1.11
176     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
177    
178 buchmann 1.34 stringstream largerzeroS;
179     largerzeroS << "(" << datajzb << ">" << jzbthreshold << ")";
180     TCut largerzeroD(largerzeroS.str().c_str());
181 buchmann 1.11
182     stringstream smallerzeroS;
183 buchmann 1.34 smallerzeroS << "(" << datajzb << "<-" << jzbthreshold << ")";
184     TCut smallerzeroD(smallerzeroS.str().c_str());
185    
186    
187     stringstream largerzeroMS;
188     largerzeroMS << "(" << mcjzb << ">" << jzbthreshold << ")";
189     TCut largerzeroM(largerzeroMS.str().c_str());
190    
191     TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&largerzeroD,data,luminosity);
192     THStack mcRcorrJZBeemm = allsamples.DrawStack("mcRcorrJZBeemm","mll",nbins,min,max, "m_{ll} [GeV}", "events", cutmass&&cutOSSF&&cutnJets&&largerzeroM,mc,luminosity);
193     TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&smallerzeroD,data,luminosity);
194     TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&largerzeroD,data,luminosity);
195     TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem", "mll",nbins,min,max, "m_{ll} [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&smallerzeroD,data,luminosity);
196 buchmann 1.11
197     TH1F *RcorrJZBSBem;
198     TH1F *LcorrJZBSBem;
199     TH1F *RcorrJZBSBeemm;
200     TH1F *LcorrJZBSBeemm;
201    
202 buchmann 1.16 // TH1F *RcorrJZBeemmNoS;
203 buchmann 1.11
204 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
205 buchmann 1.34 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&largerzeroD,data, luminosity);
206     LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem", "mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&smallerzeroD,data, luminosity);
207     RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&largerzeroD,data, luminosity);
208     LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm","mll",nbins,min,max, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets&&smallerzeroD,data, luminosity);
209 buchmann 1.11 }
210    
211 fronga 1.40 // Separate predictions
212 fronga 1.43 TH1F* SFN = (TH1F*)LcorrJZBeemm->Clone("SFN");
213     TH1F* OFP = (TH1F*)RcorrJZBem->Clone("OFP");
214     TH1F* OFN = (TH1F*)LcorrJZBem->Clone("OFN");
215 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
216 fronga 1.43 OFP->Scale(1.0/3.0);
217     OFP->Add(RcorrJZBSBem,1.0/3.);
218     OFP->Add(RcorrJZBSBeemm,1.0/3.);
219     OFN->Scale(1.0/3.0);
220     OFN->Add(LcorrJZBSBem,1.0/3.);
221     OFN->Add(LcorrJZBSBeemm,1.0/3.);
222     }
223    
224     TH1F* Bpred = (TH1F*)SFN->Clone("Bpred");
225     Bpred->Add(OFP);
226     Bpred->Add(OFN,-1);
227 buchmann 1.11 Bpred->SetLineColor(kRed);
228    
229 fronga 1.40 RcorrJZBeemm->SetTitleOffset(1.3,"y");
230 buchmann 1.11 RcorrJZBeemm->Draw();
231 buchmann 1.77 mcRcorrJZBeemm.Draw("histo,same");
232 buchmann 1.11 Bpred->Draw("histo,same");
233     RcorrJZBeemm->Draw("same");
234    
235     TLegend *leg = allsamples.allbglegend();
236     leg->SetX1(0.58);
237     leg->AddEntry(RcorrJZBeemm,"observed (data)","l");
238     leg->AddEntry(Bpred,"predicted (data)","l");
239     leg->Draw("same");
240    
241     stringstream saveas;
242     saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold;
243     CompleteSave(ckin,saveas.str());
244 buchmann 1.34
245 fronga 1.40 // Draw all predictions overlayed
246 fronga 1.43 unsigned int w = gStyle->GetHistLineWidth()+1; // Make line a bit wider, since we dash it
247     SFN->SetLineColor(kGreen+2);
248     SFN->SetLineStyle(2);
249     SFN->SetLineWidth(w);
250     OFP->SetLineColor(kBlue+2);
251     OFP->SetLineStyle(2);
252     OFP->SetLineWidth(w);
253     OFN->SetLineColor(kMagenta+2);
254     OFN->SetLineStyle(3);
255     OFN->SetLineWidth(w);
256 buchmann 1.34
257     RcorrJZBeemm->Draw();
258 fronga 1.43 SFN->Draw("histo,same");
259     OFP->Draw("histo,same");
260     OFN->Draw("histo,same");
261 buchmann 1.34 Bpred->Draw("histo,same");
262     RcorrJZBeemm->Draw("same");
263    
264 fronga 1.40 TLegend *leg2 = make_legend("",0.52,0.7);
265     leg2->AddEntry(RcorrJZBeemm,"observed (data)","lp");
266 buchmann 1.34 leg2->AddEntry(Bpred,"predicted (data)","l");
267 fronga 1.43 leg2->AddEntry(SFN, " SF JZB<0","l");
268     leg2->AddEntry(OFN, " OF JZB<0","l");
269     leg2->AddEntry(OFP, " OF JZB>0","l");
270 buchmann 1.34 leg2->Draw("same");
271    
272     saveas.str("");
273     saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold << "_nomc";
274     CompleteSave(ckin,saveas.str());
275    
276 buchmann 1.11 delete RcorrJZBeemm;
277     delete LcorrJZBeemm;
278     delete RcorrJZBem;
279     delete LcorrJZBem;
280 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
281 buchmann 1.11 delete RcorrJZBSBeemm;
282     delete LcorrJZBSBeemm;
283     delete RcorrJZBSBem;
284     delete LcorrJZBSBem;
285     }
286     delete Bpred;
287     delete ckin;
288     }
289    
290 buchmann 1.1 void make_special_mll_plot(int nbins, float min, float max, bool logscale,string xlabel) {
291    
292     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
293    
294     TH1F *datahistoOSSF = allsamples.Draw("datahistoOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,data,luminosity);
295     THStack mcstackOSSF = allsamples.DrawStack("mcstackOSSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&cutnJets&&basiccut,mc,luminosity);
296     TH1F *datahistoOSOF = allsamples.Draw("datahistoOSOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&cutnJets&&basiccut,data,luminosity);
297    
298     if(logscale) ckin->SetLogy(1);
299     datahistoOSSF->SetMarkerSize(DataMarkerSize);
300     datahistoOSSF->GetXaxis()->SetTitle(xlabel.c_str());
301     datahistoOSSF->GetXaxis()->CenterTitle();
302     datahistoOSSF->GetYaxis()->SetTitle("events");
303     datahistoOSSF->GetYaxis()->CenterTitle();
304     datahistoOSOF->SetMarkerSize(DataMarkerSize);
305     datahistoOSSF->SetMarkerSize(DataMarkerSize);
306     datahistoOSSF->Draw();
307    
308 buchmann 1.73 mcstackOSSF.Draw("histo,same");
309 buchmann 1.1 datahistoOSSF->Draw("same");
310    
311     datahistoOSOF->SetMarkerColor(TColor::GetColor("#FE642E"));
312     datahistoOSOF->SetLineColor(kRed);
313     datahistoOSOF->SetMarkerStyle(21);
314     datahistoOSOF->Draw("same");
315    
316     // Try to re-arrange legend...
317     TLegend *bgleg = allsamples.allbglegend("",datahistoOSSF);
318     TLegend *kinleg = make_legend();
319     kinleg->AddEntry(datahistoOSSF,"SF (data)","p");
320     kinleg->AddEntry(datahistoOSOF,"OF (data)","p");
321     TIter next(bgleg->GetListOfPrimitives());
322     TObject* obj;
323     // Copy the nice bkgd legend skipping the "data"
324 buchmann 1.16 while ( (obj = next()) )
325 buchmann 1.1 if ( strcmp(((TLegendEntry*)obj)->GetObject()->GetName(),"datahistoOSSF") )
326     kinleg->GetListOfPrimitives()->Add(obj);
327    
328     kinleg->Draw();
329     CompleteSave(ckin,"kin/mll_ossf_osof_distribution");
330    
331     delete datahistoOSOF;
332     delete datahistoOSSF;
333     delete ckin;
334     }
335    
336    
337     void draw_ratio_plot(TH1* hdata, THStack& hmc, float ymin=0.5, float ymax=1.5) {
338    
339     // Make a histogram from stack
340     TIter next(hmc.GetHists());
341     TObject* obj;
342     TH1* hratio = NULL;
343 buchmann 1.16 while ( (obj = next()) ) {
344 buchmann 1.1 if ( !hratio ) {
345     hratio = (TH1*)obj->Clone();
346     hratio->SetName("hratio");
347     } else hratio->Add( (TH1*)obj );
348     }
349     hratio->Divide(hdata);
350     hratio->SetMaximum(ymax);
351     hratio->SetMinimum(ymin);
352     hratio->SetMarkerStyle(2);
353     hratio->SetLineWidth(1);
354     hratio->GetYaxis()->SetLabelSize(0.08);
355     hratio->GetXaxis()->SetLabelSize(0.0);
356    
357     TPad* rpad = new TPad("rpad","",0.15,0.73,0.4,0.88);
358     rpad->SetTopMargin(0.0);
359     rpad->SetBottomMargin(0.0);
360     rpad->SetRightMargin(0.0);
361     rpad->Draw();
362     rpad->cd();
363     // hratio->GetXaxis()->SetNdivisions(0);
364     hratio->GetYaxis()->SetNdivisions(502,false);
365     hratio->Draw("e1x0");
366    
367     TF1* oneline = new TF1("","1.0",0,1000);
368     oneline->SetLineColor(kBlue);
369     oneline->SetLineStyle(1);
370     oneline->SetLineWidth(1);
371     oneline->Draw("same");
372     }
373 fronga 1.55
374 buchmann 1.51 float make_one_OFSF_plot(string variable, string addcut, string legendTitle, int nbins, float min, float max, float ymax, bool logscale,
375 fronga 1.58 string xlabel, string filename, float legendPosition=0.55) {
376 pablom 1.46
377     TCut ibasiccut=basiccut;
378     bool draw_separation_lines=false;
379    
380     if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
381    
382     TCut cutSF;
383     TCut cutOF;
384    
385 buchmann 1.51 cutOF = cutOSOF&&cutnJets&&ibasiccut;
386     cutSF = cutOSSF&&cutnJets&&ibasiccut;
387 pablom 1.46
388     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
389 fronga 1.54 TPad* rcan = new TPad("rcan","rcan",0,0,1,1);
390     rcan->SetLogy(logscale);
391     rcan->cd();
392    
393 fronga 1.58 std::cout << "OF/SF comparison: variable = " << variable << ", cut = " << cutSF.GetTitle() << std::endl;
394 pablom 1.46 TH1F *datahistoSF = allsamples.Draw("datahistoSF",variable,nbins,min,max, xlabel, "events",cutSF,data,luminosity);
395     TH1F *datahistoOF = allsamples.Draw("datahistoOF",variable,nbins,min,max, xlabel, "events",cutOF,data,luminosity);
396 fronga 1.58 // string signal("LM3");
397     // TH1F* signalhisto = new TH1F("signalhisto",signal.c_str(),nbins,min,max);
398     // int idx = signalsamples.FindSample(signal)[0];
399     // (signalsamples.collection)[idx].events->Project("signalhisto",variable.c_str(),cutSF);
400     // signalhisto->Scale((signalsamples.collection)[idx].weight*luminosity);
401     // signalhisto->SetLineColor((signalsamples.collection)[idx].samplecolor);
402     // signalhisto->SetLineStyle(2);
403 pablom 1.46 datahistoSF->SetMarkerSize(DataMarkerSize);
404     datahistoOF->SetLineColor(kRed);
405    
406     if ( !logscale ) {
407     datahistoSF->SetMinimum(0); // Defaults
408     } else {
409     datahistoSF->SetMinimum(0.5);
410     }
411 buchmann 1.51 if (ymax<0) {
412     if ( logscale ) datahistoSF->SetMaximum(5.3*datahistoSF->GetMaximum());
413 buchmann 1.68 else datahistoSF->SetMaximum(1.8*datahistoSF->GetMaximum());
414 pablom 1.46 } else {
415 buchmann 1.51 datahistoSF->SetMaximum(ymax);
416 pablom 1.46 }
417    
418 buchmann 1.51 float ymaxSet = datahistoSF->GetMaximum();
419    
420 pablom 1.46 datahistoSF->GetXaxis()->SetTitle(xlabel.c_str());
421 buchmann 1.51 datahistoSF->GetYaxis()->SetTitle("Events");
422 pablom 1.46 datahistoSF->GetXaxis()->CenterTitle();
423     datahistoSF->GetYaxis()->CenterTitle();
424    
425 buchmann 1.51 TLegend *mleg = make_legend(legendTitle.c_str(),legendPosition,0.7,false,legendPosition+0.2);
426     mleg->AddEntry(datahistoSF, "Same-flavor", "PL");
427     if (datahistoOF->Integral()>0) {
428     mleg->AddEntry(datahistoOF, "Opposite-flavor", "L");
429     } else {
430     mleg->AddEntry((TObject*)0, "", "");
431     }
432 fronga 1.58 //mleg->AddEntry(signalhisto, "LM3", "L");
433 pablom 1.46
434     datahistoSF->Draw("E1");
435 buchmann 1.51 if (datahistoOF->Integral()>0) datahistoOF->Draw("HIST,SAMES");
436 fronga 1.58 //signalhisto->Draw("HIST,SAMES");
437 pablom 1.46 mleg->Draw();
438     DrawPrelim();
439 fronga 1.58 if (datahistoOF->Integral()>0) {
440 buchmann 1.79 Save_With_Ratio( datahistoSF, datahistoOF, rcan, "SFOF/" + filename, false, false, "SF/OF" );
441 fronga 1.58 } else {
442     CompleteSave(rcan, "SFOF/" + filename);
443     delete rcan;
444     }
445 pablom 1.46
446     datahistoSF->Delete();
447     datahistoOF->Delete();
448 fronga 1.58 //signalhisto->Delete();
449 pablom 1.46 delete mleg;
450     delete ckin;
451 buchmann 1.79 delete rcan;
452 pablom 1.46
453 buchmann 1.51 return ymaxSet;
454    
455 pablom 1.46 }
456    
457 fronga 1.55 // Compare data to data
458     float make_data_comparison_plot(string variable, TCut cut, int nbins, float min, float max, float ymax, bool logscale,
459     string xlabel, string filename, float legendPosition=0.55) {
460    
461     TCut ibasiccut=basiccut&&cut;
462    
463     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
464     TPad* rcan = new TPad("rcan","rcan",0,0,1,1);
465     rcan->SetLogy(logscale);
466     rcan->cd();
467    
468     std::cout << "Data comparison: variable = " << variable << ", cut = " << ibasiccut.GetTitle() << std::endl;
469    
470     TH1F *data1 = allsamples.Draw("data1",variable,nbins,min,max, xlabel, "events",ibasiccut,data,luminosity);
471     TH1F *data2 = comparesamples.Draw("data2",variable,nbins,min,max, xlabel, "events",ibasiccut,data,luminosity);
472 buchmann 1.71 data1->Scale(5.0/9.2);
473 fronga 1.55
474     data1->SetMarkerSize(DataMarkerSize);
475     data2->SetLineColor(kRed);
476    
477     if ( !logscale ) {
478     data1->SetMinimum(0); // Defaults
479     } else {
480     data1->SetMinimum(0.5);
481     }
482     if (ymax<0) {
483     if ( logscale ) data1->SetMaximum(5.3*data1->GetMaximum());
484     else data1->SetMaximum(1.5*data1->GetMaximum());
485     } else {
486     data1->SetMaximum(ymax);
487     }
488    
489     float ymaxSet = data1->GetMaximum();
490    
491     data1->GetXaxis()->SetTitle(xlabel.c_str());
492     data1->GetYaxis()->SetTitle("Events");
493     data1->GetXaxis()->CenterTitle();
494     data1->GetYaxis()->CenterTitle();
495    
496     TLegend *mleg = make_legend("",legendPosition,0.7,false,legendPosition+0.2);
497 buchmann 1.71 mleg->AddEntry(data1, "2012 data (scaled)", "PL");
498     mleg->AddEntry(data2, "2011 data", "L");
499 fronga 1.55
500     data1->Draw("E1");
501     data2->Draw("HIST,SAMES");
502     mleg->Draw();
503     DrawPrelim();
504 buchmann 1.79 Save_With_Ratio( data1, data2, rcan, "compareData/" + filename, false, false, "new/old" );
505 fronga 1.55
506     data1->Delete();
507     data2->Delete();
508     delete mleg;
509 buchmann 1.79 delete rcan;
510 fronga 1.55 delete ckin;
511    
512     }
513    
514     void make_OFSF_plots(string variable, string addcut, int nbins, float min, float max, bool logscale,
515     string xlabel, string filename, float legendPosition=0.55) {
516 buchmann 1.51
517 buchmann 1.68 string mllcuts[] = { "mll>20","mll>15&&mll<70", "mll>75&&mll<105", "mll>120" };
518     string mllcutname[] = { "m_{ll} > 20 GeV", "20 < m_{ll} < 70 GeV", "70 < m_{ll} < 110 GeV", "m_{ll} > 120 GeV" };
519 buchmann 1.51 string plotname[] = {"_all","_low","_peak","_high"};
520     float ymax;
521 fronga 1.54
522     int start = 0;
523     if ( !PlottingSetup::openBox ) start = 3;
524    
525     for ( int i=start; i<4; ++i ) {
526 buchmann 1.51 if ( addcut != "" ) mllcuts[i] += "&&"+addcut;
527 fronga 1.54 if ( i==start ) {
528 fronga 1.58 ymax = make_one_OFSF_plot(variable, mllcuts[i], mllcutname[i], nbins, min, max, -1, logscale, xlabel,
529 fronga 1.55 filename+plotname[i], legendPosition );
530 buchmann 1.51 } else {
531 fronga 1.58 make_one_OFSF_plot(variable, mllcuts[i], mllcutname[i], nbins, min, max, ymax, logscale, xlabel,
532 fronga 1.55 filename+plotname[i], legendPosition );
533 buchmann 1.51 }
534     make_one_OFSF_plot(variable, "id1==1&&id1==id2&&"+mllcuts[i], mllcutname[i], nbins, min, max, ymax, logscale, xlabel,
535 fronga 1.55 filename+plotname[i]+"_mm", legendPosition );
536 buchmann 1.51 make_one_OFSF_plot(variable, "id1==0&&id1==id2&&"+mllcuts[i], mllcutname[i], nbins, min, max, ymax, logscale, xlabel,
537 fronga 1.55 filename+plotname[i]+"_ee", legendPosition );
538 buchmann 1.51 }
539    
540     }
541 pablom 1.46
542 buchmann 1.76 TCut ReplaceInCut(TCut cut, string replacethis, string withthis) {
543     string scut=(string)(const char*)cut;
544     string acut=ReplaceAll(scut,replacethis,withthis);
545     return TCut(acut.c_str());
546     }
547    
548 buchmann 1.77 void DoMCSystPlot(string datavariable, string mcvariable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
549 buchmann 1.76 TCut cut=addcut&&basiccut;
550    
551     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
552     ckin->SetLogy(dolog);
553     cout << "\r Creating " << filename << " : data (1/6)" << std::flush;
554 buchmann 1.77 TH1F *datahisto = allsamples.Draw("datahisto",datavariable,nbins,min,max, xlabel, "events",cut,data,luminosity);
555 buchmann 1.76 datahisto->SetMarkerSize(DataMarkerSize);
556     if ( !dolog ) datahisto->SetMinimum(0); // Defaults
557     else datahisto->SetMinimum(0.5);
558     if (dolog) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
559     else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
560     cout << "\r Creating " << filename << " : MC central (2/6)" << std::flush;
561 buchmann 1.77 THStack mcstack = allsamples.DrawStack("mcstack", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
562 buchmann 1.76 TH1F *MCcentral = CollapseStack(mcstack);
563    
564     TCut bkpcut = cut;
565     cut = ReplaceInCut(cut,"pfJetGoodNum40","pfJetGoodNum40p1sigma");
566     cout << "\r Creating " << filename << " : MC JES up (3/6)" << std::flush;
567 buchmann 1.77 TH1F *MCJESup = allsamples.Draw("MCJESup", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
568 buchmann 1.76
569     cut = ReplaceInCut(cut,"pfJetGoodNum40p1sigma","pfJetGoodNum40n1sigma");
570     cout << "\r Creating " << filename << " : MC JES down (4/6)" << std::flush;
571 buchmann 1.77 TH1F *MCJESdn = allsamples.Draw("MCJESdn", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
572 buchmann 1.76
573     cut=bkpcut;
574     TCut bkpweight = cutWeight;
575     cutWeight= ReplaceInCut(cutWeight,"weight","PUweightUP");
576     cout << "\r Creating " << filename << " : MC PU up (5/6)" << std::flush;
577 buchmann 1.77 TH1F *MCPUup = allsamples.Draw("MCPUup", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
578 buchmann 1.76
579     cutWeight= ReplaceInCut(cutWeight,"PUweightUP","PUweightDOWN");
580     cout << "\r Creating " << filename << " : MC PU down (6/6)" << std::flush;
581 buchmann 1.77 TH1F *MCPUdn = allsamples.Draw("MCPUdn", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
582 buchmann 1.76 cutWeight=bkpweight;
583     cout << "\r Creating " << filename << " : Processing systematics ..." << std::flush;
584     TH1F *Systematic = (TH1F*)MCPUdn->Clone("Systematic");
585     for(int i=1;i<=Systematic->GetNbinsX();i++) {
586     float jesdn = abs(MCcentral->GetBinContent(i)-MCJESdn->GetBinContent(i));
587     float jesup = abs(MCcentral->GetBinContent(i)-MCJESup->GetBinContent(i));
588     float jes = jesdn>jesup?jesdn:jesup;
589    
590     float PUup = abs(MCcentral->GetBinContent(i)-MCPUup->GetBinContent(i));
591     float PUdn = abs(MCcentral->GetBinContent(i)-MCPUdn->GetBinContent(i));
592     float pu = PUdn>PUup?PUdn:PUup;
593    
594     float sys=sqrt(jes*jes+pu*pu);
595     sys/=MCcentral->GetBinContent(i);
596     if(MCcentral->GetBinContent(i)==0) sys=0;
597     Systematic->SetBinContent(i,sys);
598     }
599    
600     datahisto->Draw("e1");
601     ckin->Update();
602     mcstack.Draw("histo,same");
603    
604     datahisto->Draw("same,e1");
605     TLegend *kinleg = allsamples.allbglegend();
606     kinleg->Draw();
607    
608     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
609 buchmann 1.77 kinpad->SetLogy(dolog);
610 buchmann 1.76 kinpad->cd();
611     datahisto->Draw("e1");
612     mcstack.Draw("histo,same");
613     datahisto->Draw("same,e1");
614     datahisto->Draw("same,axis");
615    
616     kinleg->Draw("same");
617     DrawPrelim();
618     string saveas="kin/"+filename;
619    
620     cout << "Passing filename to be saved : " << filename << " as " << saveas << endl;
621     save_with_ratio_and_sys_band( datahisto, CollapseStack(mcstack), kinpad->cd(), saveas, false, false, "data/mc",Systematic );
622    
623     ckin->cd();
624     MCcentral->SetFillColor(kWhite);
625     MCcentral->SetLineColor(kBlack);
626 buchmann 1.77 MCcentral->SetLineWidth(2);
627 buchmann 1.76 MCPUdn->SetLineColor(kRed);
628     MCPUup->SetLineColor(kYellow);
629     MCJESdn->SetLineColor(kBlue);
630     MCJESup->SetLineColor(kGreen);
631    
632 buchmann 1.77 TLegend *legsmall = new TLegend(0.0,0.85,1.0,1.00);
633     legsmall->SetNColumns(5);
634 buchmann 1.76 legsmall->AddEntry(MCcentral,"central","L");
635     legsmall->AddEntry(MCPUdn,"PU down","L");
636     legsmall->AddEntry(MCPUup,"PU up","L");
637     legsmall->AddEntry(MCJESdn,"JES down","L");
638     legsmall->AddEntry(MCJESup,"JES up","L");
639 buchmann 1.77 legsmall->SetFillColor(kWhite);
640     legsmall->SetBorderSize(0);
641 buchmann 1.76
642 buchmann 1.77 datahisto->Draw("e1");
643     MCcentral->Draw("histo,same");
644 buchmann 1.76 MCPUdn->Draw("histo,same");
645     MCPUup->Draw("histo,same");
646     MCJESdn->Draw("histo,same");
647     MCJESup->Draw("histo,same");
648     datahisto->Draw("e1,same");
649     legsmall->Draw();
650 buchmann 1.77 CompleteSave(ckin,saveas+"___AllLines");
651 buchmann 1.76
652 buchmann 1.77 delete datahisto;
653     delete MCcentral;
654     delete MCPUdn;
655     delete MCPUup;
656     delete MCJESdn;
657     delete MCJESup;
658 buchmann 1.76 delete ckin;
659     }
660    
661 buchmann 1.77 void DoMCSystPlot(string variable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
662     DoMCSystPlot(variable, variable, nbins, min, max, addcut, dolog, xlabel, filename);
663     }
664    
665 buchmann 1.1 float lastrange_min=0;
666     float lastrange_max=0;
667    
668     void make_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
669     string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
670     // TCut basiccut("(pfJetGoodNum>=2&&pfJetGoodID[0])&&(pfJetGoodNum>=2&&pfJetGoodID[1])&&(passed_triggers||!is_data)");
671     TCut ibasiccut=basiccut;
672     bool draw_separation_lines=false;
673 buchmann 1.67 bool drawsignal = false;
674 buchmann 1.1
675     if(isPF) ibasiccut=basiccut&&"pfjzb[0]>-998";
676    
677     if(addcut != "") ibasiccut = ibasiccut && addcut.c_str();
678    
679     //Step 1: Adapt the variable (if we're dealing with PF we need to adapt the variable!)
680     if(isPF) {
681     if(variable=="mll") variable="pfmll[0]";
682     if(variable=="jetpt[0]") variable="pfJetGoodPt[0]";
683     if(variable=="jeteta[0]") variable="pfJetGoodEta[0]";
684     if(variable=="pt") variable="pfpt[0]";
685     if(variable=="pt1") variable="pfpt1[0]";
686     if(variable=="pt2") variable="pfpt2[0]";
687     if(variable=="eta1") variable="pfeta1[0]";
688     if(variable=="jzb[1]") variable="pfjzb[0]";
689     //if(variable=="pfJetGoodNum") variable="pfJetGoodNum"; // pointless.
690     }
691    
692     //Step 2: Refine the cut
693     TCut cut;
694     cut=cutmass&&cutOSSF&&cutnJets&&ibasiccut;
695 buchmann 1.66 if(filename=="nJets" || filename=="nJets_inclusive" || filename=="nJets_met100" || filename=="nJets_inclusive_met100") cut=cutmass&&cutOSSF&&ibasiccut;
696     if(filename=="nJets_osof" || filename=="nJets_osof_inclusive" || filename=="nJets_osof_met100" || filename=="nJets_osof_inclusive_met100") cut=cutmass&&cutOSOF&&ibasiccut;
697 buchmann 1.1 if(filename=="nJets_nocuts_except_mll_ossf") cut=cutmass&&cutOSSF;
698 buchmann 1.66 if(filename=="mll"||filename=="mll_met100") {
699 buchmann 1.1 cut=cutOSSF&&cutnJets&&ibasiccut;
700     draw_separation_lines=true;
701     }
702 buchmann 1.66 if(filename=="mll_ee"||filename=="mll_ee_met100") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==0";
703     if(filename=="mll_mm"||filename=="mll_mm_met100") cut=cutOSSF&&cutnJets&&ibasiccut&&"id1==1";
704     if(filename=="mll_osof"||filename=="mll_osof_met100") {
705 buchmann 1.1 cut=cutOSOF&&cutnJets&&ibasiccut;
706     draw_separation_lines=true;
707     }
708 buchmann 1.34 if(Contains(filename,"aboveJZB")) cut=cutOSSF&&cutnJets&&ibasiccut;
709     if(Contains(filename,"mll_ee_above")) cut=cut&&"id1==0";
710     if(Contains(filename,"mll_mm_above")) cut=cut&&"id1==1";
711 buchmann 1.11 if(Contains(filename,"mll_osof_aboveJZB")) cut=cutOSOF&&cutnJets&&ibasiccut;
712 buchmann 1.66 if(filename=="mll_inclusive"||filename=="mll_inclusive_highrange") cut=cutOSSF;
713     if(filename=="mll_inclusive_osof") cut=cutOSOF;
714     if(filename=="mll_inclusive_ee") cut=cutOSSF&&"id1==0";
715     if(filename=="mll_inclusive_mm") cut=cutOSSF&&"id1==1";
716 buchmann 1.1 if(filename=="pfJetGoodEta_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
717     if(filename=="pfJetGoodPt_0") cut=cutOSSF&&cutmass&&ibasiccut&&cutnJets;
718 fronga 1.54 if(filename=="numVtx") cut=cutmass&&ibasiccut;
719 buchmann 1.1
720     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
721     ckin->SetLogy(logscale);
722     TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
723     datahisto->SetMarkerSize(DataMarkerSize);
724 fronga 1.40 if ( !logscale ) datahisto->SetMinimum(0); // Defaults
725     else datahisto->SetMinimum(0.5);
726     // Custom max.
727     if(variable=="TMath::Abs(pfJetDphiMet[0])") datahisto->SetMaximum(1.5*datahisto->GetMaximum());
728 buchmann 1.1 if(variable=="pfJetGoodPt[0]") datahisto->SetMaximum(10*datahisto->GetMaximum());
729     if(variable=="pt") datahisto->SetMaximum(10*datahisto->GetMaximum());
730 buchmann 1.22 if(filename=="mll_inclusive"||filename=="mll_inclusive_mm"||filename=="mll_inclusive_ee") datahisto->SetMinimum(1);
731 buchmann 1.1 if(filename=="mll_osof") datahisto->SetMaximum(10*datahisto->GetMaximum());
732     if(filename=="mll_osof") datahisto->SetMinimum(9);
733 fronga 1.40 if (logscale) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
734     else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
735    
736 buchmann 1.66 cout << "******** Cut used : " << (const char*) cut << " for plot " << filename << endl;
737 buchmann 1.1 if(loadlastminmax) {
738     datahisto->SetMinimum(lastrange_min);
739     datahisto->SetMaximum(lastrange_max);
740     if(logscale) {
741     datahisto->SetMinimum(pow(10,lastrange_min));
742     datahisto->SetMaximum(pow(10,lastrange_max));
743     }
744     }
745    
746 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!)
747     string signal("LM3");
748     TH1F* signalhisto = new TH1F("signalhisto",signal.c_str(),nbins,min,max);
749     int idx = signalsamples.FindSample(signal)[0];
750 buchmann 1.67 if(drawsignal) (signalsamples.collection)[idx].events->Project("signalhisto",variable.c_str(),cut);
751     if(drawsignal) signalhisto->Scale((signalsamples.collection)[idx].weight*luminosity);
752     if(drawsignal) signalhisto->SetLineColor(kOrange);
753 fronga 1.40
754     THStack mcstack = allsamples.DrawStack("mcstack", variable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
755     datahisto->Draw("e1");
756     ckin->Update();
757 buchmann 1.73 mcstack.Draw("histo,same");
758 fronga 1.40
759 buchmann 1.1 datahisto->Draw("same,e1");
760     TLegend *kinleg = allsamples.allbglegend();
761     kinleg->Draw();
762     if(filename=="mll_osof") {
763     kinleg->SetHeader("Opposite flavor");
764     kinleg->SetX1(0.58);
765     }
766     if(filename=="mll") {
767     kinleg->SetHeader("Same flavor");
768     kinleg->SetX1(0.58);
769     }
770     TText* write_cut = write_cut_on_canvas(decipher_cut(cut,basicqualitycut));
771     write_cut->Draw();
772     TText* write_variable = write_text(0.99,0.01,variable);
773     write_variable->SetTextAlign(31);
774     write_variable->SetTextSize(0.02);
775    
776     TLine *lowerboundary;
777     TLine *upperboundary;
778    
779     if(RestrictToMassPeak&&draw_separation_lines) {
780     Color_t linecolor=kBlue;
781     float linemin=pow(10,ckin->GetUymin());
782     if(filename=="mll_osof") linemin=pow(10,lastrange_min);
783     lowerboundary = new TLine(71,linemin,71,datahisto->GetMaximum());
784     upperboundary = new TLine(111,linemin,111,datahisto->GetMaximum());
785     lowerboundary->SetLineColor(linecolor);
786     lowerboundary->SetLineStyle(2);
787     upperboundary->SetLineColor(linecolor);
788     upperboundary->SetLineStyle(2);
789     }
790    
791     lastrange_min=ckin->GetUymin();
792     lastrange_max=ckin->GetUymax();
793    
794    
795     if ( plotratio ) {
796     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
797     kinpad->cd();
798     kinpad->SetLogy(logscale);
799     datahisto->Draw("e1");
800 buchmann 1.73 mcstack.Draw("histo,same");
801 buchmann 1.67 if(drawsignal) signalhisto->Draw("same");
802 buchmann 1.1 datahisto->Draw("same,e1");
803     datahisto->Draw("same,axis");
804     if(RestrictToMassPeak&&draw_separation_lines) {
805     lowerboundary->Draw("same");
806     upperboundary->Draw("same");
807     }
808    
809 buchmann 1.67 if(drawsignal) kinleg->AddEntry("signalhisto",signal.c_str(),"l");
810 buchmann 1.1 kinleg->Draw();
811     write_cut->Draw();
812     DrawPrelim();
813     string saveas="kin/"+filename;
814     if(isPF) saveas="kin/"+filename+"__PF";
815 buchmann 1.79 Save_With_Ratio(datahisto,mcstack,kinpad->cd(),saveas);
816 buchmann 1.1 // if(isPF) CompleteSave(with_ratio,"kin/"+filename+"__PF_withratio");
817     // else CompleteSave(with_ratio,"kin/"+filename+"_withratio");
818     // delete with_ratio;
819     } else {
820     if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
821     else CompleteSave(ckin,"kin/"+filename);
822     }
823     datahisto->Delete();
824 buchmann 1.66 delete signalhisto;
825 buchmann 1.1 delete ckin;
826     }
827    
828 buchmann 1.72
829     void make_plain_kin_plot(string variable, string addcut, int nbins, float min, float max, bool logscale,
830     string xlabel, string filename, bool isPF=true, bool plotratio=true, bool loadlastminmax=false ) {
831     TCut cut=TCut(addcut.c_str())&&basiccut;
832    
833     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
834     ckin->SetLogy(logscale);
835     TH1F *datahisto = allsamples.Draw("datahisto",variable,nbins,min,max, xlabel, "events",cut,data,luminosity);
836     datahisto->SetMarkerSize(DataMarkerSize);
837     if ( !logscale ) datahisto->SetMinimum(0); // Defaults
838     else datahisto->SetMinimum(0.5);
839     // Custom max.
840     if (logscale) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
841     else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
842    
843     cout << "******** Cut used : " << (const char*) cut << " for plot " << filename << endl;
844     if(loadlastminmax) {
845     datahisto->SetMinimum(lastrange_min);
846     datahisto->SetMaximum(lastrange_max);
847     if(logscale) {
848     datahisto->SetMinimum(pow(10,lastrange_min));
849     datahisto->SetMaximum(pow(10,lastrange_max));
850     }
851     }
852    
853     THStack mcstack = allsamples.DrawStack("mcstack", variable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
854     datahisto->Draw("e1");
855     ckin->Update();
856 buchmann 1.73 mcstack.Draw("histo,same");
857 buchmann 1.72
858     datahisto->Draw("same,e1");
859     TLegend *kinleg = allsamples.allbglegend();
860     kinleg->Draw();
861    
862     lastrange_min=ckin->GetUymin();
863     lastrange_max=ckin->GetUymax();
864    
865     if ( plotratio ) {
866     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
867     kinpad->cd();
868     kinpad->SetLogy(logscale);
869     datahisto->Draw("e1");
870 buchmann 1.73 mcstack.Draw("histo,same");
871 buchmann 1.72 datahisto->Draw("same,e1");
872     datahisto->Draw("same,axis");
873    
874     kinleg->Draw();
875     DrawPrelim();
876     string saveas="kin/"+filename;
877     if(isPF) saveas="kin/"+filename+"__PF";
878 buchmann 1.79 Save_With_Ratio(datahisto,mcstack,kinpad->cd(),saveas);
879 buchmann 1.72 } else {
880     if(isPF) CompleteSave(ckin,"kin/"+filename+"__PF");
881     else CompleteSave(ckin,"kin/"+filename);
882     }
883     datahisto->Delete();
884     delete ckin;
885     }
886    
887    
888 fronga 1.40 void make_JES_plot(TCut cut, string name) {
889 buchmann 1.1
890     int nbins=10;
891     float min=-0.5;
892     float max = 9.5;
893     bool logscale=true;
894     string xlabel="nJets";
895    
896     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
897     ckin->SetLogy(logscale);
898 fronga 1.40 TH1F *datahisto = allsamples.Draw("datahisto","pfJetGoodNum40",nbins,min,max, xlabel, "events",cut,data,luminosity);
899 buchmann 1.1 datahisto->SetMarkerSize(DataMarkerSize);
900 fronga 1.40 THStack mcstack = allsamples.DrawStack("mcstack","pfJetGoodNum40",nbins,min,max, xlabel, "events",cut,mc,luminosity);
901     TH1F *JESup = allsamples.Draw("JESup","pfJetGoodNum40p1sigma",nbins,min,max, xlabel, "events",cut,mc,luminosity);
902     TH1F *JESdn = allsamples.Draw("JESdn","pfJetGoodNum40n1sigma",nbins,min,max, xlabel, "events",cut,mc,luminosity);
903 buchmann 1.1
904     datahisto->SetMinimum(1);
905     datahisto->SetMaximum(5.3*datahisto->GetMaximum()); // in line with kinematic plots style
906    
907     float xs[nbins],ys[nbins],exs[nbins],eys[nbins];
908     for(int i=1;i<JESup->GetNbinsX();i++) {
909     float up=JESup->GetBinContent(i);
910     float dn=JESdn->GetBinContent(i);
911     xs[i]=JESup->GetBinCenter(i);
912     ys[i]=0.5*(up+dn);
913     exs[i]=0.5*JESup->GetBinWidth(i);
914     eys[i]=0.5*TMath::Abs(up-dn);
915     }
916    
917     TGraphAsymmErrors *JESunc = new TGraphAsymmErrors(nbins, xs,ys,exs,exs,eys,eys);
918     JESunc->SetFillColor(TColor::GetColor("#00ADE1"));
919     JESunc->SetFillStyle(3002);
920     datahisto->Draw("e1");
921 buchmann 1.73 mcstack.Draw("histo,same");
922 buchmann 1.1 JESunc->Draw("2");
923     datahisto->Draw("same,e1");
924     TLegend *kinleg = allsamples.allbglegend();
925     kinleg->AddEntry(JESunc,"JES uncertainty","f");
926     kinleg->Draw();
927 fronga 1.40 CompleteSave(ckin,"Systematics/JES"+name);
928 buchmann 1.1 datahisto->Delete();
929     delete ckin;
930    
931     }
932    
933 buchmann 1.72 string Cut2Str(TCut cut) {
934     return ((string)(const char*)cut);
935     }
936    
937     void MakeElegantTwoThreeComparisons() {
938    
939 buchmann 1.73 TCut signal("met[4]>100&&met[4]<150&&mll>20"&&PlottingSetup::basicqualitycut);
940 buchmann 1.72 TCut TwoJets("pfJetGoodNum40==2");
941     TCut ThreeJets("pfJetGoodNum40>=3");
942    
943 buchmann 1.73 float min=20;
944     float max=300;
945     int nbins=int((max-min)/5.0);
946     string xlabel="m_{ll} [GeV]";
947 buchmann 1.72
948     TCanvas *can2 = new TCanvas("can2","can2");
949     TH1F *TwoOF = allsamples.Draw("TwoOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&signal&&TwoJets,mc,luminosity,allsamples.FindSample("TTJets_"));
950     TH1F *TwoSF = allsamples.Draw("TwoSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&signal&&TwoJets,mc,luminosity,allsamples.FindSample("TTJets_"));
951     TH1F *ThreeOF = allsamples.Draw("ThreeOF","mll",nbins,min,max, xlabel, "events",cutOSOF&&signal&&ThreeJets,mc,luminosity,allsamples.FindSample("TTJets_"));
952     TH1F *ThreeSF = allsamples.Draw("ThreeSF","mll",nbins,min,max, xlabel, "events",cutOSSF&&signal&&ThreeJets,mc,luminosity,allsamples.FindSample("TTJets_"));
953    
954     can2->cd(1);
955    
956     TwoSF->SetFillColor(kWhite);
957     TwoOF->SetFillColor(kWhite);
958     ThreeSF->SetFillColor(kWhite);
959     ThreeOF->SetFillColor(kWhite);
960    
961     TPad *kin3 = new TPad("kin3","kin3",0,0,1,1);
962     kin3->cd();
963     TwoOF->Draw("histo");
964     TwoSF->Draw("e1,same");
965     TLegend *leg_SFOF_Two = make_legend();
966     leg_SFOF_Two->SetHeader("t#bar{t} MC:");
967     leg_SFOF_Two->AddEntry(TwoOF,"OF, nJets==2","l");
968     leg_SFOF_Two->AddEntry(TwoSF,"SF, nJets==2","lp");
969     leg_SFOF_Two->Draw();
970 buchmann 1.79 Save_With_Ratio(TwoSF,TwoOF,kin3->cd(),"DoubleRatios/SFOF_Two");
971 buchmann 1.72
972     TPad *kin4 = new TPad("kin4","kin4",0,0,1,1);
973     kin4->cd();
974     ThreeOF->Draw("histo");
975     ThreeSF->Draw("e1,same");
976     TLegend *leg_SFOF_Three = make_legend();
977     leg_SFOF_Three->SetHeader("t#bar{t} MC:");
978     leg_SFOF_Three->AddEntry(TwoOF,"OF, nJet#geq3","l");
979     leg_SFOF_Three->AddEntry(TwoSF,"SF, nJets#geq3","lp");
980     leg_SFOF_Three->Draw();
981 buchmann 1.79 Save_With_Ratio(ThreeSF,ThreeOF,kin4->cd(),"DoubleRatios/SFOF_Three");
982 buchmann 1.72
983 buchmann 1.73
984     TwoSF->Scale(ThreeSF->Integral()/TwoSF->Integral());
985     TPad *kin = new TPad("kin","kin",0,0,1,1);
986     kin->cd();
987     TwoSF->Draw("histo");
988     ThreeSF->Draw("e1,same");
989     TLegend *leg_SF_Two_Three = make_legend();
990     leg_SF_Two_Three->SetHeader("t#bar{t} MC:");
991     leg_SF_Two_Three->AddEntry(TwoSF,"#splitline{SF, nJets==2}{ (scaled)}","l");
992     leg_SF_Two_Three->AddEntry(ThreeSF,"SF, nJets#geq3","lp");
993     leg_SF_Two_Three->Draw();
994 buchmann 1.79 Save_With_Ratio(TwoSF,ThreeSF,kin->cd(),"DoubleRatios/SF_Two_Three");
995 buchmann 1.73
996     TwoOF->Scale(ThreeOF->Integral()/TwoOF->Integral());
997     TPad *kin2 = new TPad("kin2","kin2",0,0,1,1);
998     kin2->cd();
999     TwoOF->Draw("histo");
1000     ThreeOF->Draw("e1,same");
1001     TLegend *leg_OF_Two_Three = make_legend();
1002     leg_OF_Two_Three->SetHeader("t#bar{t} MC:");
1003     leg_OF_Two_Three->AddEntry(TwoSF,"#splitline{OF, nJets==2}{ (scaled)}","l");
1004     leg_OF_Two_Three->AddEntry(ThreeSF,"OF, nJets#geq3","lp");
1005     leg_OF_Two_Three->Draw();
1006 buchmann 1.79 Save_With_Ratio(TwoOF,ThreeOF,kin2->cd(),"DoubleRatios/OF_Two_Three");
1007 buchmann 1.73
1008 buchmann 1.72 }
1009    
1010 buchmann 1.78 void PresentRange(TH1F *Down, TH1F *Up, TH1F *central, TVirtualPad *pad, string title) {
1011     pad->cd();
1012     TGraphErrors *gr = new TGraphErrors(Down->GetNbinsX());
1013     for(int i=1;i<=Down->GetNbinsX();i++) {
1014     float average=0.5*(Down->GetBinContent(i)+Up->GetBinContent(i));
1015     float error=abs(Down->GetBinContent(i)-average);
1016     gr->SetPoint(i-1,Down->GetBinCenter(i),average);
1017     gr->SetPointError(i-1,Down->GetBinWidth(i)/2.0,error);
1018     }
1019     gr->SetFillColor(TColor::GetColor("#F79F81"));
1020     gr->GetYaxis()->SetRangeUser(0,2);
1021     gr->GetXaxis()->SetTitle(central->GetXaxis()->GetTitle());
1022     gr->GetYaxis()->SetTitle(central->GetYaxis()->GetTitle());
1023     gr->GetXaxis()->CenterTitle();
1024     gr->GetYaxis()->CenterTitle();
1025    
1026     gr->Draw("A2");
1027     central->Draw("e1,same");
1028     DrawMCPrelim();
1029     TText *rtitle = write_text(0.8,0.8,title);
1030     TLine *line = new TLine(Down->GetBinLowEdge(1),1.0,Down->GetBinLowEdge(Down->GetNbinsX())+Down->GetBinWidth(Down->GetNbinsX()),1.0);
1031     line->SetLineColor(kBlue);
1032     line->SetLineStyle(2);
1033     line->Draw("same");
1034     rtitle->Draw("same");
1035     }
1036    
1037     TH1F* ProduceTTbarRatio(TH1F *datahisto, TH1F *fullmc, TH1F *originalttbar, TH1F *httbar) {
1038     TH1F *basehisto = (TH1F*)fullmc->Clone("basehisto");
1039     basehisto->Add(originalttbar,-1);
1040     basehisto->Add(httbar);
1041    
1042     string sname=httbar->GetName();
1043     sname="R"+sname.substr(1,sname.length());
1044     TH1F *ratio = (TH1F*)datahisto->Clone(sname.c_str());
1045     ratio->Divide(basehisto);
1046     delete basehisto;
1047     return ratio;
1048     }
1049    
1050     void make_ttbar_comparison(string datavariable, string mcvariable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
1051    
1052     TCut cut=addcut&&basiccut;
1053    
1054     TCanvas *ckin = new TCanvas("ckin","Kinematic Plots (in the making)",600,600);
1055     ckin->SetLogy(dolog);
1056     cout << "\r Creating " << filename << " : data (1/11)" << std::flush;
1057     TH1F *datahisto = allsamples.Draw("datahisto",datavariable,nbins,min,max, xlabel, "events",cut,data,luminosity);
1058     datahisto->SetMarkerSize(DataMarkerSize);
1059     if ( !dolog ) datahisto->SetMinimum(0); // Defaults
1060     else datahisto->SetMinimum(0.5);
1061     if (dolog) datahisto->SetMaximum(5.3*datahisto->GetMaximum());
1062     else datahisto->SetMaximum(1.3*datahisto->GetMaximum());
1063     cout << "\r Creating " << filename << " : MC central (stack) (2/11)" << std::flush;
1064     THStack mcstack = allsamples.DrawStack("mcstack", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity);
1065     TH1F *MCcentral = CollapseStack(mcstack);
1066    
1067     cout << "\r Creating " << filename << " : MC central (histo) (3/11)" << std::flush;
1068     TH1F *TCentral = allsamples.Draw ("TCentral", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,allsamples.FindSample("TTJets_"));
1069     TH1F *RCentral = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TCentral);
1070    
1071     cout << "\r Creating " << filename << " : MC Matching up (4/11)" << std::flush;
1072     TH1F *TMatchingUp = systsamples.Draw("TMatchingUp", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_matchingup"));
1073     TH1F *RMatchingUp = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TMatchingUp);
1074    
1075     cout << "\r Creating " << filename << " : MC Matching down (5/11)" << std::flush;
1076     TH1F *TMatchingDown = systsamples.Draw("TMatchingDown",mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_matchingdown"));
1077     TH1F *RMatchingDown = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TMatchingDown);
1078    
1079     cout << "\r Creating " << filename << " : MC Scale up (6/11)" << std::flush;
1080     TH1F *TScaleUp = systsamples.Draw("TScaleUp", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_scaleup"));
1081     TH1F *RScaleUp = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TScaleUp);
1082    
1083     cout << "\r Creating " << filename << " : MC Scale down (7/11)" << std::flush;
1084     TH1F *TScaleDown = systsamples.Draw("TScaleDown", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_scaledown"));
1085     TH1F *RScaleDown = ProduceTTbarRatio(datahisto,MCcentral,TCentral,TScaleDown);
1086    
1087     cout << "\r Creating " << filename << " : MC mass=166 (8/11)" << std::flush;
1088     TH1F *Ttmass166 = systsamples.Draw("Ttmass166", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_mass166"));
1089     TH1F *Rtmass166 = ProduceTTbarRatio(datahisto,MCcentral,TCentral,Ttmass166);
1090    
1091     cout << "\r Creating " << filename << " : MC mass=169 (9/11)" << std::flush;
1092     TH1F *Ttmass169 = systsamples.Draw("Ttmass169", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_mass169"));
1093     TH1F *Rtmass169 = ProduceTTbarRatio(datahisto,MCcentral,TCentral,Ttmass169);
1094    
1095     cout << "\r Creating " << filename << " : MC mass=175 (10/11)" << std::flush;
1096     TH1F *Ttmass175 = systsamples.Draw("Ttmass175", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_mass175"));
1097     TH1F *Rtmass175 = ProduceTTbarRatio(datahisto,MCcentral,TCentral,Ttmass175);
1098    
1099     cout << "\r Creating " << filename << " : MC mass=178 (11/11)" << std::flush;
1100     TH1F *Ttmass178 = systsamples.Draw("Ttmass178", mcvariable,nbins,min,max,xlabel,"events",cut,mc,luminosity,systsamples.FindSample("TTJets_mass178"));
1101     TH1F *Rtmass178 = ProduceTTbarRatio(datahisto,MCcentral,TCentral,Ttmass178);
1102    
1103    
1104     datahisto->Draw("e1");
1105     ckin->Update();
1106     mcstack.Draw("histo,same");
1107    
1108     datahisto->Draw("same,e1");
1109     TLegend *kinleg = allsamples.allbglegend();
1110     kinleg->Draw();
1111    
1112     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1113     kinpad->SetLogy(dolog);
1114     kinpad->cd();
1115     datahisto->Draw("e1");
1116     mcstack.Draw("histo,same");
1117     datahisto->Draw("same,e1");
1118     datahisto->Draw("same,axis");
1119    
1120     kinleg->Draw("same");
1121     DrawPrelim();
1122     string saveas="kin/"+filename;
1123    
1124     cout << "Passing filename to be saved : " << filename << " as " << saveas << endl;
1125 buchmann 1.79 Save_With_Ratio( datahisto, CollapseStack(mcstack), kinpad->cd(), saveas, false, false, "data/mc");
1126     delete kinpad;
1127 buchmann 1.78
1128     ckin->cd();
1129     TCentral->SetLineColor(kBlack);
1130    
1131     TMatchingUp->SetLineColor(TColor::GetColor("#2c17b1"));//blue
1132     TMatchingUp->SetLineStyle(2);//dashed
1133     TMatchingDown->SetLineColor(TColor::GetColor("#2c17b1"));
1134     TMatchingDown->SetLineStyle(3);//dotted
1135    
1136     TScaleUp->SetLineColor(TColor::GetColor("#FF8500"));//orange
1137     TScaleUp->SetLineStyle(2);//dashed
1138     TScaleDown->SetLineColor(TColor::GetColor("#FF8500"));
1139     TScaleDown->SetLineStyle(3);//dotted
1140    
1141     Ttmass166->SetLineColor(TColor::GetColor("#0acf00"));//green
1142     Ttmass166->SetLineStyle(3);//dotted
1143     Ttmass178->SetLineColor(TColor::GetColor("#0acf00"));
1144     Ttmass178->SetLineStyle(2);//dashed
1145    
1146    
1147     Ttmass169->SetLineColor(TColor::GetColor("#FF52F1"));//purple
1148     Ttmass169->SetLineStyle(3);//dotted
1149     Ttmass175->SetLineColor(TColor::GetColor("#FF52F1"));
1150     Ttmass175->SetLineStyle(2);//dashed
1151    
1152    
1153    
1154    
1155     MCcentral->SetLineStyle(3);
1156     MCcentral->SetLineColor(kRed);
1157    
1158     TCentral->Draw("e1,same");
1159     TCentral->Draw("histo,same");
1160     TMatchingUp->Draw("histo,same");
1161     TMatchingDown->Draw("histo,same");
1162     TScaleUp->Draw("histo,same");
1163     TScaleDown->Draw("histo,same");
1164     Ttmass166->Draw("histo,same");
1165     Ttmass169->Draw("histo,same");
1166     Ttmass175->Draw("histo,same");
1167     Ttmass178->Draw("histo,same");
1168    
1169     TLegend *sleg = make_legend();
1170     sleg->AddEntry(TCentral,"Central","L");
1171     sleg->AddEntry(TMatchingUp,"matching up","L");
1172     sleg->AddEntry(TMatchingDown,"matching down","L");
1173     sleg->AddEntry(TScaleUp,"scale up","L");
1174     sleg->AddEntry(TScaleDown,"scale down","L");
1175     sleg->AddEntry(Ttmass166,"m_{t}=166","L");
1176     sleg->AddEntry(Ttmass169,"m_{t}=169","L");
1177     sleg->AddEntry(Ttmass175,"m_{t}=175","L");
1178     sleg->AddEntry(Ttmass178,"m_{t}=178","L");
1179     sleg->Draw();
1180    
1181     CompleteSave(ckin,saveas+"___AllLines");
1182     ckin->cd();
1183     ckin->SetLogy(0);
1184    
1185     RCentral->SetLineColor(kBlack);
1186    
1187     RMatchingUp->SetLineColor(TColor::GetColor("#2c17b1"));//blue
1188     RMatchingUp->SetLineStyle(2);//dashed
1189     RMatchingDown->SetLineColor(TColor::GetColor("#2c17b1"));
1190     RMatchingDown->SetLineStyle(3);//dotted
1191    
1192     RScaleUp->SetLineColor(TColor::GetColor("#FF8500"));//orange
1193     RScaleUp->SetLineStyle(2);//dashed
1194     RScaleDown->SetLineColor(TColor::GetColor("#FF8500"));
1195     RScaleDown->SetLineStyle(3);//dotted
1196    
1197     Rtmass166->SetLineColor(TColor::GetColor("#0acf00"));//green
1198     Rtmass166->SetLineStyle(3);//dotted
1199     Rtmass178->SetLineColor(TColor::GetColor("#0acf00"));
1200     Rtmass178->SetLineStyle(2);//dashed
1201    
1202    
1203     Rtmass169->SetLineColor(TColor::GetColor("#FF52F1"));//purple
1204     Rtmass169->SetLineStyle(3);//dotted
1205     Rtmass175->SetLineColor(TColor::GetColor("#FF52F1"));
1206     Rtmass175->SetLineStyle(2);//dashed
1207    
1208    
1209     RCentral->GetYaxis()->SetRangeUser(0,2);
1210     RCentral->Draw("e1");
1211     RMatchingUp->Draw("histo,same");
1212     RMatchingDown->Draw("histo,same");
1213     RScaleUp->Draw("histo,same");
1214     RScaleDown->Draw("histo,same");
1215     Rtmass166->Draw("histo,same");
1216     Rtmass169->Draw("histo,same");
1217     Rtmass175->Draw("histo,same");
1218     Rtmass178->Draw("histo,same");
1219    
1220     CompleteSave(ckin,saveas+"___AllRatios");
1221    
1222     TCanvas *multicanvas = new TCanvas("multicanvas","multicanvas",1000,1000);
1223     multicanvas->Divide(2,2);
1224     PresentRange(RMatchingUp,RMatchingDown,RCentral,multicanvas->cd(1),"Matching");
1225     PresentRange(RScaleUp,RScaleDown,RCentral,multicanvas->cd(2),"Scale");
1226     PresentRange(Rtmass166,Rtmass178,RCentral,multicanvas->cd(3),"m_{t} (2#sigma)");
1227     PresentRange(Rtmass169,Rtmass175,RCentral,multicanvas->cd(4),"m_{t} (1#sigma)");
1228     CompleteSave(multicanvas,saveas+"___RangeIllustration");
1229    
1230    
1231     delete datahisto;
1232     delete TCentral;
1233     delete TMatchingUp;
1234     delete TMatchingDown;
1235     delete TScaleUp;
1236     delete TScaleDown;
1237     delete Ttmass166;
1238     delete Ttmass169;
1239     delete Ttmass175;
1240     delete Ttmass178;
1241    
1242     delete ckin;
1243    
1244     }
1245    
1246     void make_ttbar_comparison(string variable, int nbins, float min, float max, TCut addcut, bool dolog, string xlabel, string filename) {
1247     make_ttbar_comparison(variable, variable, nbins, min, max, addcut, dolog, xlabel, filename);
1248     }
1249 buchmann 1.72
1250 buchmann 1.79 void ProduceJanPlots() {
1251     TCanvas *c1 = new TCanvas("c1","c1");
1252     TH1F *metSF = allsamples.Draw("metSF","met[4]",30,100,400, "E_{T}^{miss} [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
1253     TH1F *metOF = allsamples.Draw("metOF","met[4]",30,100,400, "E_{T}^{miss} [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
1254    
1255     TPad* rcan = new TPad("rcan","rcan",0,0,1,1);
1256     rcan->cd();
1257    
1258     metOF->SetLineColor(kRed);
1259     metSF->Draw("e1");
1260     metOF->Draw("histo,same");
1261     metSF->Draw("e1,same");
1262    
1263     TLegend *leg = make_legend();
1264    
1265     leg->AddEntry(metSF,"Data SF","p");
1266     leg->AddEntry(metOF,"Data OF","l");
1267     leg->Draw();
1268    
1269     DrawPrelim();
1270    
1271     Save_With_Ratio(metSF,metOF,rcan,"JanPlots/ETHConfig",false,false,"SF/OF");
1272    
1273     delete rcan;
1274     delete metSF;
1275     delete metOF;
1276     delete c1;
1277     }
1278    
1279     THStack MakeOneSystematicsPlot(TCut cut, string saveas, string variation, TH1F *hdata, string variable, int nbins, float bmin, float bmax, string label) {
1280     THStack SystPlot = allsamples.DrawStack(variation,variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity);
1281    
1282     //now need to process the plot (calculate the variation and set the member of thstack accordingly!)
1283     if(variation!="Central") {
1284     TH1F *varttbar;
1285     if(variation=="MatchingUp") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_matchingup_TuneZ2s"));
1286     if(variation=="MatchingDown") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_matchingdown"));
1287     if(variation=="ScaleUp") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_scaleup"));
1288     if(variation=="ScaleDown") varttbar = systsamples.Draw("varttbar",variable,nbins,bmin,bmax,label,"events",cut,mc,PlottingSetup::luminosity,systsamples.FindSample("TTJets_scaledown"));
1289     assert(varttbar);
1290    
1291     TIter nextHisto(SystPlot.GetHists());
1292     TH1F* h;
1293     while ( h = (TH1F*)nextHisto() ) {
1294     if(Contains(h->GetName(),"t_bar_t")) {
1295     varttbar->Scale(h->Integral()/varttbar->Integral());
1296     for(int i=0;i<=h->GetNbinsX()+1;i++) {//note that we deliberatly consider the under/overflow bin as well!
1297     h->SetBinContent(i,varttbar->GetBinContent(i));
1298     h->SetBinError(i,varttbar->GetBinError(i));
1299     }
1300     SystPlot.Modified();
1301     }
1302     }
1303     delete varttbar;
1304     }
1305    
1306     TLegend *fullleg = allsamples.allbglegend();
1307     fullleg->SetHeader(variation.c_str());
1308     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1309     kinpad->SetLogy(1);
1310     kinpad->cd();
1311    
1312     hdata->Draw("e1");
1313     SystPlot.Draw("histo,same");
1314     hdata->Draw("e1,same");
1315     fullleg->Draw();
1316     DrawPrelim();
1317    
1318     Save_With_Ratio(hdata,SystPlot,kinpad,saveas+"_"+variation);
1319     CleanLegends();
1320    
1321     delete kinpad;
1322     return SystPlot;
1323     }
1324    
1325    
1326    
1327     void ProduceMCSystematicPlot(string variable, int nbins, float bmin, float bmax, string label, TCut thiscut, string saveas) {
1328     TCanvas *ca = new TCanvas("ca","ca");
1329    
1330     TH1F *hdata = allsamples.Draw("hdata",variable,nbins,bmin,bmax,label,"events",thiscut,data,luminosity);
1331    
1332     THStack ScaleUp = MakeOneSystematicsPlot(thiscut,saveas,"ScaleUp",hdata,variable, nbins, bmin, bmax, label);
1333     THStack ScaleDown = MakeOneSystematicsPlot(thiscut,saveas,"ScaleDown",hdata,variable, nbins, bmin, bmax, label);
1334     THStack MatchingUp = MakeOneSystematicsPlot(thiscut,saveas,"MatchingUp",hdata,variable, nbins, bmin, bmax, label);
1335     THStack MatchingDown = MakeOneSystematicsPlot(thiscut,saveas,"MatchingDown",hdata,variable, nbins, bmin, bmax, label);
1336    
1337     TH1F *HScaleUp = CollapseStack(ScaleUp);
1338     TH1F *HScaleDown = CollapseStack(ScaleDown);
1339     TH1F *HMatchingUp = CollapseStack(MatchingUp);
1340     TH1F *HMatchingDown = CollapseStack(MatchingDown);
1341    
1342     DeleteStack(ScaleUp);
1343     DeleteStack(ScaleDown);
1344     DeleteStack(MatchingUp);
1345     DeleteStack(MatchingDown);
1346    
1347     THStack Central = MakeOneSystematicsPlot(thiscut,saveas,"Central",hdata,variable, nbins, bmin, bmax, label);
1348     TH1F *HCentral = CollapseStack(Central);
1349    
1350     TH1F *Systematic = (TH1F*)hdata->Clone("Systematic");
1351     for(int i=1;i<=Systematic->GetNbinsX();i++) {
1352     float matchingup = abs(HMatchingUp->GetBinContent(i)-HCentral->GetBinContent(i));
1353     float matchingdown = abs(HMatchingDown->GetBinContent(i)-HCentral->GetBinContent(i));
1354     float scaleup = abs(HScaleUp->GetBinContent(i)-HCentral->GetBinContent(i));
1355     float scaledown = abs(HScaleDown->GetBinContent(i)-HCentral->GetBinContent(i));
1356    
1357     float matching = matchingup>matchingdown?matchingup:matchingdown;
1358     float scale = scaleup>scaledown?scaleup:scaledown;
1359    
1360     float sys=sqrt(matching*matching+scale*scale);
1361     sys/=HCentral->GetBinContent(i);
1362     if(HCentral->GetBinContent(i)==0) sys=0;
1363     Systematic->SetBinContent(i,sys);
1364     }
1365    
1366     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
1367     kinpad->SetLogy(1);
1368     kinpad->cd();
1369     hdata->Draw("e1");
1370     Central.Draw("histo,same");
1371     hdata->Draw("e1,same");
1372     DrawPrelim();
1373    
1374     save_with_ratio_and_sys_band( hdata, HCentral, kinpad->cd(), saveas, false, false, "data/mc",Systematic );
1375    
1376     CleanLegends();
1377     DeleteStack(Central);
1378     delete Systematic;
1379     delete HScaleUp;
1380     delete HScaleDown;
1381     delete HMatchingUp;
1382     delete HMatchingDown;
1383     delete hdata;
1384     delete HCentral;
1385     delete ca;
1386     }
1387    
1388     void ProduceMCSystematicPlots() {
1389     TCut cutweightBKP = cutWeight;
1390    
1391     ProduceMCSystematicPlot("met[4]",80,0,400,"PFMET [GeV]",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_SameFlavor");
1392     ProduceMCSystematicPlot("met[4]",80,0,400,"PFMET [GeV]",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/ETH_OppositeFlavor");
1393     ProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>100"),"MCSystPlots/NJets/ETH_SameFlavor");
1394     ProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>100"),"MCSystPlots/NJets/ETH_OppositeFlavor");
1395    
1396     TCut cutnJetsBKP = cutnJets;
1397     cutnJets = TCut((ReplaceAll((const char*)cutnJets,"pt2>20","pt2>10")).c_str());
1398     cutnJets = TCut((ReplaceAll((const char*)cutnJets,"pfJetGoodNum40>=3","pfJetGoodNum40>=2")).c_str());
1399     cutnJets = TCut((ReplaceAll((const char*)cutnJets,"abs(eta2)<1.4","abs(eta2)<2.4")).c_str());
1400     cutnJets = TCut((ReplaceAll((const char*)cutnJets,"abs(eta1)<1.4","abs(eta1)<2.4")).c_str());
1401    
1402     ProduceMCSystematicPlot("met[4]",80,0,400,"PFMET [GeV]",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_SameFlavor");
1403     ProduceMCSystematicPlot("met[4]",80,0,400,"PFMET [GeV]",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70"),"MCSystPlots/MET/Aachen_OppositeFlavor");
1404     ProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSSF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>150"),"MCSystPlots/NJets/Aachen_SameFlavor");
1405     ProduceMCSystematicPlot("pfJetGoodNum40",8,-0.5,7.5,"NJets",cutOSOF&&cutnJets&&TCut("mll>20&&mll<70&&met[4]>150"),"MCSystPlots/NJets/Aachen_OppositeFlavor");
1406     cutnJets = cutnJetsBKP;
1407     cutWeight = cutweightBKP;
1408     }
1409    
1410 buchmann 1.1 void do_kinematic_plots(string mcjzb, string datajzb, bool doPF=false)
1411     {
1412 buchmann 1.66 // switch_overunderflow(true);
1413 buchmann 1.1 bool dolog=true;
1414     bool nolog=false;
1415 fronga 1.54
1416 buchmann 1.69 bool doOFSF = false;
1417 buchmann 1.77 bool doKin = true;
1418 buchmann 1.71 bool doDataComp = false;
1419 buchmann 1.73 bool MakeTwoThreeJetComparison = false;
1420 fronga 1.55
1421 fronga 1.54
1422 buchmann 1.1 if(doPF) write_warning(__FUNCTION__,"Please use caution when trying to produce PF plots; not all versions of the JZB trees have these variables!");
1423 buchmann 1.17 float mll_low=50;
1424 buchmann 1.2 float mll_hi=160;
1425     if(!PlottingSetup::RestrictToMassPeak) {
1426 buchmann 1.26 mll_low=20;
1427 fronga 1.54 mll_hi=320;
1428 buchmann 1.2 }
1429 buchmann 1.72
1430 buchmann 1.73 if(MakeTwoThreeJetComparison) MakeElegantTwoThreeComparisons();
1431 fronga 1.54
1432 buchmann 1.79 //ProduceJanPlots();
1433     ProduceMCSystematicPlots();
1434     make_plain_kin_plot("pt",Cut2Str(cutOSSF&&TCut("mll>20&&pfJetGoodNumBtag30>=2")),40,0,200,nolog,"Z p_{T}","PlotForKostas",doPF,true);
1435    
1436 fronga 1.54 if ( doOFSF ) {
1437 buchmann 1.69 make_OFSF_plots("mll", "met[4]>100", 60, 20., 320., false, "m_{ll}", "mll");
1438 fronga 1.55
1439 buchmann 1.70 // make_OFSF_plots("pfJetGoodNum40", "met[4]>100", 7, 3, 10, true, "#(jets)", "njets");
1440     // make_OFSF_plots("pfJetGoodNum40", "met[4]>100&&pfJetGoodNumBtag30==0", 7, 3, 10, true, "#(jets)", "njets_btagVeto");
1441     // make_OFSF_plots("pfJetGoodNum40", "met[4]>100&&pfJetGoodNumBtag30>0", 7, 3, 10, true, "#(jets)", "njets_AtLeastOneBJet30");
1442 fronga 1.55
1443 buchmann 1.70 // make_OFSF_plots("pfJetGoodNumBtag30", "met[4]>100", 5, 0, 5, true, "#(b-jets)", "nbjets");
1444     // make_OFSF_plots("pfJetGoodPtBtag[0]", "met[4]>100&&pfJetGoodNumBtag30>0", 20, 0, 400, true, "p_{T}(leading b-jet)", "ptb1");
1445 fronga 1.61
1446 buchmann 1.68 // make_OFSF_plots("iso1", "met[4]>100", 20, 0, 0.3, true, "lepton 1 isolation", "iso1");
1447     // make_OFSF_plots("iso2", "met[4]>100", 20, 0, 0.3, true, "lepton 2 isolation", "iso2");
1448 fronga 1.55 // make_OFSF_plots("pt1", "met[4]>100", 30, 0., 300., true, "p_{T,1}", "pt1");
1449     // make_OFSF_plots("pt2", "met[4]>100", 22, 0., 220., true, "p_{T,2}", "pt2");
1450 buchmann 1.68 // make_OFSF_plots("eta1", "met[4]>100", 10, -2.5, 2.5, false, "#eta_{1}", "eta1", 0.15);
1451     // make_OFSF_plots("eta2", "met[4]>100", 10, -2.5, 2.5, false, "#eta_{2}", "eta2", 0.15);
1452 fronga 1.55 // make_OFSF_plots("phi1", "met[4]>100", 10, -TMath::Pi(), TMath::Pi(), false, "#phi_{1}", "phi1", 0.2);
1453     // make_OFSF_plots("phi2", "met[4]>100", 10, -TMath::Pi(), TMath::Pi(), false, "#phi_{2}", "phi2", 0.2);
1454 buchmann 1.70 // make_OFSF_plots("pfJetGoodPt[0]/pfJetGoodPt[1]", "met[4]>100", 20, 1, 10, true, "pt_{j}^{1}/pt_{j}^{2}", "jpt1pt2", 0.2);
1455 fronga 1.55 make_OFSF_plots("TMath::Abs(pfJetDphiMet[0])", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(jet1,MET)|", "dphij1met", 0.2);
1456 buchmann 1.70 // make_OFSF_plots("TMath::Abs(dphi)", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(l1,l2)|", "dphi", 0.2);
1457     // make_OFSF_plots("TMath::Abs(dphiMet1)", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(l1,MET)|", "dphiMet1", 0.2);
1458     // make_OFSF_plots("TMath::Abs(dphiMet2)", "met[4]>100", 16, 0, 3.2, false, "|#Delta#phi(l2,MET)|", "dphiMet2", 0.2);
1459     // 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");
1460     // 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");
1461     // 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");
1462     // 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");
1463 fronga 1.55 }
1464    
1465 buchmann 1.70 if ( doDataComp) {
1466 fronga 1.55 TCut mllCut("");
1467 fronga 1.62 float massmin = 15.;
1468     float massmax = 315;
1469     int massnbins = 60;
1470 buchmann 1.70 /* if ( !PlottingSetup::openBox ) {
1471 buchmann 1.69 mllCut = "mll>70";
1472 fronga 1.62 massmin = 120;
1473     massmax = 360;
1474     massnbins = 14;
1475 buchmann 1.70 }*/
1476 fronga 1.55
1477     TCut cutSignal = cutmass&&cutnJets&&"met[4]>100";
1478 buchmann 1.70
1479 buchmann 1.71 /* make_data_comparison_plot("numVtx", "",40, -0.5, 39.5,-1., true, "N(Vertices)", "numVtx");
1480     make_data_comparison_plot("pfJetGoodEta[0]", "",50, -3.0, 3.0,-1., true, "N(Jets)", "pfJetGoodEta0");
1481    
1482    
1483     make_data_comparison_plot("pfJetGoodNum40", cutOSOF,10, -0.5, 9.5,-1., true, "N(Jets)", "njets_OF");
1484     make_data_comparison_plot("met[4]", cutOSSF,60, 0., 300.,-1., true, "pfMET", "met_SF_inclusive");
1485 buchmann 1.70 make_data_comparison_plot("met[1]", cutOSSF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_SF_inclusive");
1486     make_data_comparison_plot("met[4]", cutOSOF,60, 0., 300.,-1., true, "pfMET", "met_OF_inclusive");
1487     make_data_comparison_plot("met[1]", cutOSOF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_OF_inclusive");
1488    
1489     make_data_comparison_plot("met[4]", cutnJets&&cutOSSF,60, 0., 300.,-1., true, "pfMET", "met_SF_exclusive");
1490 buchmann 1.71 // make_data_comparison_plot("met[1]", cutnJets&&cutOSSF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_SF_exclusive");
1491 buchmann 1.70 make_data_comparison_plot("met[4]", cutnJets&&cutOSOF,60, 0., 300.,-1., true, "pfMET", "met_OF_exclusive");
1492 buchmann 1.71 // make_data_comparison_plot("met[1]", cutnJets&&cutOSOF,60, 0., 300.,-1., true, "type 1 corrected pfMET", "mett1_OF_exclusive");
1493     */
1494 buchmann 1.70
1495     string basiccutsaved = (const char*)basiccut;
1496    
1497     string newbasiccut=basiccutsaved;
1498    
1499     size_t found;
1500     found = newbasiccut.find( "pt2>20" );
1501     while (found!=string::npos){
1502     newbasiccut.replace( found, string( "pt2>20" ).length(), "pt2>10" );
1503     found = newbasiccut.find( "pt2>20" );
1504     }
1505     // basiccut=TCut(newbasiccut.c_str());
1506     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[4]>150")&&cutOSSF,60, 0., 300.,-1., false, "mll", "mll_SF_Aachen_pt2010_met");
1507     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[4]>150")&&cutOSOF,60, 0., 300.,-1., false, "mll", "mll_OF_Aachen_pt2010_met");
1508     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[1]>150")&&cutOSSF,60, 0., 300.,-1., true, "mll", "mll_SF_Aachen_pt2010_t1cpfmet");
1509     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=2&&met[1]>150")&&cutOSOF,60, 0., 300.,-1., true, "mll", "mll_OF_Aachen_pt2010_t1cpfmet");
1510     // basiccut=TCut(basiccutsaved.c_str());
1511    
1512     // make_data_comparison_plot("pfJetGoodNum40", cutOSSF, 8, 0., 8.,-1., true, "#(jets)", "njets_SF");
1513     // make_data_comparison_plot("pfJetGoodNum40", cutOSOF, 8, 0., 8.,-1., true, "#(jets)", "njets_OF");
1514    
1515     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[4]>100")&&cutOSSF,60, 0., 300.,-1., true, "mll", "mll_SF_ETH_met");
1516     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[4]>100")&&cutOSOF,60, 0., 300.,-1., true, "mll", "mll_OF_ETH_met");
1517     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[1]>100")&&cutOSSF,60, 0., 300.,-1., true, "mll", "mll_SF_ETH_t1cpfmet");
1518     // make_data_comparison_plot("mll", TCut("pfJetGoodNum40>=3&&met[1]>100")&&cutOSOF,60, 0., 300.,-1., true, "mll", "mll_OF_ETH_t1cpfmet");
1519    
1520    
1521 buchmann 1.71 /* make_data_comparison_plot("mll", cutOSSF,60, 15., 315.,-1., true, "m_{ll}", "mll_SF_inclusive");
1522     make_data_comparison_plot("mll", cutOSSF&&TCut("id1==0"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_inclusive_ee");
1523     make_data_comparison_plot("mll", cutOSSF&&TCut("id1==1"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_inclusive_mm");
1524     make_data_comparison_plot("mll", cutOSOF,60, 15., 315.,-1., true, "m_{ll}", "mll_OF_inclusive");
1525 buchmann 1.70 make_data_comparison_plot("mll", cutnJets&&cutOSSF&&TCut("id1==0"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_exclusive_ee");
1526     make_data_comparison_plot("mll", cutnJets&&cutOSSF&&TCut("id1==1"),60, 15., 315.,-1., true, "m_{ll}", "mll_SF_exclusive_mm");
1527     make_data_comparison_plot("mll", cutnJets&&cutOSSF,60, 15., 315.,-1., true, "m_{ll}", "mll_SF_exclusive");
1528     make_data_comparison_plot("mll", cutnJets&&cutOSOF,60, 15., 315.,-1., true, "m_{ll}", "mll_OF_exclusive");
1529 buchmann 1.71 */
1530 fronga 1.62 make_data_comparison_plot("mll", cutOSSF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig");
1531 buchmann 1.71 make_data_comparison_plot("mll", cutOSOF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig");
1532    
1533     make_data_comparison_plot("mll", TCut("abs(eta1)<1.4&&abs(eta2)<1.4") && cutOSSF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig_central");
1534     make_data_comparison_plot("mll", TCut("abs(eta1)<1.4&&abs(eta2)<1.4") && cutOSOF&&cutSignal&&mllCut, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig_central");
1535    
1536 fronga 1.62 make_data_comparison_plot("mll", cutOSSF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30==0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig_btagVeto");
1537 buchmann 1.71 make_data_comparison_plot("mll", cutOSOF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30==0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig_btagVeto");
1538    
1539 fronga 1.62 make_data_comparison_plot("mll", cutOSSF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30>0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_sig_AtLeastOneBJet");
1540 buchmann 1.71 make_data_comparison_plot("mll", cutOSOF&&cutSignal&&mllCut&&"pfJetGoodNumBtag30>0", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig_AtLeastOneBJet");
1541 fronga 1.55
1542 buchmann 1.71 /*
1543 fronga 1.62 make_data_comparison_plot("mll", mllCut&&cutOSOF&&cutSignal, massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_sig");
1544 fronga 1.63 make_data_comparison_plot("mll", cutmass&&cutOSSF&&"met[4]>100&&met[4]<150&&pfJetGoodNum40==2", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_SF_CR");
1545     make_data_comparison_plot("mll", cutmass&&cutOSOF&&"met[4]>100&&met[4]<150&&pfJetGoodNum40==2", massnbins, 15., 315.,-1., false, "m_{ll}", "mll_OF_CR");
1546 fronga 1.60
1547     make_data_comparison_plot("pfJetGoodNum40", cutOSSF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(jets)", "njets_SF_sig");
1548     make_data_comparison_plot("pfJetGoodNum40", cutOSOF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(jets)", "njets_OF_sig");
1549     make_data_comparison_plot("pfJetGoodNumBtag30", cutOSSF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(b-jets)", "nbjets_SF_sig");
1550     make_data_comparison_plot("pfJetGoodNumBtag30", cutOSOF&&cutSignal&&mllCut, 8, 0., 8.,-1., false, "#(b-jets)", "nbjets_OF_sig");
1551 buchmann 1.71 */
1552 fronga 1.54 }
1553    
1554 fronga 1.55
1555 fronga 1.54 if ( doKin ) {
1556 fronga 1.55 string mllCut("");
1557 buchmann 1.78
1558    
1559 buchmann 1.73 /*
1560     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_0j",doPF,true);
1561     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_1j",doPF,true);
1562     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_2j",doPF,true);
1563     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/MET_OF_30to70_3j",doPF,true);
1564    
1565     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_0j",doPF,true);
1566     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_1j",doPF,true);
1567     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_2j",doPF,true);
1568     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/MET_OF_Z_3j",doPF,true);
1569 buchmann 1.77
1570 buchmann 1.74
1571 buchmann 1.75 make_plain_kin_plot("pfTightHT",Cut2Str(cutOSOF&&cutnJets),120,0,1200,dolog,"H_{T}","HT_3jets_OF",doPF,true);
1572     make_plain_kin_plot("pfTightHT",Cut2Str(cutOSSF&&cutnJets) ,120,0,1200,dolog,"H_{T}","HT_3jets_SF",doPF,true);
1573     make_plain_kin_plot("pfTightHT",Cut2Str(cutOSOF&&cutnJets&&TCut("met[4]>100")),120,0,1200,dolog,"H_{T}","HT_3jets_OF_MET100",doPF,true);
1574     make_plain_kin_plot("pfTightHT",Cut2Str(cutOSSF&&cutnJets&&TCut("met[4]>100")) ,120,0,1200,dolog,"H_{T}","HT_3jets_SF_MET100",doPF,true);
1575 buchmann 1.74
1576 buchmann 1.73
1577     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_0j",doPF,true);
1578     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_1j",doPF,true);
1579     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_2j",doPF,true);
1580     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_30to70_3j",doPF,true);
1581    
1582     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==0")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_0j",doPF,true);
1583     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==1")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_1j",doPF,true);
1584     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==2")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_2j",doPF,true);
1585     make_plain_kin_plot("met[1]",Cut2Str(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==3")),40,0,400,dolog,"PFMET","Debunking/T1MET_OF_Z_3j",doPF,true);
1586 fronga 1.55
1587 buchmann 1.77 make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&cutnJets&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_SF_20to70",doPF,true);
1588 buchmann 1.72 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&cutnJets&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_OF_20to70",doPF,true);
1589    
1590     make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&cutnJets&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_SF_above120",doPF,true);
1591 buchmann 1.73 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&cutnJets&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_OF_above120",doPF,true);*/
1592 buchmann 1.72
1593 buchmann 1.73 /* make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&TCut("pfJetGoodNum40==2")&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_SF_20to70___2jetsonly",doPF,true);
1594 buchmann 1.72 make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("pfJetGoodNum40==2")&&TCut("mll>20&&mll<70")),50,0,300,dolog,"PFMET","MET_OF_20to70___2jetsonly",doPF,true);
1595    
1596     make_plain_kin_plot("met[4]",Cut2Str(cutOSSF&&TCut("pfJetGoodNum40==2")&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_SF_above120___2jetsonly",doPF,true);
1597     make_plain_kin_plot("met[4]",Cut2Str(cutOSOF&&TCut("pfJetGoodNum40==2")&&TCut("mll>120")),50,0,300,dolog,"PFMET","MET_OF_above120___2jetsonly",doPF,true);
1598 buchmann 1.73 */
1599 buchmann 1.72
1600    
1601    
1602    
1603    
1604    
1605    
1606 buchmann 1.77 // make_kin_plot("pfJetGoodPt[0]/pfJetGoodPt[1]","",45,1,10,dolog,"pt_{j}^{1}/pt_{j}^{2}","j1j2ratio",doPF,true);
1607     // make_kin_plot("TMath::Abs(pfJetDphiMet[0])","",32,0,3.2,nolog,"|#Delta#phi(jet1,MET)|","dphiJ1MET",doPF,true);
1608     // Plots in signal region
1609     // make_kin_plot("met[4]","",70,0,350,dolog,"MET [GeV]","met",doPF,true);
1610    
1611    
1612 buchmann 1.78
1613    
1614    
1615     make_kin_plot("MetFactor","",20,0,2,nolog,"MetFactor","MetFactor",doPF,true);
1616    
1617     make_ttbar_comparison("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_OF_30to70_2j__ALLMCSAMPLES");
1618    
1619     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==0")),dolog,"PFMET","Debunking/MET_OF_30to70_0j");
1620     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfJetGoodNum40==1")),dolog,"PFMET","Debunking/MET_OF_30to70_1j");
1621     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_OF_30to70_2j");
1622     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>30&&mll<70&&pfTightHT>100&&pfJetGoodNum40==3")),dolog,"PFMET","Debunking/MET_OF_30to70_3j");
1623    
1624     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==0")),dolog,"PFMET","Debunking/MET_OF_Z_0j");
1625     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfJetGoodNum40==1")),dolog,"PFMET","Debunking/MET_OF_Z_1j");
1626     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==2")),dolog,"PFMET","Debunking/MET_OF_Z_2j");
1627     DoMCSystPlot("met[4]",40,0,400,(cutOSOF&&TCut("mll>80&&mll<100&&pfTightHT>100&&pfJetGoodNum40==3")),dolog,"PFMET","Debunking/MET_OF_Z_3j");
1628    
1629    
1630 buchmann 1.77 DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSSF,dolog,"m_{ll} [GeV]","kinSys/mll");
1631     DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSSF&&TCut("id1==0"),dolog,"m_{ll} [GeV]","kinSys/mll_ee");
1632     DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSSF&&TCut("id1==1"),dolog,"m_{ll} [GeV]","kinSys/mll_mm");
1633     DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutnJets&&cutOSOF,dolog,"m_{ll} [GeV]","kinSys/mll_osof");
1634    
1635     DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutOSSF,dolog,"m_{ll} [GeV]","kinSys/mll_inclusive");
1636     DoMCSystPlot("mll", (int)((mll_hi-mll_low)/5),mll_low,mll_hi,cutOSOF,dolog,"m_{ll} [GeV]","kinSys/mll_inclusive_osof");
1637    
1638     DoMCSystPlot("pfJetGoodNum40", 9,-0.5,8.5,cutOSSF,dolog,"nJets","kinSys/nJets_ossf");
1639     DoMCSystPlot("pfJetGoodNum40", 9,-0.5,8.5,cutOSOF,dolog,"nJets","kinSys/nJets_osof");
1640    
1641     DoMCSystPlot("pfJetGoodPt[0]/pfJetGoodPt[1]",45,1,10,cutnJets&&cutOSSF,dolog,"p_{T}^{J1} / p_{T}^{J2}","kinSys/j1j2ratio");
1642 buchmann 1.78 DoMCSystPlot("TMath::Abs(pfJetDphiMet[0])",32,0,3.2,cutnJets&&cutOSSF,dolog,"|#Delta#phi(jet1,MET)|","kinSys/dphiJ1MET");
1643    
1644     DoMCSystPlot(datajzb,mcjzb, (int)((PlottingSetup::jzbHigh+110)/10),-110,PlottingSetup::jzbHigh,cutnJets&&cutOSSF&&Restrmasscut,dolog,"m_{ll} [GeV]","kinSys/jzb_OS_SFZP");
1645     DoMCSystPlot(datajzb,mcjzb, (int)((PlottingSetup::jzbHigh+110)/10),-110,PlottingSetup::jzbHigh,cutnJets&&cutOSOF&&Restrmasscut,dolog,"m_{ll} [GeV]","kinSys/jzb_OS_OFZP");
1646 buchmann 1.77
1647 buchmann 1.72
1648    
1649 buchmann 1.70 make_kin_plot("mll","mll>20"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll",doPF,true);
1650     make_kin_plot("mll","mll>20",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof",doPF,true,true);
1651     make_kin_plot("mll","mll>20"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee",doPF,true);
1652     make_kin_plot("mll","mll>20"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm",doPF,true);
1653    
1654     make_kin_plot("pfJetGoodNum40",mllCut,9,-0.5,8.5,dolog,"nJets","nJets",doPF);
1655     make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_osof",doPF);
1656    
1657     // make_kin_plot("mll","mll>20&&met[4]>100"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_met100",doPF,true);
1658     // make_kin_plot("mll","mll>20&&met[4]>100",(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_osof_met100",doPF,true,true);
1659     // make_kin_plot("mll","mll>20&&met[4]>100"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_ee_met100",doPF,true);
1660     // make_kin_plot("mll","mll>20&&met[4]>100"+mllCut,(int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_mm_met100",doPF,true);
1661 fronga 1.54
1662 buchmann 1.69
1663 buchmann 1.70 // make_kin_plot("pfJetGoodNum40","met[4]>100"+mllCut,9,-0.5,8.5,dolog,"nJets","nJets_met100",doPF);
1664     // make_kin_plot("pfJetGoodNum40","met[4]>100",9,-0.5,8.5,dolog,"nJets","nJets_osof_met100",doPF);
1665 fronga 1.54
1666     // Further inclusive invariant mass plots
1667 buchmann 1.70 make_kin_plot("mll",mllCut,(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive",doPF,true);
1668     // make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_ee",doPF,true);
1669     // make_kin_plot("mll","",(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_mm",doPF,true);
1670     make_kin_plot("mll",mllCut,(int)((mll_hi-mll_low))/5,mll_low,mll_hi,dolog,"m_{ll} [GeV]","mll_inclusive_osof",doPF,true);
1671 fronga 1.54
1672     //make_kin_plot("mll","",(int)((350-mll_low))/5,mll_low,350,dolog,"m_{ll} [GeV]","mll_inclusive_highrange",doPF);
1673     //if(!doPF) make_special_mll_plot((int)((mll_hi-mll_low)/5),mll_low,mll_hi,dolog,"m_{ll} [GeV]");
1674    
1675    
1676     // Number of jets
1677     make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_inclusive",doPF);
1678     make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_osof_inclusive",doPF);
1679     //make_kin_plot("pfJetGoodNum40","",9,-0.5,8.5,dolog,"nJets","nJets_nocuts_except_mll_ossf",doPF);
1680    
1681     // Others
1682     make_kin_plot("numVtx","",(int)(30.5-(-0.5)),-0.5,30.5,nolog,"N(Vtx)","numVtx",doPF);
1683     // make_kin_plot("jetpt[0]","",40,0,200,dolog,"leading jet p_{T} [GeV]","pfJetGoodPt_0",doPF);
1684     // make_kin_plot("jeteta[0]","",40,-5,5,nolog,"leading jet #eta","pfJetGoodEta_0",doPF);
1685     make_kin_plot("pt","",50,0,500,dolog,"Z p_{T} [GeV]","Zpt",doPF);
1686     make_kin_plot("pt1","",50,0,200,nolog,"p_{T} [GeV]","pt1",doPF);
1687     make_kin_plot("pt2","",50,0,200,nolog,"p_{T} [GeV]","pt2",doPF);
1688     make_kin_plot("eta1","",40,-3,3,nolog,"#eta_{l}","eta",doPF);
1689     make_kin_plot("jzb[1]","",100,-150,200,dolog,"JZB [GeV]","jzb_ossf",doPF);
1690     // stringstream jzbcut;
1691     // jzbcut << "((is_data&&("<<datajzb<<")>100)||(!is_data&&("<<mcjzb<<")>100))";
1692     // make_kin_plot("mll",jzbcut.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB100",doPF,true);
1693     // 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);
1694     // 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);
1695     // 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);
1696     // stringstream jzbcut2;
1697     // jzbcut2 << "((is_data&&("<<datajzb<<")>150)||(!is_data&&("<<mcjzb<<")>150))";
1698     // make_kin_plot("mll",jzbcut2.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB150",doPF,true);
1699     // 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);
1700     // 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);
1701     // 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);
1702     // stringstream jzbcut3;
1703     // jzbcut3 << "((is_data&&("<<datajzb<<")>50)||(!is_data&&("<<mcjzb<<")>50))";
1704     // make_kin_plot("mll",jzbcut3.str(),(int)((mll_hi-mll_low)/5),mll_low,mll_hi,nolog,"m_{ll} [GeV]","mll_aboveJZB50",doPF,true);
1705     // 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);
1706     // 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);
1707     // 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);
1708    
1709     // 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);
1710     //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);
1711     //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);
1712     }
1713    
1714     // make_special_obs_pred_mll_plot(datajzb,mcjzb,0);
1715     // make_special_obs_pred_mll_plot(datajzb,mcjzb,50);
1716     // make_special_obs_pred_mll_plot(datajzb,mcjzb,80);
1717 buchmann 1.67 make_special_obs_pred_mll_plot(datajzb,mcjzb,100);
1718 fronga 1.40 // make_special_obs_pred_mll_plot(datajzb,mcjzb,150);
1719     // make_special_obs_pred_mll_plot(datajzb,mcjzb,200);
1720     // make_special_obs_pred_mll_plot(datajzb,mcjzb,250);
1721    
1722 fronga 1.54 // make_JES_plot(cutmass&&cutOSSF&&basiccut,"_ossf");
1723     // make_JES_plot(cutmass&&cutOSOF&&basiccut,"_osof");
1724 fronga 1.40
1725 buchmann 1.65 switch_overunderflow(false);
1726 buchmann 1.1 }
1727    
1728     void make_comp_plot( string var, string xlabel, string filename, float jzbcut, string mcjzb, string datajzb,
1729     int nbins, float xmin, float xmax, bool log,
1730     float ymin=0, float ymax=0, bool leftJustified=false ) {
1731 fronga 1.40 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- WATCH OUT: the argument in the function changed!
1732 buchmann 1.1
1733     TCut weightbackup=cutWeight;//backing up the correct weight (restoring below!)
1734     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__));
1735 fronga 1.40 //if(var=="numVtx") cutWeight=TCut("1.0");
1736 buchmann 1.1 TCut jzbData[]= { TCut(TString(datajzb+">"+any2string(jzbcut))),TCut(TString(datajzb+"<-"+any2string(jzbcut))) };
1737     TCut jzbMC[] = { TCut(TString(mcjzb+">"+any2string(jzbcut))),TCut(TString(mcjzb+"<-"+any2string(jzbcut))) };
1738    
1739     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- below: the next ~20 lines changed!
1740     int nRegions=4;
1741 buchmann 1.50 if(!PlottingSetup::RestrictToMassPeak||!PlottingSetup::UseSidebandsForcJZB) {
1742 buchmann 1.1 nRegions=2;
1743     }
1744    
1745     string sRegions[] = { "SFZP","OFZP","SFSB","OFSB" };
1746     TCut kRegions[] = { cutOSSF&&cutnJets&&cutmass, cutOSOF&&cutnJets&&cutmass,
1747     cutOSSF&&cutnJets&&sidebandcut, cutOSOF&&cutnJets&&sidebandcut };
1748    
1749     //find ymax
1750     TH1F *Refdatahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[0]&&jzbData[0],data,luminosity);
1751     ymax=int((Refdatahisto->GetMaximum()+2*TMath::Sqrt(Refdatahisto->GetMaximum()))*1.2+0.5);
1752     delete Refdatahisto;
1753    
1754     for ( int iregion=0; iregion<nRegions; ++iregion )
1755     for ( int ijzb=0; ijzb<2; ++ijzb ) {
1756     TCanvas *ccomp = new TCanvas("ccomp","Comparison plot",600,400);
1757     ccomp->SetLogy(log);
1758     TH1F *datahisto = allsamples.Draw("datahisto", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbData[ijzb],data,luminosity);
1759 fronga 1.40 TH1F *lm3histo = signalsamples.Draw("lm3histo", var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb],data,luminosity,signalsamples.FindSample("LM3"));
1760 buchmann 1.1 THStack mcstack = allsamples.DrawStack("mcstack",var,nbins,xmin,xmax,xlabel,"events",kRegions[iregion]&&jzbMC[ijzb], mc, luminosity);
1761     datahisto->SetMarkerSize(DataMarkerSize);
1762     if (ymax>ymin) datahisto->SetMaximum(ymax);
1763 fronga 1.40 lm3histo->SetLineStyle(2);
1764 buchmann 1.1 datahisto->Draw("e1");
1765 buchmann 1.73 mcstack.Draw("histo,same");
1766 buchmann 1.1 datahisto->Draw("same,e1");
1767 fronga 1.40 lm3histo->Draw("hist,same");
1768 buchmann 1.1 TLegend *kinleg = allsamples.allbglegend((sRegions[iregion]+(ijzb?"neg":"pos")).c_str());
1769     if ( leftJustified ) {
1770     Float_t w = kinleg->GetX2()-kinleg->GetX1();
1771     kinleg->SetX1(0.2);
1772     kinleg->SetX2(0.2+w);
1773     }
1774 fronga 1.40 kinleg->AddEntry(lm3histo,"LM3","l");
1775 buchmann 1.1 kinleg->Draw();
1776     TText* write_variable = write_text(0.99,0.01,var);
1777     write_variable->SetTextAlign(31);
1778     write_variable->SetTextSize(0.02);
1779     ccomp->RedrawAxis();
1780     CompleteSave(ccomp,"compare/JZBcut_at_"+any2string(jzbcut)+"/"+filename+"/"+filename+sRegions[iregion]+(ijzb?"neg":"pos"));
1781     delete datahisto;
1782     delete ccomp;
1783 fronga 1.40 delete lm3histo;
1784 buchmann 1.1 }
1785     cutWeight=weightbackup;
1786     }
1787    
1788    
1789     void region_comparison_plots(string mcjzb, string datajzb, vector<float> jzb_cuts) {
1790     dout << "Creating comparison plots for signal and control regions" << endl;
1791     // Compare a few quantities in the signal region and all 7 control regions
1792    
1793 buchmann 1.33 // switch_overunderflow(true); // switching overflow/underflow bins on
1794 buchmann 1.1
1795 buchmann 1.65 switch_overunderflow(true);
1796 buchmann 1.1 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- the arguments changed
1797 buchmann 1.16 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
1798 buchmann 1.1 float jzbcut=jzb_cuts[ijzb]; // Comparison plots are done for this JZB cut
1799     float mll_low=50;float mll_high=170;
1800     if(!PlottingSetup::RestrictToMassPeak) {
1801 fronga 1.40 mll_high=300;
1802     mll_low=20;
1803 buchmann 1.1 }
1804 fronga 1.40 make_comp_plot("pfJetGoodPt[0]/pfJetGoodPt[1]","pt_{j}^{1}/pt_{j}^{2}","j1j2ratio",jzbcut,mcjzb,datajzb,100,0,10,true);
1805     make_comp_plot("TMath::Abs(pfJetDphiMet[0])","|#Delta#phi(jet1,MET)|","dphiJ1MET",jzbcut,mcjzb,datajzb,32,0,3.2,false,0,0,true);
1806    
1807     make_comp_plot("mll","m_{ll} [GeV]","mll",jzbcut,mcjzb,datajzb,56,mll_low,mll_high,false,0,16.);
1808 buchmann 1.1 make_comp_plot("met[4]","pfMET [GeV]","pfmet",jzbcut,mcjzb,datajzb,18,0,360,false,0,16.);
1809 fronga 1.40 make_comp_plot("pfJetGoodNum40","#(jets)","njets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
1810     make_comp_plot("pfJetGoodNumBtag","#(b-jets)","nBjets",jzbcut,mcjzb,datajzb,10,0,10, false,0,35.);
1811 buchmann 1.1 make_comp_plot("pt","Z p_{T} [GeV]","Zpt",jzbcut,mcjzb,datajzb,26,0,525,false,0.,21.);
1812 fronga 1.40 make_comp_plot("numVtx","#(prim. vertices)","nvtx",jzbcut,mcjzb,datajzb,40,0.,40.,false,0,16.);
1813 buchmann 1.1 make_comp_plot("TMath::Abs(dphi)","#Delta#phi(leptons)","dphilep",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
1814     make_comp_plot("TMath::Abs(dphi_sumJetVSZ[1])","#Delta#phi(Z,jets)","dphiZjets",jzbcut,mcjzb,datajzb,10,0.,3.1415,false,0,16.,true);
1815 fronga 1.40 make_comp_plot("eta1","#eta_1","eta1",jzbcut,mcjzb,datajzb,10,0.,2.5,false,0,16.);
1816     make_comp_plot("eta2","#eta_2","eta2",jzbcut,mcjzb,datajzb,10,0.,2.5,false,0,16.);
1817 buchmann 1.1 }
1818    
1819     switch_overunderflow(false); // switching overflow/underflow bins off
1820     }
1821    
1822    
1823    
1824     void do_kinematic_PF_plots(string mcjzb, string datajzb)
1825     {
1826     do_kinematic_plots(mcjzb,datajzb,true);
1827     }
1828    
1829     void signal_bg_comparison()
1830     {
1831     TCanvas *can = new TCanvas("can","Signal Background Comparison Canvas");
1832     can->SetLogy(1);
1833    
1834     int sbg_nbins=130;
1835     float sbg_min=-500; //-110;
1836     float sbg_max=800; //jzbHigh;
1837    
1838     float simulatedlumi=luminosity;//in pb please - adjust to your likings
1839    
1840 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"));
1841 buchmann 1.7 TH1F *JZBplotLM4;
1842     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"));
1843     else JZBplotLM4 = allsamples.Draw("JZBplotLM4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,allsamples.FindSample("LM3"));
1844 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"));
1845    
1846     JZBplotTtbar->SetLineColor(allsamples.GetColor("TTJet"));
1847     JZBplotZJETs->SetFillColor(allsamples.GetColor("DY"));
1848     JZBplotZJETs->SetLineColor(kBlack);
1849     JZBplotLM4->SetLineStyle(2);
1850     JZBplotZJETs->SetMaximum(JZBplotZJETs->GetMaximum()*5);
1851     JZBplotZJETs->SetMinimum(1);
1852    
1853     JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
1854     JZBplotTtbar->SetMinimum(0.01);
1855     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
1856     JZBplotTtbar->DrawClone("histo");
1857     JZBplotZJETs->Draw("histo,same");
1858     JZBplotTtbar->SetFillColor(0);
1859     JZBplotTtbar->DrawClone("histo,same");
1860     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
1861     JZBplotLM4->Draw("histo,same");
1862    
1863    
1864     TLegend *signal_bg_comparison_leg2 = make_legend("",0.55,0.75,false);
1865     signal_bg_comparison_leg2->AddEntry(JZBplotZJETs,"Z+Jets","f");
1866     signal_bg_comparison_leg2->AddEntry(JZBplotTtbar,"t#bar{t}","f");
1867 buchmann 1.7 if(PlottingSetup::RestrictToMassPeak) signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM4","f");
1868     else signal_bg_comparison_leg2->AddEntry(JZBplotLM4,"LM3","f");
1869 buchmann 1.1 signal_bg_comparison_leg2->Draw();
1870     DrawMCPrelim(simulatedlumi);
1871     CompleteSave(can,"jzb_bg_vs_signal_distribution");
1872    
1873     // Define illustrative set of SMS points
1874     TCut kSMS1("MassGlu==250&&MassLSP==75");
1875     TCut kSMS2("MassGlu==800&&MassLSP==200");
1876     TCut kSMS3("MassGlu==1050&&MassLSP==850");
1877     TCut kSMS4("MassGlu==1200&&MassLSP==100");
1878    
1879     //If the scan samples haven't been loaded yet, this is a good point to load them (all of them!)
1880     if((scansample.collection).size()<2) define_SMS_sample(false, allsamples, signalsamples, scansample, true); // loading ALL zones for the scans, not only the basic one.
1881    
1882    
1883     TH1F *JZBplotSMS1 = scansample.Draw("JZBplotSMS1",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS1,mc,simulatedlumi,scansample.FindSample("t"));
1884     JZBplotSMS1->Scale(JZBplotLM4->Integral()/JZBplotSMS1->Integral());
1885    
1886     TH1F *JZBplotSMS2 = scansample.Draw("JZBplotSMS2",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS2,mc,simulatedlumi,scansample.FindSample("t"));
1887     JZBplotSMS2->Scale(JZBplotLM4->Integral()/JZBplotSMS2->Integral());
1888    
1889     TH1F *JZBplotSMS3 = scansample.Draw("JZBplotSMS3",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS3,mc,simulatedlumi,scansample.FindSample("t"));
1890     JZBplotSMS3->Scale(JZBplotLM4->Integral()/JZBplotSMS3->Integral());
1891    
1892     TH1F *JZBplotSMS4 = scansample.Draw("JZBplotSMS4",jzbvariablemc,sbg_nbins,sbg_min,sbg_max, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&kSMS4,mc,simulatedlumi,scansample.FindSample("t"));
1893     JZBplotSMS4->Scale(JZBplotLM4->Integral()/JZBplotSMS4->Integral());
1894    
1895     // Draw all plots overlaid
1896     JZBplotTtbar->SetMaximum(JZBplotZJETs->GetMaximum());
1897     JZBplotTtbar->SetMinimum(0.01);
1898     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
1899     JZBplotTtbar->DrawClone("histo");
1900     JZBplotZJETs->Draw("histo,same");
1901     JZBplotTtbar->SetFillColor(0);
1902     JZBplotTtbar->DrawClone("histo,same");
1903     JZBplotTtbar->SetFillColor(allsamples.GetColor("TTJets"));
1904    
1905     JZBplotSMS1->SetLineColor(kRed+1);
1906     JZBplotSMS2->SetLineColor(kBlue+1);
1907     JZBplotSMS3->SetLineColor(kRed+1);
1908     JZBplotSMS4->SetLineColor(kBlue+1);
1909     JZBplotSMS3->SetLineStyle(2);
1910     JZBplotSMS4->SetLineStyle(2);
1911    
1912     JZBplotSMS1->Draw("histo,same");
1913     JZBplotSMS2->Draw("histo,same");
1914     JZBplotSMS3->Draw("histo,same");
1915     JZBplotSMS4->Draw("histo,same");
1916     JZBplotLM4->SetLineColor(kGreen);JZBplotLM4->Draw("histo,same");
1917     TLegend *signal_bg_comparison_leg6 = make_legend("",0.55,0.55,false);
1918     signal_bg_comparison_leg6->AddEntry(JZBplotZJETs,"Z+Jets","f");
1919     signal_bg_comparison_leg6->AddEntry(JZBplotTtbar,"t#bar{t}","f");
1920     signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"","");
1921     signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"SMS parameters","");
1922     signal_bg_comparison_leg6->AddEntry(JZBplotSMS1,"(250,75) [GeV]","f");
1923     signal_bg_comparison_leg6->AddEntry(JZBplotSMS2,"(800,200) [GeV]","f");
1924     signal_bg_comparison_leg6->AddEntry(JZBplotSMS3,"(1050,850) [GeV]","f");
1925     signal_bg_comparison_leg6->AddEntry(JZBplotSMS4,"(1200,100) [GeV]","f");
1926     signal_bg_comparison_leg6->AddEntry(JZBplotLM4,"LM4","f");
1927     signal_bg_comparison_leg6->Draw();
1928     DrawMCPrelim(simulatedlumi);
1929     CompleteSave(can,"jzb_bg_vs_signal_distribution_SMS__summary");
1930    
1931     while((scansample.collection).size() > 1) scansample.RemoveLastSample();
1932    
1933     }
1934    
1935     vector<TF1*> do_cb_fit_to_plot(TH1F *histo, float Sigma, float doingfitacrosstheboard=false) {
1936     TF1 *BpredFunc = new TF1("BpredFunc",InvCrystalBall,0,1000,5);
1937     BpredFunc->SetParameter(0,histo->GetBinContent(1));
1938     if(doingfitacrosstheboard) BpredFunc->SetParameter(0,histo->GetMaximum());
1939     BpredFunc->SetParameter(1,0.);
1940     if(method==1) BpredFunc->SetParameter(2,10*Sigma);//KM
1941     else BpredFunc->SetParameter(2,Sigma);//Gaussian based methods
1942     if(method==-99) BpredFunc->SetParameter(2,2.0*Sigma);//Kostas
1943     BpredFunc->SetParameter(3,1.8);
1944     BpredFunc->SetParameter(4,2.5);
1945     histo->Fit(BpredFunc,"QN0");
1946     BpredFunc->SetLineColor(kBlue);
1947    
1948     TF1 *BpredFuncP = new TF1("BpredFuncP",InvCrystalBallP,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
1949     TF1 *BpredFuncN = new TF1("BpredFuncN",InvCrystalBallN,-1000,histo->GetBinLowEdge(histo->GetNbinsX())+histo->GetBinWidth(histo->GetNbinsX()),5);
1950    
1951     BpredFuncP->SetParameters(BpredFunc->GetParameters());
1952     BpredFuncP->SetLineColor(kBlue);
1953     BpredFuncP->SetLineStyle(2);
1954    
1955     BpredFuncN->SetParameters(BpredFunc->GetParameters());
1956     BpredFuncN->SetLineColor(kBlue);
1957     BpredFuncN->SetLineStyle(2);
1958    
1959     vector<TF1*> functions;
1960     functions.push_back(BpredFuncN);
1961     functions.push_back(BpredFunc);
1962     functions.push_back(BpredFuncP);
1963     return functions;
1964     }
1965    
1966    
1967     TF1* do_logpar_fit_to_plot(TH1F *osof) {
1968     TCanvas *logpar_fit_can = new TCanvas("logpar_fit_can","Fit canvas for LogPar");
1969     TF1 *logparfunc = new TF1("logparfunc",LogParabola,0,300,3);
1970     TF1 *logparfunc2 = new TF1("logparfunc2",LogParabola,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
1971     TF1 *logparfuncN = new TF1("logparfuncN",LogParabolaN,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
1972     TF1 *logparfuncP = new TF1("logparfuncP",LogParabolaP,0,(osof->GetXaxis()->GetBinLowEdge(osof->GetNbinsX())+osof->GetXaxis()->GetBinWidth(osof->GetNbinsX())),3);
1973     osof->SetMinimum(0);
1974     osof->Fit(logparfunc,"QR");
1975     osof->Draw();
1976     logparfunc->SetLineWidth(2);
1977     logparfunc2->SetParameters(logparfunc->GetParameters());
1978     logparfuncN->SetParameters(logparfunc->GetParameters());
1979     logparfuncP->SetParameters(logparfunc->GetParameters());
1980     stringstream fitinfo;
1981     fitinfo << "#Chi^{2} / NDF : " << logparfunc->GetChisquare() << " / " << logparfunc->GetNDF();
1982     TText *writefitinfo = write_text(0.8,0.8,fitinfo.str());
1983     writefitinfo->SetTextSize(0.03);
1984     DrawPrelim();
1985     writefitinfo->Draw();
1986     logparfunc->Draw("same");
1987     logparfunc2->Draw("same");
1988     logparfuncN->SetLineStyle(2);
1989     logparfuncP->SetLineStyle(2);
1990     logparfuncN->Draw("same");
1991     logparfuncP->Draw("same");
1992     CompleteSave(logpar_fit_can,"MakingOfBpredFunction/Bpred_Data_LogPar_Fit_To_TTbarPred");
1993     delete logpar_fit_can;
1994     return logparfunc2;
1995     }
1996    
1997     vector<TF1*> do_extended_fit_to_plot(TH1F *prediction, TH1F *Tprediction, TH1F *ossf, TH1F *osof,int isdata) {
1998     /* there are mainly two background contributions: Z+Jets (a) and ttbar (b). So:
1999     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.
2000     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.
2001     Once we have these two components, we use the combined parameters to get the final function and we're done.
2002     */
2003     //Step 1: take the OSSF prediction - OSOF prediction, and fit a crystal ball function to it
2004     TH1F *step1cb = (TH1F*)ossf->Clone("step1cb");
2005     step1cb->Add(osof,-1);
2006     vector<TF1*> functions = do_cb_fit_to_plot(step1cb,PlottingSetup::JZBPeakWidthData);
2007     TF1 *zjetscrystalball = functions[1];
2008    
2009     //Step 2: use the OSOF distribution and look at the [10,100] GeV JZB range, and fit our log parabola
2010     // TH1F *ttbarprediction=(TH1F*)prediction->Clone("ttbarprediction");
2011     // ttbarprediction->Add(ossf,-1);//without the Z+Jets estimate, this is really just the ttbar estimate!
2012     // 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)
2013     TF1 *ttbarlogpar = do_logpar_fit_to_plot(Tprediction);
2014     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2015 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) ttbarlogpar->SetParameter(0,1.0/3*ttbarlogpar->GetParameter(0));//correcting for the fact that we didn't multiply with (1.0/3);
2016 buchmann 1.1
2017    
2018     TF1 *ttbarlogparP = new TF1("ttbarlogparP",LogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2019     TF1 *ttbarlogparN = new TF1("ttbarlogparN",LogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2020    
2021     //and now fuse the two!
2022     TF1 *kmlp = new TF1("kmlp", CrystalBallPlusLogParabola, 0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2023     TF1 *kmlpP= new TF1("kmlpP",CrystalBallPlusLogParabolaP,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2024     TF1 *kmlpN= new TF1("kmlpN",CrystalBallPlusLogParabolaN,0,(prediction->GetXaxis()->GetBinLowEdge(prediction->GetNbinsX())+prediction->GetXaxis()->GetBinWidth(prediction->GetNbinsX())),8);
2025     double kmlp_pars[10];
2026     for(int i=0;i<5;i++) kmlp_pars[i]=zjetscrystalball->GetParameter(i);
2027     for(int i=0;i<3;i++) kmlp_pars[5+i]=ttbarlogpar->GetParameter(i);
2028     ttbarlogparP->SetParameters(ttbarlogpar->GetParameters());
2029     ttbarlogparN->SetParameters(ttbarlogpar->GetParameters());
2030     kmlp->SetParameters(kmlp_pars);
2031     prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
2032     /*
2033     if you want to start from scratch (without the partial fitting and only fitting the whole thing, some good start values could be :
2034     */
2035     kmlp_pars[0]=kmlp->GetParameter(0);
2036     kmlp_pars[1]=3.6198;
2037     kmlp_pars[2]=16.4664;
2038     kmlp_pars[3]=1.92253;
2039     kmlp_pars[4]=3.56099;
2040     kmlp_pars[5]=5.83;
2041     kmlp_pars[6]=0.000757479;
2042     kmlp_pars[7]=95.6157;
2043     kmlp_pars[8]=0;
2044     kmlp_pars[9]=0;
2045     kmlp->SetParameters(kmlp_pars);
2046     /**/
2047     prediction->Fit(kmlp,"Q");//fitting the final result (done this in the past but kicked it)
2048    
2049     kmlpP->SetParameters(kmlp->GetParameters());
2050     kmlpN->SetParameters(kmlp->GetParameters());
2051    
2052     // now that we're done, let's save all of this so we can have a look at it afterwards.
2053     TCanvas *can = new TCanvas("can","Prediction Fit Canvas");
2054     can->SetLogy(1);
2055     prediction->SetMarkerColor(kRed);
2056     prediction->Draw();
2057    
2058     kmlp->SetLineColor(TColor::GetColor("#04B404"));
2059     kmlpP->SetLineColor(TColor::GetColor("#04B404"));
2060     kmlpN->SetLineColor(TColor::GetColor("#04B404"));
2061     kmlp->Draw("same");
2062     kmlpN->SetLineStyle(2);
2063     kmlpP->SetLineStyle(2);
2064     kmlpN->Draw("same");
2065     kmlpP->Draw("same");
2066    
2067     ttbarlogpar->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
2068     ttbarlogpar->Draw("same");
2069     ttbarlogparP->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
2070     ttbarlogparN->SetLineColor(TColor::GetColor("#CC2EFA"));//purple
2071     ttbarlogparP->SetLineStyle(2);
2072     ttbarlogparN->SetLineStyle(2);
2073     ttbarlogparP->Draw("same");
2074     ttbarlogparN->Draw("same");
2075    
2076     functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
2077    
2078     TLegend *analyticalBpredLEG = make_legend("",0.5,0.55);
2079     analyticalBpredLEG->AddEntry(prediction,"predicted","p");
2080     analyticalBpredLEG->AddEntry(functions[1],"Crystal Ball fit","l");
2081     analyticalBpredLEG->AddEntry(functions[0],"1#sigma Crystal Ball fit","l");
2082     analyticalBpredLEG->AddEntry(ttbarlogparN,"TTbar fit","l");
2083     analyticalBpredLEG->AddEntry(ttbarlogpar,"1#sigma TTbar fit","l");
2084     analyticalBpredLEG->AddEntry(kmlp,"Combined function","l");
2085     analyticalBpredLEG->AddEntry(kmlpN,"1#sigma combined function","l");
2086     analyticalBpredLEG->Draw("same");
2087    
2088     if(isdata==0) CompleteSave(can,"MakingOfBpredFunction/Bpred_MC_Analytical_Function_Composition");
2089     if(isdata==1) CompleteSave(can,"MakingOfBpredFunction/Bpred_data_Analytical_Function_Composition");
2090     if(isdata==2) CompleteSave(can,"MakingOfBpredFunction/Bpred_MCBnS_Analytical_Function_Composition");
2091     delete can;
2092    
2093     //and finally: prep return functions
2094     vector<TF1*> return_functions;
2095     return_functions.push_back(kmlpN);
2096     return_functions.push_back(kmlp);
2097     return_functions.push_back(kmlpP);
2098    
2099     return_functions.push_back(ttbarlogparN);
2100     return_functions.push_back(ttbarlogpar);
2101     return_functions.push_back(ttbarlogparP);
2102    
2103     return_functions.push_back(functions[0]);
2104     return_functions.push_back(functions[1]);
2105     return_functions.push_back(functions[2]);
2106    
2107     return return_functions;
2108     }
2109    
2110 buchmann 1.28 void do_prediction_plot(string jzb, TCanvas *globalcanvas, float high, int use_data, bool overlay_signal = false,string subdir="" )
2111 buchmann 1.1 {
2112 buchmann 1.65
2113 buchmann 1.1 bool is_data=false;
2114     bool use_signal=false;
2115     if(use_data==1) is_data=true;
2116     if(use_data==2) use_signal=true;
2117 buchmann 1.65 int nbins=int(high/10);//100;
2118     if(is_data) nbins=int(high/10);
2119 buchmann 1.1 float low=0;
2120 buchmann 1.65 float hi=high;
2121    
2122     stringstream cutpositiveS;
2123     cutpositiveS << "(" << jzb << ">0)";
2124     TCut cutpositive(cutpositiveS.str().c_str());
2125     stringstream cutnegativeS;
2126     cutnegativeS << "(" << jzb << "<0)";
2127     TCut cutnegative(cutnegativeS.str().c_str());
2128    
2129 buchmann 1.10
2130 buchmann 1.1 TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
2131 buchmann 1.65 TH1F *RcorrJZBeemm = allsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2132     TH1F *LcorrJZBeemm = allsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2133     TH1F *RcorrJZBem = allsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2134     TH1F *LcorrJZBem = allsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2135 buchmann 1.10
2136 buchmann 1.1 blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
2137     blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
2138     blankback->GetXaxis()->CenterTitle();
2139     blankback->GetYaxis()->CenterTitle();
2140    
2141     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2142     TH1F *RcorrJZBSBem;
2143     TH1F *LcorrJZBSBem;
2144     TH1F *RcorrJZBSBeemm;
2145     TH1F *LcorrJZBSBeemm;
2146    
2147     TH1F *RcorrJZBeemmNoS;
2148    
2149 buchmann 1.65 //these are for the ratio
2150     TH1F *JRcorrJZBeemm = allsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2151     TH1F *JLcorrJZBeemm = allsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2152     TH1F *JRcorrJZBem = allsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2153     TH1F *JLcorrJZBem = allsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2154 buchmann 1.1
2155     TH1F *JRcorrJZBSBem;
2156     TH1F *JLcorrJZBSBem;
2157     TH1F *JRcorrJZBSBeemm;
2158     TH1F *JLcorrJZBSBeemm;
2159    
2160 buchmann 1.65 if(use_data==2 || overlay_signal) RcorrJZBeemmNoS = allsamples.Draw("RcorrJZBeemmNoS",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,false);
2161 buchmann 1.1
2162    
2163 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2164 buchmann 1.65 RcorrJZBSBem = allsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2165     LcorrJZBSBem = allsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2166     RcorrJZBSBeemm = allsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2167     LcorrJZBSBeemm = allsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2168 buchmann 1.10
2169 buchmann 1.1 //these are for the ratio
2170 buchmann 1.65 JRcorrJZBSBem = allsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2171     JLcorrJZBSBem = allsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
2172     JRcorrJZBSBeemm = allsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutpositive&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2173     JLcorrJZBSBeemm = allsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutnegative&&sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
2174 buchmann 1.1 }
2175    
2176     TH1F *lm4RcorrJZBeemm;
2177 buchmann 1.65 if(overlay_signal || use_data == 2 || use_data == 1) lm4RcorrJZBeemm = allsamples.Draw("lm4RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutpositive&&cutmass&&cutOSSF&&cutnJets,is_data, luminosity,allsamples.FindSample("LM"));
2178 buchmann 1.1
2179     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
2180    
2181     TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
2182     TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
2183    
2184     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2185     TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
2186 buchmann 1.23
2187 buchmann 1.26 TH1F *BpredSys = new TH1F("Bpredsys","Bpredsys",PlottingSetup::global_ratio_binning.size()-1,&PlottingSetup::global_ratio_binning[0]);
2188 buchmann 1.23 ClearHisto(BpredSys);
2189    
2190 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2191 buchmann 1.1 Bpred->Add(RcorrJZBem,1.0/3.);
2192     Bpred->Add(LcorrJZBem,-1.0/3.);
2193     Bpred->Add(RcorrJZBSBem,1.0/3.);
2194     Bpred->Add(LcorrJZBSBem,-1.0/3.);
2195     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2196     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2197    
2198     TTbarpred->Scale(1.0/3);
2199     Zjetspred->Add(LcorrJZBem,-1.0/3.);
2200     Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
2201     TTbarpred->Add(RcorrJZBSBem,1.0/3.);
2202     Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
2203     TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
2204    
2205     //these are for the ratio
2206     JBpred->Add(JRcorrJZBem,1.0/3.);
2207     JBpred->Add(JLcorrJZBem,-1.0/3.);
2208     JBpred->Add(JRcorrJZBSBem,1.0/3.);
2209     JBpred->Add(JLcorrJZBSBem,-1.0/3.);
2210     JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
2211     JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
2212 buchmann 1.23
2213     //Systematics:
2214 buchmann 1.26 AddSquared(BpredSys,JLcorrJZBeemm,zjetsestimateuncertONPEAK*zjetsestimateuncertONPEAK);
2215     AddSquared(BpredSys,JRcorrJZBem,emuncertONPEAK*emuncertONPEAK*(1.0/9));
2216     AddSquared(BpredSys,JLcorrJZBem,emuncertONPEAK*emuncertONPEAK*(1.0/9));
2217     AddSquared(BpredSys,JRcorrJZBSBem,emsidebanduncertONPEAK*emsidebanduncertONPEAK*(1.0/9));
2218     AddSquared(BpredSys,JLcorrJZBSBem,emsidebanduncertONPEAK*emsidebanduncertONPEAK*(1.0/9));
2219     AddSquared(BpredSys,JRcorrJZBSBeemm,eemmsidebanduncertONPEAK*eemmsidebanduncertONPEAK*(1.0/9));
2220     AddSquared(BpredSys,JLcorrJZBSBeemm,eemmsidebanduncertONPEAK*eemmsidebanduncertONPEAK*(1.0/9));
2221 buchmann 1.1 } else {
2222     Bpred->Add(RcorrJZBem,1.0);
2223     Bpred->Add(LcorrJZBem,-1.0);
2224    
2225     Zjetspred->Add(LcorrJZBem,-1.0);
2226    
2227     //these are for the ratio
2228     JBpred->Add(JRcorrJZBem,1.0);
2229     JBpred->Add(JLcorrJZBem,-1.0);
2230 buchmann 1.23
2231     //Systematics
2232 buchmann 1.26 AddSquared(BpredSys,JLcorrJZBeemm,zjetsestimateuncertOFFPEAK*zjetsestimateuncertOFFPEAK);
2233     AddSquared(BpredSys,JRcorrJZBem,emuncertOFFPEAK*emuncertOFFPEAK);
2234     AddSquared(BpredSys,JLcorrJZBem,emuncertOFFPEAK*emuncertOFFPEAK);
2235 buchmann 1.23
2236 buchmann 1.1 }
2237    
2238 buchmann 1.23 SQRT(BpredSys);
2239 buchmann 1.26 BpredSys->Divide(JBpred);
2240 buchmann 1.23
2241 buchmann 1.1 flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
2242     TH1F *Tpred = (TH1F*)RcorrJZBem->Clone("Bpred");
2243     Tpred->Add(LcorrJZBem,-1.0);
2244 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2245 buchmann 1.1 Tpred->Add(RcorrJZBSBem,1.0);
2246     Tpred->Add(LcorrJZBSBem,-1.0);
2247     Tpred->Add(RcorrJZBSBeemm,1.0);
2248     Tpred->Add(LcorrJZBSBeemm,-1.0);
2249     }
2250    
2251     globalcanvas->cd();
2252     globalcanvas->SetLogy(1);
2253    
2254     RcorrJZBeemm->SetMarkerStyle(20);
2255     RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
2256     RcorrJZBeemm->SetMinimum(0.1);
2257    
2258     Bpred->SetLineColor(kRed);
2259     Bpred->SetStats(0);
2260    
2261     int versok=false;
2262     if(gROOT->GetVersionInt()>=53000) versok=true;
2263    
2264    
2265     if ( overlay_signal || use_data==2 ) lm4RcorrJZBeemm->SetLineColor(TColor::GetColor("#088A08"));
2266     RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
2267    
2268     TLegend *legBpred = make_legend("",0.6,0.55);
2269     TLegend *legBpred2 = make_legend("",0.6,0.55);
2270    
2271    
2272     vector<TF1*> analytical_function;
2273     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
2274     kinpad->cd();
2275     kinpad->SetLogy(1);
2276    
2277     string Bpredsaveas="Bpred_Data";
2278     blankback->SetMaximum(5*RcorrJZBeemm->GetMaximum());
2279     blankback->SetMinimum(0.1);
2280     if(use_data!=1) blankback->SetMinimum(0.1);
2281     blankback->Draw();
2282     if(use_data==1)
2283     {
2284 buchmann 1.14 //Bpred->SetLineWidth(3); //paper style.overruled.
2285     //lm4RcorrJZBeemm->SetLineWidth(3); //paper style.overruled.
2286 buchmann 1.1 analytical_function = do_extended_fit_to_plot(Bpred,Tpred,LcorrJZBeemm,LcorrJZBem,is_data);
2287     kinpad->cd();//necessary because the extended fit function creates its own canvas
2288     RcorrJZBeemm->Draw("e1x0,same");
2289    
2290     Bpred->Draw("hist,same");
2291 buchmann 1.14 //analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
2292 buchmann 1.1 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2293 buchmann 1.66 //lm4RcorrJZBeemm->Draw("hist,same");
2294 buchmann 1.1 legBpred->AddEntry(RcorrJZBeemm,"observed","p");
2295     legBpred->AddEntry(Bpred,"predicted","l");
2296 buchmann 1.24 // legBpred->AddEntry(analytical_function[1],"predicted fit","l");
2297     // legBpred->AddEntry(analytical_function[2],"stat. uncert.","l");
2298 buchmann 1.66 // legBpred->AddEntry(lm4RcorrJZBeemm,(allsamples.collection[allsamples.FindSample("LM")[0]].samplename).c_str(),"l");
2299 buchmann 1.1 legBpred->Draw();
2300     DrawPrelim();
2301    
2302     //this plot shows what the prediction is composed of
2303 buchmann 1.10 TPad *predcomppad = new TPad("predcomppad","predcomppad",0,0,1,1);
2304     float CurrentBpredLineWidth=Bpred->GetLineWidth();
2305     Bpred->SetLineWidth(2);
2306     predcomppad->cd();
2307     predcomppad->SetLogy(1);
2308     TH1F *jzbnegative = (TH1F*)LcorrJZBeemm->Clone("jzbnegative");
2309     TH1F *sidebandsemu = (TH1F*)Bpred->Clone("sidebandsemu");
2310     sidebandsemu->Add(jzbnegative,-1);
2311    
2312     jzbnegative->SetFillColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
2313     jzbnegative->SetLineColor(allsamples.GetColor((allsamples.FindSample("DY"))[0]));
2314     sidebandsemu->SetLineColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
2315     sidebandsemu->SetFillColor(allsamples.GetColor((allsamples.FindSample("TTJets"))[0]));
2316    
2317 buchmann 1.1 THStack predcomposition("predcomposition","prediction composition");
2318 buchmann 1.10 predcomposition.Add(sidebandsemu);
2319     predcomposition.Add(jzbnegative);
2320 buchmann 1.1 blankback->Draw();
2321     RcorrJZBeemm->Draw("e1x0,same");
2322     predcomposition.Draw("histo,same");//
2323     Bpred->Draw("hist,same");
2324 buchmann 1.10 // analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
2325 buchmann 1.1 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2326 buchmann 1.14 // lm4RcorrJZBeemm->SetLineColor(kOrange+1);
2327 buchmann 1.10 lm4RcorrJZBeemm->SetLineWidth(2);
2328 buchmann 1.14 //lm4RcorrJZBeemm->SetLineWidth(2); // paper style. overruled.
2329 buchmann 1.66 // lm4RcorrJZBeemm->Draw("histo,same");
2330 buchmann 1.1 DrawPrelim();
2331 buchmann 1.10 TLegend *speciallegBpred = make_legend("",0.45,0.55);
2332 buchmann 1.14 //TLegend *speciallegBpred = make_legend("",0.35,0.55); // paper style. overruled.
2333 buchmann 1.10 speciallegBpred->AddEntry(RcorrJZBeemm,"Data","pl");
2334     speciallegBpred->AddEntry(Bpred,"Total background","l");
2335     speciallegBpred->AddEntry(jzbnegative,"JZB<0 (data)","f");
2336 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) speciallegBpred->AddEntry(sidebandsemu,"Sidebands/e#mu (data)","f");
2337 buchmann 1.30 else speciallegBpred->AddEntry(sidebandsemu,"e#mu (data)","f");
2338 buchmann 1.10 // speciallegBpred->AddEntry(lm4RcorrJZBeemmC,"LM4","l");
2339 buchmann 1.66 // speciallegBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
2340 buchmann 1.10 speciallegBpred->Draw();
2341 buchmann 1.79 Save_With_Ratio(JRcorrJZBeemm,JBpred,predcomppad,subdir+"Bpred_Data_____PredictionComposition",true,true,"data/pred",BpredSys);
2342     delete predcomppad;
2343 buchmann 1.10
2344     TCanvas *specialcanv = new TCanvas("specialcanv","specialcanv");
2345 buchmann 1.30 specialcanv->SetLogy(1);
2346     // THStack kostack = allsamples.DrawStack("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,!is_data, luminosity,use_signal);
2347 buchmann 1.1 blankback->Draw();
2348 buchmann 1.30 // kostack.Draw("same");
2349 buchmann 1.73 predcomposition.Draw("hist");
2350 buchmann 1.1 Bpred->Draw("hist,same");
2351 buchmann 1.30 //analytical_function[0]->Draw("same"); analytical_function[1]->Draw("same");analytical_function[2]->Draw("same");
2352 buchmann 1.1 RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2353     legBpred->Draw();
2354     DrawPrelim();
2355 buchmann 1.12 CompleteSave(specialcanv,subdir+"Bpred_Data_____PredictionCompositioninMC");
2356 buchmann 1.10 Bpred->SetLineWidth((int)CurrentBpredLineWidth);
2357 buchmann 1.1
2358 buchmann 1.34
2359     //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;
2360    
2361 buchmann 1.10 delete speciallegBpred;
2362 buchmann 1.1 delete Zjetspred;
2363     delete TTbarpred;
2364    
2365     kinpad->cd();
2366     }
2367     if(use_data==0) {
2368     RcorrJZBeemm->Draw("e1x0,same");
2369 buchmann 1.14 //Bpred->SetLineWidth(3); // paper style. overruled.
2370 buchmann 1.1 Bpred->Draw("hist,same");
2371     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2372 buchmann 1.10 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
2373 buchmann 1.18 legBpred->AddEntry(Bpred,"MC predicted","l");
2374 buchmann 1.1 if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
2375     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
2376 buchmann 1.66 // if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
2377 buchmann 1.1 legBpred->Draw();
2378     DrawMCPrelim();
2379     Bpredsaveas="Bpred_MC";
2380     // CompleteSave(globalcanvas,"Bpred_MC"); // done below in save_with_ratio
2381     }
2382     if(use_data==2) {
2383     RcorrJZBeemm->Draw("e1x0,same");
2384 buchmann 1.14 //Bpred->SetLineWidth(3); // paper style. overruled.
2385 buchmann 1.1 Bpred->Draw("hist,same");
2386     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2387 buchmann 1.10 legBpred->AddEntry(RcorrJZBeemm,"MC true","p");
2388 buchmann 1.1 legBpred->AddEntry(Bpred,"MC predicted","l");
2389 buchmann 1.10 legBpred2->AddEntry(RcorrJZBeemm,"MC true","p");
2390 buchmann 1.1 legBpred2->AddEntry(Bpred,"MC predicted","l");
2391     {
2392     if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
2393     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18 --> now only allowed for root >=v5.30
2394     legBpred->Draw();
2395     DrawMCPrelim();
2396     Bpredsaveas="Bpred_MCwithS";
2397     // CompleteSave(globalcanvas,"Bpred_MCwithS"); // done below in save_with_ratio
2398     }
2399     {
2400 buchmann 1.14 //lm4RcorrJZBeemm->SetLineWidth(3); //paper style. overruled.
2401     //RcorrJZBeemmNoS->SetLineWidth(3); //paper style. overruled.
2402     //lm4RcorrJZBeemm->SetLineStyle(2); //paper style. overruled.
2403     //RcorrJZBeemmNoS->SetLineStyle(3); //paper style. overruled.
2404     //lm4RcorrJZBeemm->SetLineColor(kOrange+1); //paper style. overruled.
2405    
2406 buchmann 1.1 RcorrJZBeemmNoS->SetLineStyle(2);
2407     legBpred2->AddEntry(RcorrJZBeemmNoS,"MC B","l");
2408 buchmann 1.66 // legBpred2->AddEntry(lm4RcorrJZBeemm,"MC S","l");
2409 buchmann 1.1 legBpred2->Draw();
2410     RcorrJZBeemmNoS->SetLineColor(TColor::GetColor("#61210B"));
2411     RcorrJZBeemmNoS->Draw("histo,same");
2412     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2413     lm4RcorrJZBeemm->Draw("histo,same");
2414     DrawMCPrelim();
2415     Bpredsaveas="Bpred_MCwithS__plus";
2416     // CompleteSave(globalcanvas,"Bpred_MCwithS__plus"); // done below in save_with_ratio
2417     }
2418     }
2419    
2420    
2421     //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
2422     string ytitle("ratio");
2423     if ( use_data==1 ) ytitle = "data/pred";
2424 buchmann 1.8 //save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,Bpredsaveas,true,use_data!=1,ytitle);
2425 buchmann 1.79 Save_With_Ratio(JRcorrJZBeemm,JBpred,kinpad,subdir+Bpredsaveas,true,false,ytitle,BpredSys);//not extending the y range anymore up to 4
2426    
2427     delete kinpad;
2428 buchmann 1.1
2429 buchmann 1.65
2430 buchmann 1.1
2431     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2432 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!)
2433 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2434 buchmann 1.11 TH1F *Bpredem = (TH1F*)LcorrJZBeemm->Clone("Bpredem");
2435     Bpredem->Add(RcorrJZBem);
2436     Bpredem->Add(LcorrJZBem,-1);
2437     TH1F *BpredSBem = (TH1F*)LcorrJZBeemm->Clone("BpredSBem");
2438     BpredSBem->Add(RcorrJZBSBem);
2439     Bpred->Add(LcorrJZBSBem,-1);
2440     TH1F *BpredSBeemm = (TH1F*)LcorrJZBeemm->Clone("BpredSBeemm");
2441     BpredSBeemm->Add(RcorrJZBSBeemm);
2442     BpredSBeemm->Add(LcorrJZBSBeemm,-1.0);
2443     globalcanvas->cd();
2444     globalcanvas->SetLogy(1);
2445    
2446     RcorrJZBeemm->SetMarkerStyle(20);
2447     RcorrJZBeemm->GetXaxis()->SetRangeUser(0,high);
2448     blankback->Draw();
2449     RcorrJZBeemm->Draw("e1x0,same");
2450     RcorrJZBeemm->SetMarkerSize(DataMarkerSize);
2451    
2452     Bpredem->SetLineColor(kRed+1);
2453     Bpredem->SetStats(0);
2454     Bpredem->Draw("hist,same");
2455    
2456     BpredSBem->SetLineColor(kGreen+2);//TColor::GetColor("#0B6138"));
2457     BpredSBem->SetLineStyle(2);
2458     BpredSBem->Draw("hist,same");
2459    
2460     BpredSBeemm->SetLineColor(kBlue+1);
2461     BpredSBeemm->SetLineStyle(3);
2462     BpredSBeemm->Draw("hist,same");
2463     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
2464    
2465     TLegend *legBpredc = make_legend("",0.6,0.55);
2466     if(use_data==1)
2467     {
2468     legBpredc->AddEntry(RcorrJZBeemm,"observed","p");
2469     legBpredc->AddEntry(Bpredem,"OFZP","l");
2470     legBpredc->AddEntry(BpredSBem,"OFSB","l");
2471     legBpredc->AddEntry(BpredSBeemm,"SFSB","l");
2472     legBpredc->Draw();
2473 buchmann 1.12 CompleteSave(globalcanvas,subdir+"Bpred_Data_comparison");
2474 buchmann 1.11 }
2475     if(use_data==0) {
2476     legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
2477     legBpredc->AddEntry(Bpredem,"MC OFZP","l");
2478     legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
2479     legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
2480     legBpredc->Draw();
2481 buchmann 1.12 CompleteSave(globalcanvas,subdir+"Bpred_MC_comparison");
2482 buchmann 1.11 }
2483     if(use_data==2) {
2484     legBpredc->AddEntry(RcorrJZBeemm,"MC true","p");
2485     legBpredc->AddEntry(Bpredem,"MC OFZP","l");
2486     legBpredc->AddEntry(BpredSBem,"MC OFSB","l");
2487     legBpredc->AddEntry(BpredSBeemm,"MC SFSB","l");
2488 buchmann 1.66 // if ( overlay_signal ) legBpred->AddEntry(lm4RcorrJZBeemm,"LM4","l");
2489 buchmann 1.11 legBpredc->Draw();
2490 buchmann 1.12 CompleteSave(globalcanvas,subdir+"Bpred_MCwithS_comparison");
2491 buchmann 1.11 }
2492     }
2493 buchmann 1.1
2494 buchmann 1.31 TFile *f = new TFile("tester.root","RECREATE");
2495     RcorrJZBeemm->Write();
2496     Bpred->Write();
2497     f->Close();
2498    
2499 buchmann 1.1 delete RcorrJZBeemm;
2500     delete LcorrJZBeemm;
2501     delete RcorrJZBem;
2502     delete LcorrJZBem;
2503    
2504     delete JRcorrJZBeemm;
2505     delete JLcorrJZBeemm;
2506     delete JRcorrJZBem;
2507     delete JLcorrJZBem;
2508    
2509     delete blankback;
2510    
2511 buchmann 1.30 delete BpredSys;
2512 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
2513 buchmann 1.1 delete RcorrJZBSBem;
2514     delete LcorrJZBSBem;
2515     delete RcorrJZBSBeemm;
2516     delete LcorrJZBSBeemm;
2517    
2518     delete JRcorrJZBSBem;
2519     delete JLcorrJZBSBem;
2520     delete JRcorrJZBSBeemm;
2521     delete JLcorrJZBSBeemm;
2522     }
2523     if(overlay_signal || use_data==2) delete lm4RcorrJZBeemm;
2524     }
2525    
2526     void do_prediction_plots(string mcjzb, string datajzb, float DataSigma, float MCSigma, bool overlay_signal ) {
2527 buchmann 1.65 switch_overunderflow(true);
2528 buchmann 1.1 TCanvas *globalcanvas = new TCanvas("globalcanvas","Prediction Canvas");
2529 buchmann 1.28 do_prediction_plot(datajzb,globalcanvas,jzbHigh ,data,overlay_signal);
2530 buchmann 1.14 if ( !PlottingSetup::Approved ) {
2531 buchmann 1.28 do_prediction_plot(mcjzb,globalcanvas,jzbHigh ,mc,overlay_signal);
2532     do_prediction_plot(mcjzb,globalcanvas,jzbHigh ,mcwithsignal,overlay_signal);
2533 buchmann 1.14 } else {
2534     write_info(__FUNCTION__,"You set approved to true, therefore not producing prediction/observation plots for MC with and without signal.");
2535 buchmann 1.15 }
2536 buchmann 1.65 delete globalcanvas;
2537     switch_overunderflow(false);
2538 buchmann 1.1 }
2539    
2540     string give_jzb_expression(float peak, int type) {
2541     stringstream val;
2542     if(type==data) {
2543     if(peak<0) val << jzbvariabledata << "+" << TMath::Abs(peak);
2544     if(peak>0) val << jzbvariabledata << "-" << TMath::Abs(peak);
2545     if(peak==0) val << jzbvariabledata;
2546     }
2547     if(type==mc) {
2548     if(peak<0) val << jzbvariablemc << "+" << TMath::Abs(peak);
2549     if(peak>0) val << jzbvariablemc << "-" << TMath::Abs(peak);
2550     if(peak==0) val << jzbvariablemc;
2551     }
2552     return val.str();
2553     }
2554    
2555    
2556     void lepton_comparison_plots() {
2557     Float_t ymin = 1.e-5, ymax = 0.25;
2558     TCanvas *can = new TCanvas("can","Lepton Comparison Canvas");
2559     can->SetLogy(1);
2560 buchmann 1.3 TH1F *eemc = allsamples.Draw("eemc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",mc, luminosity,allsamples.FindSample("/DY"));
2561     TH1F *mmmc = allsamples.Draw("mmmc","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",mc, luminosity,allsamples.FindSample("/DY"));
2562 buchmann 1.1 eemc->SetLineColor(kBlue);
2563     mmmc->SetLineColor(kRed);
2564     eemc->SetMinimum(0.1);
2565     eemc->SetMaximum(10*eemc->GetMaximum());
2566     eemc->Draw("histo");
2567     mmmc->Draw("histo,same");
2568     TLegend *leg = make_legend();
2569     leg->AddEntry(eemc,"ZJets->ee (MC)","l");
2570     leg->AddEntry(mmmc,"ZJets->#mu#mu (MC)","l");
2571     leg->Draw("same");
2572     CompleteSave(can, "lepton_comparison/mll_effratio_mc");
2573    
2574     TH1F *eed = allsamples.Draw("eed","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
2575     TH1F *mmd = allsamples.Draw("mmd","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
2576     eed->SetLineColor(kBlue);
2577     mmd->SetLineColor(kRed);
2578     eed->SetMinimum(0.1);
2579     eed->SetMaximum(10*eed->GetMaximum());
2580     eed->Draw("histo");
2581     mmd->Draw("histo,same");
2582     TLegend *leg2 = make_legend();
2583     leg2->AddEntry(eed,"ZJets->ee (data)","l");
2584     leg2->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
2585     leg2->Draw();
2586     CompleteSave(can, "lepton_comparison/mll_effratio_data");
2587    
2588     TH1F *jeed = allsamples.Draw("jeed",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==0)",data, luminosity);
2589     TH1F *jmmd = allsamples.Draw("jmmd",jzbvariabledata, int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets&&"(id1==1)",data, luminosity);
2590     TH1F *jeemmd = allsamples.Draw("jeemmd",jzbvariabledata,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
2591     dout << "ee : " << jeed->GetMean() << "+/-" << jeed->GetMeanError() << endl;
2592     dout << "ee : " << jmmd->GetMean() << "+/-" << jmmd->GetMeanError() << endl;
2593     dout << "eemd : " << jeemmd->GetMean() << "+/-" << jeemmd->GetMeanError() << endl;
2594     jeemmd->SetLineColor(kBlack);
2595     jeemmd->SetMarkerStyle(25);
2596     jeed->SetLineColor(kBlue);
2597     jmmd->SetLineColor(kRed);
2598     jeed->SetMinimum(0.1);
2599     jeed->SetMaximum(10*eed->GetMaximum());
2600     TH1* njeemmd = jeemmd->DrawNormalized();
2601     njeemmd->SetMinimum(ymin);
2602     njeemmd->SetMaximum(ymax);
2603    
2604     jeed->DrawNormalized("histo,same");
2605     jmmd->DrawNormalized("histo,same");
2606     jeemmd->DrawNormalized("same");
2607     TLegend *jleg2 = make_legend(" ");
2608     jleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
2609     jleg2->AddEntry(jeed,"ee","l");
2610     jleg2->AddEntry(jmmd,"#mu#mu","l");
2611     jleg2->Draw();
2612     CompleteSave(can,"lepton_comparison/jzb_effratio_data");
2613    
2614     TPad *eemmpad = new TPad("eemmpad","eemmpad",0,0,1,1);
2615     eemmpad->cd();
2616     eemmpad->SetLogy(1);
2617     jeed->Draw("histo");
2618     jmmd->Draw("histo,same");
2619     TLegend *eemmlegend = make_legend(" ");
2620     eemmlegend->AddEntry(jeed,"ee","l");
2621     eemmlegend->AddEntry(jmmd,"#mu#mu","l");
2622     eemmlegend->Draw();
2623     DrawPrelim();
2624 buchmann 1.79 Save_With_Ratio(jeed,jmmd,eemmpad->cd(),"lepton_comparison/jzb_Comparing_ee_mm_data");
2625 buchmann 1.1
2626 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"));
2627     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"));
2628     TH1F *zjeemmd = allsamples.Draw("zjeemmd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets, mc, luminosity,allsamples.FindSample("/DY"));
2629 buchmann 1.1 dout << "Z+Jets ee : " << zjeed->GetMean() << "+/-" << zjeed->GetMeanError() << endl;
2630     dout << "Z+Jets ee : " << zjmmd->GetMean() << "+/-" << zjmmd->GetMeanError() << endl;
2631     dout << "Z+Jets eemd : " << zjeemmd->GetMean() << "+/-" << zjeemmd->GetMeanError() << endl;
2632     zjeemmd->SetLineColor(kBlack);
2633     zjeemmd->SetMarkerStyle(25);
2634     zjeed->SetLineColor(kBlue);
2635     zjmmd->SetLineColor(kRed);
2636     zjeed->SetMinimum(0.1);
2637     zjeed->SetMaximum(10*eed->GetMaximum());
2638    
2639     TH1* nzjeemmd = zjeemmd->DrawNormalized();
2640     nzjeemmd->SetMinimum(ymin);
2641     nzjeemmd->SetMaximum(ymax);
2642     zjeed->DrawNormalized("histo,same");
2643     zjmmd->DrawNormalized("histo,same");
2644     zjeemmd->DrawNormalized("same");
2645     TLegend *zjleg2 = make_legend("Z+jets MC");
2646     zjleg2->AddEntry(jeemmd,"ee and #mu#mu","p");
2647     zjleg2->AddEntry(jeed,"ee","l");
2648     zjleg2->AddEntry(jmmd,"#mu#mu","l");
2649     zjleg2->Draw();
2650     CompleteSave(can,"lepton_comparison/jzb_effratio_ZJets");
2651    
2652     TH1F *ld = allsamples.Draw("ld","mll",50,50,150, "mll [GeV]", "events", cutOSSF&&cutnJets,data, luminosity);
2653     ld->DrawNormalized("e1");
2654     eed->DrawNormalized("histo,same");
2655     mmd->DrawNormalized("histo,same");
2656     TLegend *leg3 = make_legend();
2657     leg3->AddEntry(ld,"ZJets->ll (data)","p");
2658     leg3->AddEntry(eed,"ZJets->ee (data)","l");
2659     leg3->AddEntry(mmd,"ZJets->#mu#mu (data)","l");
2660     leg3->Draw();
2661     CompleteSave(can,"lepton_comparison/mll_effratio_data__all_compared");
2662     /*
2663     TH1F *jzbld = allsamples.Draw("jzbld",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
2664     TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariable,75,-150,150, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
2665     */
2666     TH1F *jzbld = allsamples.Draw("jzbld",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity);
2667     TH1F *jzbemd = allsamples.Draw("jzbemd",jzbvariabledata,int((jzbHigh+110)/5),-110,jzbHigh , "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity);
2668     jzbld->SetMarkerColor(kBlack);
2669     jzbld->SetMarkerStyle(26);
2670     jzbemd->SetMarkerStyle(25);
2671     jzbemd->SetMarkerColor(kRed);
2672     jzbemd->SetLineColor(kRed);
2673     jzbld->SetMinimum(0.35);
2674     jzbld->Draw("e1");
2675     jzbemd->Draw("e1,same");
2676     TLegend *leg4 = make_legend();
2677     leg4->AddEntry(jzbld,"SFZP","p");
2678     leg4->AddEntry(jzbemd,"OFZP","p");
2679     leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
2680     leg4->AddEntry((TObject*)0,"",""); //causes segmentation violation
2681     leg4->Draw();
2682     CompleteSave(can,"lepton_comparison/jzb_eemumu_emu_data");
2683    
2684     TH1F *ttbarjzbld = allsamples.Draw("ttbarjzbld",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
2685     TH1F *ttbarjzbemd = allsamples.Draw("ttbarjzbemd",jzbvariablemc,int((jzbHigh+150)/5),-150,jzbHigh, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,data, luminosity,allsamples.FindSample("TTJet"));
2686     ttbarjzbld->SetLineColor(allsamples.GetColor("TTJet"));
2687     ttbarjzbemd->SetLineColor(allsamples.GetColor("TTJet"));
2688     ttbarjzbld->Draw("histo");
2689     ttbarjzbemd->SetLineStyle(2);
2690     ttbarjzbemd->Draw("histo,same");
2691     TLegend *leg5 = make_legend();
2692     leg5->AddEntry(ttbarjzbld,"t#bar{t}->(ee or #mu#mu)","l");
2693     leg5->AddEntry(ttbarjzbemd,"t#bar{t}->e#mu","l");
2694     leg5->Draw();
2695     CompleteSave(can,"lepton_comparison/ttbar_emu_mc");
2696    
2697     }
2698    
2699     bool is_OF(TCut cut) {
2700     string scut = (const char*) cut;
2701     if((int)scut.find("id1!=id2")>-1) return true;
2702     if((int)scut.find("id1==id2")>-1) return false;
2703     return false;
2704     }
2705    
2706     bool is_ZP(TCut cut) {
2707     string scut = (const char*) cut;
2708     if((int)scut.find("91")>-1) return true;
2709     return false;
2710     }
2711    
2712    
2713     void draw_pure_jzb_histo(TCut cut,string datavariable, string mcvariable, string savename, TCanvas *can,vector<float> binning) {
2714     TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
2715     jzbpad->cd();
2716     jzbpad->SetLogy(1);
2717     string xlabel="JZB [GeV]";
2718    
2719     TH1F *datahisto = allsamples.Draw("datahisto",datavariable,binning, xlabel, "events",cut,data,luminosity);
2720     THStack mcstack = allsamples.DrawStack("mcstack",mcvariable,binning, xlabel, "events",cut,mc,luminosity);
2721    
2722     datahisto->SetMinimum(0.1);
2723     datahisto->SetMarkerSize(DataMarkerSize);
2724     datahisto->Draw("e1");
2725 buchmann 1.73 mcstack.Draw("histo,same");
2726 buchmann 1.1 datahisto->Draw("same,e1");
2727    
2728     TLegend *leg;
2729 buchmann 1.50 if (!PlottingSetup::RestrictToMassPeak||!PlottingSetup::UseSidebandsForcJZB) {
2730 fronga 1.41 if(is_OF(cut)) leg = allsamples.allbglegend("Opposite flavor",datahisto);
2731     else leg = allsamples.allbglegend("Same flavor",datahisto);
2732     } else {
2733     if(is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("OFZP",datahisto);
2734     else if(!is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("SFZP",datahisto);
2735     else if( is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("OFSB",datahisto);
2736     else if(!is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("SFSB",datahisto);
2737     else {
2738     std::cerr << "Unable to decode cut: " << cut.GetTitle() << std::endl;
2739     exit(-1);
2740     }
2741     }
2742 buchmann 1.1 leg->Draw();
2743     string write_cut = decipher_cut(cut,"");
2744     TText *writeline1 = write_cut_on_canvas(write_cut.c_str());
2745     writeline1->SetTextSize(0.035);
2746     writeline1->Draw();
2747 buchmann 1.79 if(!Contains(savename,"Dibosons")) Save_With_Ratio(datahisto,mcstack,jzbpad->cd(),("jzb/"+savename));
2748     else Save_With_Ratio(datahisto,mcstack,jzbpad->cd(),savename);
2749 buchmann 1.1 TPad *jzbpad2 = new TPad("jzbpad2","jzbpad2",0,0,1,1);
2750     jzbpad2->cd();
2751     jzbpad2->SetLogy(1);
2752     datahisto->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
2753     datahisto->SetMinimum(0.1);
2754     datahisto->SetMarkerSize(DataMarkerSize);
2755     datahisto->Draw("e1");
2756 buchmann 1.73 mcstack.Draw("histo,same");
2757 buchmann 1.1 datahisto->Draw("same,e1");
2758     leg->SetHeader("");
2759     leg->Draw();
2760     writeline1->SetTextSize(0.035);
2761     writeline1->Draw();
2762     DrawPrelim();
2763 buchmann 1.79 if(!Contains(savename,"Dibosons")) Save_With_Ratio(datahisto,mcstack,jzbpad2->cd(),("jzb/PositiveSideOnly/"+savename+""));
2764     else Save_With_Ratio(datahisto,mcstack,jzbpad2->cd(),(savename+"__PosOnly"));
2765 buchmann 1.1 datahisto->Delete();
2766     mcstack.Delete();
2767     }
2768    
2769     Double_t GausR(Double_t *x, Double_t *par) {
2770     return gRandom->Gaus(x[0],par[0]);
2771     }
2772 buchmann 1.12
2773     void produce_stretched_jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
2774     TCanvas *dican = new TCanvas("dican","JZB Plots Canvas");
2775     float max=jzbHigh ;
2776     float min=-120;
2777     int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
2778     int coarserbins=int(nbins/2.0);
2779     int rebinnedbins=int(nbins/4.0);
2780 buchmann 1.1
2781 buchmann 1.12 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
2782     for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
2783     for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
2784     for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
2785    
2786     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP",dican,binning);
2787     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP",dican,binning);
2788     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_SFZP",dican,binning);
2789     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_SFZP",dican,binning);
2790     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_OFZP",dican,binning);
2791     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_OFZP",dican,binning);
2792 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB",dican,binning);
2793     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB",dican,binning);
2794 buchmann 1.12
2795     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP_coarse",dican,coarse_binning);
2796     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP_coarse",dican,coarse_binning);
2797 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB_coarse",dican,coarse_binning);
2798     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB_coarse",dican,coarse_binning);
2799 buchmann 1.12
2800     delete dican;
2801     }
2802    
2803    
2804     void diboson_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
2805 buchmann 1.65 switch_overunderflow(true);
2806 buchmann 1.12 vector<int> SamplesToBeModified = allsamples.FindSampleBySampleName("WW/WZ/ZZ");
2807    
2808     if(SamplesToBeModified.size()==0 || SamplesToBeModified[0]==-1) {
2809     write_error(__FUNCTION__,"Could not find any diboson samples - aborting diboson plots");
2810     return;
2811     }
2812    
2813     float stretchfactor = 100.0;
2814     vector<string> labels;
2815    
2816    
2817     dout << "Going to increase the cross section for diboson samples ... " << endl;
2818 buchmann 1.16 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
2819 buchmann 1.12 float origxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
2820     (allsamples.collection)[SamplesToBeModified[i]].xs=origxs*stretchfactor;
2821     dout << " Increased xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].filename << " from " << origxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ")" << endl;
2822     labels.push_back((allsamples.collection)[SamplesToBeModified[i]].samplename);
2823     (allsamples.collection)[SamplesToBeModified[i]].samplename=any2string(int(stretchfactor))+" x "+(allsamples.collection)[SamplesToBeModified[i]].samplename;
2824     dout << " (also renamed it to " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " )" << endl;
2825     }
2826    
2827     dout << "Going to produce JZB plots" << endl;
2828 buchmann 1.13 produce_stretched_jzb_plots(mcjzb,datajzb,ratio_binning);
2829 buchmann 1.12 TCanvas *gloca = new TCanvas("gloca","gloca");
2830    
2831     dout << "Going to produce prediction plots" << endl;
2832 buchmann 1.28 do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do only MC plots, no signal
2833     do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do MC plots with signal
2834 buchmann 1.12 delete gloca;
2835    
2836     dout << "Going to reset the cross section for diboson samples ... " << endl;
2837 buchmann 1.16 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
2838 buchmann 1.12 float Upxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
2839     (allsamples.collection)[SamplesToBeModified[i]].xs=(allsamples.collection)[SamplesToBeModified[i]].xs*(1.0/stretchfactor);
2840     string Upname=(allsamples.collection)[SamplesToBeModified[i]].samplename;
2841     (allsamples.collection)[SamplesToBeModified[i]].samplename=labels[i];
2842     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;
2843    
2844     }
2845 buchmann 1.65 // switch_overunderflow(false);
2846 buchmann 1.12 }
2847 buchmann 1.35
2848    
2849     void draw_normalized_data_vs_data_histo(TCut cut1, TCut cut2, string variable, string legentry1, string legentry2, string savename, TCanvas *can,vector<float> binning) {
2850     TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
2851     jzbpad->cd();
2852     jzbpad->SetLogy(1);
2853     string xlabel="JZB [GeV]";
2854    
2855     TH1F *datahisto1 = allsamples.Draw("datahisto1",variable,binning, xlabel, "events",cut1,data,luminosity);
2856     datahisto1->SetLineColor(kRed);
2857     datahisto1->SetMarkerColor(kRed);
2858     TH1F *datahisto2 = allsamples.Draw("datahisto2",variable,binning, xlabel, "events",cut2,data,luminosity);
2859     datahisto2->SetLineColor(kBlue);
2860     datahisto2->SetMarkerColor(kBlue);
2861    
2862     datahisto2->SetMarkerSize(DataMarkerSize);
2863     datahisto1->DrawNormalized("e1");
2864     datahisto2->DrawNormalized("histo,same");
2865     datahisto1->DrawNormalized("same,e1");
2866    
2867     TLegend *leg = make_legend();
2868     leg->AddEntry(datahisto1,legentry1.c_str());
2869     leg->AddEntry(datahisto2,legentry2.c_str());
2870     leg->Draw();
2871    
2872 buchmann 1.79 Save_With_Ratio(datahisto1,datahisto2,jzbpad->cd(),("jzb/"+savename));
2873 buchmann 1.35
2874     datahisto1->Delete();
2875     datahisto2->Delete();
2876     }
2877    
2878    
2879 buchmann 1.1 void jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
2880 buchmann 1.65 switch_overunderflow(true);
2881 buchmann 1.1 TCanvas *can = new TCanvas("can","JZB Plots Canvas");
2882     float max=jzbHigh ;
2883     float min=-120;
2884     int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
2885     int coarserbins=int(nbins/2.0);
2886     int rebinnedbins=int(nbins/4.0);
2887    
2888     vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
2889     for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
2890     for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
2891     for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
2892    
2893 buchmann 1.14 if ( !PlottingSetup::Approved ) {
2894     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP",can,binning);
2895     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP",can,binning);
2896     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_SFZP",can,binning);
2897     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_SFZP",can,binning);
2898     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_OFZP",can,binning);
2899     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_OFZP",can,binning);
2900     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2901 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB",can,binning);
2902     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB",can,binning);
2903 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);
2904     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);
2905 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);
2906 buchmann 1.35
2907 buchmann 1.14 }
2908 buchmann 1.1
2909     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarse",can,coarse_binning);
2910 buchmann 1.14 if ( !PlottingSetup::Approved ) {
2911     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarse",can,coarse_binning);
2912     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
2913 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarse",can,coarse_binning);
2914     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarse",can,coarse_binning);
2915 buchmann 1.14 }
2916 buchmann 1.12 delete can;
2917 buchmann 1.65 switch_overunderflow(false);
2918 buchmann 1.1 }
2919    
2920    
2921     void calculate_all_yields(string mcdrawcommand,vector<float> jzb_cuts) {
2922     dout << "Calculating background yields in MC:" << endl;
2923     jzb_cuts.push_back(14000);
2924     TH1F *allbgs = allsamples.Draw("allbgs",jzbvariablemc,jzb_cuts, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc,luminosity);
2925     float cumulative=0;
2926     for(int i=allbgs->GetNbinsX();i>=1;i--) {
2927     cumulative+=allbgs->GetBinContent(i);
2928     dout << "Above " << allbgs->GetBinLowEdge(i) << " GeV/c : " << cumulative << endl;
2929     }
2930     }
2931    
2932    
2933     TCut give_jzb_expression(string mcjzb, float jzbcut, string posneg="pos") {
2934     stringstream res;
2935     res << "(" << mcjzb;
2936     if(posneg=="pos") res << ">";
2937     else res << "<-";
2938     res << jzbcut << ")";
2939     return TCut(res.str().c_str());
2940     }
2941    
2942     string sigdig(float number, int nsigdig=3, float min=0) {
2943     //this function tries to extract n significant digits, and if the number is below (min), it returns "<min"
2944     if(number<min) return "< "+any2string(min);
2945     stringstream sol;
2946     sol << setprecision(nsigdig) << number;
2947    
2948     return sol.str();
2949     }
2950    
2951     string jzb_tex_command(string region, string posneg) {
2952     if(posneg=="pos") posneg="POS";
2953     else posneg="NEG";
2954     stringstream texcommand;
2955     texcommand<<"\\"<<region <<"JZB"<<posneg;
2956     return texcommand.str();
2957     }
2958     // \SFZPJZBPOS
2959     // Sample & \OFZPJZBPOS & \OFZPJZBNEG & \SFZPJZBPOS & \SFZPJZBNEG & \OFSBJZBPOS & \OFSBJZBNEG & \SFSBJZBPOS & \SFSBJZBNEG \\\hline
2960    
2961     void compute_MC_yields(string mcjzb,vector<float> jzb_cuts) {
2962     dout << "Calculating background yields in MC:" << endl;
2963    
2964     TCanvas *yica = new TCanvas("yica","yield canvas");
2965    
2966     int nRegions=4;
2967 buchmann 1.50 if(!PlottingSetup::RestrictToMassPeak||!PlottingSetup::UseSidebandsForcJZB) nRegions=2;
2968 buchmann 1.1 string tsRegions[] = {"SFZP","OFZP","SFSB","OFSB"};
2969     string posneg[] = {"pos","neg"};
2970     TCut tkRegions[] = {cutOSSF&&cutnJets&&cutmass,cutOSOF&&cutnJets&&cutmass,cutOSSF&&cutnJets&&sidebandcut,cutOSOF&&cutnJets&&sidebandcut};
2971    
2972 buchmann 1.16 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
2973 buchmann 1.1 TCut jzbMC[] = { give_jzb_expression(mcjzb,jzb_cuts[ijzb],"pos"), give_jzb_expression(mcjzb,jzb_cuts[ijzb],"neg") };
2974     dout << "_________________________________________________________" << endl;
2975     dout << "Table for JZB> " << jzb_cuts[ijzb] << endl;
2976 buchmann 1.16 for(int isample=0;isample<(int)(allsamples.collection).size();isample++) {
2977 buchmann 1.1 if(!(allsamples.collection)[isample].is_data) dout << (allsamples.collection)[isample].samplename << " & ";
2978     else dout << "Sample & ";
2979     for(int iregion=0;iregion<nRegions;iregion++) {
2980     for(int ipos=0;ipos<2;ipos++) {
2981     if((allsamples.collection)[isample].is_data) dout << jzb_tex_command(tsRegions[iregion],posneg[ipos]) << " & ";
2982     else {
2983     vector<int> specific;specific.push_back(isample);
2984     TH1F *shisto = allsamples.Draw("shisto","mll",1,0,500,"tester","events",tkRegions[iregion]&&jzbMC[ipos],mc,luminosity,specific);
2985     dout << sigdig(shisto->Integral(),3,0.05) <<" & ";
2986     delete shisto;
2987     }
2988     }//end of ipos
2989     }//end of iregion
2990     dout << " \\\\" << endl;
2991     }//end of isample
2992     }//end of ijzb
2993     dout << " \\hline" << endl;
2994    
2995     delete yica;
2996     }
2997    
2998     void draw_ttbar_and_zjets_shape_for_one_configuration(string mcjzb, string datajzb, int leptontype=-1, int scenario=0,bool floating=false) {
2999     //Step 1: Establishing cuts
3000     stringstream jetcutstring;
3001     string writescenario="";
3002    
3003     if(scenario==0) jetcutstring << "(pfJetGoodNum>=3)&&"<<(const char*) basicqualitycut;
3004     if(scenario==1) jetcutstring << "(pfJetPt[0]>50&&pfJetPt[1]>50)&&"<<(const char*)basicqualitycut;
3005     TCut jetcut(jetcutstring.str().c_str());
3006     string leptoncut="mll>0";
3007     if(leptontype==0||leptontype==1) {
3008     if(leptontype==0) {
3009     leptoncut="id1==0";
3010     writescenario="__ee";
3011     }
3012     else {
3013     leptoncut="id1==1";
3014     writescenario="__ee";
3015     }
3016     }
3017     TCut lepcut(leptoncut.c_str());
3018    
3019     TCanvas *c5 = new TCanvas("c5","c5",1500,500);
3020     TCanvas *c6 = new TCanvas("c6","c6");
3021     c5->Divide(3,1);
3022    
3023     //STEP 2: Extract Zjets shape in data
3024     c5->cd(1);
3025     c5->cd(1)->SetLogy(1);
3026     TCut massat40("mll>40");
3027     TH1F *ossfleft = allsamples.Draw("ossfleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
3028     TH1F *osofleft = allsamples.Draw("osofleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
3029     ossfleft->SetLineColor(kRed);
3030     ossfleft->SetMarkerColor(kRed);
3031     ossfleft->Add(osofleft,-1);
3032     vector<TF1*> functions = do_cb_fit_to_plot(ossfleft,10);
3033     ossfleft->SetMarkerSize(DataMarkerSize);
3034     ossfleft->Draw();
3035     functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
3036     TF1 *zjetsfunc = (TF1*) functions[1]->Clone();
3037     TF1 *zjetsfuncN = (TF1*) functions[0]->Clone();
3038     TF1 *zjetsfuncP = (TF1*) functions[2]->Clone();
3039     zjetsfunc->Draw("same");zjetsfuncN->Draw("same");zjetsfuncP->Draw("same");
3040     TLegend *leg1 = new TLegend(0.6,0.6,0.89,0.80);
3041     leg1->SetFillColor(kWhite);
3042     leg1->SetLineColor(kWhite);
3043     leg1->AddEntry(ossfleft,"OSSF (sub),JZB<peak","p");
3044     leg1->AddEntry(zjetsfunc,"OSSF fit ('zjets')","l");
3045     leg1->Draw("same");
3046     TText *titleleft = write_title("Extracting Z+Jets shape");
3047     titleleft->Draw();
3048    
3049     //Step 3: Extract ttbar shape (in data or MC?)
3050     c5->cd(2);
3051     c5->cd(2)->SetLogy(1);
3052     TH1F *osof;
3053     TText *titlecenter;
3054     bool frommc=false;
3055     if(frommc) {
3056     osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,mc,luminosity,allsamples.FindSample("TTJets"));
3057     titlecenter = write_title("Extracting ttbar shape (from ossf MC)");
3058     }
3059     else {
3060     osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
3061     titlecenter = write_title("Extracting ttbar shape (from osof data)");
3062     }
3063     osof->SetMarkerSize(DataMarkerSize);
3064     osof->Draw();
3065     vector<TF1*> ttbarfunctions = do_cb_fit_to_plot(osof,35,true);
3066     ttbarfunctions[0]->SetLineColor(kRed); ttbarfunctions[0]->SetLineStyle(2); ttbarfunctions[0]->Draw("same");
3067     ttbarfunctions[1]->SetLineColor(kRed); ttbarfunctions[1]->Draw("same");
3068     ttbarfunctions[2]->SetLineColor(kRed); ttbarfunctions[2]->SetLineStyle(2); ttbarfunctions[2]->Draw("same");
3069    
3070     TLegend *leg2 = new TLegend(0.15,0.8,0.4,0.89);
3071     leg2->SetFillColor(kWhite);
3072     leg2->SetLineColor(kWhite);
3073     if(frommc) {
3074     leg2->AddEntry(osof,"t#bar{t} OSSF, MC","p");
3075     leg2->AddEntry(ttbarfunctions[1],"Fit to t#bar{t} OSSF,MC","l");
3076     } else {
3077     leg2->AddEntry(osof,"OSOF","p");
3078     leg2->AddEntry(ttbarfunctions[1],"Fit to OSOF","l");
3079     }
3080     leg2->Draw("same");
3081     titlecenter->Draw();
3082    
3083     //--------------------------------------------------------------------------------------------------------------------------------
3084     //STEP 4: Present it!
3085     // actually: if we wanna let it float we need to do that first :-)
3086     c5->cd(3);
3087     c5->cd(3)->SetLogy(1);
3088     TH1F *observed = allsamples.Draw("observed",datajzb,100,0,500, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
3089     observed->SetMarkerSize(DataMarkerSize);
3090    
3091     TF1 *logparc = new TF1("logparc",InvCrystalBall,0,1000,5); logparc->SetLineColor(kRed);
3092     TF1 *logparcn = new TF1("logparcn",InvCrystalBallN,0,1000,5); logparcn->SetLineColor(kRed); logparcn->SetLineStyle(2);
3093     TF1 *logparcp = new TF1("logparcp",InvCrystalBallP,0,1000,5); logparcp->SetLineColor(kRed); logparcp->SetLineStyle(2);
3094    
3095     TF1 *zjetsc = new TF1("zjetsc",InvCrystalBall,0,1000,5); zjetsc->SetLineColor(kBlue);
3096     TF1 *zjetscn = new TF1("zjetscn",InvCrystalBallN,0,1000,5); zjetscn->SetLineColor(kBlue); zjetscn->SetLineStyle(2);
3097     TF1 *zjetscp = new TF1("zjetscp",InvCrystalBallP,0,1000,5); zjetscp->SetLineColor(kBlue); zjetscp->SetLineStyle(2);
3098    
3099     TF1 *ZplusJetsplusTTbar = new TF1("ZplusJetsplusTTbar", DoubleInvCrystalBall,0,1000,10); ZplusJetsplusTTbar->SetLineColor(kBlue);
3100     TF1 *ZplusJetsplusTTbarP= new TF1("ZplusJetsplusTTbarP",DoubleInvCrystalBallP,0,1000,10); ZplusJetsplusTTbarP->SetLineColor(kBlue); ZplusJetsplusTTbarP->SetLineStyle(2);
3101     TF1 *ZplusJetsplusTTbarN= new TF1("ZplusJetsplusTTbarN",DoubleInvCrystalBallN,0,1000,10); ZplusJetsplusTTbarN->SetLineColor(kBlue); ZplusJetsplusTTbarN->SetLineStyle(2);
3102    
3103     zjetsc->SetParameters(zjetsfunc->GetParameters());
3104     zjetscp->SetParameters(zjetsfunc->GetParameters());
3105     zjetscn->SetParameters(zjetsfunc->GetParameters());
3106    
3107     TH1F *observeda = allsamples.Draw("observeda",datajzb,53,80,jzbHigh, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
3108     //blublu
3109     logparc->SetParameters(ttbarfunctions[1]->GetParameters());
3110     logparcn->SetParameters(ttbarfunctions[1]->GetParameters());
3111     logparcp->SetParameters(ttbarfunctions[1]->GetParameters());
3112     if(floating) {
3113     dout << "TTbar contribution assumed (before fitting) : " << logparc->GetParameter(0) << endl;
3114     logparc->SetParameters(ttbarfunctions[1]->GetParameters());
3115     for(int i=0;i<10;i++) {
3116     if(i<5) ZplusJetsplusTTbar->FixParameter(i,zjetsfunc->GetParameter(i));
3117     if(i>=5) {
3118     if (i>5) ZplusJetsplusTTbar->FixParameter(i,logparc->GetParameter(i-5));
3119     if (i==5) ZplusJetsplusTTbar->SetParameter(i,logparc->GetParameter(i-5));
3120     }
3121     }//end of setting parameters
3122     observeda->Draw("same");
3123     ZplusJetsplusTTbar->Draw("same");
3124     observeda->Fit(ZplusJetsplusTTbar);
3125     dout << "--> Quality of Z+Jets / TTbar fit : chi2/ndf = " << ZplusJetsplusTTbar->GetChisquare() << "/" << ZplusJetsplusTTbar->GetNDF() << endl;
3126     ZplusJetsplusTTbar->Draw("same");
3127     ZplusJetsplusTTbarP->SetParameters(ZplusJetsplusTTbar->GetParameters());
3128     ZplusJetsplusTTbarN->SetParameters(ZplusJetsplusTTbar->GetParameters());
3129     dout << "TTbar contribution found (after fitting) : " << ZplusJetsplusTTbar->GetParameter(5) << endl;
3130     float factor = ZplusJetsplusTTbar->GetParameter(5) / logparc->GetParameter(0);
3131     dout << "FACTOR: " << factor << endl;
3132     logparc->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
3133     logparcn->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
3134     logparcp->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
3135     }
3136    
3137     c5->cd(3);
3138     c5->cd(3)->SetLogy(1);
3139     observed->Draw();
3140     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
3141     logparc->Draw("same");
3142     logparcn->Draw("same");
3143     logparcp->Draw("same");
3144    
3145     TLegend *leg3 = new TLegend(0.6,0.6,0.89,0.80);
3146     leg3->SetFillColor(kWhite);
3147     leg3->SetLineColor(kWhite);
3148     leg3->AddEntry(observed,"OSSF,JZB>peak","p");
3149     leg3->AddEntry(ttbarfunctions[1],"OSOF fit ('ttbar')","l");
3150     leg3->AddEntry(zjetsfunc,"OSSF,JZB<0 fit ('zjets')","l");
3151     leg3->Draw("same");
3152     TText *titleright = write_title("Summary of shapes and observed shape");
3153     titleright->Draw();
3154    
3155     c6->cd()->SetLogy(1);
3156     observed->Draw();
3157     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
3158     logparc->Draw("same");
3159     logparcn->Draw("same");
3160     logparcp->Draw("same");
3161     leg3->Draw("same");
3162     titleright->Draw();
3163    
3164     if(scenario==0) {
3165     CompleteSave(c5,"Shapes2/Making_of___3jetsabove30"+writescenario);
3166     CompleteSave(c5->cd(1),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd1");
3167     CompleteSave(c5->cd(2),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd2");
3168     CompleteSave(c5->cd(3),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd3");
3169     CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30"+writescenario);
3170     } else {
3171     CompleteSave(c5,"Shapes2/Making_of___2jetsabove50"+writescenario);
3172     CompleteSave(c5->cd(1),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd1");
3173     CompleteSave(c5->cd(2),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd2");
3174     CompleteSave(c5->cd(3),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd3");
3175     CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50"+writescenario);
3176     }
3177     dout << "Statistics about our fits: " << endl;
3178     dout << "Z+Jets shape: Chi2/ndf = " << zjetsfunc->GetChisquare() << "/" << ossfleft->GetNbinsX() << endl;
3179     dout << "ttbar shape: Chi2/ndf = " << ttbarfunctions[1]->GetChisquare() << "/" << osof->GetNbinsX() << endl;
3180    
3181     c6->cd();
3182     TLegend *additionallegend = new TLegend(0.6,0.6,0.89,0.89);
3183     additionallegend->SetFillColor(kWhite);
3184     additionallegend->SetLineColor(kWhite);
3185     additionallegend->AddEntry(observed,"Data","p");
3186     additionallegend->AddEntry(ZplusJetsplusTTbar,"Fitted Z+jets & TTbar","l");
3187     additionallegend->AddEntry(zjetsc,"Z+jets","l");
3188     additionallegend->AddEntry(logparc,"TTbar","l");
3189     observed->Draw();
3190     ZplusJetsplusTTbar->SetLineColor(kGreen);
3191     ZplusJetsplusTTbarP->SetLineColor(kGreen);
3192     ZplusJetsplusTTbarN->SetLineColor(kGreen);
3193     ZplusJetsplusTTbarP->SetLineStyle(2);
3194     ZplusJetsplusTTbarN->SetLineStyle(2);
3195     TF1 *ZplusJetsplusTTbar2 = new TF1("ZplusJetsplusTTbar2",DoubleInvCrystalBall,0,1000,10);
3196     ZplusJetsplusTTbar2->SetParameters(ZplusJetsplusTTbar->GetParameters());
3197     ZplusJetsplusTTbar2->SetLineColor(kGreen);
3198     ZplusJetsplusTTbarP->SetFillColor(TColor::GetColor("#81F781"));
3199     ZplusJetsplusTTbarN->SetFillColor(kWhite);
3200     ZplusJetsplusTTbarP->Draw("fcsame");
3201     ZplusJetsplusTTbarN->Draw("fcsame");
3202     TH1F *hZplusJetsplusTTbar = (TH1F*)ZplusJetsplusTTbar2->GetHistogram();
3203     TH1F *hZplusJetsplusTTbarN = (TH1F*)ZplusJetsplusTTbarN->GetHistogram();
3204     TH1F *hZplusJetsplusTTbarP = (TH1F*)ZplusJetsplusTTbarP->GetHistogram();
3205     hZplusJetsplusTTbar->SetMarkerSize(0);
3206     hZplusJetsplusTTbarP->SetMarkerSize(0);
3207     hZplusJetsplusTTbarN->SetMarkerSize(0);
3208     for (int i=1;i<=hZplusJetsplusTTbar->GetNbinsX();i++) {
3209     float newerror=hZplusJetsplusTTbarP->GetBinContent(i)-hZplusJetsplusTTbar->GetBinContent(i);
3210     hZplusJetsplusTTbar->SetBinError(i,newerror);
3211     if(hZplusJetsplusTTbar->GetBinContent(i)<0.05) hZplusJetsplusTTbar->SetBinContent(i,0); //avoiding a displaying probolem
3212     }
3213     hZplusJetsplusTTbarP->SetFillColor(kGreen);
3214     hZplusJetsplusTTbarN->SetFillColor(kWhite);
3215     hZplusJetsplusTTbarN->Draw("same");
3216    
3217     ZplusJetsplusTTbar2->SetMarkerSize(0);
3218     ZplusJetsplusTTbar2->Draw("same");
3219    
3220     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
3221     logparc->Draw("same");
3222     logparcn->Draw("same");
3223     logparcp->Draw("same");
3224     additionallegend->Draw("same");
3225     if(scenario==0) {
3226     CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30__allfits__"+writescenario);
3227     } else {
3228     CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50__allfits__"+writescenario);
3229     }
3230     //--------------------------------------------------------------------------------------------------------------------------------
3231     }
3232    
3233     void draw_ttbar_and_zjets_shape(string mcjzb, string datajzb) {
3234     int all_leptons=-1;
3235 buchmann 1.16 int threejetswith30gev=0;
3236     /*
3237     int twojetswith50gev=1;
3238 buchmann 1.1 int electrons_only=0;
3239     int mu_only=1;
3240 buchmann 1.16
3241 buchmann 1.1 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,twojetswith50gev);
3242     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev);
3243    
3244     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,twojetswith50gev);
3245     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,threejetswith30gev);
3246    
3247     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,twojetswith50gev);
3248     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,threejetswith30gev);
3249     */
3250    
3251     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev,true);
3252     }
3253    
3254 buchmann 1.32 float find_one_correction_factor(string FindKeyword, bool dodata, TCut SpecialCut, string SaveAs) {
3255 buchmann 1.1 TCanvas *cancorr = new TCanvas("cancorr","Canvas for Response Correction");
3256     cancorr->SetLogz();
3257     cancorr->SetRightMargin(0.13);
3258 buchmann 1.45 TCut zptforresponsepresentation(Restrmasscut&&SpecialCut&&passtrig);
3259 fronga 1.40
3260     if(PlottingSetup::DoBTag) zptforresponsepresentation=zptforresponsepresentation&&PlottingSetup::bTagRequirement;
3261     TH2F *niceresponseplotd = new TH2F("niceresponseplotd","",100,0,600,100,0,5);
3262     niceresponseplotd->Sumw2();
3263     TH2F* emuResponse = (TH2F*)niceresponseplotd->Clone("emuResponse");
3264 buchmann 1.27 vector<int> SampleIndices=allsamples.FindSample(FindKeyword);
3265 buchmann 1.33 for(int iSample=0;iSample<(int)SampleIndices.size();iSample++) {
3266 buchmann 1.32 if((allsamples.collection)[SampleIndices[iSample]].is_data && !dodata) continue;
3267     if((allsamples.collection)[SampleIndices[iSample]].is_data ==false && dodata) continue;
3268    
3269 buchmann 1.30 dout << " Response correction : Using sample " << (allsamples.collection)[SampleIndices[iSample]].filename << " for " << FindKeyword << endl;
3270 fronga 1.40 (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+niceresponseplotd",(zptforresponsepresentation&&cutOSSF)*cutWeight);
3271     (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+emuResponse",(zptforresponsepresentation&&cutOSOF)*cutWeight);
3272 buchmann 1.27 }
3273 fronga 1.40 niceresponseplotd->Add(emuResponse,-1);
3274    
3275 buchmann 1.1 niceresponseplotd->SetStats(0);
3276     niceresponseplotd->GetXaxis()->SetTitle("Z p_{T} [GeV]");
3277     niceresponseplotd->GetYaxis()->SetTitle("Response");
3278     niceresponseplotd->GetXaxis()->CenterTitle();
3279     niceresponseplotd->GetYaxis()->CenterTitle();
3280     niceresponseplotd->Draw("COLZ");
3281     TProfile * profd = (TProfile*)niceresponseplotd->ProfileX();
3282 fronga 1.40 profd->Rebin(2);
3283 buchmann 1.1 profd->SetMarkerSize(DataMarkerSize);
3284 fronga 1.40 profd->Fit("pol0","","same,e1",100,400);
3285 buchmann 1.1 DrawPrelim();
3286 buchmann 1.27 string stitle="Data";
3287     if(!Contains(FindKeyword,"Data")) stitle="MC";
3288     TText* title = write_text(0.5,0.7,stitle.c_str());
3289 buchmann 1.1 title->SetTextAlign(12);
3290     title->Draw();
3291     TF1 *datapol=(TF1*)profd->GetFunction("pol0");
3292 buchmann 1.27 float correction=datapol->GetParameter(0);
3293     stringstream resstring;
3294     resstring<<"Response: "<<std::setprecision(2)<<100*correction<<" %";
3295     TText* restitle = write_text(0.5,0.65,resstring.str());
3296 buchmann 1.1 restitle->SetTextAlign(12);
3297     restitle->SetTextSize(0.03);
3298     restitle->Draw();
3299 buchmann 1.27 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_New_"+SaveAs);
3300     delete cancorr;
3301     delete niceresponseplotd;
3302 fronga 1.40 delete profd;
3303 buchmann 1.27 return correction;
3304     }
3305    
3306     void find_correction_factors(string &jzbvardata,string &jzbvarmc) {
3307    
3308 buchmann 1.30 dout << "Computing response corrections: " << endl;
3309 buchmann 1.27 //Step 1 : Get results
3310 buchmann 1.32 float datacorrection=find_one_correction_factor("Data",true,"","Data");
3311     float mccorrection=find_one_correction_factor("DY",false,"","MC");
3312 buchmann 1.1
3313 buchmann 1.32 float dataEEcorrection=find_one_correction_factor("Data",true,"id1==0","Data_ee");
3314     float mcEEcorrection=find_one_correction_factor("DY",false,"id1==0","MC_ee");
3315 buchmann 1.27
3316 buchmann 1.32 float dataMMcorrection=find_one_correction_factor("Data",true,"id1==1","Data_mm");
3317     float mcMMcorrection=find_one_correction_factor("DY",false,"id1==1","MC_mm");
3318 buchmann 1.27
3319     cout << "Corrections : " << endl;
3320     cout << " Data : " << datacorrection << endl;
3321     cout << " ee (" << dataEEcorrection << ") , mm (" << dataMMcorrection << ")" << endl;
3322     cout << " MC : " << mccorrection << endl;
3323     cout << " ee (" << mcEEcorrection << ") , mm (" << mcMMcorrection << ")" << endl;
3324    
3325     //Step 2: Processing the result and making it into something useful :-)
3326 buchmann 1.1 stringstream jzbvardatas;
3327 buchmann 1.27 jzbvardatas << "(";
3328    
3329     if(dataEEcorrection>=1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]-" << dataEEcorrection-1 << "*pt))";
3330     if(dataEEcorrection<1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-dataEEcorrection << "*pt))";
3331    
3332     if(dataMMcorrection>=1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]-" << dataMMcorrection-1 << "*pt))";
3333     if(dataMMcorrection<1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-dataMMcorrection << "*pt))";
3334    
3335     float averagecorrection=(dataMMcorrection+dataEEcorrection)/2.0;
3336    
3337 buchmann 1.30 if(datacorrection>=1) jzbvardatas<<"+((id1!=id2)*(jzb[1]-" << datacorrection-1 << "*pt))";
3338     if(datacorrection<1) jzbvardatas<<"+((id1!=id2)*(jzb[1]+" << 1-datacorrection << "*pt))";
3339 buchmann 1.27
3340     jzbvardatas << ")";
3341 buchmann 1.1 jzbvardata=jzbvardatas.str();
3342 buchmann 1.27
3343 buchmann 1.1 stringstream jzbvarmcs;
3344 buchmann 1.27 jzbvarmcs << "(";
3345    
3346     if(mcEEcorrection>=1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]-" << mcEEcorrection-1 << "*pt))";
3347     if(mcEEcorrection<1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-mcEEcorrection << "*pt))";
3348    
3349     if(mcMMcorrection>=1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]-" << mcMMcorrection-1 << "*pt))";
3350     if(mcMMcorrection<1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-mcMMcorrection << "*pt))";
3351    
3352     float averagemccorrection=(mcMMcorrection+mcEEcorrection)/2.0;
3353    
3354 buchmann 1.30 if(mccorrection>=1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]-" << mccorrection-1 << "*pt))";
3355     if(mccorrection<1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]+" << 1-mccorrection << "*pt))";
3356 buchmann 1.27
3357     jzbvarmcs << ")";
3358 buchmann 1.1 jzbvarmc=jzbvarmcs.str();
3359 buchmann 1.27
3360 buchmann 1.1 dout << "JZB Z pt correction summary : " << endl;
3361     dout << " Data: The response is " << datacorrection << " --> jzb variable is now : " << jzbvardata << endl;
3362     dout << " MC : The response is " << mccorrection << " --> jzb variable is now : " << jzbvarmc << endl;
3363 buchmann 1.27
3364 buchmann 1.1 }
3365    
3366     void pick_up_events(string cut) {
3367     dout << "Picking up events with cut " << cut << endl;
3368     allsamples.PickUpEvents(cut);
3369     }
3370    
3371 buchmann 1.18 void save_template(string mcjzb, string datajzb,vector<float> jzb_cuts,float MCPeakError,float DataPeakError, vector<float> jzb_shape_limit_bins) {
3372 buchmann 1.1 dout << "Saving configuration template!" << endl;
3373     ofstream configfile;
3374     configfile.open("../DistributedModelCalculations/last_configuration.C");
3375     configfile<<"#include <iostream>\n";
3376     configfile<<"#include <vector>\n";
3377     configfile<<"#ifndef SampleClassLoaded\n";
3378     configfile<<"#include \"SampleClass.C\"\n";
3379     configfile<<"#endif\n";
3380     configfile<<"#define SetupLoaded\n";
3381     configfile<<"#ifndef ResultLibraryClassLoaded\n";
3382     configfile<<"#include \"ResultLibraryClass.C\"\n";
3383     configfile<<"#endif\n";
3384    
3385     configfile<<"\nusing namespace std;\n\n";
3386    
3387     configfile<<"namespace PlottingSetup { \n";
3388     configfile<<"string datajzb=\"datajzb_ERROR\";\n";
3389     configfile<<"string mcjzb=\"mcjzb_ERROR\";\n";
3390     configfile<<"vector<float>jzb_cuts;\n";
3391 buchmann 1.18 configfile<<"vector<float>jzb_shape_limit_bins;\n";
3392 buchmann 1.1 configfile<<"float MCPeakError=-999;\n";
3393 buchmann 1.11 configfile<<"float DataPeakError=-999;\n";
3394 buchmann 1.1 configfile<<"}\n\n";
3395    
3396     configfile<<"void read_config() {\n";
3397     configfile<<"datajzb=\""<<datajzb<<"\";\n";
3398     configfile<<"mcjzb=\""<<mcjzb<<"\";\n\n";
3399 buchmann 1.11 configfile<<"\n\nMCPeakError="<<MCPeakError<<";\n";
3400     configfile<<"DataPeakError="<<DataPeakError<<";\n\n";
3401 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";
3402 buchmann 1.1 configfile<<"\n\n";
3403 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";
3404     for(int i=0;i<(int)Npred.size();i++) configfile<<"Npred.push_back("<<Npred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3405     for(int i=0;i<(int)Nprederr.size();i++) configfile<<"Nprederr.push_back("<<Nprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3406 buchmann 1.1 configfile<<"\n\n";
3407 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";
3408     for(int i=0;i<(int)flippedNpred.size();i++) configfile<<"flippedNpred.push_back("<<flippedNpred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
3409 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";
3410 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";
3411     configfile<<"\n\n";
3412 buchmann 1.1 configfile<<"\n\n";
3413     configfile<<"luminosity="<<luminosity<<";\n";
3414 buchmann 1.5 configfile<<"RestrictToMassPeak="<<RestrictToMassPeak<<";//defines the type of analysis we're running\n";
3415 buchmann 1.52 configfile<<"UseSidebandsForcJZB="<<UseSidebandsForcJZB<<";//tells us whether to use the sidebands or not\n";
3416 buchmann 1.1
3417     configfile<<"\n\ncout << \"Configuration successfully loaded!\" << endl; \n \n } \n \n";
3418    
3419     configfile.close();
3420    
3421     }
3422    
3423     float get_nonzero_minimum(TH1F *histo) {
3424     float min=histo->GetMaximum();
3425     for(int ibin=1;ibin<=histo->GetNbinsX();ibin++) {
3426     float curcont=histo->GetBinContent(ibin);
3427     if(curcont<min&&curcont>0) min=curcont;
3428     }
3429     return min;
3430     }
3431    
3432     void draw_all_ttbar_histos(TCanvas *can, vector<TH1F*> histos, string drawoption="", float manualmin=-9) {
3433     can->cd();
3434     float min=1;
3435     float max=histos[0]->GetMaximum();
3436     if(manualmin>=0) min=manualmin;
3437     else {
3438 buchmann 1.16 for(int i=1;i<(int)histos.size();i++) {
3439 buchmann 1.1 float curmin=get_nonzero_minimum(histos[i]);
3440     float curmax=histos[i]->GetMaximum();
3441     if(curmin<min) min=curmin;
3442     if(curmax>max) max=curmax;
3443     }
3444     }
3445     histos[0]->GetYaxis()->SetRangeUser(min,4*max);
3446     histos[0]->Draw(drawoption.c_str());
3447     stringstream drawopt;
3448     drawopt << drawoption << ",same";
3449 buchmann 1.16 for(int i=1;i<(int)histos.size();i++) {
3450 buchmann 1.1 histos[i]->Draw(drawopt.str().c_str());
3451     }
3452     }
3453    
3454     void ttbar_sidebands_comparison(string mcjzb, vector<float> binning, string prestring) {
3455     //in the case of the on peak analysis, we compare the 3 control regions to the real value
3456     //in the case of the OFF peak analysis, we compare our control region to the real value
3457     TCut weightbackup=cutWeight;
3458 buchmann 1.65 switch_overunderflow(true);
3459 buchmann 1.34
3460     bool doPURW=false;
3461    
3462    
3463     if(!doPURW) {
3464 fronga 1.40 dout << "Not doing PU reweighting for ttbar closure test" << endl;
3465 buchmann 1.34 cutWeight="1.0";
3466     // Do it without PU re-weighting
3467     float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
3468     stringstream resultsNoPU;
3469     stringstream noPUdatajzb;
3470     stringstream noPUmcjzb;
3471    
3472     stringstream mcjzbnoPU;
3473     find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,true,noPUdatajzb,noPUmcjzb);
3474 buchmann 1.36 mcjzb = noPUmcjzb.str();
3475 buchmann 1.34 }
3476    
3477 fronga 1.40
3478 buchmann 1.1 float simulatedlumi = luminosity; //in pb please - adjust to your likings
3479    
3480 buchmann 1.70 TH1F *TZem = systsamples.Draw("TZem", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3481     TH1F *nTZem = systsamples.Draw("nTZem","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3482 buchmann 1.1 TH1F *TSem;
3483     TH1F *nTSem;
3484 buchmann 1.70 TH1F *TZeemm = systsamples.Draw("TZeemm", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3485     TH1F *nTZeemm = systsamples.Draw("nTZeemm","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3486 buchmann 1.1 TH1F *TSeemm;
3487     TH1F *nTSeemm;
3488    
3489 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3490 buchmann 1.70 TSem = systsamples.Draw("TSem", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3491     nTSem = systsamples.Draw("nTSem", "-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3492     TSeemm = systsamples.Draw("TSeemm", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3493     nTSeemm = systsamples.Draw("nTSeemm","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTT"));
3494 buchmann 1.1 }
3495    
3496     TCanvas *tcan = new TCanvas("tcan","tcan");
3497     tcan->SetLogy(1);
3498    
3499     TZeemm->SetLineColor(kBlack);
3500     TZem->SetLineColor(kRed);
3501     TZeemm->SetMarkerColor(kBlack);
3502     TZem->SetMarkerColor(kRed);
3503    
3504    
3505 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3506 buchmann 1.1 TSem->SetLineColor(TColor::GetColor("#00A616"));
3507     TSeemm->SetLineColor(kMagenta+2);
3508     TSem->SetMarkerColor(TColor::GetColor("#00A616"));
3509     TSeemm->SetMarkerColor(kMagenta+2);
3510     TSem->SetLineStyle(2);
3511     TSeemm->SetLineStyle(3);
3512     }
3513    
3514     vector<TH1F*> histos;
3515 buchmann 1.31 TZem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
3516     TZeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
3517 buchmann 1.1 histos.push_back(TZem);
3518     histos.push_back(TZeemm);
3519 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3520 buchmann 1.31 TSeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
3521     TSem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
3522 buchmann 1.1 histos.push_back(TSem);
3523     histos.push_back(TSeemm);
3524     }
3525 buchmann 1.67 draw_all_ttbar_histos(tcan,histos,"histo",8);
3526 buchmann 1.1
3527     TLegend *leg = make_legend("MC t#bar{t}",0.6,0.65,false);
3528     leg->AddEntry(TZeemm,"SFZP","l");
3529     leg->AddEntry(TZem,"OFZP","l");
3530 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3531 buchmann 1.1 leg->AddEntry(TSeemm,"SFSB","l");
3532     leg->AddEntry(TSem,"OFSB","l");
3533     }
3534     leg->Draw("same");
3535     DrawMCPrelim(simulatedlumi);
3536     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison");
3537 buchmann 1.66
3538 buchmann 1.1 TH1F *TZemcopy = (TH1F*)TZem->Clone("TZemcopy");
3539     TH1F *TZeemmcopy = (TH1F*)TZeemm->Clone("TZeemmcopy");
3540 buchmann 1.11 TH1F *TSeemmcopy;
3541     TH1F *TSemcopy;
3542 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3543 buchmann 1.11 TSeemmcopy = (TH1F*)TSeemm->Clone("TSeemmcopy");
3544     TSemcopy = (TH1F*)TSem->Clone("TSemcopy");
3545     }
3546 buchmann 1.1
3547     TZem->Divide(TZeemm);
3548     TZem->SetMarkerStyle(21);
3549 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3550 buchmann 1.1 TSem->Divide(TZeemm);
3551     TSeemm->Divide(TZeemm);
3552     TSem->SetMarkerStyle(24);
3553     TSeemm->SetMarkerStyle(32);
3554 fronga 1.40 }
3555 buchmann 1.1
3556     tcan->SetLogy(0);
3557     TZem->GetYaxis()->SetRangeUser(0,2.5);
3558     TZem->GetYaxis()->SetTitle("ratio");
3559     TZem->Draw();
3560 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3561 buchmann 1.1 TSem->Draw("same");
3562     TSeemm->Draw("same");
3563     }
3564    
3565 buchmann 1.33 float linepos=emuncertONPEAK;
3566 buchmann 1.51 if(!PlottingSetup::RestrictToMassPeak) linepos=emuncertOFFPEAK;
3567 buchmann 1.33
3568 buchmann 1.1 TLine *top = new TLine(binning[0],1.0+linepos,binning[binning.size()-1],1.0+linepos);
3569     TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
3570     TLine *bottom = new TLine(binning[0],1.0-linepos,binning[binning.size()-1],1.0-linepos);
3571    
3572 buchmann 1.11 /*write_warning(__FUNCTION__,"These two lines are to be removed!");
3573     TLine *topalt = new TLine(binning[0],1.0+0.1,binning[binning.size()-1],1.0+0.1);
3574     TLine *bottomalt = new TLine(binning[0],1.0-0.1,binning[binning.size()-1],1.0-0.1);
3575     topalt->SetLineColor(kRed);topalt->SetLineStyle(3);
3576     bottomalt->SetLineColor(kRed);bottomalt->SetLineStyle(3);
3577     topalt->Draw("same");bottomalt->Draw("same");*/
3578    
3579    
3580 buchmann 1.1 top->SetLineColor(kBlue);top->SetLineStyle(2);
3581     bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
3582     center->SetLineColor(kBlue);
3583    
3584     top->Draw("same");
3585     center->Draw("same");
3586     bottom->Draw("same");
3587    
3588     TLegend *leg2 = make_legend("MC t#bar{t}",0.55,0.75,false);
3589     leg2->AddEntry(TZem,"OFZP / SFZP","ple");
3590 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3591 buchmann 1.1 leg2->AddEntry(TSeemm,"SFSB / SFZP","ple");
3592     leg2->AddEntry(TSem,"OFSB / SFZP","ple");
3593     }
3594     leg2->AddEntry(bottom,"syst. envelope","l");
3595     leg2->SetX1(0.25);leg2->SetX2(0.6);
3596     leg2->SetY1(0.65);
3597    
3598     leg2->Draw("same");
3599    
3600     DrawMCPrelim(simulatedlumi);
3601     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison_ratio");
3602    
3603 buchmann 1.66
3604 fronga 1.40 if (0) { // Turn this off: we don't need this
3605    
3606     ///-------------- second part: only look at the quantity we actually care about!
3607     TH1F *leftsfzp = (TH1F*)nTZeemm->Clone("leftsfzp");
3608     TH1F *rightsfzp = (TH1F*)TZeemmcopy->Clone("rightsfzp");
3609     rightsfzp->Add(leftsfzp,-1);
3610     TH1F *leftofzp = (TH1F*)nTZem->Clone("leftofzp");
3611     TH1F *rightofzp = (TH1F*)TZemcopy->Clone("rightofzp");
3612     rightofzp->Add(leftofzp,-1);
3613     TH1F *leftofsb;
3614     TH1F *rightofsb;
3615     TH1F *leftsfsb;
3616     TH1F *rightsfsb;
3617 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3618 fronga 1.40 leftofsb = (TH1F*)nTSem->Clone("leftofsb");
3619     rightofsb = (TH1F*)TSemcopy->Clone("rightofsb");
3620     rightofsb->Add(leftofsb,-1);
3621     leftsfsb = (TH1F*)nTSeemm->Clone("leftsfsb");
3622     rightsfsb = (TH1F*)TSeemmcopy->Clone("rightsfsb");
3623     rightsfsb->Add(leftsfsb,-1);
3624     }
3625 buchmann 1.1
3626 fronga 1.40 tcan->SetLogy(1);
3627     rightsfzp->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
3628     rightsfzp->GetYaxis()->SetTitle("#deltaJZB / 25 GeV");
3629     rightsfzp->Draw("histo");
3630     rightofzp->Draw("histo,same");
3631 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3632 fronga 1.40 rightofsb->Draw("histo,same");
3633     rightsfsb->Draw("histo,same");
3634     }
3635     DrawMCPrelim(simulatedlumi);
3636    
3637     TLegend *legA = make_legend("MC t#bar{t}",0.6,0.65,false);
3638     legA->AddEntry(rightsfzp,"SFZP","l");
3639     legA->AddEntry(rightofzp,"OFZP","l");
3640 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3641 fronga 1.40 legA->AddEntry(rightofsb,"SFSB","l");
3642     legA->AddEntry(rightsfsb,"OFSB","l");
3643     }
3644     legA->Draw();
3645 buchmann 1.1
3646 fronga 1.40 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison");
3647 buchmann 1.1
3648 fronga 1.40 tcan->SetLogy(0);
3649     rightofzp->Divide(rightsfzp);
3650     rightofzp->GetXaxis()->SetRangeUser(0.0,binning[binning.size()-1]);
3651     rightofzp->GetYaxis()->SetRangeUser(0.0,2.5);
3652     rightofzp->GetYaxis()->SetTitle("#deltaJZB ratio");
3653     rightofzp->Draw();
3654 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3655 fronga 1.40 rightofsb->Divide(rightsfzp);
3656     rightsfsb->Divide(rightsfzp);
3657     rightofsb->Draw("same");
3658     rightsfsb->Draw("same");
3659     }
3660 buchmann 1.1
3661 fronga 1.40 TLine *top2 = new TLine(0.0,1.0+linepos,binning[binning.size()-1],1.0+linepos);
3662     TLine *center2 = new TLine(0.0,1.0,binning[binning.size()-1],1.0);
3663     TLine *bottom2 = new TLine(0.0,1.0-linepos,binning[binning.size()-1],1.0-linepos);
3664    
3665     top2->SetLineColor(kBlue);top2->SetLineStyle(2);
3666     bottom2->SetLineColor(kBlue);bottom2->SetLineStyle(2);
3667     center2->SetLineColor(kBlue);
3668    
3669     top2->Draw("same");
3670     center2->Draw("same");
3671     bottom2->Draw("same");
3672 buchmann 1.1
3673 fronga 1.40 rightofzp->SetMarkerStyle(21);
3674 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3675 fronga 1.40 rightofsb->SetMarkerStyle(24);
3676     rightsfsb->SetMarkerStyle(32);
3677     }
3678 buchmann 1.1
3679 fronga 1.40 TLegend *leg3 = make_legend("MC t#bar{t}",0.55,0.75,false);
3680     leg3->AddEntry(rightofzp,"OFZP / SFZP","ple");
3681 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3682 fronga 1.40 leg3->AddEntry(rightsfsb,"SFSB / SFZP","ple");
3683     leg3->AddEntry(rightofsb,"OFSB / SFZP","ple");
3684     }
3685     leg3->AddEntry(bottom,"syst. envelope","l");
3686     leg3->SetX1(0.25);leg3->SetX2(0.6);
3687     leg3->SetY1(0.65);
3688 buchmann 1.1
3689 fronga 1.40 leg3->Draw("same");
3690 buchmann 1.1
3691 fronga 1.40 DrawMCPrelim(simulatedlumi);
3692     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison_ratio");
3693 buchmann 1.1
3694     }
3695    
3696     delete TZem;
3697     delete nTZem;
3698     delete TZeemm;
3699     delete nTZeemm;
3700 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3701 buchmann 1.1 delete TSem;
3702     delete nTSem;
3703     delete TSeemm;
3704     delete nTSeemm;
3705     }
3706    
3707     delete tcan;
3708     cutWeight=weightbackup;
3709 buchmann 1.65 switch_overunderflow(false);
3710 buchmann 1.1 }
3711    
3712     void ttbar_sidebands_comparison(string mcjzb, vector<float> jzb_binning) {
3713     vector<float> nicer_binning;
3714 buchmann 1.32
3715 buchmann 1.33 /* nicer_binning.push_back(-400);
3716 buchmann 1.31 nicer_binning.push_back(-250);
3717     nicer_binning.push_back(-200);
3718     nicer_binning.push_back(-150);
3719     nicer_binning.push_back(-100);
3720     nicer_binning.push_back(-50);
3721     nicer_binning.push_back(-20);
3722    
3723     nicer_binning.push_back(0);
3724     nicer_binning.push_back(20);
3725     nicer_binning.push_back(50);
3726     nicer_binning.push_back(100);
3727     nicer_binning.push_back(150);
3728     nicer_binning.push_back(200);
3729     nicer_binning.push_back(250);
3730 buchmann 1.33 nicer_binning.push_back(400);*/
3731    
3732 buchmann 1.1 nicer_binning.push_back(-100);
3733     nicer_binning.push_back(-50);
3734     nicer_binning.push_back(-25);
3735     nicer_binning.push_back(0);
3736     nicer_binning.push_back(25);
3737     nicer_binning.push_back(50);
3738     nicer_binning.push_back(75);
3739     nicer_binning.push_back(100);
3740     nicer_binning.push_back(125);
3741     nicer_binning.push_back(150);
3742 fronga 1.40 //nicer_binning.push_back(175);
3743 buchmann 1.1 nicer_binning.push_back(200);
3744 buchmann 1.66 // nicer_binning.push_back(250);
3745     // nicer_binning.push_back(300);
3746     // nicer_binning.push_back(400);
3747 buchmann 1.33
3748 buchmann 1.1 ttbar_sidebands_comparison(mcjzb,nicer_binning, "ttbar/");
3749     }
3750    
3751    
3752 buchmann 1.70 void zjets_prediction_comparison(string mcjzbWithPUa, TCut massregioncut, string massregionname) {
3753 buchmann 1.66 cout << "****************************************************************************************************************************************************************" << endl;
3754 buchmann 1.20 TCanvas *zcan = new TCanvas("zcan","zcan");
3755 buchmann 1.36 // zcan->SetLogy(1);
3756 buchmann 1.20 TCut weightbackup=cutWeight;
3757 buchmann 1.36
3758 buchmann 1.66 bool UsePURW=true;
3759 buchmann 1.36
3760    
3761     string mcjzb;
3762     if(UsePURW) {
3763     mcjzb=mcjzbWithPUa;
3764 buchmann 1.66 cout << "Using PURW peak positions" << endl;
3765 buchmann 1.36 } else {
3766     // Do it without PU re-weighting
3767 buchmann 1.66 cutWeight="1.0";
3768 buchmann 1.36 float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
3769     stringstream resultsNoPU;
3770     stringstream noPUdatajzb;
3771     stringstream noPUmcjzb;
3772    
3773     find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,false,noPUdatajzb,noPUmcjzb);
3774     dout << "The peak corrected JZB expression for MC without pileup is : " << noPUmcjzb.str() << endl;
3775    
3776     mcjzb = noPUmcjzb.str();
3777    
3778     }
3779 buchmann 1.34
3780 buchmann 1.25
3781     vector<float> binning;
3782     binning.push_back(0);
3783 buchmann 1.33 binning.push_back(10);
3784 buchmann 1.34 binning.push_back(20);
3785     binning.push_back(40);
3786 fronga 1.40 binning.push_back(60);
3787 buchmann 1.36 // binning.push_back(50);
3788     // binning.push_back(60);
3789     // binning.push_back(70);
3790     // binning.push_back(80);
3791     // binning.push_back(90);
3792 buchmann 1.25 binning.push_back(100);
3793 buchmann 1.36
3794 buchmann 1.1 float simulatedlumi = luminosity;//in pb please - adjust to your likings
3795    
3796     TCut kPos((mcjzb+">0").c_str());
3797     TCut kNeg((mcjzb+"<0").c_str());
3798     string var( "abs("+mcjzb+")" );
3799 buchmann 1.36
3800     TCut notTau("abs(genMID1)!=15");
3801 buchmann 1.66 TCut ee_mm_tautau("mll>0");
3802 buchmann 1.36
3803 buchmann 1.1
3804 buchmann 1.70 TH1F *hJZBpos = systsamples.Draw("hJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3805     TH1F *hJZBneg = systsamples.Draw("hJZBneg",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3806 buchmann 1.36
3807 buchmann 1.1 hJZBpos->SetLineColor(kBlack);
3808     hJZBneg->SetLineColor(kRed);
3809    
3810 buchmann 1.25 hJZBpos->SetMinimum(1.0);
3811 buchmann 1.1 hJZBpos->Draw("e1");
3812     hJZBneg->Draw("same,hist");
3813     hJZBpos->Draw("same,e1"); // So it's on top...
3814    
3815 buchmann 1.36 TLegend *leg = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.55,0.75,false);
3816 buchmann 1.1 leg->AddEntry(hJZBpos,"Observed","pe");
3817     leg->AddEntry(hJZBneg,"Predicted","l");
3818     leg->Draw("same");
3819     DrawMCPrelim(simulatedlumi);
3820 buchmann 1.70 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction"+any2string(massregionname));
3821 buchmann 1.1
3822     TH1F* hratio = (TH1F*)hJZBpos->Clone("hratio");
3823     hratio->Divide(hJZBneg);
3824    
3825 buchmann 1.30 for(int i=1;i<=hJZBpos->GetNbinsX();i++) {
3826 buchmann 1.36 cout << "Positive: " << hJZBpos->GetBinContent(i) << " vs Negative : " << hJZBneg->GetBinContent(i) << " (ratio : " << hJZBpos->GetBinContent(i) / hJZBneg->GetBinContent(i) << endl;
3827 buchmann 1.30 }
3828    
3829 buchmann 1.70 // zcan->SetLogy(0);
3830 buchmann 1.66 hratio->GetYaxis()->SetRangeUser(0,2.5);
3831 buchmann 1.1 hratio->GetYaxis()->SetTitle("Observed/Predicted");
3832     hratio->Draw("e1");
3833    
3834 buchmann 1.25 TLine *top = new TLine(binning[0],1.25,binning[binning.size()-1],1.25);
3835     TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
3836     TLine *bottom = new TLine(binning[0],0.75,binning[binning.size()-1],0.75);
3837 buchmann 1.1
3838    
3839     top->SetLineColor(kBlue);top->SetLineStyle(2);
3840     bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
3841     center->SetLineColor(kBlue);
3842    
3843     top->Draw("same");
3844     center->Draw("same");
3845     bottom->Draw("same");
3846    
3847 buchmann 1.36 TLegend *leg2 = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.25,0.75,false);
3848 buchmann 1.1 leg2->AddEntry(hratio,"obs / pred","pe");
3849     leg2->AddEntry(bottom,"syst. envelope","l");
3850     leg2->Draw("same");
3851     DrawMCPrelim(simulatedlumi);
3852 buchmann 1.70 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction_ratio"+any2string(massregionname));
3853 buchmann 1.36
3854     TCut reducedNJets(cutnJets);
3855    
3856 buchmann 1.70 TH1F *TAUhJZBpos = systsamples.Draw("TAUhJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3857     TH1F *LcorrJZBeemm = systsamples.Draw("LcorrJZBeemm",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3858     TH1F *RcorrJZBem = systsamples.Draw("RcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3859     TH1F *LcorrJZBem = systsamples.Draw("LcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3860 buchmann 1.36
3861     TH1F *RcorrJZBSBem;
3862     TH1F *LcorrJZBSBem;
3863     TH1F *RcorrJZBSBeemm;
3864     TH1F *LcorrJZBSBeemm;
3865    
3866 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3867 buchmann 1.70 RcorrJZBSBem = systsamples.Draw("RcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3868     LcorrJZBSBem = systsamples.Draw("LcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3869     RcorrJZBSBeemm = systsamples.Draw("RcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kPos&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3870     LcorrJZBSBeemm = systsamples.Draw("LcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ee_mm_tautau&&kNeg&&massregioncut,mc,simulatedlumi,systsamples.FindSample("/DY"));
3871 buchmann 1.36 }
3872    
3873     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
3874 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3875 buchmann 1.36 Bpred->Add(RcorrJZBem,1.0/3.);
3876     Bpred->Add(LcorrJZBem,-1.0/3.);
3877     Bpred->Add(RcorrJZBSBem,1.0/3.);
3878     Bpred->Add(LcorrJZBSBem,-1.0/3.);
3879     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
3880     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
3881     } else {
3882     Bpred->Add(RcorrJZBem,1.0);
3883     Bpred->Add(LcorrJZBem,-1.0);
3884     }
3885    
3886     Bpred->SetLineColor(kRed);
3887    
3888     TAUhJZBpos->SetLineColor(kBlack);
3889     Bpred->SetLineColor(kRed);
3890    
3891     TAUhJZBpos->SetMinimum(1.0);
3892     TAUhJZBpos->Draw("e1");
3893     Bpred->Draw("same,hist");
3894     TAUhJZBpos->Draw("same,e1");
3895    
3896     TLegend *TAUleg = make_legend("MC Z+jets #rightarrow ee,#mu#mu,#tau#tau",0.55,0.75,false);
3897     TAUleg->AddEntry(TAUhJZBpos,"Observed","pe");
3898     TAUleg->AddEntry(Bpred,"Predicted","l");
3899     TAUleg->Draw("same");
3900     DrawMCPrelim(simulatedlumi);
3901 buchmann 1.70 CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction__"+any2string(massregionname));
3902 buchmann 1.36
3903     TH1F* TAUhratio = (TH1F*)TAUhJZBpos->Clone("TAUhratio");
3904     TAUhratio->Divide(Bpred);
3905    
3906     for(int i=1;i<=TAUhJZBpos->GetNbinsX();i++) {
3907     cout << "ee/mm/tautau observed: " << TAUhJZBpos->GetBinContent(i) << " vs predicted : " << Bpred->GetBinContent(i) << " (ratio : " << TAUhJZBpos->GetBinContent(i) / Bpred->GetBinContent(i) << endl;
3908     }
3909    
3910     zcan->SetLogy(0);
3911     TAUhratio->GetYaxis()->SetRangeUser(0,2.5);
3912     TAUhratio->GetYaxis()->SetTitle("Observed/Predicted");
3913     TAUhratio->Draw("e1");
3914    
3915     top->Draw("same");
3916     center->Draw("same");
3917     bottom->Draw("same");
3918    
3919 buchmann 1.66 TLegend *TAUleg2 = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.25,0.75,false);
3920 buchmann 1.36 TAUleg2->AddEntry(TAUhratio,"obs / pred","pe");
3921     TAUleg2->AddEntry(bottom,"syst. envelope","l");
3922     TAUleg2->Draw("same");
3923     DrawMCPrelim(simulatedlumi);
3924 buchmann 1.70 CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction_ratio"+any2string(massregionname));
3925 buchmann 1.36
3926     delete Bpred;
3927     delete TAUhJZBpos;
3928     delete LcorrJZBeemm;
3929     delete RcorrJZBem;
3930     delete LcorrJZBem;
3931 buchmann 1.70 delete hJZBpos;
3932     delete hJZBneg;
3933 buchmann 1.36
3934 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
3935 buchmann 1.36 delete RcorrJZBSBem;
3936     delete LcorrJZBSBem;
3937     delete RcorrJZBSBeemm;
3938     delete LcorrJZBSBeemm;
3939     }
3940    
3941 buchmann 1.1
3942     delete zcan;
3943     cutWeight=weightbackup;
3944     }
3945    
3946    
3947 buchmann 1.70 void zjets_prediction_comparison(string mcjzbWithPUa) {
3948     zjets_prediction_comparison(mcjzbWithPUa, TCut(""), "nomasscut");
3949     zjets_prediction_comparison(mcjzbWithPUa, TCut("abs(mll-91)<20"), "Zwindow_20");
3950     zjets_prediction_comparison(mcjzbWithPUa, TCut("mll>20&&mll<70"), "LowMassRegion2070");
3951     zjets_prediction_comparison(mcjzbWithPUa, TCut("mll>110"), "HighMassRegion110");
3952     }
3953    
3954 buchmann 1.1 void sideband_assessment(string datajzb, float min=30.0, float max=50.0) {
3955     tout << endl << endl;
3956     stringstream bordercut;
3957     bordercut << "(TMath::Abs(" << datajzb << ")<" << max << ")&&(TMath::Abs(" << datajzb << ")>" << min << ")";
3958     tout << bordercut.str().c_str() << endl;
3959     TH1F *ofsb = allsamples.Draw("ofsb",datajzb,100, 0,100, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
3960     TH1F *ofzp = allsamples.Draw("ofzp",datajzb,100, 0,100, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
3961     float OFSB = ofsb->Integral();
3962     float OFZP = ofzp->Integral();
3963    
3964     tout << "\\begin{table}[hbtp]" << endl;
3965     tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
3966     tout << "\\begin{center}" << endl;
3967     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;
3968     tout << "\\begin{tabular}{l|cc}" << endl;
3969     tout << "\\hline" << endl;
3970     tout << "& {\\OFZP} & {\\OFSB} \\\\\\hline" << endl;
3971 buchmann 1.25 tout << "\\#(events) & "<<OFZP<<" & "<<OFSB<<"\\\\ \\hline" << endl;
3972 buchmann 1.1 tout << "\\end{tabular}" << endl;
3973     tout << "\\end{center}" << endl;
3974     tout << "\\end{table}" << endl;
3975    
3976    
3977     }
3978    
3979     void make_table(samplecollection &coll, string jzbexpr, bool is_data, vector<float> jzb_cuts, string subselection="none") {
3980    
3981     vector<float> jzbcutprediction;
3982     vector<float> metcutprediction;
3983    
3984     vector<float> jzbcutobservation;
3985     vector<float> metcutobservation;
3986    
3987     TCanvas *cannie = new TCanvas("cannie","cannie");
3988    
3989 buchmann 1.16 for(int icut=0;icut<(int)jzb_cuts.size();icut++) {
3990 buchmann 1.1 float currcut=jzb_cuts[icut];
3991     int nbins=1;float low=currcut;
3992     vector<int> mysample;
3993     if(subselection!="none") mysample=coll.FindSample(subselection);
3994     TH1F *RcorrJZBeemm = coll.Draw("RcorrJZBeemm",jzbexpr,1,currcut,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3995     TH1F *LcorrJZBeemm = coll.Draw("LcorrJZBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3996     TH1F *RcorrJZBem = coll.Draw("RcorrJZBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3997     TH1F *LcorrJZBem = coll.Draw("LcorrJZBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3998    
3999     TH1F *RcorrJZBSBem;
4000     TH1F *LcorrJZBSBem;
4001     TH1F *RcorrJZBSBeemm;
4002     TH1F *LcorrJZBSBeemm;
4003    
4004 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4005 buchmann 1.1 RcorrJZBSBem = coll.Draw("RcorrJZBSBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4006     LcorrJZBSBem = coll.Draw("LcorrJZBSBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4007     RcorrJZBSBeemm = coll.Draw("RcorrJZBSBeemm",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4008     LcorrJZBSBeemm = coll.Draw("LcorrJZBSBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4009     }
4010    
4011     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
4012 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4013 buchmann 1.1 Bpred->Add(RcorrJZBem,1.0/3.);
4014     Bpred->Add(LcorrJZBem,-1.0/3.);
4015     Bpred->Add(RcorrJZBSBem,1.0/3.);
4016     Bpred->Add(LcorrJZBSBem,-1.0/3.);
4017     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
4018     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
4019     } else {
4020     Bpred->Add(RcorrJZBem,1.0);
4021     Bpred->Add(LcorrJZBem,-1.0);
4022     }
4023    
4024     jzbcutobservation.push_back(RcorrJZBeemm->Integral());
4025     jzbcutprediction.push_back(Bpred->Integral());
4026    
4027     delete RcorrJZBeemm;
4028     delete LcorrJZBeemm;
4029     delete RcorrJZBem;
4030     delete LcorrJZBem;
4031     delete RcorrJZBSBem;
4032     delete LcorrJZBSBem;
4033     delete RcorrJZBSBeemm;
4034     delete LcorrJZBSBeemm;
4035    
4036     TH1F *MetObs = coll.Draw("MetObs",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
4037     TH1F *MetPred = coll.Draw("MetPred",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
4038    
4039     metcutobservation.push_back(MetObs->Integral());
4040     metcutprediction.push_back(MetPred->Integral());
4041     delete MetObs;
4042     delete MetPred;
4043     }//end of cut loop
4044    
4045     //prediction part
4046     if(is_data) cout << "Data prediction & ";
4047     if(subselection!="none") cout << subselection << " prediction &";
4048 buchmann 1.16 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutprediction[ij] << " vs " << metcutprediction[ij] << " & ";
4049 buchmann 1.1
4050     cout << endl;
4051     //observation part
4052     if(is_data) cout << "Data observation & ";
4053     if(subselection!="none") cout << subselection << " observation &";
4054 buchmann 1.16 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutobservation[ij] << " vs " << metcutobservation[ij] << " & ";
4055 buchmann 1.1 cout << endl;
4056     cout << "_________________________________________________________________" << endl;
4057     delete cannie;
4058     }
4059    
4060     void met_jzb_cut(string datajzb, string mcjzb, vector<float> jzb_cut) {
4061 buchmann 1.79 cout << "You probably don't want --met, you want --metplots ... " << endl;
4062     assert(0);
4063 buchmann 1.1 /*we want a table like this:
4064     __________________ 50 | 100 | ...
4065     | Data prediction | a vs b | a vs b | ...
4066     | Data observed | a vs b | a vs b | ...
4067     --------------------------------------
4068     --------------------------------------
4069     | LM4 prediction | a vs b | a vs b | ...
4070     | LM4 observed | a vs b | a vs b | ...
4071     | LM8 prediction | a vs b | a vs b | ...
4072     | LM8 observed | a vs b | a vs b | ...
4073    
4074     where a is the result for a jzb cut at X, and b is the result for a met cut at X
4075     */
4076     make_table(allsamples,datajzb, true,jzb_cut,"none");
4077     make_table(signalsamples,mcjzb, false,jzb_cut,"LM4");
4078     make_table(signalsamples,mcjzb, false,jzb_cut,"LM8");
4079     }
4080    
4081    
4082     //________________________________________________________________________________________
4083     // JZB Efficiency plot (efficiency of passing reco. JZB cut as function of generator JZB cut)
4084     void JZBSelEff(string mcjzb, TTree* events, string informalname, vector<float> jzb_bins) {
4085    
4086     float min = 0, max = 400;
4087     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};
4088     int nbins = sizeof(xbins)/sizeof(float)-1;
4089     int markers[] = { 20, 26, 21, 24, 22, 25, 28 };
4090    
4091 buchmann 1.14
4092     TH1F* heff = new TH1F("heff", "JZB eff ; generator JZB [GeV]; efficiency",nbins,xbins);
4093     TH1F* hgen = new TH1F("hgen", "JZB gen ; generator JZB [GeV]; efficiency",nbins,xbins);
4094     TH1F* hreco = new TH1F("hreco","JZB reco ; generator JZB [GeV]; efficiency",nbins,xbins);
4095 buchmann 1.1
4096     TCut kgen(genMassCut&&"genZPt>0&&genNjets>2&&abs(genMID)==23"&&cutOSSF);
4097     TCut kreco(cutmass);
4098    
4099     TF1* func = new TF1("func","0.5*[2]*(TMath::Erf((x-[1])/[0])+1)",min,max);
4100     func->SetParNames("epsilon","x_{1/2}","sigma");
4101     func->SetParameter(0,50.);
4102     func->SetParameter(1,0.);
4103     func->SetParameter(2,1.);
4104     gStyle->SetOptStat(0);
4105     gStyle->SetOptFit(0);
4106    
4107     TCanvas *can = new TCanvas("can","Canvas for JZB Efficiency",600,600);
4108     can->SetGridx(1);
4109     can->SetGridy(1);
4110 buchmann 1.14 can->SetLeftMargin(0.16);
4111     can->SetRightMargin(0.05);
4112 buchmann 1.1 TLegend *leg = make_legend("",0.6,0.2,false,0.89,0.5);
4113 buchmann 1.14 leg->SetBorderSize(1);
4114     leg->SetLineColor(kBlack);
4115     leg->SetTextFont(62);
4116 buchmann 1.1
4117 buchmann 1.16 for ( int icut=0; icut<(int)jzb_bins.size(); ++icut ) {
4118 buchmann 1.1
4119     ostringstream selection;
4120     selection << mcjzb << ">" << jzb_bins[icut];
4121     TCut ksel(selection.str().c_str());
4122     events->Draw("genJZB>>hgen", kgen&&kreco, "goff");
4123     events->Draw("genJZB>>hreco",kgen&&kreco&&ksel,"goff");
4124    
4125     // Loop over steps to get efficiency curve
4126     for ( Int_t iBin = 0; iBin<nbins-1; ++iBin ) {
4127     Float_t eff = hreco->GetBinContent(iBin+1)/hgen->GetBinContent(iBin+1);
4128     heff->SetBinContent(iBin+1,eff);
4129     heff->SetBinError(iBin+1,TMath::Sqrt(eff*(1-eff)/hgen->GetBinContent(iBin+1)));
4130     }
4131    
4132     heff->GetXaxis()->SetRangeUser(min, max);
4133 buchmann 1.14 // heff->GetXaxis()->SetLabelSize(0.05); // paper style. overruled.
4134     // heff->GetYaxis()->SetLabelSize(0.05); // paper style. overruled.
4135     // heff->GetXaxis()->SetTitleSize(0.06); // paper style. overruled.
4136     // heff->GetYaxis()->SetTitleSize(0.06); // paper style. overruled.
4137 buchmann 1.1 heff->SetMarkerStyle(markers[icut]);
4138     heff->Fit("func","Q+","same");
4139    
4140     // Print values
4141     dout << "+++ For " << selection.str() << std::endl;
4142     for ( int i=0; i<func->GetNpar(); ++i )
4143     dout << " " << func->GetParName(i) << " " << func->GetParameter(i) << " \\pm " << func->GetParError(i) << std::endl;
4144     char hname[256]; sprintf(hname,"heff%d",icut);
4145    
4146     // Store plot
4147     TH1F* h = (TH1F*)heff->Clone(hname);
4148 buchmann 1.14 h->SetNdivisions(505,"X");
4149 buchmann 1.1 if ( icut) h->Draw("same");
4150     else h->Draw();
4151     char htitle[256]; sprintf(htitle,"JZB > %3.0f GeV", jzb_bins[icut]);
4152     leg->AddEntry(h,htitle,"p");
4153    
4154     }
4155    
4156     leg->Draw();
4157     DrawMCPrelim(0.0);
4158     CompleteSave(can, "Systematics/jzb_efficiency_curve"+informalname );
4159    
4160     delete hgen;
4161     delete hreco;
4162     delete heff;
4163     }
4164    
4165     //________________________________________________________________________________________
4166     // Calls the above function for each signal sample
4167     void plot_jzb_sel_eff(string mcjzb, samplecollection &signalsamples, vector<float> bins )
4168     {
4169 buchmann 1.16 for (int isignal=0; isignal<(int)signalsamples.collection.size();isignal++) {
4170 buchmann 1.1 dout << "JZB selection efficiency curve: " << std::endl;
4171     JZBSelEff(mcjzb,(signalsamples.collection)[isignal].events,(signalsamples.collection)[isignal].samplename,bins); // Only for some selected samples
4172     }
4173     }
4174 buchmann 1.3
4175     void qcd_plots(string datajzb, string mcjzb, vector<float> bins) {
4176     // What this function aims to do:
4177     // Illustrate cut flow for QCD (requiring only one lepton, requiring etc.)
4178     // 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.
4179     TCanvas *can = new TCanvas("can","can");
4180     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
4181     kinpad->cd();
4182    
4183     string jzb=mcjzb;
4184    
4185     float hi=400;
4186     bool use_signal=false;
4187     bool use_data=false;
4188    
4189     bool is_data=false;
4190     int nbins=50;//100;
4191     float low=0;
4192     float high=500;
4193     int versok=false;
4194     if(gROOT->GetVersionInt()>=53000) versok=true;
4195    
4196     TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
4197     TH1F *RcorrJZBeemm = qcdsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4198     TH1F *LcorrJZBeemm = qcdsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4199     TH1F *RcorrJZBem = qcdsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4200     TH1F *LcorrJZBem = qcdsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4201     blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
4202     blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
4203     blankback->GetXaxis()->CenterTitle();
4204     blankback->GetYaxis()->CenterTitle();
4205    
4206     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
4207     TH1F *RcorrJZBSBem;
4208     TH1F *LcorrJZBSBem;
4209     TH1F *RcorrJZBSBeemm;
4210     TH1F *LcorrJZBSBeemm;
4211    
4212 buchmann 1.16 // TH1F *RcorrJZBeemmNoS;
4213 buchmann 1.3
4214     //these are for the ratio
4215     TH1F *JRcorrJZBeemm = qcdsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4216     TH1F *JLcorrJZBeemm = qcdsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4217     TH1F *JRcorrJZBem = qcdsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4218     TH1F *JLcorrJZBem = qcdsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4219    
4220     TH1F *JRcorrJZBSBem;
4221     TH1F *JLcorrJZBSBem;
4222     TH1F *JRcorrJZBSBeemm;
4223     TH1F *JLcorrJZBSBeemm;
4224    
4225 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4226 buchmann 1.3 RcorrJZBSBem = qcdsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4227     LcorrJZBSBem = qcdsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4228     RcorrJZBSBeemm = qcdsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4229     LcorrJZBSBeemm = qcdsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4230    
4231     //these are for the ratio
4232     JRcorrJZBSBem = qcdsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4233     JLcorrJZBSBem = qcdsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
4234     JRcorrJZBSBeemm = qcdsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4235     JLcorrJZBSBeemm = qcdsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
4236    
4237     }
4238    
4239     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
4240    
4241     TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
4242     TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
4243    
4244     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
4245     TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
4246 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4247 buchmann 1.3 Bpred->Add(RcorrJZBem,1.0/3.);
4248     Bpred->Add(LcorrJZBem,-1.0/3.);
4249     Bpred->Add(RcorrJZBSBem,1.0/3.);
4250     Bpred->Add(LcorrJZBSBem,-1.0/3.);
4251     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
4252     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
4253    
4254     TTbarpred->Scale(1.0/3);
4255     Zjetspred->Add(LcorrJZBem,-1.0/3.);
4256     Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
4257     TTbarpred->Add(RcorrJZBSBem,1.0/3.);
4258     Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
4259     TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
4260    
4261     //these are for the ratio
4262     JBpred->Add(JRcorrJZBem,1.0/3.);
4263     JBpred->Add(JLcorrJZBem,-1.0/3.);
4264     JBpred->Add(JRcorrJZBSBem,1.0/3.);
4265     JBpred->Add(JLcorrJZBSBem,-1.0/3.);
4266     JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
4267     JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
4268     } else {
4269     Bpred->Add(RcorrJZBem,1.0);
4270     Bpred->Add(LcorrJZBem,-1.0);
4271    
4272     Zjetspred->Add(LcorrJZBem,-1.0);
4273    
4274     //these are for the ratio
4275     JBpred->Add(JRcorrJZBem,1.0);
4276     JBpred->Add(JLcorrJZBem,-1.0);
4277     }
4278    
4279    
4280     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
4281 buchmann 1.1
4282 buchmann 1.3 TLegend *legBpred = make_legend("",0.6,0.55,false);
4283     RcorrJZBeemm->Draw("e1x0,same");
4284     Bpred->Draw("hist,same");
4285     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
4286     legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
4287     legBpred->AddEntry(Bpred,"MC predicted","l");
4288     if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
4289     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
4290     legBpred->Draw();
4291     DrawMCPrelim();
4292    
4293     //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
4294     string ytitle("ratio");
4295     if ( use_data==1 ) ytitle = "data/pred";
4296 buchmann 1.79 Save_With_Ratio(JRcorrJZBeemm,JBpred,kinpad,"QCD/Bpred",true,false,ytitle);
4297     delete kinpad;
4298 buchmann 1.3
4299     TH1F *allevents = qcdsamples.Draw("allevents","pfJetGoodNum",1,0,100, "internal code", "events", "" ,mc, luminosity);
4300     TH1F *ossf = qcdsamples.Draw("ossf","pfJetGoodNum",1,0,100, "internal code", "events", cutOSSF ,mc, luminosity);
4301     TH1F *osof = qcdsamples.Draw("osof","pfJetGoodNum",1,0,100, "internal code", "events", cutOSOF ,mc, luminosity);
4302     TH1F *njossf = qcdsamples.Draw("njossf","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSSF ,mc, luminosity);
4303     TH1F *njosof = qcdsamples.Draw("njosof","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSOF ,mc, luminosity);
4304    
4305     dout << "______________________________________________" << endl;
4306     dout << "QCD contribution: " << endl;
4307     dout << "Total number of events: " << allevents->Integral() << endl;
4308     dout << "OSSF events: " << ossf->Integral() << endl;
4309     dout << "OSOF events: " << osof->Integral() << endl;
4310     dout << "OSSF events with >=3 jets:" << njossf->Integral() << endl;
4311     dout << "OSOF events with >=3 jets:" << njosof->Integral() << endl;
4312     dout << "(note that no mass requirement has been imposed)" << endl;
4313    
4314     dout << "______________________________________________" << endl;
4315     dout << "How QCD shows up in the different regions: " << endl;
4316     dout << "OSSF: " << endl;
4317 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4318 buchmann 1.3 dout << " Z window: \t" << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
4319     dout << " sideband: \t" << RcorrJZBSBeemm->Integral() << " (JZB>0) , " << LcorrJZBSBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBSBeemm->Integral() + LcorrJZBSBeemm->Integral() << endl;
4320     } else {
4321     dout << " " << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
4322     }
4323     dout << "OSOF: " << endl;
4324 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4325 buchmann 1.3 dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
4326     dout << " sideband: \t" << RcorrJZBSBem->Integral() << " (JZB>0) , " << LcorrJZBSBem->Integral() << " (JZB<0) --> total: " << RcorrJZBSBem->Integral() + LcorrJZBSBem->Integral() << endl;
4327     } else {
4328     dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
4329     }
4330     dout << "Therefore: " << endl;
4331 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4332 buchmann 1.3 dout << " Prediction increases by : " << LcorrJZBeemm->Integral() << " + (1.0/3)*(" << RcorrJZBSBeemm->Integral() <<"-"<< LcorrJZBSBeemm->Integral() << ") (SFSB) ";
4333     dout << " + (1.0/3)*(" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
4334     dout << " + (1.0/3)*(" << RcorrJZBSBem->Integral() <<"-"<< LcorrJZBSBem->Integral() << ") (OFSB) ";
4335     dout << " = " << LcorrJZBeemm->Integral() + (1.0/3)*(RcorrJZBSBeemm->Integral() - LcorrJZBSBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() + RcorrJZBSBem->Integral() - LcorrJZBSBem->Integral()) << endl;
4336     } else {
4337     dout << " Prediction increases by : " << LcorrJZBeemm->Integral();
4338     dout << " + (" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
4339     dout << " = " << LcorrJZBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() << endl;
4340     }
4341     dout << " Observation increases by : " << RcorrJZBeemm->Integral() << endl;
4342    
4343     dout << endl;
4344 buchmann 1.16 for(int i=0;i<(int)bins.size();i++) {
4345 buchmann 1.3 dout << " JZB > " << bins[i] << " : " << endl;
4346     dout << " Observation increases by : " << RcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
4347 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB) {
4348 buchmann 1.3 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;
4349     } else {
4350     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;
4351     }
4352     }
4353    
4354     delete can;
4355     delete allevents;
4356     if(ossf) delete ossf;
4357     if(RcorrJZBem) delete RcorrJZBem;
4358     if(LcorrJZBem) delete LcorrJZBem;
4359     if(RcorrJZBeemm) delete RcorrJZBeemm;
4360     if(LcorrJZBeemm) delete LcorrJZBeemm;
4361 buchmann 1.50 if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&RcorrJZBSBem) delete RcorrJZBSBem;
4362     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&LcorrJZBSBem) delete LcorrJZBSBem;
4363     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&RcorrJZBSBeemm) delete RcorrJZBSBeemm;
4364     if(PlottingSetup::RestrictToMassPeak&&PlottingSetup::UseSidebandsForcJZB&&LcorrJZBSBeemm) delete LcorrJZBSBeemm;
4365 buchmann 1.3 }
4366 buchmann 1.1
4367 buchmann 1.4 void check_ptsanity() {
4368     TCanvas *ptsancan = new TCanvas("ptsancan","ptsancan",600,1800);
4369     TH1F *individualpt1histos[allsamples.collection.size()];
4370     TH1F *individualpt2histos[allsamples.collection.size()];
4371     TH1F *fpt1 = new TH1F("fpt1","fpt1",50,0,50);
4372     fpt1->GetYaxis()->SetRangeUser(0,1);
4373     fpt1->GetXaxis()->SetTitle("p_{T,1}");
4374     fpt1->GetXaxis()->CenterTitle();
4375    
4376     TH1F *fpt2 = new TH1F("fpt2","fpt2",50,0,50);
4377     fpt2->GetXaxis()->SetTitle("p_{T,2}");
4378     fpt2->GetXaxis()->CenterTitle();
4379    
4380     ptsancan->Divide(1,3);
4381     ptsancan->cd(1);
4382     float maxpt1entry=0;
4383     float maxpt2entry=0;
4384    
4385     TLegend *leg = make_legend();
4386     leg->SetX1(0.0);
4387     leg->SetY1(0.0);
4388     leg->SetX2(1.0);
4389     leg->SetY2(1.0);
4390    
4391    
4392 buchmann 1.16 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
4393 buchmann 1.4 string nowname=(allsamples.collection)[isample].filename;
4394     cout << "Drawing: " << nowname << " (sample " << isample+1 << " / " << allsamples.collection.size() << ")" << endl;
4395     individualpt1histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt1",50,0,50, "p_{T,1}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
4396     individualpt2histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt2",50,0,50, "p_{T,2}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
4397     individualpt1histos[isample]->SetLineColor(isample+1);
4398     individualpt2histos[isample]->SetLineColor(isample+1);
4399     float currmaxpt1entry=individualpt1histos[isample]->GetMaximum()/individualpt1histos[isample]->Integral();
4400     float currmaxpt2entry=individualpt2histos[isample]->GetMaximum()/individualpt2histos[isample]->Integral();
4401     cout << " pt 1 histo contains; " << individualpt1histos[isample]->Integral() << endl;
4402     cout << " pt 2 histo contains; " << individualpt2histos[isample]->Integral() << endl;
4403     if(currmaxpt1entry>maxpt1entry)maxpt1entry=currmaxpt1entry;
4404     if(currmaxpt2entry>maxpt2entry)maxpt2entry=currmaxpt2entry;
4405     leg->AddEntry(individualpt2histos[isample],((allsamples.collection)[isample].filename).c_str(),"f");
4406     }
4407    
4408     fpt1->GetYaxis()->SetRangeUser(0,maxpt1entry);
4409     fpt2->GetYaxis()->SetRangeUser(0,maxpt2entry);
4410    
4411     ptsancan->cd(1);
4412     fpt1->Draw();
4413     ptsancan->cd(2);
4414     fpt2->Draw();
4415    
4416 buchmann 1.16 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
4417 buchmann 1.4 ptsancan->cd(1);
4418     individualpt1histos[isample]->DrawNormalized("same,histo");
4419     ptsancan->cd(2);
4420     individualpt2histos[isample]->DrawNormalized("same,histo");
4421     }
4422     ptsancan->cd(3);
4423     leg->Draw();
4424     CompleteSave(ptsancan,"PtSanityCheck");
4425    
4426     delete ptsancan;
4427     }
4428    
4429 buchmann 1.6 void do_mlls_plot(string mcjzb) {
4430     cout << "At this point we'd plot the mll distribution" << endl;
4431     TCanvas *sigcan = new TCanvas("sigcan","sigcan");
4432 buchmann 1.16 for(int isig=0;isig<(int)(signalsamples.collection).size();isig++) {
4433 buchmann 1.6 if(!(signalsamples.collection)[isig].events) continue;
4434     string nowname=(signalsamples.collection)[isig].filename;
4435     TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets,mc,luminosity,signalsamples.FindSample(nowname));
4436     // TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events","",mc,luminosity,signalsamples.FindSample(nowname));
4437     mll->SetLineColor(TColor::GetColor("#04B404"));
4438     stringstream poscutS;
4439     poscutS << "((" << mcjzb <<")>50)";
4440     TCut poscut(poscutS.str().c_str());
4441     TH1F *mllP = signalsamples.Draw("mllhistoP","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets&&poscut,mc,luminosity,signalsamples.FindSample(nowname));
4442     mllP->SetLineColor(TColor::GetColor("#0040FF"));
4443     mll->Draw("histo");
4444     mllP->Draw("histo,same");
4445     TLegend *leg = make_legend();
4446     leg->SetY1(0.8);
4447     leg->AddEntry(mll,(signalsamples.collection)[isig].samplename.c_str(),"L");
4448     leg->AddEntry(mllP,((signalsamples.collection)[isig].samplename+", JZB>50").c_str(),"L");
4449     leg->Draw();
4450     TLine *lin = new TLine(71.2,0,71.2,mll->GetMaximum());
4451     TLine *lin2 = new TLine(111.2,0,111.2,mll->GetMaximum());
4452     lin->Draw("same");
4453     lin2->Draw("same");
4454    
4455     CompleteSave(sigcan,"MllShape/"+(signalsamples.collection)[isig].samplename);
4456     delete mll;
4457     delete mllP;
4458     }
4459     }
4460    
4461 buchmann 1.47 void met_vs_jzb_plots(string datajzb, string mcjzb) {
4462 buchmann 1.9
4463     TCanvas *canmetjzb = new TCanvas("canmet","MET vs JZB canvas");
4464     canmetjzb->SetRightMargin(0.16);
4465    
4466     vector<string> findme;
4467     findme.push_back("DY");
4468     findme.push_back("TTJets");
4469     findme.push_back("LM");
4470 buchmann 1.48 /*
4471 buchmann 1.16 for(int ifind=0;ifind<(int)findme.size();ifind++) {
4472 buchmann 1.9 vector<int> selsamples = allsamples.FindSample(findme[ifind]);
4473     TH2F *metvsjzb = new TH2F("metvsjzb","metvsjzb",200,0,100,400,-100,100);
4474 buchmann 1.16 for(int isel=0;isel<(int)selsamples.size();isel++) {
4475 buchmann 1.47 dout << "Producing MET:JZB plot ... working on sample: " << allsamples.collection[selsamples[isel]].filename << endl;
4476     allsamples.collection[selsamples[isel]].events->Draw("jzb[1]:met[4]>>+metvsjzb",cutmass&&cutOSSF&&cutnJets);
4477 buchmann 1.9 }
4478     metvsjzb->Scale(allsamples.collection[selsamples[0]].weight);
4479     metvsjzb->SetStats(0);
4480     metvsjzb->GetXaxis()->SetTitle("MET (GeV)");
4481     metvsjzb->GetYaxis()->SetTitle("JZB (GeV)");
4482     metvsjzb->GetXaxis()->CenterTitle();
4483     metvsjzb->GetYaxis()->CenterTitle();
4484     metvsjzb->Draw("COLZ");
4485     TText* title = write_text(0.5,0.95,allsamples.collection[selsamples[0]].samplename);
4486     title->SetTextAlign(12);
4487     title->Draw();
4488     CompleteSave(canmetjzb,(string)"METvsJZBplots/"+findme[ifind]);
4489     }
4490 buchmann 1.48 */
4491 buchmann 1.47
4492     dout << "About to produce MET plot for DY split up by JZB" << endl;
4493    
4494     int nbins=14;
4495     float low=0;
4496     float high=140;
4497    
4498     stringstream sLEFT;
4499     sLEFT << "((" << mcjzb << ")<0)";
4500     TCut LEFT(sLEFT.str().c_str());
4501     stringstream sRIGHT;
4502     sRIGHT << "((" << mcjzb << ")>0)";
4503     TCut RIGHT(sRIGHT.str().c_str());
4504    
4505     TH1F *metleft = allsamples.Draw("metleft","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
4506     TH1F *metleftO = allsamples.Draw("metleftO","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
4507     TH1F *metright = allsamples.Draw("metright","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
4508     TH1F *metrightO = allsamples.Draw("metrightO","met[4]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
4509    
4510 buchmann 1.48
4511     TH1F *Bpred = (TH1F*)metleft->Clone("Bpred");
4512     Bpred->Add(metleftO,-1);
4513     Bpred->Add(metrightO);
4514     TH1F *obs = (TH1F*)metright->Clone("obs");
4515    
4516 buchmann 1.47 metleft->Add(metleftO,-1);
4517     metright->Add(metrightO,-1);
4518    
4519     metleft->SetLineColor(kRed);
4520     metright->SetLineColor(kBlack);
4521     TPad *metpad = new TPad("metpad","metpad",0,0,1,1);
4522     metpad->cd();
4523     metpad->SetLogy(1);
4524     metleft->Draw("histo");
4525     metright->Draw("same");
4526     TLegend *lg = make_legend();
4527     lg->SetX1(0.5);
4528 buchmann 1.48 lg->SetY1(0.7);
4529 buchmann 1.47 lg->AddEntry(metright,"JZB>0 (OSOF corrected)","P");
4530     lg->AddEntry(metleft,"JZB<0 (OSOF corrected)","L");
4531 buchmann 1.48 lg->SetHeader("DY");
4532    
4533 buchmann 1.47 lg->Draw();
4534 buchmann 1.79 Save_With_Ratio(metright,metleft,metpad->cd(),"METvsJZBplots/ComparingLeftToRightinMETspectrum");
4535 buchmann 1.48
4536     TPad *metpad3 = new TPad("metpad3","metpad3",0,0,1,1);
4537     metpad3->cd();
4538     metpad3->SetLogy(1);
4539     Bpred->SetLineColor(kRed);
4540     Bpred->Draw("histo");
4541     obs->SetLineColor(kBlack);
4542     obs->Draw("same");
4543     TLegend *lg2 = make_legend();
4544     lg2->SetX1(0.5);
4545     lg2->SetY1(0.7);
4546     lg2->AddEntry(obs,"observed","P");
4547     lg2->AddEntry(Bpred,"predicted","L");
4548     lg2->SetHeader("DY");
4549    
4550     lg2->Draw();
4551    
4552 buchmann 1.79 Save_With_Ratio(obs,Bpred,metpad3->cd(),"METvsJZBplots/ComparingPredObsinMET");
4553 buchmann 1.48
4554 buchmann 1.47 TPad *metpad2 = new TPad("metpad2","metpad2",0,0,1,1);
4555 buchmann 1.48 metpad2->cd();
4556     metpad2->SetLogy(1);
4557 buchmann 1.47
4558     TH1F *metlefta = allsamples.Draw("metlefta","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
4559     TH1F *metleftOa = allsamples.Draw("metleftOa","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity, allsamples.FindSample("DYJets"));
4560     TH1F *metrighta = allsamples.Draw("metrighta","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
4561     TH1F *metrightOa = allsamples.Draw("metrightOa","met[2]",nbins,low,high, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity, allsamples.FindSample("DYJets"));
4562    
4563     metlefta->Add(metleftOa,-1);
4564     metrighta->Add(metrightOa,-1);
4565    
4566     metlefta->SetLineColor(kRed);
4567     metpad2->cd();
4568     metlefta->Draw("histo");
4569     metrighta->Draw("same");
4570     lg->Draw();
4571 buchmann 1.79 Save_With_Ratio(metrighta,metlefta,metpad2->cd(),"METvsJZBplots/ComparingLeftToRightinMET_type1_spectrum");
4572 buchmann 1.47
4573 buchmann 1.48 delete Bpred;
4574     delete obs;
4575    
4576     float newhigh=300;
4577     int newNBins=30;
4578    
4579     TPad *metpad4 = new TPad("metpad4","metpad4",0,0,1,1);
4580     TH1F *Ametleft = allsamples.Draw("Ametleft","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&LEFT,mc, luminosity);
4581     TH1F *AmetleftO = allsamples.Draw("AmetleftO","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&LEFT,mc, luminosity);
4582     TH1F *Ametright = allsamples.Draw("Ametright","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSSF&&cutnJets&&RIGHT,mc, luminosity);
4583     TH1F *AmetrightO = allsamples.Draw("AmetrightO","met[4]",newNBins,low,newhigh, "MET [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&RIGHT,mc, luminosity);
4584    
4585     TH1F *aBpred = (TH1F*)Ametleft->Clone("aBpred");
4586     aBpred->Add(AmetleftO,-1);
4587     aBpred->Add(AmetrightO);
4588     aBpred->SetLineColor(kRed);
4589    
4590     TH1F *aobs = (TH1F*)Ametright->Clone("aobs");
4591     metpad4->cd();
4592     metpad4->SetLogy(1);
4593     aobs->Draw();
4594     aBpred->Draw("histo,same");
4595     aobs->Draw("same");
4596     lg->SetHeader("All MC");
4597     lg->Draw();
4598 buchmann 1.79 Save_With_Ratio(aobs,aBpred,metpad4->cd(),"METvsJZBplots/ComparingPredObsinMET_ALLSAMPLES");
4599 buchmann 1.48
4600 buchmann 1.47
4601     delete lg;
4602     delete canmetjzb;
4603     delete metleft;
4604     delete metleftO;
4605     delete metright;
4606     delete metrightO;
4607 buchmann 1.9 }
4608    
4609    
4610 buchmann 1.1 void test() {
4611    
4612     TCanvas *testcanv = new TCanvas("testcanv","testcanv");
4613     testcanv->cd();
4614 buchmann 1.33 // switch_overunderflow(true);
4615 buchmann 1.1 TH1F *ptdistr = allsamples.Draw("ptdistr","pt1",100,30,200, "p_{T} [GeV]", "events", cutOSSF,data,luminosity);
4616     switch_overunderflow(false);
4617     ptdistr->Draw();
4618     testcanv->SaveAs("test.png");
4619     dout << "HELLO there!" << endl;
4620    
4621     }