ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.51
Committed: Wed Aug 15 14:21:13 2012 UTC (12 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.50: +68 -61 lines
Log Message:
Fixed accidentally overwritten section and two special sideband cases

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