ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.71
Committed: Wed Nov 7 10:54:34 2012 UTC (12 years, 5 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.70: +29 -15 lines
Log Message:
made data to data comparison (run comparison) clearer, with updated legends etc.

File Contents

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