BAT  0.9.4
The Bayesian analysis toolkit
 All Classes Namespaces Functions Variables Enumerations
BCModelOutput.cxx
1 /*
2  * Copyright (C) 2007-2014, the BAT core developer team
3  * All rights reserved.
4  *
5  * For the licensing terms see doc/COPYING.
6  * For documentation see http://mpp.mpg.de/bat
7  */
8 
9 // ---------------------------------------------------------
10 
11 #include "BCModelOutput.h"
12 
13 #include "BCModel.h"
14 #include "BCParameter.h"
15 #include "BCH1D.h"
16 #include "BCH2D.h"
17 #include "BCLog.h"
18 
19 #include <TDirectory.h>
20 #include <TFile.h>
21 #include <TTree.h>
22 #include <TObject.h>
23 #include <TH2D.h>
24 #include <TH1D.h>
25 #include <TString.h>
26 
27 #include <iostream>
28 
29 // ---------------------------------------------------------
31 {
32  Init();
33 }
34 
35 // ---------------------------------------------------------
36 BCModelOutput::BCModelOutput(BCModel * model, const char * filename)
37 {
38  Init();
39  SetModel(model);
40  SetFile(filename);
41 }
42 
43 // ---------------------------------------------------------
45 {
46  if (fOutputFile) {
47  Close();
48  delete fOutputFile;
49  }
50 }
51 
52 // ---------------------------------------------------------
54 {
55  modeloutput.Copy(* this);
56 }
57 
58 // ---------------------------------------------------------
60 {
61  if (this != &modeloutput)
62  modeloutput.Copy(* this);
63 
64  return * this;
65 }
66 
67 // ---------------------------------------------------------
68 void BCModelOutput::Init()
69 {
70  fIndex = 0;
71  fOutputFile = 0;
72  fAnalysisTree = 0;
73  fTreeSA = 0;
74  fModel = 0;
75  fFileName = 0;
76 }
77 
78 // ---------------------------------------------------------
80 {
81  fModel = model;
82  fModel->MCMCInitialize();
83  fModel->SAInitialize();
84 }
85 
86 // ---------------------------------------------------------
87 void BCModelOutput::SetFile(const char * filename)
88 {
89  if(!fModel) {
90  BCLog::OutError("BCModelOutput::SetFile : Cannot set file if model is not set.");
91  return;
92  }
93 
94  // delete the old file
95  if (fOutputFile) {
96  fOutputFile->Close();
97  delete fOutputFile;
98  }
99 
100  // remember current directory
101  TDirectory * dir = gDirectory;
102 
103  // create a new file
104  fFileName = const_cast<char *>(filename);
105  fOutputFile = TFile::Open(fFileName, "RECREATE");
106 
107  // initialize trees
108  InitializeAnalysisTree();
109  fModel->MCMCInitializeMarkovChainTrees();
110  fModel->InitializeSATree();
111 
112  // change back to the old directory
113  gDirectory = dir;
114 }
115 
116 // ---------------------------------------------------------
118 {
119  if (fModel)
120  fModel->WriteMarkovChain(flag);
121 }
122 
123 // ---------------------------------------------------------
125 {
126  if(!fOutputFile) {
127  BCLog::OutError("BCModelOutput::FillAnalysisTree : No file to write to.");
128  return;
129  }
130 
131  // get output values from model
132  fNParameters = fModel->GetNParameters();
133  fProbability_apriori = fModel->GetModelAPrioriProbability();
134  fProbability_aposteriori = fModel->GetModelAPosterioriProbability();
135 
136  fMode_global.clear();
137  fMode_marginalized.clear();
138  fMean_marginalized.clear();
139  fMedian_marginalized.clear();
140  fQuantile_05.clear();
141  fQuantile_10.clear();
142  fQuantile_16.clear();
143  fQuantile_84.clear();
144  fQuantile_90.clear();
145  fQuantile_95.clear();
146 
147  // loop over parameters
148  int nparameters = fModel->GetNParameters();
149  for (int i = 0; i < nparameters; ++i) {
150  const BCParameter * parameter = fModel->GetParameter(i);
151  if (fModel->GetBestFitParameters().size() > 0)
152  fMode_global.push_back(fModel->GetBestFitParameters().at(i));
153  if (fModel->GetMarginalized(parameter->GetName().data())) {
154  fMode_marginalized.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetMode());
155  fMean_marginalized.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetMean());
156  fMedian_marginalized.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetMedian());
157  fQuantile_05.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.05));
158  fQuantile_10.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.10));
159  fQuantile_16.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.16));
160  fQuantile_84.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.84));
161  fQuantile_90.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.90));
162  fQuantile_95.push_back(fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.95));
163  }
164  }
165 
166  // fill tree
167  fAnalysisTree->Fill();
168 
169  // increase index
170  fIndex++;
171 }
172 
173 // ---------------------------------------------------------
175 {
176  if(!fOutputFile) {
177  BCLog::OutError("BCModelOutput::WriteMarginalizedDistributions : No file to write to.");
178  return;
179  }
180 
181  if (!fOutputFile->IsOpen())
182  return;
183 
184  // remember current directory
185  TDirectory * dir = gDirectory;
186 
187  // change to file
188  fOutputFile->cd();
189 
190  int nparameters = fModel->GetNParameters();
191  for (int i = 0; i < nparameters; ++i) {
192  BCH1D* bchist = fModel->GetMarginalized(fModel->GetParameter(i));
193  if (bchist) {
194  TH1D* hist = bchist->GetHistogram();
195  if (hist)
196  hist->Write();
197  }
198  }
199 
200  if (nparameters > 1)
201  for (int i = 0; i < nparameters - 1; ++i) {
202  for (int j = i + 1; j < nparameters; ++j) {
203  BCH2D* bchist = fModel->GetMarginalized(fModel->GetParameter(i),
204  fModel->GetParameter(j));
205  if (bchist) {
206  TH2D* hist = bchist->GetHistogram();
207  if (hist)
208  hist->Write();
209  }
210  }
211  }
212 
213  // return to old directory
214  gDirectory = dir;
215 }
216 
217 // ---------------------------------------------------------
218 void BCModelOutput::Write(TObject * o)
219 {
220  if(!fOutputFile) {
221  BCLog::OutError("BCModelOutput::Write : No file to write to.");
222  return;
223  }
224 
225  // remember current directory
226  TDirectory * dir = gDirectory;
227 
228  // change to file
229  fOutputFile->cd();
230 
231  o->Write();
232 
233  // return to old directory
234  gDirectory = dir;
235 }
236 
237 // ---------------------------------------------------------
239 {
240  if (!fOutputFile)
241  return;
242 
243  if (!fOutputFile->IsOpen())
244  return;
245 
246  // remember current directory
247  TDirectory * dir = gDirectory;
248 
249  // change to file
250  fOutputFile->cd();
251 
252  // write analysis tree to file
253  if (fAnalysisTree)
254  if (fAnalysisTree->GetEntries() > 0)
255  fAnalysisTree->Write();
256 
257  // write markov chain tree to file
258  if (fModel) {
259  for (unsigned i = 0; i < fModel->MCMCGetNChains(); ++i) {
260  if (fModel->MCMCGetMarkovChainTree(i)){
261  if (fModel->MCMCGetMarkovChainTree(i)->GetEntries() > 0) {
262  fModel->MCMCGetMarkovChainTree(i)->Write();
263  }
264  }
265  }
266  }
267 
268  // write SA tree to file
269  if (fModel)
270  if (fModel->GetSATree()->GetEntries() > 0)
271  fModel->GetSATree()->Write();
272 
273  // close file
274  fOutputFile->Close();
275 
276  // return to old directory
277  gDirectory = dir;
278 }
279 
280 // ---------------------------------------------------------
281 void BCModelOutput::InitializeAnalysisTree()
282 {
283  // create new tree
284  fAnalysisTree = new TTree("AnalysisTree", "AnalysisTree");
285 
286  // set branch addresses
287  fAnalysisTree->Branch("fIndex", &fIndex, "index/I");
288  fAnalysisTree->Branch("fNParameters", &fNParameters, "parameters/I");
289  fAnalysisTree->Branch("fProbability_apriori" , &fProbability_apriori, "apriori probability/D");
290  fAnalysisTree->Branch("fProbability_aposteriori", &fProbability_aposteriori, "aposteriori probability/D");
291  fAnalysisTree->Branch("fMode_global", &fMode_global);
292  fAnalysisTree->Branch("fMode_marginalized", &fMode_marginalized);
293  fAnalysisTree->Branch("fMean_marginalized", &fMean_marginalized);
294  fAnalysisTree->Branch("fMedian_marginalized", &fMedian_marginalized);
295  fAnalysisTree->Branch("fQuantile_5" , &fQuantile_05);
296  fAnalysisTree->Branch("fQuantile_10" , &fQuantile_10);
297  fAnalysisTree->Branch("fQuantile_16" , &fQuantile_16);
298  fAnalysisTree->Branch("fQuantile_84" , &fQuantile_84);
299  fAnalysisTree->Branch("fQuantile_90" , &fQuantile_90);
300  fAnalysisTree->Branch("fQuantile_95" , &fQuantile_95);
301 }
302 
303 // ---------------------------------------------------------
304 void BCModelOutput::Copy(BCModelOutput & modeloutput) const
305 {
306  // don't copy the content
307  modeloutput.fModel = fModel;
308  modeloutput.fAnalysisTree = fAnalysisTree;
309 }
void SetFile(const char *filename)
The base class for all user-defined models.
Definition: BCModel.h:50
A class for handling 2D distributions.
Definition: BCH2D.h:37
void WriteMarginalizedDistributions()
TH2D * GetHistogram()
Definition: BCH2D.h:60
double GetModelAPosterioriProbability() const
Definition: BCModel.h:95
void WriteMarkovChain(bool flag=true)
virtual ~BCModelOutput()
A class for creating an (ROOT) output file.
Definition: BCModelOutput.h:38
A class representing a parameter of a model.
Definition: BCParameter.h:28
TH1D * GetHistogram()
Definition: BCH1D.h:53
BCModelOutput & operator=(const BCModelOutput &modeloutput)
A class for handling 1D distributions.
Definition: BCH1D.h:31
void SetModel(BCModel *model)
void Write(TObject *o)
double GetModelAPrioriProbability() const
Definition: BCModel.h:90
const std::string & GetName() const
Definition: BCParameter.h:54
void FillAnalysisTree()