ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.70
Committed: Thu Oct 11 09:00:41 2012 UTC (12 years, 6 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.69: +128 -70 lines
Log Message:
Updated plotting functions to use the new dileptonic ttbar sample for systematics; produce zjets closure for different mass regions (20<mll<70, Z window, mll>110)

File Contents

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