• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

BCModelOutput.cxx

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008-2012, Daniel Kollar and Kevin Kroeninger.
00003  * All rights reserved.
00004  *
00005  * For the licensing terms see doc/COPYING.
00006  */
00007 
00008 // ---------------------------------------------------------
00009 
00010 #include "BCModelOutput.h"
00011 
00012 #include "BCModel.h"
00013 #include "BCParameter.h"
00014 #include "BCH1D.h"
00015 #include "BCH2D.h"
00016 #include "BCLog.h"
00017 
00018 #include <TDirectory.h>
00019 #include <TFile.h>
00020 #include <TTree.h>
00021 #include <TObject.h>
00022 #include <TH2D.h>
00023 #include <TH1D.h>
00024 #include <TString.h>
00025 
00026 #include <iostream>
00027 
00028 // ---------------------------------------------------------
00029 BCModelOutput::BCModelOutput()
00030 {
00031    Init();
00032 }
00033 
00034 // ---------------------------------------------------------
00035 BCModelOutput::BCModelOutput(BCModel * model, const char * filename)
00036 {
00037    Init();
00038    SetModel(model);
00039    SetFile(filename);
00040 }
00041 
00042 // ---------------------------------------------------------
00043 BCModelOutput::~BCModelOutput()
00044 {
00045    if (fOutputFile) {
00046       fOutputFile->Close();
00047       delete fOutputFile;
00048    }
00049 }
00050 
00051 // ---------------------------------------------------------
00052 BCModelOutput::BCModelOutput(const BCModelOutput & modeloutput)
00053 {
00054    modeloutput.Copy(* this);
00055 }
00056 
00057 // ---------------------------------------------------------
00058 BCModelOutput & BCModelOutput::operator = (const BCModelOutput & modeloutput)
00059 {
00060    if (this != &modeloutput)
00061       modeloutput.Copy(* this);
00062 
00063    return * this;
00064 }
00065 
00066 // ---------------------------------------------------------
00067 void BCModelOutput::Init()
00068 {
00069    fIndex = 0;
00070    fOutputFile = 0;
00071    fAnalysisTree = 0;
00072    fTreeSA = 0;
00073    fModel = 0;
00074    fFileName = 0;
00075 }
00076 
00077 // ---------------------------------------------------------
00078 void BCModelOutput::SetModel(BCModel * model)
00079 {
00080    fModel = model;
00081    fModel->MCMCInitialize();
00082    fModel->SAInitialize();
00083 }
00084 
00085 // ---------------------------------------------------------
00086 void BCModelOutput::SetFile(const char * filename)
00087 {
00088    if(!fModel) {
00089       BCLog::OutError("BCModelOutput::SetFile : Cannot set file if model is not set.");
00090       return;
00091    }
00092 
00093    // delete the old file
00094    if (fOutputFile) {
00095       fOutputFile->Close();
00096       delete fOutputFile;
00097    }
00098 
00099    // remember current directory
00100    TDirectory * dir = gDirectory;
00101 
00102    // create a new file
00103    fFileName = const_cast<char *>(filename);
00104    fOutputFile = new TFile(fFileName, "RECREATE");
00105 
00106    // initialize trees
00107    InitializeAnalysisTree();
00108    fModel->MCMCInitializeMarkovChainTrees();
00109    fModel->InitializeSATree();
00110 
00111    // change back to the old directory
00112    gDirectory = dir;
00113 }
00114 
00115 // ---------------------------------------------------------
00116 void BCModelOutput::WriteMarkovChain(bool flag)
00117 {
00118    if (fModel)
00119       fModel->WriteMarkovChain(flag);
00120 }
00121 
00122 // ---------------------------------------------------------
00123 void BCModelOutput::FillAnalysisTree()
00124 {
00125    if(!fOutputFile) {
00126       BCLog::OutError("BCModelOutput::FillAnalysisTree : No file to write to.");
00127       return;
00128    }
00129 
00130    // get output values from model
00131    fNParameters = fModel->GetNParameters();
00132    fProbability_apriori   = fModel->GetModelAPrioriProbability();
00133    fProbability_aposteriori = fModel->GetModelAPosterioriProbability();
00134 
00135    // loop over parameters
00136    int nparameters = fModel->GetNParameters();
00137    for (int i = 0; i < nparameters; ++i) {
00138       BCParameter * parameter = fModel->GetParameter(i);
00139       if (fModel->GetBestFitParameters().size() > 0)
00140          fMode_global[i] = fModel->GetBestFitParameters().at(i);
00141       if (fModel->GetMarginalized(parameter->GetName().data())) {
00142          fMode_marginalized[i] = fModel->GetMarginalized(parameter->GetName().data())->GetMode();
00143          fMean_marginalized[i] = fModel->GetMarginalized(parameter->GetName().data())->GetMean();
00144          fMedian_marginalized[i] = fModel->GetMarginalized(parameter->GetName().data())->GetMedian();
00145          fQuantile_05[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.05);
00146          fQuantile_10[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.10);
00147          fQuantile_16[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.16);
00148          fQuantile_84[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.84);
00149          fQuantile_90[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.90);
00150          fQuantile_95[i] = fModel->GetMarginalized(parameter->GetName().data())->GetQuantile(0.95);
00151       }
00152    }
00153 
00154    // fill tree
00155    fAnalysisTree->Fill();
00156 
00157    // increase index
00158    fIndex++;
00159 }
00160 
00161 // ---------------------------------------------------------
00162 void BCModelOutput::WriteMarginalizedDistributions()
00163 {
00164    if(!fOutputFile) {
00165       BCLog::OutError("BCModelOutput::WriteMarginalizedDistributions : No file to write to.");
00166       return;
00167    }
00168 
00169    // remember current directory
00170    TDirectory * dir = gDirectory;
00171 
00172    // change to file
00173    fOutputFile->cd();
00174 
00175    int nparameters = fModel->GetNParameters();
00176    for (int i = 0; i < nparameters; ++i)
00177       fModel->GetMarginalized(fModel->GetParameter(i))->GetHistogram()->Write();
00178 
00179    if (nparameters > 1)
00180       for (int i = 0; i < nparameters - 1; ++i)
00181          for (int j = i + 1; j < nparameters; ++j)
00182             fModel->GetMarginalized(fModel->GetParameter(i),
00183                   fModel->GetParameter(j))->GetHistogram()->Write();
00184 
00185    // return to old directory
00186    gDirectory = dir;
00187 }
00188 
00189 // ---------------------------------------------------------
00190 void BCModelOutput::WriteErrorBand()
00191 {
00192    if(!fOutputFile) {
00193       BCLog::OutError("BCModelOutput::WriteErrorBand : No file to write to.");
00194       return;
00195    }
00196 
00197    // remember current directory
00198    TDirectory * dir = gDirectory;
00199 
00200    // change to file
00201    fOutputFile->cd();
00202 
00203    TH2D * h0 = fModel->GetErrorBandXY();
00204    if (h0) {
00205       TH2D * h1 = (TH2D*)h0->Clone("errorbandxy");
00206       h1->Write();
00207 
00208       double levels[] = { .68, .90, .95 };
00209       int nlevels = sizeof(levels)/sizeof(double);
00210       for (int i=0;i<nlevels;i++) {
00211          TH2D * htmp = fModel->GetErrorBandXY_yellow(levels[i]);
00212          htmp->SetName(TString::Format("%s_sub_%f.2",h1->GetName(),levels[i]));
00213          htmp->Write();
00214          delete htmp;
00215       }
00216 
00217       delete h1;
00218    }
00219 
00220    // return to old directory
00221    gDirectory = dir;
00222 }
00223 
00224 // ---------------------------------------------------------
00225 void BCModelOutput::Write(TObject * o)
00226 {
00227    if(!fOutputFile) {
00228       BCLog::OutError("BCModelOutput::Write : No file to write to.");
00229       return;
00230    }
00231 
00232    // remember current directory
00233    TDirectory * dir = gDirectory;
00234 
00235    // change to file
00236    fOutputFile->cd();
00237 
00238    o->Write();
00239 
00240    // return to old directory
00241    gDirectory = dir;
00242 }
00243 
00244 // ---------------------------------------------------------
00245 void BCModelOutput::Close()
00246 {
00247    // remember current directory
00248    TDirectory * dir = gDirectory;
00249 
00250    // change to file
00251    fOutputFile->cd();
00252 
00253    // write analysis tree to file
00254    if (fAnalysisTree->GetEntries() > 0)
00255       fAnalysisTree->Write();
00256 
00257    // write markov chain tree to file
00258    for (int i = 0; i < fModel->MCMCGetNChains(); ++i)
00259       if (fModel->MCMCGetMarkovChainTree(i)->GetEntries() > 0)
00260          fModel->MCMCGetMarkovChainTree(i)->Write();
00261 
00262    // write SA tree to file
00263    if (fModel->GetSATree()->GetEntries() > 0)
00264       fModel->GetSATree()->Write();
00265 
00266    // close file
00267    fOutputFile->Close();
00268 
00269    // return to old directory
00270    gDirectory = dir;
00271 }
00272 
00273 // ---------------------------------------------------------
00274 void BCModelOutput::InitializeAnalysisTree()
00275 {
00276    // create new tree
00277    fAnalysisTree = new TTree("AnalysisTree", "AnalysisTree");
00278 
00279    // set branch addresses
00280    fAnalysisTree->Branch("fIndex",                   &fIndex,                   "index/I");
00281    fAnalysisTree->Branch("fNParameters",             &fNParameters,             "parameters/I");
00282    fAnalysisTree->Branch("fProbability_apriori" ,    &fProbability_apriori,     "apriori probability/D");
00283    fAnalysisTree->Branch("fProbability_aposteriori", &fProbability_aposteriori, "aposteriori probability/D");
00284    fAnalysisTree->Branch("fMode_global",              fMode_global,             "mode (global) [parameters]/D");
00285    fAnalysisTree->Branch("fMode_marginalized",        fMode_marginalized,       "mode (marginalized) [parameters]/D");
00286    fAnalysisTree->Branch("fMean_marginalized",        fMean_marginalized,       "mean (marginalized)[parameters]/D");
00287    fAnalysisTree->Branch("fMedian_marginalized",      fMedian_marginalized,     "median (marginalized)[parameters]/D");
00288    fAnalysisTree->Branch("fQuantile_05" ,             fQuantile_05,             "quantile 5% [parameters]/D");
00289    fAnalysisTree->Branch("fQuantile_10" ,             fQuantile_10,             "quantile 10% [parameters]/D");
00290    fAnalysisTree->Branch("fQuantile_16" ,             fQuantile_16,             "quantile 16% [parameters]/D");
00291    fAnalysisTree->Branch("fQuantile_84" ,             fQuantile_84,             "quantile 84% [parameters]/D");
00292    fAnalysisTree->Branch("fQuantile_90" ,             fQuantile_90,             "quantile 90% [parameters]/D");
00293    fAnalysisTree->Branch("fQuantile_95" ,             fQuantile_95,             "quantile 95% [parameters]/D");
00294 }
00295 
00296 // ---------------------------------------------------------
00297 void BCModelOutput::Copy(BCModelOutput & modeloutput) const
00298 {
00299    // don't copy the content
00300    modeloutput.fModel            = fModel;
00301    modeloutput.fAnalysisTree     = fAnalysisTree;
00302 //   modeloutput.fMarkovChainTrees = fMarkovChainTrees;
00303 }
00304 
00305 // ---------------------------------------------------------

Generated by  doxygen 1.7.1