ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.66
Committed: Thu Sep 13 20:32:52 2012 UTC (12 years, 7 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.65: +57 -43 lines
Log Message:
Activated PURW for DY closure test (also made sure that if it's deactivated the peak position is harmonized); unified ratios for dy closure tests; fixed legend (DY with tau legend said DY->tau tau but it's DY-> ee,mm,tautau); fixed a whole bunch of conflicts with newly introduced kin plots that would overwrite old ones; adapted ttbar closure binning (going up to 400 with limited stats is not the way to go); adapted cuts for new plots;

File Contents

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