ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.64
Committed: Thu Sep 13 07:35:15 2012 UTC (12 years, 7 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.63: +0 -2 lines
Log Message:
Not switching under/overflow bin on after peak finding - this is now to be done individually in each function requiring it

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