ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Jeng/scripts/ikstest.cc
Revision: 1.3
Committed: Thu Sep 2 05:36:21 2010 UTC (14 years, 8 months ago) by jengbou
Content type: text/plain
Branch: MAIN
Changes since 1.2: +10 -10 lines
Log Message:
update

File Contents

# User Rev Content
1 jengbou 1.1 #include <vector>
2     #include <TFile.h>
3     #include <TH1.h>
4     #include <TH2.h>
5     #include <TLatex.h>
6     #include <TCanvas.h>
7     #include <TMath.h>
8     #include <TLegend.h>
9     #include <TObject.h>
10     #include <iostream>
11 jengbou 1.2 #include <sstream>
12 jengbou 1.1 #include <fstream>
13     #include <iomanip>
14 jengbou 1.2 #include <map>
15 jengbou 1.1
16     using namespace std;
17    
18 jengbou 1.2 // User defined parameters
19     bool useInv = false; // whether to use n-1 QCD template
20     bool realData = false;
21     const double stepsize = 0.001;
22    
23     //define the constants: 2.78/pb
24     const double weight_[3] = {0.0506107, //QCD
25     0.0088222, //WJets
26     0.000295 //TTbar
27     };
28     const Double_t procQCD = 1.46;
29     const Double_t procWjets = 1.03;
30     const Double_t procttjets = 1.0;
31 jengbou 1.1
32     struct testMC {
33     testMC(Double_t p = 0., Double_t sb = 0., Double_t ss = 0.){prob=p; scaleF_backg = sb; scaleF_sample = ss;}
34     Double_t prob;
35     Double_t scaleF_backg;
36     Double_t scaleF_sample;
37     };
38    
39     //function for doing KS test
40 jengbou 1.2 vector<testMC> doKStest(Double_t NsS, Double_t Ns1, Double_t Ns2, TH1F* mixS, TH1F* s1, TH1F* s2) {
41 jengbou 1.1 vector<testMC> output;
42     //define the scale factors
43     Double_t sf1 = 0.0; // QCD
44     Double_t sf2 = 0.0; // Wjets
45     //KS test
46     do {
47 jengbou 1.2 sf1 = (NsS - Ns2*sf2)/Ns1;
48 jengbou 1.1 if (sf1 < 0) break;
49     //cout << "..........sf1 = " << sf1 << endl;
50     int nbins = mixS->GetNbinsX();
51     double xmin = mixS->GetXaxis()->GetBinLowEdge(1);
52     double xmax = mixS->GetXaxis()->GetBinUpEdge(nbins);
53     TH1F *test = new TH1F("test", "", nbins, xmin, xmax);
54     test -> Sumw2();
55 jengbou 1.2 test -> Add(s1,s2,sf1,sf2);
56 jengbou 1.1 //test->Scale(1./(1.*test->Integral()));
57 jengbou 1.3 Double_t probability = mixS -> KolmogorovTest(test,"");
58 jengbou 1.1 testMC temp = testMC(probability,sf1,sf2);
59     output.push_back(temp);
60     // cout << "probability = " << setw(15) << temp.prob
61     // << "; sfQCD = " << setw(10) << temp.scaleF_backg
62 jengbou 1.3 // << "; sfWjets = " << setw(6) << temp.scaleF_sample << endl;
63 jengbou 1.1 delete test;
64 jengbou 1.2 sf2 = sf2 + stepsize;
65     } while(sf1 > 0 && sf2 <= 2.0);
66 jengbou 1.1 return output;
67     }
68    
69     //get the maximum KS test result
70     testMC getMax(vector<testMC> vec) {
71     testMC maxKSRes;
72     Double_t maximum = 0.0;
73     for (size_t i = 0; i < vec.size(); i++) {
74     if (maximum < vec.at(i).prob) {
75     maximum = vec.at(i).prob;
76     maxKSRes = vec.at(i);
77     }
78     }
79 jengbou 1.2 cout << "for maximum: " << setw(12) << maxKSRes.prob
80     << "; sb = " << setw(10) << maxKSRes.scaleF_backg
81     << "; ss = " << setw(5) << maxKSRes.scaleF_sample << endl;
82 jengbou 1.1 return maxKSRes;
83     }
84    
85 jengbou 1.2
86     //=================================
87     // Main program
88     //=================================
89 jengbou 1.1 void ikstest() {
90     //Style();
91     TLatex *latex = new TLatex();
92     latex->SetNDC();
93    
94 jengbou 1.2 ofstream outprint( "ikstest_results_20100901.txt" );
95     //open the files with histograms
96     map<string,TFile*> mfile;
97     mfile["Data"] = TFile::Open("skimmed_Data_20100901/Data_RefSel_v3.root");
98     // n-1 cuts
99     if (useInv) {
100     if (realData)
101     // mfile["InvSel"] = TFile::Open("skimmed_Data_20100825/Data_D0ge0p03.root");
102     mfile["InvSel"] = TFile::Open("skimmed_Data_20100901/Data_RelIsoge0p1_v3.root");
103     else
104     // mfile["InvSel"] = TFile::Open("skimmed_MC/QCD_D0ge0p03.root");
105     mfile["InvSel"] = TFile::Open("skimmed_MC/QCD_RelIsoge0p1_v3.root");
106     }
107 jengbou 1.1
108 jengbou 1.2 // RefSel MC
109     mfile["0"] = TFile::Open("skimmed_MC/QCD_RefSel_v3.root");
110     mfile["1"] = TFile::Open("skimmed_MC/WJets_RefSel_v3.root");
111     mfile["2"] = TFile::Open("skimmed_MC/TTbar_RefSel_v3.root");
112 jengbou 1.1
113     //define histograms and related parameters
114 jengbou 1.2 string histoName[3] = {"h_mu_pt_calo","h_met_calo","h_mt_calo"};
115 jengbou 1.1 string histoLabelX[3] = {"p_{T}^{good Muons}", "E_{T}^{#nu}", "m_{T}^{W}"};
116 jengbou 1.2 Int_t xbins[3] = {20,20,40};
117 jengbou 1.1 Double_t xlow[3] = {0.,0.,0.};
118 jengbou 1.2 Double_t xhigh[3] = {100.,100.,200.};
119 jengbou 1.1 string sample[3] = {"QCD","Wjets","ttjets"};
120    
121     TH1F* h_[9];
122     TH1F* mixh_[3];
123     TH1F* hQCD_NEW[3];
124     TH1F* hKSres_[3];
125     TH1F* hKSvalues_[3];
126    
127     //load the histograms from the root files
128     for (int i = 0; i < 3; i++) {// 3 variables
129     //cout << "file[" << i << "] : " << endl;
130 jengbou 1.2 string nameNewHisto = "mix_"+histoName[i];
131     string nameNewHistoSFKS = "finalSF_"+histoName[i];
132 jengbou 1.1 string nameNewHistoKSvalues = "KSvalues_"+histoLabelX[i];
133    
134     mixh_[i] = new TH1F(nameNewHisto.c_str(),"",xbins[i],xlow[i],xhigh[i]);
135     hKSres_[i] = new TH1F(nameNewHistoSFKS.c_str(),"",xbins[i],xlow[i],xhigh[i]);
136 jengbou 1.2 hKSvalues_[i] = new TH1F(nameNewHistoKSvalues.c_str(),"",2./stepsize, stepsize, 2.+stepsize);
137    
138     if (!useInv) {//use QCD MC sample
139     hQCD_NEW[i] = (TH1F*) mfile["0"]->Get(TString(histoName[i]))->Clone();
140     hQCD_NEW[i] -> Scale(weight_[0]);
141     hQCD_NEW[i] -> SetName((histoName[i]).c_str());
142     }
143     else {
144     hQCD_NEW[i] = (TH1F*) mfile["InvSel"]->Get(TString(histoName[i]));
145     if (!realData) hQCD_NEW[i] -> Scale(weight_[0]);
146     hQCD_NEW[i] -> SetName((histoName[i]).c_str());
147     }
148 jengbou 1.1
149     mixh_[i] -> Sumw2();
150     hKSres_[i] -> Sumw2();
151     hKSvalues_[i] -> Sumw2();
152 jengbou 1.2 }
153 jengbou 1.1
154 jengbou 1.2 for (int n = 0; n < 3; ++n) {// 3 MC samples
155     for (int ihisto = 0; ihisto < 3; ihisto++) {// 3 variables
156 jengbou 1.1 //cout << "Variable[" << ihisto << "]" << endl;
157 jengbou 1.2 string histo_name = histoName[ihisto]+sample[n];
158     ostringstream ss;
159     ss << n;
160     h_[n*3+ihisto] = (TH1F*) mfile[ss.str()]->Get(TString(histoName[ihisto]))->Clone();
161     h_[n*3+ihisto] -> Scale(weight_[n]);
162     h_[n*3+ihisto] -> SetName(histo_name.c_str());
163 jengbou 1.1 }
164     }
165    
166     //create the mixed samples = "data"
167 jengbou 1.2 TCanvas *canvas0 = new TCanvas("Data","Data distributions");
168     canvas0->Divide(3,1);
169 jengbou 1.1 for (int i = 0; i < 3; i++) {
170 jengbou 1.2 canvas0->cd(i+1);
171     if (!realData) {
172     mixh_[i] -> Add(h_[i],h_[i+3], procQCD,procWjets);
173     //mixh_[i] -> Add(mixh_[i],h_[i+6], 1,procttjets);
174     //cout << "histo_name: " << mixh_[0]->GetNbinsX() << endl;
175     }
176     else {
177     TH1F *htmp = (TH1F*) mfile["Data"]->Get(TString(histoName[i]));
178     mixh_[i] -> Add(htmp,1.);
179     }
180     mixh_[i]->DrawClone();
181 jengbou 1.1 }
182 jengbou 1.2 canvas0->SaveAs("Data_distributions.pdf");
183 jengbou 1.1
184     //define the weight corrections for each sample
185 jengbou 1.2 double NevData = mixh_[2]->Integral();
186     double corr_NevQCD = h_[2]->Integral();
187     double corr_NevQCD_NEW = hQCD_NEW[2]->Integral();
188     double corr_NevWjets = h_[5]->Integral();
189     double corr_Nevttjets = h_[8]->Integral();
190 jengbou 1.1 double corr_Nevmix = procQCD*corr_NevQCD+procWjets*corr_NevWjets;
191 jengbou 1.2 //double corr_Nevmix = procQCD*corr_NevQCD+procWjets*corr_NevWjets+procttjets*corr_Nevttjets;
192     if (!realData)
193 jengbou 1.3 outprint << "Events mix sample = " << corr_Nevmix << endl;
194 jengbou 1.2 else
195 jengbou 1.3 outprint << "Events in Data = " << NevData << endl;
196     outprint << "Events QCD sample = " << corr_NevQCD << endl;
197     outprint << "Events Wjets sample = " << corr_NevWjets << endl;
198     outprint << "Events InvSel sample = " << corr_NevQCD_NEW << endl;
199 jengbou 1.1
200     //define the containers for chosen numbers (coressponding to the max KStest result)
201     testMC maxProb[3];
202    
203     //define the scale factors calculated using information obtained from all parameters
204     Double_t SFbackg = 0.0;
205     Double_t sumSFbackg = 0.0;
206     Double_t SFsample = 0.0;
207     Double_t sumSFsample = 0.0;
208     Double_t allKS = 0.0;
209    
210     //do the KS test by varying the scale factors
211     for (int i = 0; i < 3; i++) { // 3 variables
212     TH1F *data = (TH1F*)mixh_[i]->Clone();
213 jengbou 1.2 data -> SetName("dataClone");
214 jengbou 1.1 //data -> Scale(1./data->Integral());
215 jengbou 1.2 vector<testMC> resultsKS = doKStest((realData ? NevData : corr_Nevmix),
216     (useInv ? corr_NevQCD_NEW : corr_NevQCD),
217     corr_NevWjets,
218     data, hQCD_NEW[i], h_[i+3]);
219 jengbou 1.1 testMC tksmax = getMax(resultsKS);
220     maxProb[i] = tksmax;
221     outprint << "\nFor the plot " << histoLabelX[i] << " the results are:"<< endl;
222     outprint << "\tmax Probability = " << maxProb[i].prob << endl;
223     outprint << "\tproc_background = " << maxProb[i].scaleF_backg << endl;
224     outprint << "\tproc_sample = " << maxProb[i].scaleF_sample << endl;
225    
226 jengbou 1.2 outprint << "\n\tpercent_B of Data = "
227     << maxProb[i].scaleF_backg*corr_NevQCD_NEW*100/(realData ? NevData : corr_Nevmix) << endl;
228     outprint << "\tpercent_S of Data = "
229     << maxProb[i].scaleF_sample*corr_NevWjets*100/(realData ? NevData : corr_Nevmix) << endl;
230 jengbou 1.1 outprint << "---------------------------" << endl;
231    
232     //create the mixed samples with KS test results
233     sumSFbackg += maxProb[i].prob*maxProb[i].scaleF_backg;
234     sumSFsample += maxProb[i].prob*maxProb[i].scaleF_sample;
235     allKS += maxProb[i].prob;
236    
237     //fill a histogram with the results from the KS test for each variable
238     for (int jiter = 0; jiter < resultsKS.size(); jiter++) {
239 jengbou 1.2 if (resultsKS.at(jiter).prob == 1.)
240     cout << "variable [" << i << "]: prob[" << jiter << "]= " << resultsKS.at(jiter).prob << endl;
241 jengbou 1.1 hKSvalues_[i]->SetBinContent(jiter,resultsKS.at(jiter).prob);
242     }
243     delete data;
244     }
245    
246     //calculate the final scale factors
247     SFbackg = sumSFbackg/allKS;
248     SFsample = sumSFsample/allKS;
249     outprint << "allKS = " << allKS << "\tbackground = " << SFbackg << "\tsample = " << SFsample << endl;
250 jengbou 1.3 outprint << "==> Scale Factor for QCD MC = " << SFbackg*corr_NevQCD_NEW/corr_NevQCD << endl;
251     outprint << "\tcombined percent_B of Data = "
252 jengbou 1.2 << SFbackg*corr_NevQCD_NEW*100/(realData ? NevData : corr_Nevmix) << endl;
253 jengbou 1.3 outprint << "\tcombined percent_S of Data = "
254 jengbou 1.2 << SFsample*corr_NevWjets*100/(realData ? NevData : corr_Nevmix) << endl;
255 jengbou 1.1 outprint << "\n" << endl;
256     outprint << "=================================" << endl;
257     outprint << "\n" << endl;
258    
259 jengbou 1.2
260     //=================================
261     // Plots
262     //=================================
263     for (int i = 0; i < 3; i++) {// 3 variables
264     hKSres_[i] -> Add(hQCD_NEW[i],h_[i+3],SFbackg,SFsample);
265     outprint << "hKSres->Integral() = " << hKSres_[i]->Integral() << endl;
266     outprint << "Data->Integral() = " << mixh_[i]->Integral() << endl;
267    
268     mixh_[i]->Rebin(2);
269     hQCD_NEW[i]->Rebin(2);
270     h_[i]->Rebin(2);
271     h_[i+3]->Rebin(2);
272     hKSres_[i]->Rebin(2);
273     //hKSvalues_[i]->Rebin(2);
274    
275     mixh_[i] ->SetLineColor(1);
276     hQCD_NEW[i] ->SetLineColor(3);
277     h_[i] ->SetLineColor(6);
278     h_[i+3] ->SetLineColor(4);
279     hKSres_[i] ->SetLineColor(2);
280     hKSvalues_[i]->SetLineColor(i+1);
281    
282     mixh_[i] ->SetMarkerColor(1);
283     hQCD_NEW[i] ->SetMarkerColor(3);
284     h_[i] ->SetMarkerColor(6);
285     h_[i+3] ->SetMarkerColor(4);
286     hKSres_[i] ->SetMarkerColor(2);
287     hKSvalues_[i]->SetMarkerColor(i+1);
288    
289     mixh_[i] ->SetMarkerStyle(24);
290     hQCD_NEW[i] ->SetMarkerStyle(20);
291     h_[i] ->SetMarkerStyle(20);
292     h_[i+3] ->SetMarkerStyle(20);
293     hKSres_[i] ->SetMarkerStyle(20);
294     hKSvalues_[i]->SetMarkerStyle(20);
295    
296     mixh_[i] ->SetMarkerSize(1.4);
297     hQCD_NEW[i] ->SetMarkerSize(1.1);
298     h_[i] ->SetMarkerSize(1.1);
299     h_[i+3] ->SetMarkerSize(1.1);
300     hKSres_[i] ->SetMarkerSize(0.9);
301     hKSvalues_[i]->SetMarkerSize(1.1);
302    
303     mixh_[i] ->SetStats(0);
304     hQCD_NEW[i] ->SetStats(0);
305     h_[i] ->SetStats(0);
306     h_[i+3] ->SetStats(0);
307     hKSres_[i] ->SetStats(0);
308     hKSvalues_[i]->SetStats(0);
309    
310     mixh_[i]->GetXaxis()->SetTitle(histoLabelX[i].c_str());
311     mixh_[i]->GetYaxis()->SetTitle("Entries");
312     hKSres_[i]->GetXaxis()->SetTitle(histoLabelX[i].c_str());
313     hKSres_[i]->GetYaxis()->SetTitle("Entries");
314     hKSvalues_[i]->GetXaxis()->SetTitle("iteration #");
315     hKSvalues_[i]->GetYaxis()->SetTitle("KS test values");
316    
317     string nameCanvas1 = histoName[i]+"_QCD.pdf";
318     TCanvas *canvas1 = new TCanvas(nameCanvas1.c_str(), "");
319     hQCD_NEW[i] -> Scale(1./hQCD_NEW[i]->Integral());
320     h_[i] -> Scale(1./h_[i]->Integral());
321     h_[i+3] -> Scale(1./h_[i+3]->Integral());
322     outprint << "For " << histoName[i] << " , the KStest result btw MC_QCD/InvSel is = "
323     << h_[i] -> KolmogorovTest(hQCD_NEW[i],"") << endl;
324     hQCD_NEW[i]->Draw("P");
325     h_[i]->Draw("sameP");
326     h_[i+3]->Draw("sameP");
327     TLegend *legend1 = new TLegend(0.7, 0.70, 0.9, 0.85);
328     legend1->AddEntry(h_[i], "default");
329     legend1->AddEntry(h_[i+3], "W+jets");
330     legend1->AddEntry(hQCD_NEW[i], "new");
331     legend1->Draw();
332     legend1->SetFillColor(kWhite);
333     latex->DrawLatex(0.22,0.91,histoName[i].c_str());
334     canvas1->SetLogy();
335     canvas1->SaveAs(nameCanvas1.c_str());
336    
337     string nameCanvas2 = histoName[i]+"_dataKS.pdf";
338     TCanvas *canvas2 = new TCanvas(nameCanvas2.c_str(), "");
339     hKSres_[i]->Draw("P");
340     mixh_[i]->Draw("sameP");
341     TLegend *legend2 = new TLegend(0.7, 0.70, 0.9, 0.85);
342     legend2->AddEntry(mixh_[i], "Data");
343     legend2->AddEntry(hKSres_[i], "KS result");
344     legend2->Draw();
345     legend2->SetFillColor(kWhite);
346     latex->DrawLatex(0.22,0.91,histoName[i].c_str());
347     canvas2->SetLogy();
348     canvas2->SaveAs(nameCanvas2.c_str());
349    
350     }
351    
352    
353     TCanvas *canvas3 = new TCanvas("KStestValues", "");
354     //hKSvalues_[0]->GetXaxis()->SetRangeUser(0.9,1.1);
355     //hKSvalues_[0]->GetYaxis()->SetRangeUser(1e-3,1.1);
356     hKSvalues_[0]->Draw();
357     hKSvalues_[1]->SetLineColor(2);
358     hKSvalues_[1]->Draw("same");
359     hKSvalues_[2]->SetLineColor(4);
360     hKSvalues_[2]->Draw("same");
361     TLegend *legend3 = new TLegend(0.7, 0.70, 0.9, 0.85);
362     legend3->AddEntry(hKSvalues_[0], "muon_pT");
363     legend3->AddEntry(hKSvalues_[1], "MET");
364     legend3->AddEntry(hKSvalues_[2], "W_mT");
365     legend3->Draw();
366     legend3->SetFillColor(kWhite);
367     latex->DrawLatex(0.22,0.91,"KS test values");
368     canvas3->SetLogy();
369     string nameCanvas3 = "KStestValues_newQCD.pdf";
370     canvas3->SaveAs(nameCanvas3.c_str());
371    
372 jengbou 1.1 }