ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.67
Committed: Fri Sep 14 10:18:31 2012 UTC (12 years, 7 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.66: +10 -9 lines
Log Message:
made drawing signal on kin plots optional; adapted y range for ttbar syst histo

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