ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.80
Committed: Thu Jan 24 08:16:17 2013 UTC (12 years, 3 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.79: +120 -135 lines
Log Message:
Also updated 'save with ratio and sys band' function to not eat the supplied canvas; will commit updated Plotting_Functions soon

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