ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.60
Committed: Fri Sep 7 10:26:46 2012 UTC (12 years, 7 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.59: +9 -4 lines
Log Message:
Some fixes to the plots.

File Contents

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