ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/LJMet/MultivariateAnalysis/root/toyMC.C
Revision: 1.6
Committed: Tue May 19 19:07:10 2009 UTC (15 years, 11 months ago) by kukartse
Content type: text/plain
Branch: MAIN
Changes since 1.5: +27 -18 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 kukartse 1.1 #include <iostream>
2     #include "TH1F.h"
3     #include "TObjArray.h"
4     #include "TFractionFitter.h"
5     #include "TFile.h"
6     #include "TTree.h"
7 kukartse 1.6 #include "TChain.h"
8 kukartse 1.1 #include "TRandom3.h"
9 kukartse 1.2 #include "TCanvas.h"
10 kukartse 1.5 #include "TSlider.h"
11    
12     //gROOT->SetStyle("Plain");
13     //gStyle->SetOptStat(0);
14 kukartse 1.1
15     using namespace std;
16    
17     class toyMC
18     {
19     public:
20    
21     toyMC();
22 kukartse 1.5 toyMC(int nbins);
23 kukartse 1.1 ~toyMC();
24    
25     void load_templates();
26 kukartse 1.3 void load_ejets_templates();
27 kukartse 1.1 int do_fit(TH1F * _data);
28     int generate_toy(int n_sig, int n_phys, int n_qcd);
29 kukartse 1.2 void set_overflow_bins(TH1F * h);
30     void debug_hist(TH1F * h);
31     int fit_data(void);
32 kukartse 1.1
33     TH1F * data;
34     TH1F * ttbar;
35     TH1F * wzjets;
36     TH1F * qcd;
37    
38 kukartse 1.5 int n_bins;
39    
40 kukartse 1.1 TObjArray * mc;
41     TFractionFitter * fit;
42    
43 kukartse 1.4 int n_gen_sig,n_gen_bkg1,n_gen_bkg2;
44    
45 kukartse 1.1 TH1F * toy_data;
46    
47     private:
48     TRandom3 _random;
49     };
50    
51    
52     toyMC::toyMC(){
53     data = 0;
54     ttbar = 0;
55     wzjets = 0;
56     qcd = 0;
57     mc = 0;
58     fit = 0;
59     toy_data = 0;
60 kukartse 1.5 n_bins = 50;
61     }
62    
63    
64     toyMC::toyMC(int nbins){
65     data = 0;
66     ttbar = 0;
67     wzjets = 0;
68     qcd = 0;
69     mc = 0;
70     fit = 0;
71     toy_data = 0;
72     n_bins = nbins;
73 kukartse 1.1 }
74    
75    
76     toyMC::~toyMC(){
77     delete data;
78     delete ttbar;
79     delete wzjets;
80     delete qcd;
81     delete mc;
82     delete fit;
83     delete toy_data;
84     }
85    
86    
87     void toyMC::load_templates(){
88 kukartse 1.6 TFile * data_file = new TFile("./TMVApp-data-16may2009.root","READ");
89 kukartse 1.2 TFile * ttbar_phys_template_file = new TFile("./TMVA.root","READ");
90 kukartse 1.6 TFile * qcd_template_file = new TFile("./TMVApp-qcd-16may2009.root","READ");
91 kukartse 1.1
92     TTree * t_data = (TTree *)data_file->Get("classifier");
93     TTree * t_ttbar_phys = (TTree *)ttbar_phys_template_file->Get("TestTree");
94     TTree * t_qcd = (TTree *)qcd_template_file->Get("classifier");
95    
96     delete data;
97     delete ttbar;
98     delete wzjets;
99     delete qcd;
100    
101 kukartse 1.2 delete data;
102     delete ttbar;
103     delete wzjets;
104     delete qcd;
105 kukartse 1.5 data = new TH1F("data" ,"data" ,n_bins, -0.8, 0.8);
106     ttbar = new TH1F("ttbar" ,"ttbar" ,n_bins, -0.8, 0.8);
107     wzjets = new TH1F("wzjets","wzjets",n_bins, -0.8, 0.8);
108     qcd = new TH1F("qcd" ,"qcd" ,n_bins, -0.8, 0.8);
109    
110     //
111     data->SetMarkerStyle(21);
112     data->SetMarkerSize(0.7);
113     //data->SetFillStyle(4050);
114     ttbar->SetFillColor(42);
115     //ttbar->SetFillStyle(4050);
116     wzjets->SetFillColor(46);
117     //wzjets->SetFillStyle(4050);
118     qcd->SetFillColor(48);
119     //TSlider *slider = 0;
120     //
121 kukartse 1.2
122     TCanvas * c1 = new TCanvas("canvas1","canvas1",800,600);
123     c1->Divide(2,2);
124 kukartse 1.5 TVirtualPad * pad = c1->cd(1);
125 kukartse 1.1 t_data -> Draw("MVA_BDT>>data");
126 kukartse 1.5 pad->SaveAs("mu_data.eps");
127     pad = c1->cd(2);
128 kukartse 1.1 t_ttbar_phys -> Draw("MVA_BDT>>ttbar","type==1");
129 kukartse 1.5 pad->SaveAs("mu_ttbar_template.eps");
130     pad = c1->cd(3);
131 kukartse 1.1 t_ttbar_phys -> Draw("MVA_BDT>>wzjets","type==0");
132 kukartse 1.5 pad->SaveAs("mu_wzjets_template.eps");
133     pad = c1->cd(4);
134 kukartse 1.1 t_qcd -> Draw("MVA_BDT>>qcd");
135 kukartse 1.5 pad->SaveAs("mu_qcd_template.eps");
136 kukartse 1.1
137 kukartse 1.2 set_overflow_bins(data);
138     set_overflow_bins(ttbar);
139     set_overflow_bins(wzjets);
140     set_overflow_bins(qcd);
141    
142 kukartse 1.1 //data_file->Close();
143     //ttbar_phys_template_file->Close();
144     //qcd_template_file->Close();
145    
146     delete mc;
147     mc = new TObjArray(3); // MC histograms are put in this array
148     mc->Add(ttbar);
149     mc->Add(wzjets);
150     mc->Add(qcd);
151     }
152    
153    
154 kukartse 1.3 void toyMC::load_ejets_templates(){
155 kukartse 1.6 //TFile * data_file = new TFile("./TMVApp-data-electron_noqcd.root","READ");
156     //TFile * data_file = new TFile("./TMVApp-data-electron_wzfastsim-08may2009.root","READ");
157 kukartse 1.5 TFile * data_file = new TFile("./TMVApp-data-electron-08may2009.root","READ");
158     TFile * ttbar_phys_template_file = new TFile("./TMVA.root","READ");
159     TFile * qcd_template_file = new TFile("./TMVApp-qcd-electron-08may2009.root","READ");
160 kukartse 1.3
161 kukartse 1.6 //TChain * t_data = new TChain("classifier");
162     //t_data->Add("./TMVApp-data-electron_noqcd.root");
163     //t_data->Add("./TMVApp-data-electron_qcdonly.root");
164     //t_data->Add("./TMVApp-data-electron_200.root");
165    
166 kukartse 1.3 TTree * t_data = (TTree *)data_file->Get("classifier");
167     TTree * t_ttbar_phys = (TTree *)ttbar_phys_template_file->Get("TestTree");
168     TTree * t_qcd = (TTree *)qcd_template_file->Get("classifier");
169    
170     delete data;
171     delete ttbar;
172     delete wzjets;
173     delete qcd;
174    
175 kukartse 1.6 data = new TH1F("data" ,"data" ,n_bins, -0.8, 0.8);
176     ttbar = new TH1F("ttbar" ,"ttbar" ,n_bins, -0.8, 0.8);
177     wzjets = new TH1F("wzjets","wzjets",n_bins, -0.8, 0.8);
178     qcd = new TH1F("qcd" ,"qcd" ,n_bins, -0.8, 0.8);
179 kukartse 1.5
180     //
181     data->SetMarkerStyle(21);
182     data->SetMarkerSize(0.7);
183     //data->SetFillStyle(4050);
184     ttbar->SetFillColor(42);
185     //ttbar->SetFillStyle(4050);
186     wzjets->SetFillColor(46);
187     //wzjets->SetFillStyle(4050);
188     qcd->SetFillColor(48);
189     //TSlider *slider = 0;
190     //
191 kukartse 1.3
192 kukartse 1.5 TCanvas * c1 = new TCanvas("canvas1","canvas1",800,600);
193     c1->Divide(2,2);
194     TVirtualPad * pad = c1->cd(1);
195 kukartse 1.3 t_data -> Draw("MVA_BDT>>data");
196 kukartse 1.5 pad->SaveAs("e_data.eps");
197     pad = c1->cd(2);
198 kukartse 1.3 t_ttbar_phys -> Draw("MVA_BDT>>ttbar","type==1");
199 kukartse 1.5 pad->SaveAs("e_ttbar_template.eps");
200     pad = c1->cd(3);
201 kukartse 1.3 t_ttbar_phys -> Draw("MVA_BDT>>wzjets","type==0");
202 kukartse 1.5 pad->SaveAs("e_wzjets_template.eps");
203     pad = c1->cd(4);
204 kukartse 1.3 t_qcd -> Draw("MVA_BDT>>qcd");
205 kukartse 1.5 pad->SaveAs("e_qcd_template.eps");
206 kukartse 1.3
207     //data_file->Close();
208     //ttbar_phys_template_file->Close();
209     //qcd_template_file->Close();
210    
211     delete mc;
212     mc = new TObjArray(3); // MC histograms are put in this array
213     mc->Add(ttbar);
214     mc->Add(wzjets);
215     mc->Add(qcd);
216     }
217    
218    
219 kukartse 1.1 int toyMC::do_fit(TH1F * _data){
220     delete fit;
221     fit = new TFractionFitter(_data, mc); // initialise
222 kukartse 1.4
223 kukartse 1.1 fit->Constrain(1,0.0,1.0); // constrain fraction 1 to be between 0 and 1
224     fit->Constrain(2,0.0,1.0); // constrain fraction 1 to be between 0 and 1
225 kukartse 1.6 //fit->Constrain(3,0.0,1.0); // constrain fraction 1 to be between 0 and 1
226 kukartse 1.4
227 kukartse 1.6 //fit->Constrain(3,0.37259,0.37261);
228    
229     fit->Constrain(3,0.036759,0.036761); // mu+jets true
230     fit->Constrain(3,0.017379,0.017381); // mu+jets ABCD
231     //fit->Constrain(3,0.4422735,0.4422736); // constrain fraction 1 to be between 0 and 1
232     //
233 kukartse 1.5 //double qcd_frac = (double)n_gen_bkg2/(double)(n_gen_sig+n_gen_bkg1+n_gen_bkg2);
234     //fit->Constrain(3,qcd_frac-0.000001,qcd_frac+0.000001); // constrain fraction 1 to be between 0 and 1
235 kukartse 1.6 //
236 kukartse 1.5 fit->SetRangeX(1,n_bins); // use only some bins to fit
237 kukartse 1.1 Int_t status = fit->Fit(); // perform the fit
238 kukartse 1.3 if (status!=0) status = fit->Fit();
239 kukartse 1.1 cout << "fit status: " << status << endl;
240     return status;
241     }
242    
243 kukartse 1.5 /*
244     int toyMC::fit1(TH1F * _data, double bkg2_low = 0.0, bkg2_high = 1.0){
245     delete fit;
246     fit = new TFractionFitter(_data, mc); // initialise
247    
248     fit->Constrain(1,data_low,data_high); // constrain fraction 1 to be between 0 and 1
249     fit->Constrain(2,bkg1_low,bkg1_high); // constrain fraction 1 to be between 0 and 1
250     fit->Constrain(3,bkg2_low,bkg2_high); // constrain fraction 1 to be between 0 and 1
251     fit->SetRangeX(first_bin,last_bin); // use only some bins to fit
252     Int_t status = fit->Fit(); // perform the fit
253     if (status!=0) status = fit->Fit(); // make one more attempt to fit if the first one fails
254     cout << "fit status: " << status << endl;
255     return status;
256     }
257     */
258 kukartse 1.1
259     int toyMC::generate_toy(int n_sig, int n_bg, int n_qcd){
260     int n_events=0;
261     delete toy_data;
262 kukartse 1.3
263 kukartse 1.6 toy_data = new TH1F("toy_data" ,"toy_data" ,n_bins, -0.8, 0.8);
264 kukartse 1.1
265     int _nsig = _random.Poisson(n_sig);
266     int _nbg = _random.Poisson(n_bg);
267     int _nqcd = _random.Poisson(n_qcd);
268 kukartse 1.2 //int _nqcd = n_qcd;
269 kukartse 1.4
270     n_gen_sig = _nsig;
271     n_gen_bkg1 = _nbg;
272     n_gen_bkg2 = _nqcd;
273 kukartse 1.2 n_events = _nsig+_nbg+_nqcd;
274 kukartse 1.1
275     for (int i=0;i<_nsig;i++){
276     toy_data->Fill(ttbar->GetRandom());
277     }
278     for (int i=0;i<_nbg;i++){
279     toy_data->Fill(wzjets->GetRandom());
280     }
281     for (int i=0;i<_nqcd;i++){
282     toy_data->Fill(qcd->GetRandom());
283     }
284 kukartse 1.2 //toy_data->Draw();
285     set_overflow_bins(toy_data);
286 kukartse 1.1 return n_events;
287 kukartse 1.4 //return _nsig;
288 kukartse 1.1 }
289 kukartse 1.2
290     void toyMC::set_overflow_bins(TH1F * h){
291     Int_t _last_bin = h->GetNbinsX();
292     Double_t _overflow = h->GetBinContent(_last_bin+1);
293     Int_t n_entries = h->GetEntries();
294     //h->ResetBit(TH1::kCanRebin);
295     h->AddBinContent(1,h->GetBinContent(0));
296     h->AddBinContent(_last_bin,_overflow);
297     h->SetBinContent(0,0);
298     h->SetBinContent(_last_bin+1,0);
299     h->SetEntries(n_entries);
300     }
301    
302    
303     void toyMC::debug_hist(TH1F * h){
304     cout << "DEBUG: number of entries: " << h->GetEntries() << endl;
305     cout << "DEBUG: underflow: " << h->GetBinContent(0) << endl;
306     cout << "DEBUG: bin1: " << h->GetBinContent(1) << endl;
307     Int_t _last_bin = h->GetNbinsX();
308     cout << "DEBUG: last bin: " << h->GetBinContent(_last_bin) << endl;
309     cout << "DEBUG: overflow: " << h->GetBinContent(_last_bin+1) << endl;
310     }
311    
312    
313     int toyMC::fit_data(){
314 kukartse 1.5 //load_templates();
315 kukartse 1.4 //load_ejets_templates();
316 kukartse 1.2 int _res = do_fit(data);
317     int n_data = data->GetEntries();
318     TH1F * result = (TH1F*) fit->GetPlot();
319 kukartse 1.5 result->SetFillColor(16);
320     //result->SetFillStyle(4050);
321 kukartse 1.2 data->SetMinimum(0);
322     TCanvas * c = new TCanvas("canvas2","canvas2",800,600);
323     data->Draw("Ep");
324     result->Draw("same");
325     //
326     Double_t value,error;
327     fit->GetResult(0,value,error);
328     ttbar->Scale(n_data*value/ttbar->Integral());
329     ttbar->Draw("same");
330     //
331 kukartse 1.6 fit->GetResult(1,value,error);
332     wzjets->Scale(n_data*value/wzjets->Integral());
333     wzjets->Draw("same");
334     //
335 kukartse 1.5 fit->GetResult(2,value,error);
336     qcd->Scale(n_data*value/qcd->Integral());
337     qcd->Draw("same");
338     data->Draw("Ep:same");
339     //
340     c->SaveAs("fit.eps");
341 kukartse 1.2 return _res;
342     }