00001
00002
00003
00004
00005
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
00089 if (fOutputFile)
00090 {
00091 fOutputFile -> Close();
00092 delete fOutputFile;
00093 }
00094
00095
00096 TDirectory * dir = gDirectory;
00097
00098
00099 fFileName = const_cast<char *>(filename);
00100 fOutputFile = new TFile(fFileName, "RECREATE");
00101
00102
00103 InitializeAnalysisTree();
00104 InitializeMarkovChainTrees();
00105 InitializeSATree();
00106
00107
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
00128 fNParameters = fModel -> GetNParameters();
00129 fProbability_apriori = fModel -> GetModelAPrioriProbability();
00130 fProbability_aposteriori = fModel -> GetModelAPosterioriProbability();
00131
00132
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
00154 fAnalysisTree -> Fill();
00155
00156
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
00170 TDirectory * dir = gDirectory;
00171
00172
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
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
00199 TDirectory * dir = gDirectory;
00200
00201
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
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
00237 TDirectory * dir = gDirectory;
00238
00239
00240 fOutputFile -> cd();
00241
00242 o -> Write();
00243
00244
00245 gDirectory = dir;
00246 }
00247
00248
00249 void BCModelOutput::Close()
00250 {
00251
00252 TDirectory * dir = gDirectory;
00253
00254
00255 fOutputFile -> cd();
00256
00257
00258 if (fAnalysisTree -> GetEntries() > 0)
00259 fAnalysisTree -> Write();
00260
00261
00262 for (int i = 0; i < fModel -> MCMCGetNChains(); ++i)
00263 if (fMarkovChainTrees[i] -> GetEntries() > 0)
00264 fMarkovChainTrees[i] -> Write();
00265
00266
00267 if (fTreeSA -> GetEntries() > 0)
00268 fTreeSA -> Write();
00269
00270
00271 fOutputFile -> Close();
00272
00273
00274 gDirectory = dir;
00275 }
00276
00277
00278 void BCModelOutput::InitializeAnalysisTree()
00279 {
00280
00281 fAnalysisTree = new TTree("AnalysisTree", "AnalysisTree");
00282
00283
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
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
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
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
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
00364 modeloutput.fModel = this -> fModel;
00365 modeloutput.fAnalysisTree = this -> fAnalysisTree;
00366 modeloutput.fMarkovChainTrees = this -> fMarkovChainTrees;
00367 }
00368
00369