ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.77
Committed: Fri Dec 14 13:24:29 2012 UTC (12 years, 4 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.76: +53 -27 lines
Log Message:
Added several plots illustrating the discussed set of systematic uncertainties on MC for the new version of the AN; also added the possibility to pass separate variables for MC and data (as is required e.g. for JZB)

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