BCModelOutput.cxx

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008, Daniel Kollar and Kevin Kroeninger.
00003  * All rights reserved.
00004  *
00005  * For the licensing terms see doc/COPYING.
00006  */
00007 
00008 // ---------------------------------------------------------
00009 
00010 #include "BAT/BCModelOutput.h"
00011 
00012 #include "BAT/BCModel.h"
00013 #include "BAT/BCParameter.h"
00014 #include "BAT/BCH1D.h"
00015 #include "BAT/BCH2D.h"
00016 #include "BAT/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    // delete the old file
00089    if (fOutputFile)
00090    {
00091       fOutputFile -> Close();
00092       delete fOutputFile;
00093    }
00094 
00095    // remember current directory
00096    TDirectory * dir = gDirectory;
00097 
00098    // create a new file
00099    fFileName = const_cast<char *>(filename);
00100    fOutputFile = new TFile(fFileName, "RECREATE");
00101 
00102    // initialize trees
00103    InitializeAnalysisTree();
00104    InitializeMarkovChainTrees();
00105    InitializeSATree(); 
00106    
00107    // change back to the old directory
00108    gDirectory = dir;
00109 }
00110 
00111 // ---------------------------------------------------------
00112 void BCModelOutput::WriteMarkovChain(bool flag)
00113 {
00114    if (fModel)
00115       fModel -> WriteMarkovChain(flag);
00116 }
00117 
00118 // ---------------------------------------------------------
00119 void BCModelOutput::FillAnalysisTree()
00120 {
00121    if(!fOutputFile)
00122    {
00123       BCLog::OutError("BCModelOutput::FillAnalysisTree : No file to write to.");
00124       return;
00125    }
00126 
00127    // get output values from model
00128    fNParameters = fModel -> GetNParameters();
00129    fProbability_apriori   = fModel -> GetModelAPrioriProbability();
00130    fProbability_aposteriori = fModel -> GetModelAPosterioriProbability();
00131 
00132    // loop over parameters
00133    int nparameters = fModel -> GetNParameters();
00134    for (int i = 0; i < nparameters; ++i)
00135    {
00136       BCParameter * parameter = fModel -> GetParameter(i);
00137       if (fModel -> GetBestFitParameters().size() > 0)
00138          fMode_global[i] = fModel -> GetBestFitParameters().at(i);
00139       if (fModel -> GetMarginalized(parameter -> GetName().data()))
00140       {
00141          fMode_marginalized[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetMode();
00142          fMean_marginalized[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetMean();
00143          fMedian_marginalized[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetMedian();
00144          fQuantile_05[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetQuantile(0.05);
00145          fQuantile_10[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetQuantile(0.10);
00146          fQuantile_16[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetQuantile(0.16);
00147          fQuantile_84[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetQuantile(0.84);
00148          fQuantile_90[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetQuantile(0.90);
00149          fQuantile_95[i] = fModel -> GetMarginalized(parameter -> GetName().data()) -> GetQuantile(0.95);
00150       }
00151    }
00152 
00153    // fill tree
00154    fAnalysisTree -> Fill();
00155 
00156    // increase index
00157    fIndex++;
00158 }
00159 
00160 // ---------------------------------------------------------
00161 void BCModelOutput::WriteMarginalizedDistributions()
00162 {
00163    if(!fOutputFile)
00164    {
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    {
00194       BCLog::OutError("BCModelOutput::WriteErrorBand : No file to write to.");
00195       return;
00196    }
00197 
00198    // remember current directory
00199    TDirectory * dir = gDirectory;
00200 
00201    // change to file
00202    fOutputFile -> cd();
00203 
00204    TH2D * h0 = fModel -> GetErrorBandXY();
00205    if (h0)
00206    {
00207       TH2D * h1 = (TH2D*)h0 -> Clone("errorbandxy");
00208       h1 -> Write();
00209 
00210       double levels[] = { .68, .90, .95 };
00211       int nlevels = sizeof(levels)/sizeof(double);
00212       for (int i=0;i<nlevels;i++)
00213       {
00214          TH2D * htmp = fModel -> GetErrorBandXY_yellow(levels[i]);
00215          htmp -> SetName(TString::Format("%s_sub_%f.2",h1->GetName(),levels[i]));
00216          htmp -> Write();
00217          delete htmp;
00218       }
00219 
00220       delete h1;
00221    }
00222 
00223    // return to old directory
00224    gDirectory = dir;
00225 }
00226 
00227 // ---------------------------------------------------------
00228 void BCModelOutput::Write(TObject * o)
00229 {
00230    if(!fOutputFile)
00231    {
00232       BCLog::OutError("BCModelOutput::Write : No file to write to.");
00233       return;
00234    }
00235 
00236    // remember current directory
00237    TDirectory * dir = gDirectory;
00238 
00239    // change to file
00240    fOutputFile -> cd();
00241 
00242    o -> Write();
00243 
00244    // return to old directory
00245    gDirectory = dir;
00246 }
00247 
00248 // ---------------------------------------------------------
00249 void BCModelOutput::Close()
00250 {
00251    // remember current directory
00252    TDirectory * dir = gDirectory;
00253 
00254    // change to file
00255    fOutputFile -> cd();
00256 
00257    // write analysis tree to file
00258    if (fAnalysisTree -> GetEntries() > 0)
00259       fAnalysisTree -> Write();
00260 
00261    // write markov chain tree to file
00262    for (int i = 0; i < fModel -> MCMCGetNChains(); ++i)
00263       if (fMarkovChainTrees[i] -> GetEntries() > 0)
00264          fMarkovChainTrees[i] -> Write();
00265 
00266    // write SA tree to file 
00267    if (fTreeSA -> GetEntries() > 0)
00268       fTreeSA -> Write(); 
00269 
00270    // close file
00271    fOutputFile -> Close();
00272 
00273    // return to old directory
00274    gDirectory = dir;
00275 }
00276 
00277 // ---------------------------------------------------------
00278 void BCModelOutput::InitializeAnalysisTree()
00279 {
00280    // create new tree
00281    fAnalysisTree = new TTree("AnalysisTree", "AnalysisTree");
00282 
00283    // set branch addresses
00284    fAnalysisTree -> Branch("fIndex",                   &fIndex,                   "index/I");
00285    fAnalysisTree -> Branch("fNParameters",             &fNParameters,             "parameters/I");
00286    fAnalysisTree -> Branch("fProbability_apriori" ,    &fProbability_apriori,     "apriori probability/D");
00287    fAnalysisTree -> Branch("fProbability_aposteriori", &fProbability_aposteriori, "aposteriori probability/D");
00288    fAnalysisTree -> Branch("fMode_global",              fMode_global,             "mode (global) [parameters]/D");
00289    fAnalysisTree -> Branch("fMode_marginalized",        fMode_marginalized,       "mode (marginalized) [parameters]/D");
00290    fAnalysisTree -> Branch("fMean_marginalized",        fMean_marginalized,       "mean (marginalized)[parameters]/D");
00291    fAnalysisTree -> Branch("fMedian_marginalized",      fMedian_marginalized,     "median (marginalized)[parameters]/D");
00292    fAnalysisTree -> Branch("fQuantile_05" ,             fQuantile_05,             "quantile 5% [parameters]/D");
00293    fAnalysisTree -> Branch("fQuantile_10" ,             fQuantile_10,             "quantile 10% [parameters]/D");
00294    fAnalysisTree -> Branch("fQuantile_16" ,             fQuantile_16,             "quantile 16% [parameters]/D");
00295    fAnalysisTree -> Branch("fQuantile_84" ,             fQuantile_84,             "quantile 84% [parameters]/D");
00296    fAnalysisTree -> Branch("fQuantile_90" ,             fQuantile_90,             "quantile 90% [parameters]/D");
00297    fAnalysisTree -> Branch("fQuantile_95" ,             fQuantile_95,             "quantile 95% [parameters]/D");
00298 }
00299 
00300 // ---------------------------------------------------------
00301 void BCModelOutput::InitializeMarkovChainTrees()
00302 {
00303    // create new tree
00304    fMarkovChainTrees.clear();
00305    for (int i = 0; i < fModel -> MCMCGetNChains(); ++i)
00306    {
00307       TTree * tree = new TTree(TString::Format("MarkovChainTree_%i", i), "MarkovChainTree");
00308       fMarkovChainTrees.push_back(tree);
00309    }
00310 
00311    // connect pointer to parameter vectors
00312    fParameters    = fModel -> MCMCGetP2x();
00313    fIteration     = fModel -> MCMCGetP2NIterations();
00314    fLogLikelihood = fModel -> MCMCGetP2LogProbx();
00315    fNParameters   = fModel -> MCMCGetNParameters();
00316 
00317    for (int i = 0; i < fModel -> MCMCGetNChains(); ++i)
00318    {
00319       fMarkovChainTrees[i] -> Branch("fIteration",      &(*fIteration)[i],   "iteration/I");
00320       fMarkovChainTrees[i] -> Branch("fNParameters",    &fNParameters,       "parameters/I");
00321       fMarkovChainTrees[i] -> Branch("fLogLikelihood",  &(*fLogLikelihood)[i], "log (likelihood)/D");
00322    }
00323 
00324    // loop over all parameters
00325    for (int i = 0; i < fModel -> MCMCGetNChains(); ++i)
00326       for (int j = 0; j <  fModel -> MCMCGetNParameters(); ++j)
00327       {
00328          fMarkovChainTrees[i] -> Branch(TString::Format("fParameter%i", j),
00329                &(*fParameters)[i * fModel -> MCMCGetNParameters() + j],
00330                TString::Format("parameter %i/D", j));
00331       }
00332 
00333    fModel -> MCMCSetMarkovChainTrees(fMarkovChainTrees);
00334 }
00335 
00336 // ---------------------------------------------------------
00337 void BCModelOutput::InitializeSATree()
00338 {
00339    fTreeSA = new TTree("SATree", "SATree"); 
00340 
00341    // connect pointer to parameter vectors
00342    fSAIteration     = fModel -> GetSAP2NIterations(); 
00343    fSATemperature   = fModel -> GetSAP2Temperature(); 
00344    fSALogProb       = fModel -> GetSAP2LogProb(); 
00345    fSAParameters    = fModel -> GetSAP2x(); 
00346    fSANParameters   = fModel -> GetNParameters(); 
00347 
00348    fTreeSA -> Branch("Iteration",    fSAIteration,   "iteration/I");
00349    fTreeSA -> Branch("NParameters", &fSANParameters, "parameters/I");
00350    fTreeSA -> Branch("Temperature",  fSATemperature, "temperature/D"); 
00351    fTreeSA -> Branch("LogProb",      fSALogProb,     "log probability/D"); 
00352    for (int j = 0; j <  fModel -> MCMCGetNParameters(); ++j)
00353       fTreeSA -> Branch(TString::Format("Parameter%i", j),
00354                                  &(*fSAParameters)[j], 
00355                                  TString::Format("parameter %i/D", j)); 
00356 
00357    fModel -> SetSATree(fTreeSA);
00358 }
00359 
00360 // ---------------------------------------------------------
00361 void BCModelOutput::Copy(BCModelOutput & modeloutput) const
00362 {
00363    // don't copy the content
00364    modeloutput.fModel            = this -> fModel;
00365    modeloutput.fAnalysisTree     = this -> fAnalysisTree;
00366    modeloutput.fMarkovChainTrees = this -> fMarkovChainTrees;
00367 }
00368 
00369 // ---------------------------------------------------------

Generated on Thu Feb 11 11:29:30 2010 for BayesianAnalysisToolkit by  doxygen 1.5.1