ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/Plotting_Functions.C
Revision: 1.45
Committed: Tue Jul 31 07:16:46 2012 UTC (12 years, 9 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.44: +1 -1 lines
Log Message:
Restoring previous commit (1.40: response determination: use the Z peak)

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 fronga 1.43 TH1F* SFN = (TH1F*)LcorrJZBeemm->Clone("SFN");
200     TH1F* OFP = (TH1F*)RcorrJZBem->Clone("OFP");
201     TH1F* OFN = (TH1F*)LcorrJZBem->Clone("OFN");
202     if(PlottingSetup::RestrictToMassPeak) {
203     OFP->Scale(1.0/3.0);
204     OFP->Add(RcorrJZBSBem,1.0/3.);
205     OFP->Add(RcorrJZBSBeemm,1.0/3.);
206     OFN->Scale(1.0/3.0);
207     OFN->Add(LcorrJZBSBem,1.0/3.);
208     OFN->Add(LcorrJZBSBeemm,1.0/3.);
209     }
210    
211     TH1F* Bpred = (TH1F*)SFN->Clone("Bpred");
212     Bpred->Add(OFP);
213     Bpred->Add(OFN,-1);
214 buchmann 1.11 Bpred->SetLineColor(kRed);
215    
216 fronga 1.40 RcorrJZBeemm->SetTitleOffset(1.3,"y");
217 buchmann 1.11 RcorrJZBeemm->Draw();
218     mcRcorrJZBeemm.Draw("same");
219     Bpred->Draw("histo,same");
220     RcorrJZBeemm->Draw("same");
221    
222     TLegend *leg = allsamples.allbglegend();
223     leg->SetX1(0.58);
224     leg->AddEntry(RcorrJZBeemm,"observed (data)","l");
225     leg->AddEntry(Bpred,"predicted (data)","l");
226     leg->Draw("same");
227    
228     stringstream saveas;
229     saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold;
230     CompleteSave(ckin,saveas.str());
231 buchmann 1.34
232 fronga 1.40 // Draw all predictions overlayed
233 fronga 1.43 unsigned int w = gStyle->GetHistLineWidth()+1; // Make line a bit wider, since we dash it
234     SFN->SetLineColor(kGreen+2);
235     SFN->SetLineStyle(2);
236     SFN->SetLineWidth(w);
237     OFP->SetLineColor(kBlue+2);
238     OFP->SetLineStyle(2);
239     OFP->SetLineWidth(w);
240     OFN->SetLineColor(kMagenta+2);
241     OFN->SetLineStyle(3);
242     OFN->SetLineWidth(w);
243 buchmann 1.34
244     RcorrJZBeemm->Draw();
245 fronga 1.43 SFN->Draw("histo,same");
246     OFP->Draw("histo,same");
247     OFN->Draw("histo,same");
248 buchmann 1.34 Bpred->Draw("histo,same");
249     RcorrJZBeemm->Draw("same");
250    
251 fronga 1.40 TLegend *leg2 = make_legend("",0.52,0.7);
252     leg2->AddEntry(RcorrJZBeemm,"observed (data)","lp");
253 buchmann 1.34 leg2->AddEntry(Bpred,"predicted (data)","l");
254 fronga 1.43 leg2->AddEntry(SFN, " SF JZB<0","l");
255     leg2->AddEntry(OFN, " OF JZB<0","l");
256     leg2->AddEntry(OFP, " OF JZB>0","l");
257 buchmann 1.34 leg2->Draw("same");
258    
259     saveas.str("");
260     saveas << "kin/Mll_After_Cut/Cut_At" << jzbthreshold << "_nomc";
261     CompleteSave(ckin,saveas.str());
262    
263    
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 fronga 1.42 signalhisto->SetLineColor(kOrange);
448 fronga 1.40
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.42 kinleg->AddEntry("signalhisto",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 fronga 1.41 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,subdir+Bpredsaveas,true,false,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 fronga 1.41 if (!PlottingSetup::RestrictToMassPeak) {
1778     if(is_OF(cut)) leg = allsamples.allbglegend("Opposite flavor",datahisto);
1779     else leg = allsamples.allbglegend("Same flavor",datahisto);
1780     } else {
1781     if(is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("OFZP",datahisto);
1782     else if(!is_OF(cut) && is_ZP(cut)) leg = allsamples.allbglegend("SFZP",datahisto);
1783     else if( is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("OFSB",datahisto);
1784     else if(!is_OF(cut) && !is_ZP(cut)) leg = allsamples.allbglegend("SFSB",datahisto);
1785     else {
1786     std::cerr << "Unable to decode cut: " << cut.GetTitle() << std::endl;
1787     exit(-1);
1788     }
1789     }
1790 buchmann 1.1 leg->Draw();
1791     string write_cut = decipher_cut(cut,"");
1792     TText *writeline1 = write_cut_on_canvas(write_cut.c_str());
1793     writeline1->SetTextSize(0.035);
1794     writeline1->Draw();
1795 buchmann 1.12 if(!Contains(savename,"Dibosons")) save_with_ratio(datahisto,mcstack,jzbpad->cd(),("jzb/"+savename));
1796     else save_with_ratio(datahisto,mcstack,jzbpad->cd(),savename);
1797 buchmann 1.1 TPad *jzbpad2 = new TPad("jzbpad2","jzbpad2",0,0,1,1);
1798     jzbpad2->cd();
1799     jzbpad2->SetLogy(1);
1800     datahisto->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
1801     datahisto->SetMinimum(0.1);
1802     datahisto->SetMarkerSize(DataMarkerSize);
1803     datahisto->Draw("e1");
1804     mcstack.Draw("same");
1805     datahisto->Draw("same,e1");
1806     leg->SetHeader("");
1807     leg->Draw();
1808     writeline1->SetTextSize(0.035);
1809     writeline1->Draw();
1810     DrawPrelim();
1811 buchmann 1.12 if(!Contains(savename,"Dibosons")) save_with_ratio(datahisto,mcstack,jzbpad2->cd(),("jzb/PositiveSideOnly/"+savename+""));
1812     else save_with_ratio(datahisto,mcstack,jzbpad2->cd(),(savename+"__PosOnly"));
1813 buchmann 1.1 datahisto->Delete();
1814     mcstack.Delete();
1815     }
1816    
1817     Double_t GausR(Double_t *x, Double_t *par) {
1818     return gRandom->Gaus(x[0],par[0]);
1819     }
1820 buchmann 1.12
1821     void produce_stretched_jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1822     TCanvas *dican = new TCanvas("dican","JZB Plots Canvas");
1823     float max=jzbHigh ;
1824     float min=-120;
1825     int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
1826     int coarserbins=int(nbins/2.0);
1827     int rebinnedbins=int(nbins/4.0);
1828 buchmann 1.1
1829 buchmann 1.12 vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
1830     for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
1831     for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
1832     for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
1833    
1834     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP",dican,binning);
1835     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP",dican,binning);
1836     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_SFZP",dican,binning);
1837     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_SFZP",dican,binning);
1838     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"Dibosons/ee/jzb_OS_OFZP",dican,binning);
1839     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"Dibosons/mm/jzb_OS_OFZP",dican,binning);
1840     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB",dican,binning);
1841     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB",dican,binning);
1842    
1843     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_SFZP_coarse",dican,coarse_binning);
1844     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"Dibosons/jzb_OS_OFZP_coarse",dican,coarse_binning);
1845     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_SFSB_coarse",dican,coarse_binning);
1846     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"Dibosons/jzb_OS_OFSB_coarse",dican,coarse_binning);
1847    
1848     delete dican;
1849     }
1850    
1851    
1852     void diboson_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1853     vector<int> SamplesToBeModified = allsamples.FindSampleBySampleName("WW/WZ/ZZ");
1854    
1855     if(SamplesToBeModified.size()==0 || SamplesToBeModified[0]==-1) {
1856     write_error(__FUNCTION__,"Could not find any diboson samples - aborting diboson plots");
1857     return;
1858     }
1859    
1860     float stretchfactor = 100.0;
1861     vector<string> labels;
1862    
1863    
1864     dout << "Going to increase the cross section for diboson samples ... " << endl;
1865 buchmann 1.16 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
1866 buchmann 1.12 float origxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
1867     (allsamples.collection)[SamplesToBeModified[i]].xs=origxs*stretchfactor;
1868     dout << " Increased xs for sample " << (allsamples.collection)[SamplesToBeModified[i]].filename << " from " << origxs << " to " << (allsamples.collection)[SamplesToBeModified[i]].xs << " (by a factor of " << stretchfactor << ")" << endl;
1869     labels.push_back((allsamples.collection)[SamplesToBeModified[i]].samplename);
1870     (allsamples.collection)[SamplesToBeModified[i]].samplename=any2string(int(stretchfactor))+" x "+(allsamples.collection)[SamplesToBeModified[i]].samplename;
1871     dout << " (also renamed it to " << (allsamples.collection)[SamplesToBeModified[i]].samplename << " )" << endl;
1872     }
1873    
1874     dout << "Going to produce JZB plots" << endl;
1875 buchmann 1.13 produce_stretched_jzb_plots(mcjzb,datajzb,ratio_binning);
1876 buchmann 1.12 TCanvas *gloca = new TCanvas("gloca","gloca");
1877    
1878     dout << "Going to produce prediction plots" << endl;
1879 buchmann 1.28 do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do only MC plots, no signal
1880     do_prediction_plot(mcjzb, gloca, PlottingSetup::jzbHigh, 0, false,"Dibosons/Bpred/" ); // do MC plots with signal
1881 buchmann 1.12 delete gloca;
1882    
1883     dout << "Going to reset the cross section for diboson samples ... " << endl;
1884 buchmann 1.16 for(int i=0;i<(int)SamplesToBeModified.size();i++) {
1885 buchmann 1.12 float Upxs=(allsamples.collection)[SamplesToBeModified[i]].xs;
1886     (allsamples.collection)[SamplesToBeModified[i]].xs=(allsamples.collection)[SamplesToBeModified[i]].xs*(1.0/stretchfactor);
1887     string Upname=(allsamples.collection)[SamplesToBeModified[i]].samplename;
1888     (allsamples.collection)[SamplesToBeModified[i]].samplename=labels[i];
1889     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;
1890    
1891     }
1892    
1893     }
1894 buchmann 1.35
1895    
1896     void draw_normalized_data_vs_data_histo(TCut cut1, TCut cut2, string variable, string legentry1, string legentry2, string savename, TCanvas *can,vector<float> binning) {
1897     TPad *jzbpad = new TPad("jzbpad","jzbpad",0,0,1,1);
1898     jzbpad->cd();
1899     jzbpad->SetLogy(1);
1900     string xlabel="JZB [GeV]";
1901    
1902     TH1F *datahisto1 = allsamples.Draw("datahisto1",variable,binning, xlabel, "events",cut1,data,luminosity);
1903     datahisto1->SetLineColor(kRed);
1904     datahisto1->SetMarkerColor(kRed);
1905     TH1F *datahisto2 = allsamples.Draw("datahisto2",variable,binning, xlabel, "events",cut2,data,luminosity);
1906     datahisto2->SetLineColor(kBlue);
1907     datahisto2->SetMarkerColor(kBlue);
1908    
1909     datahisto2->SetMarkerSize(DataMarkerSize);
1910     datahisto1->DrawNormalized("e1");
1911     datahisto2->DrawNormalized("histo,same");
1912     datahisto1->DrawNormalized("same,e1");
1913    
1914     TLegend *leg = make_legend();
1915     leg->AddEntry(datahisto1,legentry1.c_str());
1916     leg->AddEntry(datahisto2,legentry2.c_str());
1917     leg->Draw();
1918    
1919     save_with_ratio(datahisto1,datahisto2,jzbpad->cd(),("jzb/"+savename));
1920    
1921     datahisto1->Delete();
1922     datahisto2->Delete();
1923     }
1924    
1925    
1926 buchmann 1.1 void jzb_plots(string mcjzb, string datajzb,vector<float> ratio_binning) {
1927     TCanvas *can = new TCanvas("can","JZB Plots Canvas");
1928     float max=jzbHigh ;
1929     float min=-120;
1930     int nbins=(int)((max-min)/5.0); // we want 5 GeV/bin
1931     int coarserbins=int(nbins/2.0);
1932     int rebinnedbins=int(nbins/4.0);
1933    
1934     vector<float>binning;vector<float>coarse_binning;vector<float>coarsest_binning;
1935     for(int i=0;i<=nbins;i++)binning.push_back(min+i*(max-min)/((float)nbins));
1936     for(int i=0;i<=coarserbins;i++)coarse_binning.push_back(min+i*(max-min)/((float)coarserbins));
1937     for(int i=0;i<=rebinnedbins;i++)coarsest_binning.push_back(min+i*(max-min)/((float)rebinnedbins));
1938    
1939 buchmann 1.14 if ( !PlottingSetup::Approved ) {
1940     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP",can,binning);
1941     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP",can,binning);
1942     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_SFZP",can,binning);
1943     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_SFZP",can,binning);
1944     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==0",datajzb,mcjzb,"ee/jzb_OS_OFZP",can,binning);
1945     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass&&"id1==1",datajzb,mcjzb,"mm/jzb_OS_OFZP",can,binning);
1946     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1947     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB",can,binning);
1948     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB",can,binning);
1949 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);
1950     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);
1951 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);
1952 buchmann 1.35
1953 buchmann 1.14 }
1954 buchmann 1.1
1955     draw_pure_jzb_histo(cutOSSF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_SFZP_coarse",can,coarse_binning);
1956 buchmann 1.14 if ( !PlottingSetup::Approved ) {
1957     draw_pure_jzb_histo(cutOSOF&&cutnJets&&cutmass,datajzb,mcjzb,"jzb_OS_OFZP_coarse",can,coarse_binning);
1958     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak
1959     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSSF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_SFSB_coarse",can,coarse_binning);
1960     if(PlottingSetup::RestrictToMassPeak) draw_pure_jzb_histo(cutOSOF&&cutnJets&&sidebandcut,datajzb,mcjzb,"jzb_OS_OFSB_coarse",can,coarse_binning);
1961     }
1962 buchmann 1.12 delete can;
1963 buchmann 1.1 }
1964    
1965    
1966     void calculate_all_yields(string mcdrawcommand,vector<float> jzb_cuts) {
1967     dout << "Calculating background yields in MC:" << endl;
1968     jzb_cuts.push_back(14000);
1969     TH1F *allbgs = allsamples.Draw("allbgs",jzbvariablemc,jzb_cuts, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,mc,luminosity);
1970     float cumulative=0;
1971     for(int i=allbgs->GetNbinsX();i>=1;i--) {
1972     cumulative+=allbgs->GetBinContent(i);
1973     dout << "Above " << allbgs->GetBinLowEdge(i) << " GeV/c : " << cumulative << endl;
1974     }
1975     }
1976    
1977    
1978     TCut give_jzb_expression(string mcjzb, float jzbcut, string posneg="pos") {
1979     stringstream res;
1980     res << "(" << mcjzb;
1981     if(posneg=="pos") res << ">";
1982     else res << "<-";
1983     res << jzbcut << ")";
1984     return TCut(res.str().c_str());
1985     }
1986    
1987     string sigdig(float number, int nsigdig=3, float min=0) {
1988     //this function tries to extract n significant digits, and if the number is below (min), it returns "<min"
1989     if(number<min) return "< "+any2string(min);
1990     stringstream sol;
1991     sol << setprecision(nsigdig) << number;
1992    
1993     return sol.str();
1994     }
1995    
1996     string jzb_tex_command(string region, string posneg) {
1997     if(posneg=="pos") posneg="POS";
1998     else posneg="NEG";
1999     stringstream texcommand;
2000     texcommand<<"\\"<<region <<"JZB"<<posneg;
2001     return texcommand.str();
2002     }
2003     // \SFZPJZBPOS
2004     // Sample & \OFZPJZBPOS & \OFZPJZBNEG & \SFZPJZBPOS & \SFZPJZBNEG & \OFSBJZBPOS & \OFSBJZBNEG & \SFSBJZBPOS & \SFSBJZBNEG \\\hline
2005    
2006     void compute_MC_yields(string mcjzb,vector<float> jzb_cuts) {
2007     dout << "Calculating background yields in MC:" << endl;
2008    
2009     TCanvas *yica = new TCanvas("yica","yield canvas");
2010    
2011     int nRegions=4;
2012     if(!PlottingSetup::RestrictToMassPeak) nRegions=2;
2013     string tsRegions[] = {"SFZP","OFZP","SFSB","OFSB"};
2014     string posneg[] = {"pos","neg"};
2015     TCut tkRegions[] = {cutOSSF&&cutnJets&&cutmass,cutOSOF&&cutnJets&&cutmass,cutOSSF&&cutnJets&&sidebandcut,cutOSOF&&cutnJets&&sidebandcut};
2016    
2017 buchmann 1.16 for(int ijzb=0;ijzb<(int)jzb_cuts.size();ijzb++) {
2018 buchmann 1.1 TCut jzbMC[] = { give_jzb_expression(mcjzb,jzb_cuts[ijzb],"pos"), give_jzb_expression(mcjzb,jzb_cuts[ijzb],"neg") };
2019     dout << "_________________________________________________________" << endl;
2020     dout << "Table for JZB> " << jzb_cuts[ijzb] << endl;
2021 buchmann 1.16 for(int isample=0;isample<(int)(allsamples.collection).size();isample++) {
2022 buchmann 1.1 if(!(allsamples.collection)[isample].is_data) dout << (allsamples.collection)[isample].samplename << " & ";
2023     else dout << "Sample & ";
2024     for(int iregion=0;iregion<nRegions;iregion++) {
2025     for(int ipos=0;ipos<2;ipos++) {
2026     if((allsamples.collection)[isample].is_data) dout << jzb_tex_command(tsRegions[iregion],posneg[ipos]) << " & ";
2027     else {
2028     vector<int> specific;specific.push_back(isample);
2029     TH1F *shisto = allsamples.Draw("shisto","mll",1,0,500,"tester","events",tkRegions[iregion]&&jzbMC[ipos],mc,luminosity,specific);
2030     dout << sigdig(shisto->Integral(),3,0.05) <<" & ";
2031     delete shisto;
2032     }
2033     }//end of ipos
2034     }//end of iregion
2035     dout << " \\\\" << endl;
2036     }//end of isample
2037     }//end of ijzb
2038     dout << " \\hline" << endl;
2039    
2040     delete yica;
2041     }
2042    
2043     void draw_ttbar_and_zjets_shape_for_one_configuration(string mcjzb, string datajzb, int leptontype=-1, int scenario=0,bool floating=false) {
2044     //Step 1: Establishing cuts
2045     stringstream jetcutstring;
2046     string writescenario="";
2047    
2048     if(scenario==0) jetcutstring << "(pfJetGoodNum>=3)&&"<<(const char*) basicqualitycut;
2049     if(scenario==1) jetcutstring << "(pfJetPt[0]>50&&pfJetPt[1]>50)&&"<<(const char*)basicqualitycut;
2050     TCut jetcut(jetcutstring.str().c_str());
2051     string leptoncut="mll>0";
2052     if(leptontype==0||leptontype==1) {
2053     if(leptontype==0) {
2054     leptoncut="id1==0";
2055     writescenario="__ee";
2056     }
2057     else {
2058     leptoncut="id1==1";
2059     writescenario="__ee";
2060     }
2061     }
2062     TCut lepcut(leptoncut.c_str());
2063    
2064     TCanvas *c5 = new TCanvas("c5","c5",1500,500);
2065     TCanvas *c6 = new TCanvas("c6","c6");
2066     c5->Divide(3,1);
2067    
2068     //STEP 2: Extract Zjets shape in data
2069     c5->cd(1);
2070     c5->cd(1)->SetLogy(1);
2071     TCut massat40("mll>40");
2072     TH1F *ossfleft = allsamples.Draw("ossfleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
2073     TH1F *osofleft = allsamples.Draw("osofleft", "-"+datajzb,40,0,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
2074     ossfleft->SetLineColor(kRed);
2075     ossfleft->SetMarkerColor(kRed);
2076     ossfleft->Add(osofleft,-1);
2077     vector<TF1*> functions = do_cb_fit_to_plot(ossfleft,10);
2078     ossfleft->SetMarkerSize(DataMarkerSize);
2079     ossfleft->Draw();
2080     functions[0]->Draw("same");functions[1]->Draw("same");functions[2]->Draw("same");
2081     TF1 *zjetsfunc = (TF1*) functions[1]->Clone();
2082     TF1 *zjetsfuncN = (TF1*) functions[0]->Clone();
2083     TF1 *zjetsfuncP = (TF1*) functions[2]->Clone();
2084     zjetsfunc->Draw("same");zjetsfuncN->Draw("same");zjetsfuncP->Draw("same");
2085     TLegend *leg1 = new TLegend(0.6,0.6,0.89,0.80);
2086     leg1->SetFillColor(kWhite);
2087     leg1->SetLineColor(kWhite);
2088     leg1->AddEntry(ossfleft,"OSSF (sub),JZB<peak","p");
2089     leg1->AddEntry(zjetsfunc,"OSSF fit ('zjets')","l");
2090     leg1->Draw("same");
2091     TText *titleleft = write_title("Extracting Z+Jets shape");
2092     titleleft->Draw();
2093    
2094     //Step 3: Extract ttbar shape (in data or MC?)
2095     c5->cd(2);
2096     c5->cd(2)->SetLogy(1);
2097     TH1F *osof;
2098     TText *titlecenter;
2099     bool frommc=false;
2100     if(frommc) {
2101     osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,mc,luminosity,allsamples.FindSample("TTJets"));
2102     titlecenter = write_title("Extracting ttbar shape (from ossf MC)");
2103     }
2104     else {
2105     osof = allsamples.Draw("osof",datajzb,40,-200,200, "JZB [GeV]", "events", massat40&&cutOSOF&&jetcut&&lepcut,data,luminosity);
2106     titlecenter = write_title("Extracting ttbar shape (from osof data)");
2107     }
2108     osof->SetMarkerSize(DataMarkerSize);
2109     osof->Draw();
2110     vector<TF1*> ttbarfunctions = do_cb_fit_to_plot(osof,35,true);
2111     ttbarfunctions[0]->SetLineColor(kRed); ttbarfunctions[0]->SetLineStyle(2); ttbarfunctions[0]->Draw("same");
2112     ttbarfunctions[1]->SetLineColor(kRed); ttbarfunctions[1]->Draw("same");
2113     ttbarfunctions[2]->SetLineColor(kRed); ttbarfunctions[2]->SetLineStyle(2); ttbarfunctions[2]->Draw("same");
2114    
2115     TLegend *leg2 = new TLegend(0.15,0.8,0.4,0.89);
2116     leg2->SetFillColor(kWhite);
2117     leg2->SetLineColor(kWhite);
2118     if(frommc) {
2119     leg2->AddEntry(osof,"t#bar{t} OSSF, MC","p");
2120     leg2->AddEntry(ttbarfunctions[1],"Fit to t#bar{t} OSSF,MC","l");
2121     } else {
2122     leg2->AddEntry(osof,"OSOF","p");
2123     leg2->AddEntry(ttbarfunctions[1],"Fit to OSOF","l");
2124     }
2125     leg2->Draw("same");
2126     titlecenter->Draw();
2127    
2128     //--------------------------------------------------------------------------------------------------------------------------------
2129     //STEP 4: Present it!
2130     // actually: if we wanna let it float we need to do that first :-)
2131     c5->cd(3);
2132     c5->cd(3)->SetLogy(1);
2133     TH1F *observed = allsamples.Draw("observed",datajzb,100,0,500, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
2134     observed->SetMarkerSize(DataMarkerSize);
2135    
2136     TF1 *logparc = new TF1("logparc",InvCrystalBall,0,1000,5); logparc->SetLineColor(kRed);
2137     TF1 *logparcn = new TF1("logparcn",InvCrystalBallN,0,1000,5); logparcn->SetLineColor(kRed); logparcn->SetLineStyle(2);
2138     TF1 *logparcp = new TF1("logparcp",InvCrystalBallP,0,1000,5); logparcp->SetLineColor(kRed); logparcp->SetLineStyle(2);
2139    
2140     TF1 *zjetsc = new TF1("zjetsc",InvCrystalBall,0,1000,5); zjetsc->SetLineColor(kBlue);
2141     TF1 *zjetscn = new TF1("zjetscn",InvCrystalBallN,0,1000,5); zjetscn->SetLineColor(kBlue); zjetscn->SetLineStyle(2);
2142     TF1 *zjetscp = new TF1("zjetscp",InvCrystalBallP,0,1000,5); zjetscp->SetLineColor(kBlue); zjetscp->SetLineStyle(2);
2143    
2144     TF1 *ZplusJetsplusTTbar = new TF1("ZplusJetsplusTTbar", DoubleInvCrystalBall,0,1000,10); ZplusJetsplusTTbar->SetLineColor(kBlue);
2145     TF1 *ZplusJetsplusTTbarP= new TF1("ZplusJetsplusTTbarP",DoubleInvCrystalBallP,0,1000,10); ZplusJetsplusTTbarP->SetLineColor(kBlue); ZplusJetsplusTTbarP->SetLineStyle(2);
2146     TF1 *ZplusJetsplusTTbarN= new TF1("ZplusJetsplusTTbarN",DoubleInvCrystalBallN,0,1000,10); ZplusJetsplusTTbarN->SetLineColor(kBlue); ZplusJetsplusTTbarN->SetLineStyle(2);
2147    
2148     zjetsc->SetParameters(zjetsfunc->GetParameters());
2149     zjetscp->SetParameters(zjetsfunc->GetParameters());
2150     zjetscn->SetParameters(zjetsfunc->GetParameters());
2151    
2152     TH1F *observeda = allsamples.Draw("observeda",datajzb,53,80,jzbHigh, "JZB [GeV]", "events", massat40&&cutOSSF&&jetcut&&lepcut,data,luminosity);
2153     //blublu
2154     logparc->SetParameters(ttbarfunctions[1]->GetParameters());
2155     logparcn->SetParameters(ttbarfunctions[1]->GetParameters());
2156     logparcp->SetParameters(ttbarfunctions[1]->GetParameters());
2157     if(floating) {
2158     dout << "TTbar contribution assumed (before fitting) : " << logparc->GetParameter(0) << endl;
2159     logparc->SetParameters(ttbarfunctions[1]->GetParameters());
2160     for(int i=0;i<10;i++) {
2161     if(i<5) ZplusJetsplusTTbar->FixParameter(i,zjetsfunc->GetParameter(i));
2162     if(i>=5) {
2163     if (i>5) ZplusJetsplusTTbar->FixParameter(i,logparc->GetParameter(i-5));
2164     if (i==5) ZplusJetsplusTTbar->SetParameter(i,logparc->GetParameter(i-5));
2165     }
2166     }//end of setting parameters
2167     observeda->Draw("same");
2168     ZplusJetsplusTTbar->Draw("same");
2169     observeda->Fit(ZplusJetsplusTTbar);
2170     dout << "--> Quality of Z+Jets / TTbar fit : chi2/ndf = " << ZplusJetsplusTTbar->GetChisquare() << "/" << ZplusJetsplusTTbar->GetNDF() << endl;
2171     ZplusJetsplusTTbar->Draw("same");
2172     ZplusJetsplusTTbarP->SetParameters(ZplusJetsplusTTbar->GetParameters());
2173     ZplusJetsplusTTbarN->SetParameters(ZplusJetsplusTTbar->GetParameters());
2174     dout << "TTbar contribution found (after fitting) : " << ZplusJetsplusTTbar->GetParameter(5) << endl;
2175     float factor = ZplusJetsplusTTbar->GetParameter(5) / logparc->GetParameter(0);
2176     dout << "FACTOR: " << factor << endl;
2177     logparc->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
2178     logparcn->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
2179     logparcp->SetParameter(0,factor*ttbarfunctions[1]->GetParameter(0));
2180     }
2181    
2182     c5->cd(3);
2183     c5->cd(3)->SetLogy(1);
2184     observed->Draw();
2185     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2186     logparc->Draw("same");
2187     logparcn->Draw("same");
2188     logparcp->Draw("same");
2189    
2190     TLegend *leg3 = new TLegend(0.6,0.6,0.89,0.80);
2191     leg3->SetFillColor(kWhite);
2192     leg3->SetLineColor(kWhite);
2193     leg3->AddEntry(observed,"OSSF,JZB>peak","p");
2194     leg3->AddEntry(ttbarfunctions[1],"OSOF fit ('ttbar')","l");
2195     leg3->AddEntry(zjetsfunc,"OSSF,JZB<0 fit ('zjets')","l");
2196     leg3->Draw("same");
2197     TText *titleright = write_title("Summary of shapes and observed shape");
2198     titleright->Draw();
2199    
2200     c6->cd()->SetLogy(1);
2201     observed->Draw();
2202     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2203     logparc->Draw("same");
2204     logparcn->Draw("same");
2205     logparcp->Draw("same");
2206     leg3->Draw("same");
2207     titleright->Draw();
2208    
2209     if(scenario==0) {
2210     CompleteSave(c5,"Shapes2/Making_of___3jetsabove30"+writescenario);
2211     CompleteSave(c5->cd(1),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd1");
2212     CompleteSave(c5->cd(2),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd2");
2213     CompleteSave(c5->cd(3),"Shapes2/Making_of___3jetsabove30"+writescenario+"__cd3");
2214     CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30"+writescenario);
2215     } else {
2216     CompleteSave(c5,"Shapes2/Making_of___2jetsabove50"+writescenario);
2217     CompleteSave(c5->cd(1),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd1");
2218     CompleteSave(c5->cd(2),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd2");
2219     CompleteSave(c5->cd(3),"Shapes2/Making_of___2jetsabove50"+writescenario+"__cd3");
2220     CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50"+writescenario);
2221     }
2222     dout << "Statistics about our fits: " << endl;
2223     dout << "Z+Jets shape: Chi2/ndf = " << zjetsfunc->GetChisquare() << "/" << ossfleft->GetNbinsX() << endl;
2224     dout << "ttbar shape: Chi2/ndf = " << ttbarfunctions[1]->GetChisquare() << "/" << osof->GetNbinsX() << endl;
2225    
2226     c6->cd();
2227     TLegend *additionallegend = new TLegend(0.6,0.6,0.89,0.89);
2228     additionallegend->SetFillColor(kWhite);
2229     additionallegend->SetLineColor(kWhite);
2230     additionallegend->AddEntry(observed,"Data","p");
2231     additionallegend->AddEntry(ZplusJetsplusTTbar,"Fitted Z+jets & TTbar","l");
2232     additionallegend->AddEntry(zjetsc,"Z+jets","l");
2233     additionallegend->AddEntry(logparc,"TTbar","l");
2234     observed->Draw();
2235     ZplusJetsplusTTbar->SetLineColor(kGreen);
2236     ZplusJetsplusTTbarP->SetLineColor(kGreen);
2237     ZplusJetsplusTTbarN->SetLineColor(kGreen);
2238     ZplusJetsplusTTbarP->SetLineStyle(2);
2239     ZplusJetsplusTTbarN->SetLineStyle(2);
2240     TF1 *ZplusJetsplusTTbar2 = new TF1("ZplusJetsplusTTbar2",DoubleInvCrystalBall,0,1000,10);
2241     ZplusJetsplusTTbar2->SetParameters(ZplusJetsplusTTbar->GetParameters());
2242     ZplusJetsplusTTbar2->SetLineColor(kGreen);
2243     ZplusJetsplusTTbarP->SetFillColor(TColor::GetColor("#81F781"));
2244     ZplusJetsplusTTbarN->SetFillColor(kWhite);
2245     ZplusJetsplusTTbarP->Draw("fcsame");
2246     ZplusJetsplusTTbarN->Draw("fcsame");
2247     TH1F *hZplusJetsplusTTbar = (TH1F*)ZplusJetsplusTTbar2->GetHistogram();
2248     TH1F *hZplusJetsplusTTbarN = (TH1F*)ZplusJetsplusTTbarN->GetHistogram();
2249     TH1F *hZplusJetsplusTTbarP = (TH1F*)ZplusJetsplusTTbarP->GetHistogram();
2250     hZplusJetsplusTTbar->SetMarkerSize(0);
2251     hZplusJetsplusTTbarP->SetMarkerSize(0);
2252     hZplusJetsplusTTbarN->SetMarkerSize(0);
2253     for (int i=1;i<=hZplusJetsplusTTbar->GetNbinsX();i++) {
2254     float newerror=hZplusJetsplusTTbarP->GetBinContent(i)-hZplusJetsplusTTbar->GetBinContent(i);
2255     hZplusJetsplusTTbar->SetBinError(i,newerror);
2256     if(hZplusJetsplusTTbar->GetBinContent(i)<0.05) hZplusJetsplusTTbar->SetBinContent(i,0); //avoiding a displaying probolem
2257     }
2258     hZplusJetsplusTTbarP->SetFillColor(kGreen);
2259     hZplusJetsplusTTbarN->SetFillColor(kWhite);
2260     hZplusJetsplusTTbarN->Draw("same");
2261    
2262     ZplusJetsplusTTbar2->SetMarkerSize(0);
2263     ZplusJetsplusTTbar2->Draw("same");
2264    
2265     zjetsc->Draw("same");zjetscn->Draw("same");zjetscp->Draw("same");
2266     logparc->Draw("same");
2267     logparcn->Draw("same");
2268     logparcp->Draw("same");
2269     additionallegend->Draw("same");
2270     if(scenario==0) {
2271     CompleteSave(c6,"Shapes2/Background_Shapes___3jetsabove30__allfits__"+writescenario);
2272     } else {
2273     CompleteSave(c6,"Shapes2/Background_Shapes___2jetsabove50__allfits__"+writescenario);
2274     }
2275     //--------------------------------------------------------------------------------------------------------------------------------
2276     }
2277    
2278     void draw_ttbar_and_zjets_shape(string mcjzb, string datajzb) {
2279     int all_leptons=-1;
2280 buchmann 1.16 int threejetswith30gev=0;
2281     /*
2282     int twojetswith50gev=1;
2283 buchmann 1.1 int electrons_only=0;
2284     int mu_only=1;
2285 buchmann 1.16
2286 buchmann 1.1 draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,twojetswith50gev);
2287     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev);
2288    
2289     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,twojetswith50gev);
2290     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,electrons_only,threejetswith30gev);
2291    
2292     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,twojetswith50gev);
2293     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,mu_only,threejetswith30gev);
2294     */
2295    
2296     draw_ttbar_and_zjets_shape_for_one_configuration(mcjzb,datajzb,all_leptons,threejetswith30gev,true);
2297     }
2298    
2299 buchmann 1.32 float find_one_correction_factor(string FindKeyword, bool dodata, TCut SpecialCut, string SaveAs) {
2300 buchmann 1.1 TCanvas *cancorr = new TCanvas("cancorr","Canvas for Response Correction");
2301     cancorr->SetLogz();
2302     cancorr->SetRightMargin(0.13);
2303 buchmann 1.45 TCut zptforresponsepresentation(Restrmasscut&&SpecialCut&&passtrig);
2304 fronga 1.40
2305     if(PlottingSetup::DoBTag) zptforresponsepresentation=zptforresponsepresentation&&PlottingSetup::bTagRequirement;
2306     TH2F *niceresponseplotd = new TH2F("niceresponseplotd","",100,0,600,100,0,5);
2307     niceresponseplotd->Sumw2();
2308     TH2F* emuResponse = (TH2F*)niceresponseplotd->Clone("emuResponse");
2309 buchmann 1.27 vector<int> SampleIndices=allsamples.FindSample(FindKeyword);
2310 buchmann 1.33 for(int iSample=0;iSample<(int)SampleIndices.size();iSample++) {
2311 buchmann 1.32 if((allsamples.collection)[SampleIndices[iSample]].is_data && !dodata) continue;
2312     if((allsamples.collection)[SampleIndices[iSample]].is_data ==false && dodata) continue;
2313    
2314 buchmann 1.30 dout << " Response correction : Using sample " << (allsamples.collection)[SampleIndices[iSample]].filename << " for " << FindKeyword << endl;
2315 fronga 1.40 (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+niceresponseplotd",(zptforresponsepresentation&&cutOSSF)*cutWeight);
2316     (allsamples.collection)[SampleIndices[iSample]].events->Draw("sumJetPt[1]/pt:pt>>+emuResponse",(zptforresponsepresentation&&cutOSOF)*cutWeight);
2317 buchmann 1.27 }
2318 fronga 1.40 niceresponseplotd->Add(emuResponse,-1);
2319    
2320 buchmann 1.1 niceresponseplotd->SetStats(0);
2321     niceresponseplotd->GetXaxis()->SetTitle("Z p_{T} [GeV]");
2322     niceresponseplotd->GetYaxis()->SetTitle("Response");
2323     niceresponseplotd->GetXaxis()->CenterTitle();
2324     niceresponseplotd->GetYaxis()->CenterTitle();
2325     niceresponseplotd->Draw("COLZ");
2326     TProfile * profd = (TProfile*)niceresponseplotd->ProfileX();
2327 fronga 1.40 profd->Rebin(2);
2328 buchmann 1.1 profd->SetMarkerSize(DataMarkerSize);
2329 fronga 1.40 profd->Fit("pol0","","same,e1",100,400);
2330 buchmann 1.1 DrawPrelim();
2331 buchmann 1.27 string stitle="Data";
2332     if(!Contains(FindKeyword,"Data")) stitle="MC";
2333     TText* title = write_text(0.5,0.7,stitle.c_str());
2334 buchmann 1.1 title->SetTextAlign(12);
2335     title->Draw();
2336     TF1 *datapol=(TF1*)profd->GetFunction("pol0");
2337 buchmann 1.27 float correction=datapol->GetParameter(0);
2338     stringstream resstring;
2339     resstring<<"Response: "<<std::setprecision(2)<<100*correction<<" %";
2340     TText* restitle = write_text(0.5,0.65,resstring.str());
2341 buchmann 1.1 restitle->SetTextAlign(12);
2342     restitle->SetTextSize(0.03);
2343     restitle->Draw();
2344 buchmann 1.27 CompleteSave(cancorr,"ResponseCorrection/Response_Correction_Illustration_New_"+SaveAs);
2345     delete cancorr;
2346     delete niceresponseplotd;
2347 fronga 1.40 delete profd;
2348 buchmann 1.27 return correction;
2349     }
2350    
2351     void find_correction_factors(string &jzbvardata,string &jzbvarmc) {
2352    
2353 buchmann 1.30 dout << "Computing response corrections: " << endl;
2354 buchmann 1.27 //Step 1 : Get results
2355 buchmann 1.32 float datacorrection=find_one_correction_factor("Data",true,"","Data");
2356     float mccorrection=find_one_correction_factor("DY",false,"","MC");
2357 buchmann 1.1
2358 buchmann 1.32 float dataEEcorrection=find_one_correction_factor("Data",true,"id1==0","Data_ee");
2359     float mcEEcorrection=find_one_correction_factor("DY",false,"id1==0","MC_ee");
2360 buchmann 1.27
2361 buchmann 1.32 float dataMMcorrection=find_one_correction_factor("Data",true,"id1==1","Data_mm");
2362     float mcMMcorrection=find_one_correction_factor("DY",false,"id1==1","MC_mm");
2363 buchmann 1.27
2364     cout << "Corrections : " << endl;
2365     cout << " Data : " << datacorrection << endl;
2366     cout << " ee (" << dataEEcorrection << ") , mm (" << dataMMcorrection << ")" << endl;
2367     cout << " MC : " << mccorrection << endl;
2368     cout << " ee (" << mcEEcorrection << ") , mm (" << mcMMcorrection << ")" << endl;
2369    
2370     //Step 2: Processing the result and making it into something useful :-)
2371 buchmann 1.1 stringstream jzbvardatas;
2372 buchmann 1.27 jzbvardatas << "(";
2373    
2374     if(dataEEcorrection>=1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]-" << dataEEcorrection-1 << "*pt))";
2375     if(dataEEcorrection<1) jzbvardatas<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-dataEEcorrection << "*pt))";
2376    
2377     if(dataMMcorrection>=1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]-" << dataMMcorrection-1 << "*pt))";
2378     if(dataMMcorrection<1) jzbvardatas<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-dataMMcorrection << "*pt))";
2379    
2380     float averagecorrection=(dataMMcorrection+dataEEcorrection)/2.0;
2381    
2382 buchmann 1.30 if(datacorrection>=1) jzbvardatas<<"+((id1!=id2)*(jzb[1]-" << datacorrection-1 << "*pt))";
2383     if(datacorrection<1) jzbvardatas<<"+((id1!=id2)*(jzb[1]+" << 1-datacorrection << "*pt))";
2384 buchmann 1.27
2385     jzbvardatas << ")";
2386 buchmann 1.1 jzbvardata=jzbvardatas.str();
2387 buchmann 1.27
2388 buchmann 1.1 stringstream jzbvarmcs;
2389 buchmann 1.27 jzbvarmcs << "(";
2390    
2391     if(mcEEcorrection>=1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]-" << mcEEcorrection-1 << "*pt))";
2392     if(mcEEcorrection<1) jzbvarmcs<<"((id1==0&&id1==id2)*(jzb[1]+" << 1-mcEEcorrection << "*pt))";
2393    
2394     if(mcMMcorrection>=1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]-" << mcMMcorrection-1 << "*pt))";
2395     if(mcMMcorrection<1) jzbvarmcs<<"+((id1==1&&id1==id2)*(jzb[1]+" << 1-mcMMcorrection << "*pt))";
2396    
2397     float averagemccorrection=(mcMMcorrection+mcEEcorrection)/2.0;
2398    
2399 buchmann 1.30 if(mccorrection>=1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]-" << mccorrection-1 << "*pt))";
2400     if(mccorrection<1) jzbvarmcs<<"+((id1!=id2)*(jzb[1]+" << 1-mccorrection << "*pt))";
2401 buchmann 1.27
2402     jzbvarmcs << ")";
2403 buchmann 1.1 jzbvarmc=jzbvarmcs.str();
2404 buchmann 1.27
2405 buchmann 1.1 dout << "JZB Z pt correction summary : " << endl;
2406     dout << " Data: The response is " << datacorrection << " --> jzb variable is now : " << jzbvardata << endl;
2407     dout << " MC : The response is " << mccorrection << " --> jzb variable is now : " << jzbvarmc << endl;
2408 buchmann 1.27
2409 buchmann 1.1 }
2410    
2411     void pick_up_events(string cut) {
2412     dout << "Picking up events with cut " << cut << endl;
2413     allsamples.PickUpEvents(cut);
2414     }
2415    
2416 buchmann 1.18 void save_template(string mcjzb, string datajzb,vector<float> jzb_cuts,float MCPeakError,float DataPeakError, vector<float> jzb_shape_limit_bins) {
2417 buchmann 1.1 dout << "Saving configuration template!" << endl;
2418     ofstream configfile;
2419     configfile.open("../DistributedModelCalculations/last_configuration.C");
2420     configfile<<"#include <iostream>\n";
2421     configfile<<"#include <vector>\n";
2422     configfile<<"#ifndef SampleClassLoaded\n";
2423     configfile<<"#include \"SampleClass.C\"\n";
2424     configfile<<"#endif\n";
2425     configfile<<"#define SetupLoaded\n";
2426     configfile<<"#ifndef ResultLibraryClassLoaded\n";
2427     configfile<<"#include \"ResultLibraryClass.C\"\n";
2428     configfile<<"#endif\n";
2429    
2430     configfile<<"\nusing namespace std;\n\n";
2431    
2432     configfile<<"namespace PlottingSetup { \n";
2433     configfile<<"string datajzb=\"datajzb_ERROR\";\n";
2434     configfile<<"string mcjzb=\"mcjzb_ERROR\";\n";
2435     configfile<<"vector<float>jzb_cuts;\n";
2436 buchmann 1.18 configfile<<"vector<float>jzb_shape_limit_bins;\n";
2437 buchmann 1.1 configfile<<"float MCPeakError=-999;\n";
2438 buchmann 1.11 configfile<<"float DataPeakError=-999;\n";
2439 buchmann 1.1 configfile<<"}\n\n";
2440    
2441     configfile<<"void read_config() {\n";
2442     configfile<<"datajzb=\""<<datajzb<<"\";\n";
2443     configfile<<"mcjzb=\""<<mcjzb<<"\";\n\n";
2444 buchmann 1.11 configfile<<"\n\nMCPeakError="<<MCPeakError<<";\n";
2445     configfile<<"DataPeakError="<<DataPeakError<<";\n\n";
2446 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";
2447 buchmann 1.1 configfile<<"\n\n";
2448 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";
2449     for(int i=0;i<(int)Npred.size();i++) configfile<<"Npred.push_back("<<Npred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2450     for(int i=0;i<(int)Nprederr.size();i++) configfile<<"Nprederr.push_back("<<Nprederr[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2451 buchmann 1.1 configfile<<"\n\n";
2452 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";
2453     for(int i=0;i<(int)flippedNpred.size();i++) configfile<<"flippedNpred.push_back("<<flippedNpred[i]<<"); // JZB cut at " << jzb_cuts[i] << "\n";
2454 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";
2455 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";
2456     configfile<<"\n\n";
2457 buchmann 1.1 configfile<<"\n\n";
2458     configfile<<"luminosity="<<luminosity<<";\n";
2459 buchmann 1.5 configfile<<"RestrictToMassPeak="<<RestrictToMassPeak<<";//defines the type of analysis we're running\n";
2460 buchmann 1.1
2461     configfile<<"\n\ncout << \"Configuration successfully loaded!\" << endl; \n \n } \n \n";
2462    
2463     configfile.close();
2464    
2465     }
2466    
2467     float get_nonzero_minimum(TH1F *histo) {
2468     float min=histo->GetMaximum();
2469     for(int ibin=1;ibin<=histo->GetNbinsX();ibin++) {
2470     float curcont=histo->GetBinContent(ibin);
2471     if(curcont<min&&curcont>0) min=curcont;
2472     }
2473     return min;
2474     }
2475    
2476     void draw_all_ttbar_histos(TCanvas *can, vector<TH1F*> histos, string drawoption="", float manualmin=-9) {
2477     can->cd();
2478     float min=1;
2479     float max=histos[0]->GetMaximum();
2480     if(manualmin>=0) min=manualmin;
2481     else {
2482 buchmann 1.16 for(int i=1;i<(int)histos.size();i++) {
2483 buchmann 1.1 float curmin=get_nonzero_minimum(histos[i]);
2484     float curmax=histos[i]->GetMaximum();
2485     if(curmin<min) min=curmin;
2486     if(curmax>max) max=curmax;
2487     }
2488     }
2489     histos[0]->GetYaxis()->SetRangeUser(min,4*max);
2490     histos[0]->Draw(drawoption.c_str());
2491     stringstream drawopt;
2492     drawopt << drawoption << ",same";
2493 buchmann 1.16 for(int i=1;i<(int)histos.size();i++) {
2494 buchmann 1.1 histos[i]->Draw(drawopt.str().c_str());
2495     }
2496     }
2497    
2498     void ttbar_sidebands_comparison(string mcjzb, vector<float> binning, string prestring) {
2499     //in the case of the on peak analysis, we compare the 3 control regions to the real value
2500     //in the case of the OFF peak analysis, we compare our control region to the real value
2501     TCut weightbackup=cutWeight;
2502 buchmann 1.34
2503     bool doPURW=false;
2504    
2505    
2506     if(!doPURW) {
2507 fronga 1.40 dout << "Not doing PU reweighting for ttbar closure test" << endl;
2508 buchmann 1.34 cutWeight="1.0";
2509     // Do it without PU re-weighting
2510     float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
2511     stringstream resultsNoPU;
2512     stringstream noPUdatajzb;
2513     stringstream noPUmcjzb;
2514    
2515     stringstream mcjzbnoPU;
2516     find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,true,noPUdatajzb,noPUmcjzb);
2517 buchmann 1.36 mcjzb = noPUmcjzb.str();
2518 buchmann 1.34 }
2519    
2520 fronga 1.40
2521 buchmann 1.1 float simulatedlumi = luminosity; //in pb please - adjust to your likings
2522    
2523 fronga 1.40 TH1F *TZem = systsamples.Draw("TZem", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2524 buchmann 1.1 TH1F *nTZem = systsamples.Draw("nTZem","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2525     TH1F *TSem;
2526     TH1F *nTSem;
2527 fronga 1.40 TH1F *TZeemm = systsamples.Draw("TZeemm", mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2528 buchmann 1.1 TH1F *nTZeemm = systsamples.Draw("nTZeemm","-"+mcjzb,binning,"JZB [GeV]","events",cutmass&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2529     TH1F *TSeemm;
2530     TH1F *nTSeemm;
2531    
2532     if(PlottingSetup::RestrictToMassPeak) {
2533 fronga 1.40 TSem = systsamples.Draw("TSem", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2534     nTSem = systsamples.Draw("nTSem", "-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSOF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2535     TSeemm = systsamples.Draw("TSeemm", mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2536 buchmann 1.1 nTSeemm = systsamples.Draw("nTSeemm","-"+mcjzb,binning,"JZB [GeV]","events",sidebandcut&&cutOSSF&&cutnJets,mc,simulatedlumi,systsamples.FindSample("TTJets"));
2537     }
2538    
2539     TCanvas *tcan = new TCanvas("tcan","tcan");
2540     tcan->SetLogy(1);
2541    
2542     TZeemm->SetLineColor(kBlack);
2543     TZem->SetLineColor(kRed);
2544     TZeemm->SetMarkerColor(kBlack);
2545     TZem->SetMarkerColor(kRed);
2546    
2547    
2548     if(PlottingSetup::RestrictToMassPeak) {
2549     TSem->SetLineColor(TColor::GetColor("#00A616"));
2550     TSeemm->SetLineColor(kMagenta+2);
2551     TSem->SetMarkerColor(TColor::GetColor("#00A616"));
2552     TSeemm->SetMarkerColor(kMagenta+2);
2553     TSem->SetLineStyle(2);
2554     TSeemm->SetLineStyle(3);
2555     }
2556    
2557     vector<TH1F*> histos;
2558 buchmann 1.31 TZem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2559     TZeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2560 buchmann 1.1 histos.push_back(TZem);
2561     histos.push_back(TZeemm);
2562     if(PlottingSetup::RestrictToMassPeak) {
2563 buchmann 1.31 TSeemm->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2564     TSem->GetXaxis()->SetRangeUser(-100,binning[binning.size()-1]);
2565 buchmann 1.1 histos.push_back(TSem);
2566     histos.push_back(TSeemm);
2567     }
2568 fronga 1.40 draw_all_ttbar_histos(tcan,histos,"histo",1);
2569 buchmann 1.1
2570     TLegend *leg = make_legend("MC t#bar{t}",0.6,0.65,false);
2571     leg->AddEntry(TZeemm,"SFZP","l");
2572     leg->AddEntry(TZem,"OFZP","l");
2573     if(PlottingSetup::RestrictToMassPeak) {
2574     leg->AddEntry(TSeemm,"SFSB","l");
2575     leg->AddEntry(TSem,"OFSB","l");
2576     }
2577     leg->Draw("same");
2578     DrawMCPrelim(simulatedlumi);
2579     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison");
2580     TH1F *TZemcopy = (TH1F*)TZem->Clone("TZemcopy");
2581     TH1F *TZeemmcopy = (TH1F*)TZeemm->Clone("TZeemmcopy");
2582 buchmann 1.11 TH1F *TSeemmcopy;
2583     TH1F *TSemcopy;
2584     if(PlottingSetup::RestrictToMassPeak) {
2585     TSeemmcopy = (TH1F*)TSeemm->Clone("TSeemmcopy");
2586     TSemcopy = (TH1F*)TSem->Clone("TSemcopy");
2587     }
2588 buchmann 1.1
2589     TZem->Divide(TZeemm);
2590     TZem->SetMarkerStyle(21);
2591     if(PlottingSetup::RestrictToMassPeak) {
2592     TSem->Divide(TZeemm);
2593     TSeemm->Divide(TZeemm);
2594     TSem->SetMarkerStyle(24);
2595     TSeemm->SetMarkerStyle(32);
2596 fronga 1.40 }
2597 buchmann 1.1
2598     tcan->SetLogy(0);
2599     TZem->GetYaxis()->SetRangeUser(0,2.5);
2600     TZem->GetYaxis()->SetTitle("ratio");
2601     TZem->Draw();
2602     if(PlottingSetup::RestrictToMassPeak) {
2603     TSem->Draw("same");
2604     TSeemm->Draw("same");
2605     }
2606    
2607 buchmann 1.33 float linepos=emuncertONPEAK;
2608     if(!PlottingSetup::RestrictToMassPeak) linepos=emuncertOFFPEAK;
2609    
2610 buchmann 1.1 TLine *top = new TLine(binning[0],1.0+linepos,binning[binning.size()-1],1.0+linepos);
2611     TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
2612     TLine *bottom = new TLine(binning[0],1.0-linepos,binning[binning.size()-1],1.0-linepos);
2613    
2614 buchmann 1.11 /*write_warning(__FUNCTION__,"These two lines are to be removed!");
2615     TLine *topalt = new TLine(binning[0],1.0+0.1,binning[binning.size()-1],1.0+0.1);
2616     TLine *bottomalt = new TLine(binning[0],1.0-0.1,binning[binning.size()-1],1.0-0.1);
2617     topalt->SetLineColor(kRed);topalt->SetLineStyle(3);
2618     bottomalt->SetLineColor(kRed);bottomalt->SetLineStyle(3);
2619     topalt->Draw("same");bottomalt->Draw("same");*/
2620    
2621    
2622 buchmann 1.1 top->SetLineColor(kBlue);top->SetLineStyle(2);
2623     bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2624     center->SetLineColor(kBlue);
2625    
2626     top->Draw("same");
2627     center->Draw("same");
2628     bottom->Draw("same");
2629    
2630     TLegend *leg2 = make_legend("MC t#bar{t}",0.55,0.75,false);
2631     leg2->AddEntry(TZem,"OFZP / SFZP","ple");
2632     if(PlottingSetup::RestrictToMassPeak) {
2633     leg2->AddEntry(TSeemm,"SFSB / SFZP","ple");
2634     leg2->AddEntry(TSem,"OFSB / SFZP","ple");
2635     }
2636     leg2->AddEntry(bottom,"syst. envelope","l");
2637     leg2->SetX1(0.25);leg2->SetX2(0.6);
2638     leg2->SetY1(0.65);
2639    
2640     leg2->Draw("same");
2641    
2642     DrawMCPrelim(simulatedlumi);
2643     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_shape_comparison_ratio");
2644    
2645 fronga 1.40 if (0) { // Turn this off: we don't need this
2646    
2647     ///-------------- second part: only look at the quantity we actually care about!
2648     TH1F *leftsfzp = (TH1F*)nTZeemm->Clone("leftsfzp");
2649     TH1F *rightsfzp = (TH1F*)TZeemmcopy->Clone("rightsfzp");
2650     rightsfzp->Add(leftsfzp,-1);
2651     TH1F *leftofzp = (TH1F*)nTZem->Clone("leftofzp");
2652     TH1F *rightofzp = (TH1F*)TZemcopy->Clone("rightofzp");
2653     rightofzp->Add(leftofzp,-1);
2654     TH1F *leftofsb;
2655     TH1F *rightofsb;
2656     TH1F *leftsfsb;
2657     TH1F *rightsfsb;
2658     if(PlottingSetup::RestrictToMassPeak) {
2659     leftofsb = (TH1F*)nTSem->Clone("leftofsb");
2660     rightofsb = (TH1F*)TSemcopy->Clone("rightofsb");
2661     rightofsb->Add(leftofsb,-1);
2662     leftsfsb = (TH1F*)nTSeemm->Clone("leftsfsb");
2663     rightsfsb = (TH1F*)TSeemmcopy->Clone("rightsfsb");
2664     rightsfsb->Add(leftsfsb,-1);
2665     }
2666 buchmann 1.1
2667 fronga 1.40 tcan->SetLogy(1);
2668     rightsfzp->GetXaxis()->SetRangeUser(0,binning[binning.size()-1]);
2669     rightsfzp->GetYaxis()->SetTitle("#deltaJZB / 25 GeV");
2670     rightsfzp->Draw("histo");
2671     rightofzp->Draw("histo,same");
2672     if(PlottingSetup::RestrictToMassPeak) {
2673     rightofsb->Draw("histo,same");
2674     rightsfsb->Draw("histo,same");
2675     }
2676     DrawMCPrelim(simulatedlumi);
2677    
2678     TLegend *legA = make_legend("MC t#bar{t}",0.6,0.65,false);
2679     legA->AddEntry(rightsfzp,"SFZP","l");
2680     legA->AddEntry(rightofzp,"OFZP","l");
2681     if(PlottingSetup::RestrictToMassPeak) {
2682     legA->AddEntry(rightofsb,"SFSB","l");
2683     legA->AddEntry(rightsfsb,"OFSB","l");
2684     }
2685     legA->Draw();
2686 buchmann 1.1
2687 fronga 1.40 CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison");
2688 buchmann 1.1
2689 fronga 1.40 tcan->SetLogy(0);
2690     rightofzp->Divide(rightsfzp);
2691     rightofzp->GetXaxis()->SetRangeUser(0.0,binning[binning.size()-1]);
2692     rightofzp->GetYaxis()->SetRangeUser(0.0,2.5);
2693     rightofzp->GetYaxis()->SetTitle("#deltaJZB ratio");
2694     rightofzp->Draw();
2695     if(PlottingSetup::RestrictToMassPeak) {
2696     rightofsb->Divide(rightsfzp);
2697     rightsfsb->Divide(rightsfzp);
2698     rightofsb->Draw("same");
2699     rightsfsb->Draw("same");
2700     }
2701 buchmann 1.1
2702 fronga 1.40 TLine *top2 = new TLine(0.0,1.0+linepos,binning[binning.size()-1],1.0+linepos);
2703     TLine *center2 = new TLine(0.0,1.0,binning[binning.size()-1],1.0);
2704     TLine *bottom2 = new TLine(0.0,1.0-linepos,binning[binning.size()-1],1.0-linepos);
2705    
2706     top2->SetLineColor(kBlue);top2->SetLineStyle(2);
2707     bottom2->SetLineColor(kBlue);bottom2->SetLineStyle(2);
2708     center2->SetLineColor(kBlue);
2709    
2710     top2->Draw("same");
2711     center2->Draw("same");
2712     bottom2->Draw("same");
2713 buchmann 1.1
2714 fronga 1.40 rightofzp->SetMarkerStyle(21);
2715     if(PlottingSetup::RestrictToMassPeak) {
2716     rightofsb->SetMarkerStyle(24);
2717     rightsfsb->SetMarkerStyle(32);
2718     }
2719 buchmann 1.1
2720 fronga 1.40 TLegend *leg3 = make_legend("MC t#bar{t}",0.55,0.75,false);
2721     leg3->AddEntry(rightofzp,"OFZP / SFZP","ple");
2722     if(PlottingSetup::RestrictToMassPeak) {
2723     leg3->AddEntry(rightsfsb,"SFSB / SFZP","ple");
2724     leg3->AddEntry(rightofsb,"OFSB / SFZP","ple");
2725     }
2726     leg3->AddEntry(bottom,"syst. envelope","l");
2727     leg3->SetX1(0.25);leg3->SetX2(0.6);
2728     leg3->SetY1(0.65);
2729 buchmann 1.1
2730 fronga 1.40 leg3->Draw("same");
2731 buchmann 1.1
2732 fronga 1.40 DrawMCPrelim(simulatedlumi);
2733     CompleteSave(tcan,"Systematics/"+prestring+"/ttbar_deltajzb_comparison_ratio");
2734 buchmann 1.1
2735     }
2736    
2737     delete TZem;
2738     delete nTZem;
2739     delete TZeemm;
2740     delete nTZeemm;
2741     if(PlottingSetup::RestrictToMassPeak) {
2742     delete TSem;
2743     delete nTSem;
2744     delete TSeemm;
2745     delete nTSeemm;
2746     }
2747    
2748     delete tcan;
2749     cutWeight=weightbackup;
2750     }
2751    
2752     void ttbar_sidebands_comparison(string mcjzb, vector<float> jzb_binning) {
2753     vector<float> nicer_binning;
2754 buchmann 1.32
2755 buchmann 1.33 /* nicer_binning.push_back(-400);
2756 buchmann 1.31 nicer_binning.push_back(-250);
2757     nicer_binning.push_back(-200);
2758     nicer_binning.push_back(-150);
2759     nicer_binning.push_back(-100);
2760     nicer_binning.push_back(-50);
2761     nicer_binning.push_back(-20);
2762    
2763     nicer_binning.push_back(0);
2764     nicer_binning.push_back(20);
2765     nicer_binning.push_back(50);
2766     nicer_binning.push_back(100);
2767     nicer_binning.push_back(150);
2768     nicer_binning.push_back(200);
2769     nicer_binning.push_back(250);
2770 buchmann 1.33 nicer_binning.push_back(400);*/
2771    
2772 buchmann 1.1 nicer_binning.push_back(-100);
2773     nicer_binning.push_back(-50);
2774     nicer_binning.push_back(-25);
2775     nicer_binning.push_back(0);
2776     nicer_binning.push_back(25);
2777     nicer_binning.push_back(50);
2778     nicer_binning.push_back(75);
2779     nicer_binning.push_back(100);
2780     nicer_binning.push_back(125);
2781     nicer_binning.push_back(150);
2782 fronga 1.40 //nicer_binning.push_back(175);
2783 buchmann 1.1 nicer_binning.push_back(200);
2784 fronga 1.40 nicer_binning.push_back(250);
2785     nicer_binning.push_back(300);
2786 buchmann 1.1 nicer_binning.push_back(400);
2787 buchmann 1.33
2788 buchmann 1.1 ttbar_sidebands_comparison(mcjzb,nicer_binning, "ttbar/");
2789     }
2790    
2791    
2792 buchmann 1.34 void zjets_prediction_comparison(string mcjzbWithPUa) {
2793 buchmann 1.20 TCanvas *zcan = new TCanvas("zcan","zcan");
2794 buchmann 1.36 // zcan->SetLogy(1);
2795 buchmann 1.20 TCut weightbackup=cutWeight;
2796 buchmann 1.36
2797     bool UsePURW=false;
2798    
2799    
2800     string mcjzb;
2801     if(UsePURW) {
2802     mcjzb=mcjzbWithPUa;
2803     } else {
2804     // Do it without PU re-weighting
2805     float MCPeakNoPU=0,MCPeakErrorNoPU=0,DataPeakNoPU=0,DataPeakErrorNoPU=0,MCSigma=0,DataSigma=0;
2806     stringstream resultsNoPU;
2807     stringstream noPUdatajzb;
2808     stringstream noPUmcjzb;
2809    
2810     find_peaks(MCPeakNoPU,MCPeakErrorNoPU, DataPeakNoPU, DataPeakErrorNoPU,resultsNoPU,false,noPUdatajzb,noPUmcjzb);
2811     dout << "The peak corrected JZB expression for MC without pileup is : " << noPUmcjzb.str() << endl;
2812    
2813     mcjzb = noPUmcjzb.str();
2814    
2815     cutWeight="1.0";
2816     }
2817 buchmann 1.34
2818 buchmann 1.25
2819     vector<float> binning;
2820     binning.push_back(0);
2821 buchmann 1.33 binning.push_back(10);
2822 buchmann 1.34 binning.push_back(20);
2823     binning.push_back(40);
2824 fronga 1.40 binning.push_back(60);
2825 buchmann 1.36 // binning.push_back(50);
2826     // binning.push_back(60);
2827     // binning.push_back(70);
2828     // binning.push_back(80);
2829     // binning.push_back(90);
2830 buchmann 1.25 binning.push_back(100);
2831 buchmann 1.36
2832 buchmann 1.1 float simulatedlumi = luminosity;//in pb please - adjust to your likings
2833    
2834     TCut kPos((mcjzb+">0").c_str());
2835     TCut kNeg((mcjzb+"<0").c_str());
2836     string var( "abs("+mcjzb+")" );
2837 buchmann 1.36
2838     TCut notTau("abs(genMID1)!=15");
2839     TCut ONLYTau("mll>20");
2840    
2841 buchmann 1.1
2842 buchmann 1.36 TH1F *hJZBpos = systsamples.Draw("hJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2843     TH1F *hJZBneg = systsamples.Draw("hJZBneg",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&cutnJets&&notTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2844    
2845 buchmann 1.1 hJZBpos->SetLineColor(kBlack);
2846     hJZBneg->SetLineColor(kRed);
2847    
2848 buchmann 1.25 hJZBpos->SetMinimum(1.0);
2849 buchmann 1.1 hJZBpos->Draw("e1");
2850     hJZBneg->Draw("same,hist");
2851     hJZBpos->Draw("same,e1"); // So it's on top...
2852    
2853 buchmann 1.36 TLegend *leg = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.55,0.75,false);
2854 buchmann 1.1 leg->AddEntry(hJZBpos,"Observed","pe");
2855     leg->AddEntry(hJZBneg,"Predicted","l");
2856     leg->Draw("same");
2857     DrawMCPrelim(simulatedlumi);
2858 buchmann 1.36 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction");
2859 buchmann 1.1
2860     TH1F* hratio = (TH1F*)hJZBpos->Clone("hratio");
2861     hratio->Divide(hJZBneg);
2862    
2863 buchmann 1.30 for(int i=1;i<=hJZBpos->GetNbinsX();i++) {
2864 buchmann 1.36 cout << "Positive: " << hJZBpos->GetBinContent(i) << " vs Negative : " << hJZBneg->GetBinContent(i) << " (ratio : " << hJZBpos->GetBinContent(i) / hJZBneg->GetBinContent(i) << endl;
2865 buchmann 1.30 }
2866    
2867 buchmann 1.1 zcan->SetLogy(0);
2868 fronga 1.40 hratio->GetYaxis()->SetRangeUser(0,2.0);
2869 buchmann 1.1 hratio->GetYaxis()->SetTitle("Observed/Predicted");
2870     hratio->Draw("e1");
2871    
2872 buchmann 1.25 TLine *top = new TLine(binning[0],1.25,binning[binning.size()-1],1.25);
2873     TLine *center = new TLine(binning[0],1.0,binning[binning.size()-1],1.0);
2874     TLine *bottom = new TLine(binning[0],0.75,binning[binning.size()-1],0.75);
2875 buchmann 1.1
2876    
2877     top->SetLineColor(kBlue);top->SetLineStyle(2);
2878     bottom->SetLineColor(kBlue);bottom->SetLineStyle(2);
2879     center->SetLineColor(kBlue);
2880    
2881     top->Draw("same");
2882     center->Draw("same");
2883     bottom->Draw("same");
2884    
2885 buchmann 1.36 TLegend *leg2 = make_legend("MC Z+jets #rightarrow ee,#mu#mu",0.25,0.75,false);
2886 buchmann 1.1 leg2->AddEntry(hratio,"obs / pred","pe");
2887     leg2->AddEntry(bottom,"syst. envelope","l");
2888     leg2->Draw("same");
2889     DrawMCPrelim(simulatedlumi);
2890 buchmann 1.36 CompleteSave(zcan,"Systematics/ZJets/zjets_eemm_prediction_ratio");
2891    
2892     TCut reducedNJets(cutnJets);
2893    
2894     TH1F *TAUhJZBpos = systsamples.Draw("TAUhJZBpos",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2895     TH1F *LcorrJZBeemm = systsamples.Draw("LcorrJZBeemm",var,binning, "JZB [GeV]", "events",cutmass&&cutOSSF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2896     TH1F *RcorrJZBem = systsamples.Draw("RcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2897     TH1F *LcorrJZBem = systsamples.Draw("LcorrJZBem",var,binning, "JZB [GeV]", "events",cutmass&&cutOSOF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2898    
2899     TH1F *RcorrJZBSBem;
2900     TH1F *LcorrJZBSBem;
2901     TH1F *RcorrJZBSBeemm;
2902     TH1F *LcorrJZBSBeemm;
2903    
2904     if(PlottingSetup::RestrictToMassPeak) {
2905     RcorrJZBSBem = systsamples.Draw("RcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2906     LcorrJZBSBem = systsamples.Draw("LcorrJZBSBem",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSOF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2907     RcorrJZBSBeemm = systsamples.Draw("RcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ONLYTau&&kPos,mc,simulatedlumi,systsamples.FindSample("/DY"));
2908     LcorrJZBSBeemm = systsamples.Draw("LcorrJZBSBeemm",var,binning, "JZB [GeV]", "events",sidebandcut&&cutOSSF&&reducedNJets&&ONLYTau&&kNeg,mc,simulatedlumi,systsamples.FindSample("/DY"));
2909     }
2910    
2911     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
2912     if(PlottingSetup::RestrictToMassPeak) {
2913     Bpred->Add(RcorrJZBem,1.0/3.);
2914     Bpred->Add(LcorrJZBem,-1.0/3.);
2915     Bpred->Add(RcorrJZBSBem,1.0/3.);
2916     Bpred->Add(LcorrJZBSBem,-1.0/3.);
2917     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
2918     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
2919     } else {
2920     Bpred->Add(RcorrJZBem,1.0);
2921     Bpred->Add(LcorrJZBem,-1.0);
2922     }
2923    
2924     Bpred->SetLineColor(kRed);
2925    
2926     TAUhJZBpos->SetLineColor(kBlack);
2927     Bpred->SetLineColor(kRed);
2928    
2929     TAUhJZBpos->SetMinimum(1.0);
2930     TAUhJZBpos->Draw("e1");
2931     Bpred->Draw("same,hist");
2932     TAUhJZBpos->Draw("same,e1");
2933    
2934     TLegend *TAUleg = make_legend("MC Z+jets #rightarrow ee,#mu#mu,#tau#tau",0.55,0.75,false);
2935     TAUleg->AddEntry(TAUhJZBpos,"Observed","pe");
2936     TAUleg->AddEntry(Bpred,"Predicted","l");
2937     TAUleg->Draw("same");
2938     DrawMCPrelim(simulatedlumi);
2939     CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction");
2940    
2941     TH1F* TAUhratio = (TH1F*)TAUhJZBpos->Clone("TAUhratio");
2942     TAUhratio->Divide(Bpred);
2943    
2944     for(int i=1;i<=TAUhJZBpos->GetNbinsX();i++) {
2945     cout << "ee/mm/tautau observed: " << TAUhJZBpos->GetBinContent(i) << " vs predicted : " << Bpred->GetBinContent(i) << " (ratio : " << TAUhJZBpos->GetBinContent(i) / Bpred->GetBinContent(i) << endl;
2946     }
2947    
2948     zcan->SetLogy(0);
2949     TAUhratio->GetYaxis()->SetRangeUser(0,2.5);
2950     TAUhratio->GetYaxis()->SetTitle("Observed/Predicted");
2951     TAUhratio->Draw("e1");
2952    
2953     top->Draw("same");
2954     center->Draw("same");
2955     bottom->Draw("same");
2956    
2957     TLegend *TAUleg2 = make_legend("MC Z+jets #rightarrow #tau#tau",0.25,0.75,false);
2958     TAUleg2->AddEntry(TAUhratio,"obs / pred","pe");
2959     TAUleg2->AddEntry(bottom,"syst. envelope","l");
2960     TAUleg2->Draw("same");
2961     DrawMCPrelim(simulatedlumi);
2962     CompleteSave(zcan,"Systematics/ZJets/zjets_eemumutautau_prediction_ratio");
2963    
2964     delete Bpred;
2965     delete TAUhJZBpos;
2966     delete LcorrJZBeemm;
2967     delete RcorrJZBem;
2968     delete LcorrJZBem;
2969    
2970     if(PlottingSetup::RestrictToMassPeak) {
2971     delete RcorrJZBSBem;
2972     delete LcorrJZBSBem;
2973     delete RcorrJZBSBeemm;
2974     delete LcorrJZBSBeemm;
2975     }
2976    
2977 buchmann 1.1
2978     delete zcan;
2979     cutWeight=weightbackup;
2980    
2981     }
2982    
2983    
2984    
2985     void sideband_assessment(string datajzb, float min=30.0, float max=50.0) {
2986     tout << endl << endl;
2987     stringstream bordercut;
2988     bordercut << "(TMath::Abs(" << datajzb << ")<" << max << ")&&(TMath::Abs(" << datajzb << ")>" << min << ")";
2989     tout << bordercut.str().c_str() << endl;
2990     TH1F *ofsb = allsamples.Draw("ofsb",datajzb,100, 0,100, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
2991     TH1F *ofzp = allsamples.Draw("ofzp",datajzb,100, 0,100, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets&&bordercut.str().c_str(),data, luminosity);
2992     float OFSB = ofsb->Integral();
2993     float OFZP = ofzp->Integral();
2994    
2995     tout << "\\begin{table}[hbtp]" << endl;
2996     tout << "\\renewcommand{\\arraystretch}{1.3}" << endl;
2997     tout << "\\begin{center}" << endl;
2998     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;
2999     tout << "\\begin{tabular}{l|cc}" << endl;
3000     tout << "\\hline" << endl;
3001     tout << "& {\\OFZP} & {\\OFSB} \\\\\\hline" << endl;
3002 buchmann 1.25 tout << "\\#(events) & "<<OFZP<<" & "<<OFSB<<"\\\\ \\hline" << endl;
3003 buchmann 1.1 tout << "\\end{tabular}" << endl;
3004     tout << "\\end{center}" << endl;
3005     tout << "\\end{table}" << endl;
3006    
3007    
3008     }
3009    
3010     void make_table(samplecollection &coll, string jzbexpr, bool is_data, vector<float> jzb_cuts, string subselection="none") {
3011    
3012     vector<float> jzbcutprediction;
3013     vector<float> metcutprediction;
3014    
3015     vector<float> jzbcutobservation;
3016     vector<float> metcutobservation;
3017    
3018     TCanvas *cannie = new TCanvas("cannie","cannie");
3019    
3020 buchmann 1.16 for(int icut=0;icut<(int)jzb_cuts.size();icut++) {
3021 buchmann 1.1 float currcut=jzb_cuts[icut];
3022     int nbins=1;float low=currcut;
3023     vector<int> mysample;
3024     if(subselection!="none") mysample=coll.FindSample(subselection);
3025     TH1F *RcorrJZBeemm = coll.Draw("RcorrJZBeemm",jzbexpr,1,currcut,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3026     TH1F *LcorrJZBeemm = coll.Draw("LcorrJZBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3027     TH1F *RcorrJZBem = coll.Draw("RcorrJZBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3028     TH1F *LcorrJZBem = coll.Draw("LcorrJZBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3029    
3030     TH1F *RcorrJZBSBem;
3031     TH1F *LcorrJZBSBem;
3032     TH1F *RcorrJZBSBeemm;
3033     TH1F *LcorrJZBSBeemm;
3034    
3035     if(PlottingSetup::RestrictToMassPeak) {
3036     RcorrJZBSBem = coll.Draw("RcorrJZBSBem",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3037     LcorrJZBSBem = coll.Draw("LcorrJZBSBem",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3038     RcorrJZBSBeemm = coll.Draw("RcorrJZBSBeemm",jzbexpr.c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3039     LcorrJZBSBeemm = coll.Draw("LcorrJZBSBeemm",("-("+jzbexpr+")").c_str(),nbins,low,14000, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3040     }
3041    
3042     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
3043     if(PlottingSetup::RestrictToMassPeak) {
3044     Bpred->Add(RcorrJZBem,1.0/3.);
3045     Bpred->Add(LcorrJZBem,-1.0/3.);
3046     Bpred->Add(RcorrJZBSBem,1.0/3.);
3047     Bpred->Add(LcorrJZBSBem,-1.0/3.);
3048     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
3049     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
3050     } else {
3051     Bpred->Add(RcorrJZBem,1.0);
3052     Bpred->Add(LcorrJZBem,-1.0);
3053     }
3054    
3055     jzbcutobservation.push_back(RcorrJZBeemm->Integral());
3056     jzbcutprediction.push_back(Bpred->Integral());
3057    
3058     delete RcorrJZBeemm;
3059     delete LcorrJZBeemm;
3060     delete RcorrJZBem;
3061     delete LcorrJZBem;
3062     delete RcorrJZBSBem;
3063     delete LcorrJZBSBem;
3064     delete RcorrJZBSBeemm;
3065     delete LcorrJZBSBeemm;
3066    
3067     TH1F *MetObs = coll.Draw("MetObs",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity, mysample);
3068     TH1F *MetPred = coll.Draw("MetPred",("met[4]"),nbins,low,14000, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity, mysample);
3069    
3070     metcutobservation.push_back(MetObs->Integral());
3071     metcutprediction.push_back(MetPred->Integral());
3072     delete MetObs;
3073     delete MetPred;
3074     }//end of cut loop
3075    
3076     //prediction part
3077     if(is_data) cout << "Data prediction & ";
3078     if(subselection!="none") cout << subselection << " prediction &";
3079 buchmann 1.16 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutprediction[ij] << " vs " << metcutprediction[ij] << " & ";
3080 buchmann 1.1
3081     cout << endl;
3082     //observation part
3083     if(is_data) cout << "Data observation & ";
3084     if(subselection!="none") cout << subselection << " observation &";
3085 buchmann 1.16 for(int ij=0;ij<(int)jzb_cuts.size();ij++) cout << jzbcutobservation[ij] << " vs " << metcutobservation[ij] << " & ";
3086 buchmann 1.1 cout << endl;
3087     cout << "_________________________________________________________________" << endl;
3088     delete cannie;
3089     }
3090    
3091     void met_jzb_cut(string datajzb, string mcjzb, vector<float> jzb_cut) {
3092     /*we want a table like this:
3093     __________________ 50 | 100 | ...
3094     | Data prediction | a vs b | a vs b | ...
3095     | Data observed | a vs b | a vs b | ...
3096     --------------------------------------
3097     --------------------------------------
3098     | LM4 prediction | a vs b | a vs b | ...
3099     | LM4 observed | a vs b | a vs b | ...
3100     | LM8 prediction | a vs b | a vs b | ...
3101     | LM8 observed | a vs b | a vs b | ...
3102    
3103     where a is the result for a jzb cut at X, and b is the result for a met cut at X
3104     */
3105     make_table(allsamples,datajzb, true,jzb_cut,"none");
3106     make_table(signalsamples,mcjzb, false,jzb_cut,"LM4");
3107     make_table(signalsamples,mcjzb, false,jzb_cut,"LM8");
3108     }
3109    
3110    
3111     //________________________________________________________________________________________
3112     // JZB Efficiency plot (efficiency of passing reco. JZB cut as function of generator JZB cut)
3113     void JZBSelEff(string mcjzb, TTree* events, string informalname, vector<float> jzb_bins) {
3114    
3115     float min = 0, max = 400;
3116     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};
3117     int nbins = sizeof(xbins)/sizeof(float)-1;
3118     int markers[] = { 20, 26, 21, 24, 22, 25, 28 };
3119    
3120 buchmann 1.14
3121     TH1F* heff = new TH1F("heff", "JZB eff ; generator JZB [GeV]; efficiency",nbins,xbins);
3122     TH1F* hgen = new TH1F("hgen", "JZB gen ; generator JZB [GeV]; efficiency",nbins,xbins);
3123     TH1F* hreco = new TH1F("hreco","JZB reco ; generator JZB [GeV]; efficiency",nbins,xbins);
3124 buchmann 1.1
3125     TCut kgen(genMassCut&&"genZPt>0&&genNjets>2&&abs(genMID)==23"&&cutOSSF);
3126     TCut kreco(cutmass);
3127    
3128     TF1* func = new TF1("func","0.5*[2]*(TMath::Erf((x-[1])/[0])+1)",min,max);
3129     func->SetParNames("epsilon","x_{1/2}","sigma");
3130     func->SetParameter(0,50.);
3131     func->SetParameter(1,0.);
3132     func->SetParameter(2,1.);
3133     gStyle->SetOptStat(0);
3134     gStyle->SetOptFit(0);
3135    
3136     TCanvas *can = new TCanvas("can","Canvas for JZB Efficiency",600,600);
3137     can->SetGridx(1);
3138     can->SetGridy(1);
3139 buchmann 1.14 can->SetLeftMargin(0.16);
3140     can->SetRightMargin(0.05);
3141 buchmann 1.1 TLegend *leg = make_legend("",0.6,0.2,false,0.89,0.5);
3142 buchmann 1.14 leg->SetBorderSize(1);
3143     leg->SetLineColor(kBlack);
3144     leg->SetTextFont(62);
3145 buchmann 1.1
3146 buchmann 1.16 for ( int icut=0; icut<(int)jzb_bins.size(); ++icut ) {
3147 buchmann 1.1
3148     ostringstream selection;
3149     selection << mcjzb << ">" << jzb_bins[icut];
3150     TCut ksel(selection.str().c_str());
3151     events->Draw("genJZB>>hgen", kgen&&kreco, "goff");
3152     events->Draw("genJZB>>hreco",kgen&&kreco&&ksel,"goff");
3153    
3154     // Loop over steps to get efficiency curve
3155     for ( Int_t iBin = 0; iBin<nbins-1; ++iBin ) {
3156     Float_t eff = hreco->GetBinContent(iBin+1)/hgen->GetBinContent(iBin+1);
3157     heff->SetBinContent(iBin+1,eff);
3158     heff->SetBinError(iBin+1,TMath::Sqrt(eff*(1-eff)/hgen->GetBinContent(iBin+1)));
3159     }
3160    
3161     heff->GetXaxis()->SetRangeUser(min, max);
3162 buchmann 1.14 // heff->GetXaxis()->SetLabelSize(0.05); // paper style. overruled.
3163     // heff->GetYaxis()->SetLabelSize(0.05); // paper style. overruled.
3164     // heff->GetXaxis()->SetTitleSize(0.06); // paper style. overruled.
3165     // heff->GetYaxis()->SetTitleSize(0.06); // paper style. overruled.
3166 buchmann 1.1 heff->SetMarkerStyle(markers[icut]);
3167     heff->Fit("func","Q+","same");
3168    
3169     // Print values
3170     dout << "+++ For " << selection.str() << std::endl;
3171     for ( int i=0; i<func->GetNpar(); ++i )
3172     dout << " " << func->GetParName(i) << " " << func->GetParameter(i) << " \\pm " << func->GetParError(i) << std::endl;
3173     char hname[256]; sprintf(hname,"heff%d",icut);
3174    
3175     // Store plot
3176     TH1F* h = (TH1F*)heff->Clone(hname);
3177 buchmann 1.14 h->SetNdivisions(505,"X");
3178 buchmann 1.1 if ( icut) h->Draw("same");
3179     else h->Draw();
3180     char htitle[256]; sprintf(htitle,"JZB > %3.0f GeV", jzb_bins[icut]);
3181     leg->AddEntry(h,htitle,"p");
3182    
3183     }
3184    
3185     leg->Draw();
3186     DrawMCPrelim(0.0);
3187     CompleteSave(can, "Systematics/jzb_efficiency_curve"+informalname );
3188    
3189     delete hgen;
3190     delete hreco;
3191     delete heff;
3192     }
3193    
3194     //________________________________________________________________________________________
3195     // Calls the above function for each signal sample
3196     void plot_jzb_sel_eff(string mcjzb, samplecollection &signalsamples, vector<float> bins )
3197     {
3198 buchmann 1.16 for (int isignal=0; isignal<(int)signalsamples.collection.size();isignal++) {
3199 buchmann 1.1 dout << "JZB selection efficiency curve: " << std::endl;
3200     JZBSelEff(mcjzb,(signalsamples.collection)[isignal].events,(signalsamples.collection)[isignal].samplename,bins); // Only for some selected samples
3201     }
3202     }
3203 buchmann 1.3
3204     void qcd_plots(string datajzb, string mcjzb, vector<float> bins) {
3205     // What this function aims to do:
3206     // Illustrate cut flow for QCD (requiring only one lepton, requiring etc.)
3207     // 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.
3208     TCanvas *can = new TCanvas("can","can");
3209     TPad *kinpad = new TPad("kinpad","kinpad",0,0,1,1);
3210     kinpad->cd();
3211    
3212     string jzb=mcjzb;
3213    
3214     float hi=400;
3215     bool use_signal=false;
3216     bool use_data=false;
3217    
3218     bool is_data=false;
3219     int nbins=50;//100;
3220     float low=0;
3221     float high=500;
3222     int versok=false;
3223     if(gROOT->GetVersionInt()>=53000) versok=true;
3224    
3225     TH1F *blankback = new TH1F("blankback","blankback",int(high/10),0,high);
3226     TH1F *RcorrJZBeemm = qcdsamples.Draw("RcorrJZBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3227     TH1F *LcorrJZBeemm = qcdsamples.Draw("LcorrJZBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3228     TH1F *RcorrJZBem = qcdsamples.Draw("RcorrJZBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3229     TH1F *LcorrJZBem = qcdsamples.Draw("LcorrJZBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3230     blankback->GetXaxis()->SetTitle(RcorrJZBeemm->GetXaxis()->GetTitle());
3231     blankback->GetYaxis()->SetTitle(RcorrJZBeemm->GetYaxis()->GetTitle());
3232     blankback->GetXaxis()->CenterTitle();
3233     blankback->GetYaxis()->CenterTitle();
3234    
3235     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
3236     TH1F *RcorrJZBSBem;
3237     TH1F *LcorrJZBSBem;
3238     TH1F *RcorrJZBSBeemm;
3239     TH1F *LcorrJZBSBeemm;
3240    
3241 buchmann 1.16 // TH1F *RcorrJZBeemmNoS;
3242 buchmann 1.3
3243     //these are for the ratio
3244     TH1F *JRcorrJZBeemm = qcdsamples.Draw("JRcorrJZBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3245     TH1F *JLcorrJZBeemm = qcdsamples.Draw("JLcorrJZBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3246     TH1F *JRcorrJZBem = qcdsamples.Draw("JRcorrJZBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3247     TH1F *JLcorrJZBem = qcdsamples.Draw("JLcorrJZBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", cutmass&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3248    
3249     TH1F *JRcorrJZBSBem;
3250     TH1F *JLcorrJZBSBem;
3251     TH1F *JRcorrJZBSBeemm;
3252     TH1F *JLcorrJZBSBeemm;
3253    
3254     if(PlottingSetup::RestrictToMassPeak) {
3255     RcorrJZBSBem = qcdsamples.Draw("RcorrJZBSBem",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3256     LcorrJZBSBem = qcdsamples.Draw("LcorrJZBSBem",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3257     RcorrJZBSBeemm = qcdsamples.Draw("RcorrJZBSBeemm",jzb.c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3258     LcorrJZBSBeemm = qcdsamples.Draw("LcorrJZBSBeemm",("-"+jzb).c_str(),nbins,low,hi, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3259    
3260     //these are for the ratio
3261     JRcorrJZBSBem = qcdsamples.Draw("JRcorrJZBSBem",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3262     JLcorrJZBSBem = qcdsamples.Draw("JLcorrJZBSBem",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSOF&&cutnJets,is_data, luminosity,use_signal);
3263     JRcorrJZBSBeemm = qcdsamples.Draw("JRcorrJZBSBeemm",jzb.c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3264     JLcorrJZBSBeemm = qcdsamples.Draw("JLcorrJZBSBeemm",("-"+jzb).c_str(),PlottingSetup::global_ratio_binning, "JZB [GeV]", "events", sidebandcut&&cutOSSF&&cutnJets,is_data, luminosity,use_signal);
3265    
3266     }
3267    
3268     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed.
3269    
3270     TH1F *Zjetspred = (TH1F*)LcorrJZBeemm->Clone("Zjetspred");
3271     TH1F *TTbarpred = (TH1F*)RcorrJZBem->Clone("TTbarpred");
3272    
3273     TH1F *Bpred = (TH1F*)LcorrJZBeemm->Clone("Bpred");
3274     TH1F *JBpred = (TH1F*)JLcorrJZBeemm->Clone("Bpred");
3275     if(PlottingSetup::RestrictToMassPeak) {
3276     Bpred->Add(RcorrJZBem,1.0/3.);
3277     Bpred->Add(LcorrJZBem,-1.0/3.);
3278     Bpred->Add(RcorrJZBSBem,1.0/3.);
3279     Bpred->Add(LcorrJZBSBem,-1.0/3.);
3280     Bpred->Add(RcorrJZBSBeemm,1.0/3.);
3281     Bpred->Add(LcorrJZBSBeemm,-1.0/3.);
3282    
3283     TTbarpred->Scale(1.0/3);
3284     Zjetspred->Add(LcorrJZBem,-1.0/3.);
3285     Zjetspred->Add(LcorrJZBSBem,-1.0/3.);
3286     TTbarpred->Add(RcorrJZBSBem,1.0/3.);
3287     Zjetspred->Add(LcorrJZBSBeemm,-1.0/3.);
3288     TTbarpred->Add(RcorrJZBSBeemm,1.0/3.);
3289    
3290     //these are for the ratio
3291     JBpred->Add(JRcorrJZBem,1.0/3.);
3292     JBpred->Add(JLcorrJZBem,-1.0/3.);
3293     JBpred->Add(JRcorrJZBSBem,1.0/3.);
3294     JBpred->Add(JLcorrJZBSBem,-1.0/3.);
3295     JBpred->Add(JRcorrJZBSBeemm,1.0/3.);
3296     JBpred->Add(JLcorrJZBSBeemm,-1.0/3.);
3297     } else {
3298     Bpred->Add(RcorrJZBem,1.0);
3299     Bpred->Add(LcorrJZBem,-1.0);
3300    
3301     Zjetspred->Add(LcorrJZBem,-1.0);
3302    
3303     //these are for the ratio
3304     JBpred->Add(JRcorrJZBem,1.0);
3305     JBpred->Add(JLcorrJZBem,-1.0);
3306     }
3307    
3308    
3309     flag_this_change(__FUNCTION__,__LINE__,true);//PlottingSetup::RestrictToMassPeak ---- prediction changed
3310 buchmann 1.1
3311 buchmann 1.3 TLegend *legBpred = make_legend("",0.6,0.55,false);
3312     RcorrJZBeemm->Draw("e1x0,same");
3313     Bpred->Draw("hist,same");
3314     RcorrJZBeemm->Draw("e1x0,same");//HAVE IT ON TOP!
3315     legBpred->AddEntry(RcorrJZBeemm,"MC observed","p");
3316     legBpred->AddEntry(Bpred,"MC predicted","l");
3317     if(versok) legBpred->AddEntry((TObject*)0,"",""); // Just for alignment // causes seg fault on root v5.18
3318     if(versok) legBpred->AddEntry((TObject*)0,"",""); // causes seg fault on root v5.18
3319     legBpred->Draw();
3320     DrawMCPrelim();
3321    
3322     //3rd last argument: do special bpred ratio, 2nd last argument: extended range!, last: y-axis title
3323     string ytitle("ratio");
3324     if ( use_data==1 ) ytitle = "data/pred";
3325 buchmann 1.25 save_with_ratio(JRcorrJZBeemm,JBpred,kinpad,"QCD/Bpred",true,false,ytitle);
3326 buchmann 1.3
3327     TH1F *allevents = qcdsamples.Draw("allevents","pfJetGoodNum",1,0,100, "internal code", "events", "" ,mc, luminosity);
3328     TH1F *ossf = qcdsamples.Draw("ossf","pfJetGoodNum",1,0,100, "internal code", "events", cutOSSF ,mc, luminosity);
3329     TH1F *osof = qcdsamples.Draw("osof","pfJetGoodNum",1,0,100, "internal code", "events", cutOSOF ,mc, luminosity);
3330     TH1F *njossf = qcdsamples.Draw("njossf","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSSF ,mc, luminosity);
3331     TH1F *njosof = qcdsamples.Draw("njosof","pfJetGoodNum",1,0,100, "internal code", "events", cutnJets&&cutOSOF ,mc, luminosity);
3332    
3333     dout << "______________________________________________" << endl;
3334     dout << "QCD contribution: " << endl;
3335     dout << "Total number of events: " << allevents->Integral() << endl;
3336     dout << "OSSF events: " << ossf->Integral() << endl;
3337     dout << "OSOF events: " << osof->Integral() << endl;
3338     dout << "OSSF events with >=3 jets:" << njossf->Integral() << endl;
3339     dout << "OSOF events with >=3 jets:" << njosof->Integral() << endl;
3340     dout << "(note that no mass requirement has been imposed)" << endl;
3341    
3342     dout << "______________________________________________" << endl;
3343     dout << "How QCD shows up in the different regions: " << endl;
3344     dout << "OSSF: " << endl;
3345     if(PlottingSetup::RestrictToMassPeak) {
3346     dout << " Z window: \t" << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
3347     dout << " sideband: \t" << RcorrJZBSBeemm->Integral() << " (JZB>0) , " << LcorrJZBSBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBSBeemm->Integral() + LcorrJZBSBeemm->Integral() << endl;
3348     } else {
3349     dout << " " << RcorrJZBeemm->Integral() << " (JZB>0) , " << LcorrJZBeemm->Integral() << " (JZB<0) --> total: " << RcorrJZBeemm->Integral() + LcorrJZBeemm->Integral() << endl;
3350     }
3351     dout << "OSOF: " << endl;
3352     if(PlottingSetup::RestrictToMassPeak) {
3353     dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
3354     dout << " sideband: \t" << RcorrJZBSBem->Integral() << " (JZB>0) , " << LcorrJZBSBem->Integral() << " (JZB<0) --> total: " << RcorrJZBSBem->Integral() + LcorrJZBSBem->Integral() << endl;
3355     } else {
3356     dout << " Z window: \t" << RcorrJZBem->Integral() << " (JZB>0) , " << LcorrJZBem->Integral() << " (JZB<0) --> total: " << RcorrJZBem->Integral() + LcorrJZBem->Integral() << endl;
3357     }
3358     dout << "Therefore: " << endl;
3359     if(PlottingSetup::RestrictToMassPeak) {
3360     dout << " Prediction increases by : " << LcorrJZBeemm->Integral() << " + (1.0/3)*(" << RcorrJZBSBeemm->Integral() <<"-"<< LcorrJZBSBeemm->Integral() << ") (SFSB) ";
3361     dout << " + (1.0/3)*(" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
3362     dout << " + (1.0/3)*(" << RcorrJZBSBem->Integral() <<"-"<< LcorrJZBSBem->Integral() << ") (OFSB) ";
3363     dout << " = " << LcorrJZBeemm->Integral() + (1.0/3)*(RcorrJZBSBeemm->Integral() - LcorrJZBSBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() + RcorrJZBSBem->Integral() - LcorrJZBSBem->Integral()) << endl;
3364     } else {
3365     dout << " Prediction increases by : " << LcorrJZBeemm->Integral();
3366     dout << " + (" << RcorrJZBem->Integral() <<"-"<< LcorrJZBem->Integral() << ") (OFZP) ";
3367     dout << " = " << LcorrJZBeemm->Integral() + RcorrJZBem->Integral() - LcorrJZBem->Integral() << endl;
3368     }
3369     dout << " Observation increases by : " << RcorrJZBeemm->Integral() << endl;
3370    
3371     dout << endl;
3372 buchmann 1.16 for(int i=0;i<(int)bins.size();i++) {
3373 buchmann 1.3 dout << " JZB > " << bins[i] << " : " << endl;
3374     dout << " Observation increases by : " << RcorrJZBeemm->Integral(RcorrJZBeemm->FindBin(bins[i]),RcorrJZBeemm->GetNbinsX()) << endl;
3375     if(PlottingSetup::RestrictToMassPeak) {
3376     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;
3377     } else {
3378     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;
3379     }
3380     }
3381    
3382     delete can;
3383     delete allevents;
3384     if(ossf) delete ossf;
3385     if(RcorrJZBem) delete RcorrJZBem;
3386     if(LcorrJZBem) delete LcorrJZBem;
3387     if(RcorrJZBeemm) delete RcorrJZBeemm;
3388     if(LcorrJZBeemm) delete LcorrJZBeemm;
3389     if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBem) delete RcorrJZBSBem;
3390     if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBem) delete LcorrJZBSBem;
3391     if(PlottingSetup::RestrictToMassPeak&&RcorrJZBSBeemm) delete RcorrJZBSBeemm;
3392     if(PlottingSetup::RestrictToMassPeak&&LcorrJZBSBeemm) delete LcorrJZBSBeemm;
3393     }
3394 buchmann 1.1
3395 buchmann 1.4 void check_ptsanity() {
3396     TCanvas *ptsancan = new TCanvas("ptsancan","ptsancan",600,1800);
3397     TH1F *individualpt1histos[allsamples.collection.size()];
3398     TH1F *individualpt2histos[allsamples.collection.size()];
3399     TH1F *fpt1 = new TH1F("fpt1","fpt1",50,0,50);
3400     fpt1->GetYaxis()->SetRangeUser(0,1);
3401     fpt1->GetXaxis()->SetTitle("p_{T,1}");
3402     fpt1->GetXaxis()->CenterTitle();
3403    
3404     TH1F *fpt2 = new TH1F("fpt2","fpt2",50,0,50);
3405     fpt2->GetXaxis()->SetTitle("p_{T,2}");
3406     fpt2->GetXaxis()->CenterTitle();
3407    
3408     ptsancan->Divide(1,3);
3409     ptsancan->cd(1);
3410     float maxpt1entry=0;
3411     float maxpt2entry=0;
3412    
3413     TLegend *leg = make_legend();
3414     leg->SetX1(0.0);
3415     leg->SetY1(0.0);
3416     leg->SetX2(1.0);
3417     leg->SetY2(1.0);
3418    
3419    
3420 buchmann 1.16 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
3421 buchmann 1.4 string nowname=(allsamples.collection)[isample].filename;
3422     cout << "Drawing: " << nowname << " (sample " << isample+1 << " / " << allsamples.collection.size() << ")" << endl;
3423     individualpt1histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt1",50,0,50, "p_{T,1}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
3424     individualpt2histos[isample] = allsamples.Draw(GetNumericHistoName(),"pt2",50,0,50, "p_{T,2}", "events",cutOSSF&&cutnJets,mc,luminosity,allsamples.FindSample(nowname));
3425     individualpt1histos[isample]->SetLineColor(isample+1);
3426     individualpt2histos[isample]->SetLineColor(isample+1);
3427     float currmaxpt1entry=individualpt1histos[isample]->GetMaximum()/individualpt1histos[isample]->Integral();
3428     float currmaxpt2entry=individualpt2histos[isample]->GetMaximum()/individualpt2histos[isample]->Integral();
3429     cout << " pt 1 histo contains; " << individualpt1histos[isample]->Integral() << endl;
3430     cout << " pt 2 histo contains; " << individualpt2histos[isample]->Integral() << endl;
3431     if(currmaxpt1entry>maxpt1entry)maxpt1entry=currmaxpt1entry;
3432     if(currmaxpt2entry>maxpt2entry)maxpt2entry=currmaxpt2entry;
3433     leg->AddEntry(individualpt2histos[isample],((allsamples.collection)[isample].filename).c_str(),"f");
3434     }
3435    
3436     fpt1->GetYaxis()->SetRangeUser(0,maxpt1entry);
3437     fpt2->GetYaxis()->SetRangeUser(0,maxpt2entry);
3438    
3439     ptsancan->cd(1);
3440     fpt1->Draw();
3441     ptsancan->cd(2);
3442     fpt2->Draw();
3443    
3444 buchmann 1.16 for(int isample=0;isample<(int)allsamples.collection.size();isample++) {
3445 buchmann 1.4 ptsancan->cd(1);
3446     individualpt1histos[isample]->DrawNormalized("same,histo");
3447     ptsancan->cd(2);
3448     individualpt2histos[isample]->DrawNormalized("same,histo");
3449     }
3450     ptsancan->cd(3);
3451     leg->Draw();
3452     CompleteSave(ptsancan,"PtSanityCheck");
3453    
3454     delete ptsancan;
3455     }
3456    
3457 buchmann 1.6 void do_mlls_plot(string mcjzb) {
3458     cout << "At this point we'd plot the mll distribution" << endl;
3459     TCanvas *sigcan = new TCanvas("sigcan","sigcan");
3460 buchmann 1.16 for(int isig=0;isig<(int)(signalsamples.collection).size();isig++) {
3461 buchmann 1.6 if(!(signalsamples.collection)[isig].events) continue;
3462     string nowname=(signalsamples.collection)[isig].filename;
3463     TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets,mc,luminosity,signalsamples.FindSample(nowname));
3464     // TH1F *mll = signalsamples.Draw("mllhisto","mll",150,0,150, "m_{ll}", "events","",mc,luminosity,signalsamples.FindSample(nowname));
3465     mll->SetLineColor(TColor::GetColor("#04B404"));
3466     stringstream poscutS;
3467     poscutS << "((" << mcjzb <<")>50)";
3468     TCut poscut(poscutS.str().c_str());
3469     TH1F *mllP = signalsamples.Draw("mllhistoP","mll",150,0,150, "m_{ll}", "events",cutOSSF&&cutnJets&&poscut,mc,luminosity,signalsamples.FindSample(nowname));
3470     mllP->SetLineColor(TColor::GetColor("#0040FF"));
3471     mll->Draw("histo");
3472     mllP->Draw("histo,same");
3473     TLegend *leg = make_legend();
3474     leg->SetY1(0.8);
3475     leg->AddEntry(mll,(signalsamples.collection)[isig].samplename.c_str(),"L");
3476     leg->AddEntry(mllP,((signalsamples.collection)[isig].samplename+", JZB>50").c_str(),"L");
3477     leg->Draw();
3478     TLine *lin = new TLine(71.2,0,71.2,mll->GetMaximum());
3479     TLine *lin2 = new TLine(111.2,0,111.2,mll->GetMaximum());
3480     lin->Draw("same");
3481     lin2->Draw("same");
3482    
3483     CompleteSave(sigcan,"MllShape/"+(signalsamples.collection)[isig].samplename);
3484     delete mll;
3485     delete mllP;
3486     }
3487     }
3488    
3489 buchmann 1.9 void met_vs_jzb_plots() {
3490    
3491     TCanvas *canmetjzb = new TCanvas("canmet","MET vs JZB canvas");
3492     canmetjzb->SetRightMargin(0.16);
3493    
3494     vector<string> findme;
3495     findme.push_back("DY");
3496     findme.push_back("TTJets");
3497     findme.push_back("LM");
3498    
3499 buchmann 1.16 for(int ifind=0;ifind<(int)findme.size();ifind++) {
3500 buchmann 1.9 vector<int> selsamples = allsamples.FindSample(findme[ifind]);
3501     TH2F *metvsjzb = new TH2F("metvsjzb","metvsjzb",200,0,100,400,-100,100);
3502 buchmann 1.16 for(int isel=0;isel<(int)selsamples.size();isel++) {
3503 buchmann 1.9 cout << "Producing MET:JZB plot ... working on sample: " << allsamples.collection[selsamples[isel]].filename << endl;
3504     allsamples.collection[selsamples[isel]].events->Draw("jzb[1]:met[4]>>+metvsjzb",cutmass&&cutOSSF);
3505     }
3506     metvsjzb->Scale(allsamples.collection[selsamples[0]].weight);
3507     metvsjzb->SetStats(0);
3508     metvsjzb->GetXaxis()->SetTitle("MET (GeV)");
3509     metvsjzb->GetYaxis()->SetTitle("JZB (GeV)");
3510     metvsjzb->GetXaxis()->CenterTitle();
3511     metvsjzb->GetYaxis()->CenterTitle();
3512     metvsjzb->Draw("COLZ");
3513     TText* title = write_text(0.5,0.95,allsamples.collection[selsamples[0]].samplename);
3514     title->SetTextAlign(12);
3515     title->Draw();
3516     CompleteSave(canmetjzb,(string)"METvsJZBplots/"+findme[ifind]);
3517     }
3518     }
3519    
3520    
3521 buchmann 1.1 void test() {
3522    
3523     TCanvas *testcanv = new TCanvas("testcanv","testcanv");
3524     testcanv->cd();
3525 buchmann 1.33 // switch_overunderflow(true);
3526 buchmann 1.1 TH1F *ptdistr = allsamples.Draw("ptdistr","pt1",100,30,200, "p_{T} [GeV]", "events", cutOSSF,data,luminosity);
3527     switch_overunderflow(false);
3528     ptdistr->Draw();
3529     testcanv->SaveAs("test.png");
3530     dout << "HELLO there!" << endl;
3531    
3532     }