ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.40
Committed: Fri Jul 20 16:50:04 2012 UTC (12 years, 9 months ago) by fronga
Content type: text/plain
Branch: MAIN
Changes since 1.39: +238 -204 lines
Log Message:
- Implemented uncertainty on sigma of peak finder (cosmetics);
- add background prediction on mll plot in signal region;
- fine-tuning in kinematic plots;
- added signal on kinematic and comparison plots;
- implemented JES plot for OF;
- more kinematic and comparison distributions;
- response determination: use the Z peak, subtract OF;
- optimized binning for Bpred ratio.

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