ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.52
Committed: Thu Aug 16 14:30:32 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.51: +3 -1 lines
Log Message:
Added sideband option for storage (required for scans)

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