ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.62
Committed: Fri Sep 7 14:41:06 2012 UTC (12 years, 7 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.61: +19 -16 lines
Log Message:
Last fixes for "new" chunk of data. Added low-mass DY.

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