BayesianAnalysisToolkit  0.9.3
BCModelOutput.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007-2013, 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 // ---------------------------------------------------------
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;
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
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
135 
136  // loop over parameters
137  int nparameters = fModel->GetNParameters();
138  for (int i = 0; i < nparameters; ++i) {
139  const BCParameter * parameter = fModel->GetParameter(i);
140  if (fModel->GetBestFitParameters().size() > 0)
142  if (fModel->GetMarginalized(parameter->GetName().data())) {
143  fMode_marginalized[i] = fModel->GetMarginalized(parameter->GetName().data())->GetMode();
144  fMean_marginalized[i] = fModel->GetMarginalized(parameter->GetName().data())->GetMean();
145  fMedian_marginalized[i] = fModel->GetMarginalized(parameter->GetName().data())->GetMedian();
146  fQuantile_05[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.05);
147  fQuantile_10[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.10);
148  fQuantile_16[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.16);
149  fQuantile_84[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.84);
150  fQuantile_90[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.90);
151  fQuantile_95[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.95);
152  }
153  }
154 
155  // fill tree
156  fAnalysisTree->Fill();
157 
158  // increase index
159  fIndex++;
160 }
161 
162 // ---------------------------------------------------------
164 {
165  if(!fOutputFile) {
166  BCLog::OutError("BCModelOutput::WriteMarginalizedDistributions : No file to write to.");
167  return;
168  }
169 
170  if (!fOutputFile->IsOpen())
171  return;
172 
173  // remember current directory
174  TDirectory * dir = gDirectory;
175 
176  // change to file
177  fOutputFile->cd();
178 
179  int nparameters = fModel->GetNParameters();
180  for (int i = 0; i < nparameters; ++i) {
182  if (bchist) {
183  TH1D* hist = bchist->GetHistogram();
184  if (hist)
185  hist->Write();
186  }
187  }
188 
189  if (nparameters > 1)
190  for (int i = 0; i < nparameters - 1; ++i) {
191  for (int j = i + 1; j < nparameters; ++j) {
193  fModel->GetParameter(j));
194  if (bchist) {
195  TH2D* hist = bchist->GetHistogram();
196  if (hist)
197  hist->Write();
198  }
199  }
200  }
201 
202  // return to old directory
203  gDirectory = dir;
204 }
205 
206 // ---------------------------------------------------------
207 void BCModelOutput::Write(TObject * o)
208 {
209  if(!fOutputFile) {
210  BCLog::OutError("BCModelOutput::Write : No file to write to.");
211  return;
212  }
213 
214  // remember current directory
215  TDirectory * dir = gDirectory;
216 
217  // change to file
218  fOutputFile->cd();
219 
220  o->Write();
221 
222  // return to old directory
223  gDirectory = dir;
224 }
225 
226 // ---------------------------------------------------------
228 {
229  if (!fOutputFile)
230  return;
231 
232  if (!fOutputFile->IsOpen())
233  return;
234 
235  // remember current directory
236  TDirectory * dir = gDirectory;
237 
238  // change to file
239  fOutputFile->cd();
240 
241  // write analysis tree to file
242  if (fAnalysisTree)
243  if (fAnalysisTree->GetEntries() > 0)
244  fAnalysisTree->Write();
245 
246  // write markov chain tree to file
247  if (fModel) {
248  for (unsigned i = 0; i < fModel->MCMCGetNChains(); ++i) {
250  if (fModel->MCMCGetMarkovChainTree(i)->GetEntries() > 0) {
251  fModel->MCMCGetMarkovChainTree(i)->Write();
252  }
253  }
254  }
255  }
256 
257  // write SA tree to file
258  if (fModel)
259  if (fModel->GetSATree()->GetEntries() > 0)
260  fModel->GetSATree()->Write();
261 
262  // close file
263  fOutputFile->Close();
264 
265  // return to old directory
266  gDirectory = dir;
267 }
268 
269 // ---------------------------------------------------------
271 {
272  // create new tree
273  fAnalysisTree = new TTree("AnalysisTree", "AnalysisTree");
274 
275  // set branch addresses
276  fAnalysisTree->Branch("fIndex", &fIndex, "index/I");
277  fAnalysisTree->Branch("fNParameters", &fNParameters, "parameters/I");
278  fAnalysisTree->Branch("fProbability_apriori" , &fProbability_apriori, "apriori probability/D");
279  fAnalysisTree->Branch("fProbability_aposteriori", &fProbability_aposteriori, "aposteriori probability/D");
280  fAnalysisTree->Branch("fMode_global", fMode_global, "mode (global) [parameters]/D");
281  fAnalysisTree->Branch("fMode_marginalized", fMode_marginalized, "mode (marginalized) [parameters]/D");
282  fAnalysisTree->Branch("fMean_marginalized", fMean_marginalized, "mean (marginalized)[parameters]/D");
283  fAnalysisTree->Branch("fMedian_marginalized", fMedian_marginalized, "median (marginalized)[parameters]/D");
284  fAnalysisTree->Branch("fQuantile_05" , fQuantile_05, "quantile 5% [parameters]/D");
285  fAnalysisTree->Branch("fQuantile_10" , fQuantile_10, "quantile 10% [parameters]/D");
286  fAnalysisTree->Branch("fQuantile_16" , fQuantile_16, "quantile 16% [parameters]/D");
287  fAnalysisTree->Branch("fQuantile_84" , fQuantile_84, "quantile 84% [parameters]/D");
288  fAnalysisTree->Branch("fQuantile_90" , fQuantile_90, "quantile 90% [parameters]/D");
289  fAnalysisTree->Branch("fQuantile_95" , fQuantile_95, "quantile 95% [parameters]/D");
290 }
291 
292 // ---------------------------------------------------------
293 void BCModelOutput::Copy(BCModelOutput & modeloutput) const
294 {
295  // don't copy the content
296  modeloutput.fModel = fModel;
297  modeloutput.fAnalysisTree = fAnalysisTree;
298 }