Go to the documentation of this file.00001
00002
00003
00004
00005
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
00094 if (fOutputFile) {
00095 fOutputFile->Close();
00096 delete fOutputFile;
00097 }
00098
00099
00100 TDirectory * dir = gDirectory;
00101
00102
00103 fFileName = const_cast<char *>(filename);
00104 fOutputFile = new TFile(fFileName, "RECREATE");
00105
00106
00107 InitializeAnalysisTree();
00108 fModel->MCMCInitializeMarkovChainTrees();
00109 fModel->InitializeSATree();
00110
00111
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
00131 fNParameters = fModel->GetNParameters();
00132 fProbability_apriori = fModel->GetModelAPrioriProbability();
00133 fProbability_aposteriori = fModel->GetModelAPosterioriProbability();
00134
00135
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
00155 fAnalysisTree->Fill();
00156
00157
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
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 BCLog::OutError("BCModelOutput::WriteErrorBand : No file to write to.");
00194 return;
00195 }
00196
00197
00198 TDirectory * dir = gDirectory;
00199
00200
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
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
00233 TDirectory * dir = gDirectory;
00234
00235
00236 fOutputFile->cd();
00237
00238 o->Write();
00239
00240
00241 gDirectory = dir;
00242 }
00243
00244
00245 void BCModelOutput::Close()
00246 {
00247
00248 TDirectory * dir = gDirectory;
00249
00250
00251 fOutputFile->cd();
00252
00253
00254 if (fAnalysisTree->GetEntries() > 0)
00255 fAnalysisTree->Write();
00256
00257
00258 for (int i = 0; i < fModel->MCMCGetNChains(); ++i)
00259 if (fModel->MCMCGetMarkovChainTree(i)->GetEntries() > 0)
00260 fModel->MCMCGetMarkovChainTree(i)->Write();
00261
00262
00263 if (fModel->GetSATree()->GetEntries() > 0)
00264 fModel->GetSATree()->Write();
00265
00266
00267 fOutputFile->Close();
00268
00269
00270 gDirectory = dir;
00271 }
00272
00273
00274 void BCModelOutput::InitializeAnalysisTree()
00275 {
00276
00277 fAnalysisTree = new TTree("AnalysisTree", "AnalysisTree");
00278
00279
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
00300 modeloutput.fModel = fModel;
00301 modeloutput.fAnalysisTree = fAnalysisTree;
00302
00303 }
00304
00305