00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "BAT/BCModelManager.h"
00011
00012 #include "BAT/BCModel.h"
00013 #include "BAT/BCDataSet.h"
00014 #include "BAT/BCDataPoint.h"
00015 #include "BAT/BCLog.h"
00016 #include "BAT/BCErrorCodes.h"
00017
00018 #include <fstream>
00019 #include <iostream>
00020
00021 #include <TString.h>
00022
00023
00024
00025 BCModelManager::BCModelManager()
00026 {
00027 fModelContainer = new BCModelContainer();
00028 fDataSet = 0;
00029 }
00030
00031
00032
00033 BCModelManager::~BCModelManager()
00034 {
00035 delete fModelContainer;
00036
00037 if (fDataSet)
00038 delete fDataSet;
00039 }
00040
00041
00042
00043 BCModelManager::BCModelManager(const BCModelManager & modelmanager)
00044 {
00045 modelmanager.Copy(*this);
00046 }
00047
00048
00049
00050 BCModelManager & BCModelManager::operator = (const BCModelManager & modelmanager)
00051 {
00052 if (this != &modelmanager)
00053 modelmanager.Copy(* this);
00054
00055 return * this;
00056 }
00057
00058
00059
00060 void BCModelManager::SetDataSet(BCDataSet * dataset)
00061 {
00062
00063 fDataSet = dataset;
00064
00065
00066 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00067 this -> GetModel(i) -> SetDataSet(fDataSet);
00068 }
00069
00070
00071
00072 void BCModelManager::SetSingleDataPoint(BCDataPoint * datapoint)
00073 {
00074
00075 BCDataSet * dataset = new BCDataSet();
00076
00077
00078 dataset -> AddDataPoint(datapoint);
00079
00080
00081 this -> SetDataSet(dataset);
00082 }
00083
00084
00085
00086 void BCModelManager::SetSingleDataPoint(BCDataSet * dataset, unsigned int index)
00087 {
00088 if (index < 0 || index > dataset -> GetNDataPoints())
00089 return;
00090
00091 this -> SetSingleDataPoint(dataset -> GetDataPoint(index));
00092 }
00093
00094
00095
00096 void BCModelManager::AddModel(BCModel * model, double probability)
00097 {
00098
00099 unsigned int index = fModelContainer -> size();
00100
00101
00102 model -> SetIndex(index);
00103
00104
00105 model -> SetModelAPrioriProbability(probability);
00106
00107
00108 model -> SetDataSet(fDataSet);
00109
00110
00111 fModelContainer -> push_back(model);
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 void BCModelManager::SetIntegrationMethod(BCIntegrate::BCIntegrationMethod method)
00129 {
00130
00131
00132 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00133 this -> GetModel(i) -> SetIntegrationMethod(method);
00134 }
00135
00136
00137
00138 void BCModelManager::SetMarginalizationMethod(BCIntegrate::BCMarginalizationMethod method)
00139 {
00140
00141 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00142 this -> GetModel(i) -> SetMarginalizationMethod(method);
00143 };
00144
00145
00146
00147 void BCModelManager::SetOptimizationMethod(BCIntegrate::BCOptimizationMethod method)
00148 {
00149
00150 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00151 this -> GetModel(i) -> SetOptimizationMethod(method);
00152 }
00153
00154
00155
00156 void BCModelManager::SetNiterationsPerDimension(unsigned int niterations)
00157 {
00158
00159 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00160 this -> GetModel(i) -> SetNiterationsPerDimension(niterations);
00161 }
00162
00163
00164
00165 void BCModelManager::SetNSamplesPer2DBin(unsigned int n)
00166 {
00167
00168 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00169 this -> GetModel(i) -> SetNSamplesPer2DBin(n);
00170 }
00171
00172
00173
00174 void BCModelManager::SetRelativePrecision(double relprecision)
00175 {
00176
00177 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00178 this -> GetModel(i) -> SetRelativePrecision(relprecision);
00179 }
00180
00181
00182
00183 void BCModelManager::SetNbins(unsigned int n)
00184 {
00185
00186 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00187 this -> GetModel(i) -> BCIntegrate::SetNbins(n);
00188 }
00189
00190
00191
00192 void BCModelManager::SetFillErrorBand(bool flag)
00193 {
00194 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00195 this -> GetModel(i) -> SetFillErrorBand(flag);
00196 }
00197
00198
00199
00200 void BCModelManager::SetFitFunctionIndexX(int index)
00201 {
00202
00203 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00204 this -> GetModel(i) -> SetFitFunctionIndexX(index);
00205 }
00206
00207
00208
00209 void BCModelManager::SetFitFunctionIndexY(int index)
00210 {
00211
00212 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00213 this -> GetModel(i) -> SetFitFunctionIndexY(index);
00214 }
00215
00216
00217
00218 void BCModelManager::SetFitFunctionIndices(int indexx, int indexy)
00219 {
00220
00221 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00222 this -> GetModel(i) -> SetFitFunctionIndices(indexx, indexy);
00223 }
00224
00225
00226
00227 void BCModelManager::SetDataPointLowerBoundaries(BCDataPoint * datasetlowerboundaries)
00228 {
00229
00230 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00231 this -> GetModel(i) -> SetDataPointLowerBoundaries(datasetlowerboundaries);
00232 }
00233
00234
00235
00236 void BCModelManager::SetDataPointUpperBoundaries(BCDataPoint * datasetupperboundaries)
00237 {
00238
00239 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00240 this -> GetModel(i) -> SetDataPointUpperBoundaries(datasetupperboundaries);
00241 }
00242
00243
00244
00245 void BCModelManager::SetDataPointLowerBoundary(int index, double lowerboundary)
00246 {
00247
00248 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00249 this -> GetModel(i) -> SetDataPointLowerBoundary(index, lowerboundary);
00250 }
00251
00252
00253
00254 void BCModelManager::SetDataPointUpperBoundary(int index, double upperboundary)
00255 {
00256
00257 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00258 this -> GetModel(i) -> SetDataPointUpperBoundary(index, upperboundary);
00259 }
00260
00261
00262
00263 void BCModelManager::SetDataBoundaries(int index, double lowerboundary, double upperboundary)
00264 {
00265
00266 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00267 this -> GetModel(i) -> SetDataBoundaries(index, lowerboundary, upperboundary);
00268 }
00269
00270
00271
00272 void BCModelManager::FixDataAxis(int index, bool fixed)
00273 {
00274
00275 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00276 this -> GetModel(i) -> FixDataAxis(index, fixed);
00277 }
00278
00279
00280
00281 void BCModelManager::SetNChains(unsigned int n)
00282 {
00283
00284 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00285 this -> GetModel(i) -> MCMCSetNChains(n);
00286 }
00287
00288
00289
00290 void BCModelManager::SetFlagPCA(bool flag)
00291 {
00292
00293 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00294 this -> GetModel(i) -> MCMCSetFlagPCA(flag);
00295 }
00296
00297
00298
00299 int BCModelManager::ReadDataFromFileTree(const char * filename, const char * treename, const char * branchnames)
00300 {
00301 if (fModelContainer -> size() < 0)
00302 {
00303 BCLog::Out(BCLog::warning, BCLog::warning, "BCModelManager::ReadDataFromFileTree : No model defined.");
00304 return ERROR_NOMODELS;
00305 }
00306
00307
00308 if (!fDataSet)
00309 fDataSet = new BCDataSet();
00310 else
00311 fDataSet -> Reset();
00312
00313
00314 int read_file = fDataSet -> ReadDataFromFileTree(filename, treename, branchnames);
00315
00316 if (read_file >=0)
00317 {
00318 this -> SetDataSet(fDataSet);
00319
00320 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00321 fModelContainer -> at(i) -> SetDataSet(fDataSet);
00322 }
00323 else if (read_file == ERROR_FILENOTFOUND)
00324 {
00325 delete fDataSet;
00326 return ERROR_FILENOTFOUND;
00327 }
00328
00329 return 0;
00330 }
00331
00332
00333
00334 int BCModelManager::ReadDataFromFileTxt(const char * filename, int nbranches)
00335 {
00336 if (fModelContainer -> size() < 0)
00337 {
00338 BCLog::Out(BCLog::warning, BCLog::warning, "BCModelManager::ReadDataFromFileTree. No model defined.");
00339 return ERROR_NOMODELS;
00340 }
00341
00342
00343 if (!fDataSet)
00344 fDataSet = new BCDataSet();
00345 else
00346 fDataSet -> Reset();
00347
00348
00349 int read_file = fDataSet -> ReadDataFromFileTxt(filename, nbranches);
00350
00351 if (read_file >=0)
00352 {
00353 this -> SetDataSet(fDataSet);
00354
00355 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00356 fModelContainer -> at(i) -> SetDataSet(fDataSet);
00357 }
00358 else
00359 {
00360 delete fDataSet;
00361 return ERROR_FILENOTFOUND;
00362 }
00363
00364 return 0;
00365 }
00366
00367
00368
00369 void BCModelManager::Normalize()
00370 {
00371
00372 double normalization = 0.0;
00373
00374
00375 BCLog::OutSummary("Running normalization of all models.");
00376
00377 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00378 {
00379 fModelContainer -> at(i) -> Normalize();
00380
00381
00382 normalization += (fModelContainer -> at(i) -> GetNormalization() *
00383 fModelContainer -> at(i) -> GetModelAPrioriProbability());
00384 }
00385
00386
00387 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00388 fModelContainer -> at(i) -> SetModelAPosterioriProbability(
00389 (fModelContainer -> at(i) -> GetNormalization() *
00390 fModelContainer -> at(i) -> GetModelAPrioriProbability()) /
00391 normalization);
00392 }
00393
00394
00395
00396 double BCModelManager::BayesFactor(const unsigned int imodel1, const unsigned int imodel2)
00397 {
00398
00399
00400
00401
00402
00403 const double norm1 = fModelContainer -> at(imodel1) -> GetNormalization();
00404 const double norm2 = fModelContainer -> at(imodel2) -> GetNormalization();
00405
00406
00407 if(norm1<0.)
00408 {
00409 BCLog::OutError(
00410 Form("Model %s (index %d) not normalized. Cannot calculate Bayes factor.",
00411 fModelContainer->at(imodel1)->GetName().data(),imodel1));
00412 return -1.;
00413 }
00414
00415
00416 if(norm2<0.)
00417 {
00418 BCLog::OutError(
00419 Form("Model %s (index %d) not normalized. Cannot calculate Bayes factor.",
00420 fModelContainer->at(imodel2)->GetName().data(),imodel2));
00421 return -1.;
00422 }
00423
00424
00425 if(norm2==0. && norm1!=0.)
00426 {
00427 BCLog::OutError(
00428 Form("Model %s (index %d) has ZERO probability. Bayes factor is infinite.",
00429 fModelContainer->at(imodel2)->GetName().data(),imodel2));
00430 return -1.;
00431 }
00432
00433
00434 if(norm2==0. && norm1==0.)
00435 {
00436 BCLog::OutWarning(
00437 Form("Models %s and %s have ZERO probability. Bayes factor is unknown. Returning 1.",
00438 fModelContainer->at(imodel2)->GetName().data(),fModelContainer->at(imodel1)->GetName().data()));
00439 return 1.;
00440 }
00441
00442
00443 return norm1/norm2;
00444 }
00445
00446
00447
00448 void BCModelManager::FindMode()
00449 {
00450
00451 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00452 this -> GetModel(i) -> FindMode();
00453 }
00454
00455
00456
00457 void BCModelManager::MarginalizeAll()
00458 {
00459
00460 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00461 this -> GetModel(i) -> MarginalizeAll();
00462 }
00463
00464
00465
00466 void BCModelManager::WriteMarkovChain(bool flag)
00467 {
00468
00469 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00470 this -> GetModel(i) -> WriteMarkovChain(flag);
00471 }
00472
00473
00474
00475 void BCModelManager::CalculatePValue(bool flag_histogram)
00476 {
00477
00478 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00479 this -> GetModel(i) -> CalculatePValue(this -> GetModel(i) -> GetBestFitParameters(), flag_histogram);
00480 }
00481
00482
00483
00484 void BCModelManager::PrintSummary(const char * file)
00485 {
00486 ofstream out;
00487 std::streambuf * old_buffer = 0;
00488
00489 if(file)
00490 {
00491 out.open(file);
00492 if (!out.is_open())
00493 {
00494 std::cerr<<"Couldn't open file "<<file<<std::endl;
00495 return;
00496 }
00497 old_buffer = std::cout.rdbuf(out.rdbuf());
00498 }
00499
00500
00501 int nmodels = fModelContainer -> size();
00502 std::cout
00503 <<std::endl
00504 <<"======================================"<<std::endl
00505 <<" Summary"<<std::endl
00506 <<"======================================"<<std::endl
00507 <<std::endl
00508 <<" Number of models : "<<nmodels<<std::endl
00509 <<std::endl
00510 <<" - Models:"<<std::endl;
00511
00512 for (int i = 0; i < nmodels; i++)
00513 fModelContainer -> at(i) -> PrintSummary();
00514
00515
00516 std::cout
00517 <<" - Data:"<<std::endl
00518 <<std::endl
00519 <<" Number of entries: "<<fDataSet -> GetNDataPoints()<<std::endl
00520 <<std::endl;
00521
00522 std::cout
00523 <<"======================================"<<std::endl
00524 <<" Model comparison"<<std::endl
00525 <<std::endl;
00526
00527
00528 std::cout
00529 <<" - A priori probabilities:"<<std::endl
00530 <<std::endl;
00531
00532 for (int i=0; i<nmodels; i++)
00533 std::cout
00534 <<" p("<< fModelContainer -> at(i) -> GetName()
00535 <<") = "<< fModelContainer -> at(i) -> GetModelAPrioriProbability()
00536 <<std::endl;
00537 std::cout<<std::endl;
00538
00539 std::cout
00540 <<" - A posteriori probabilities:"<<std::endl
00541 <<std::endl;
00542
00543 for (int i = 0; i < nmodels; i++)
00544 std::cout
00545 <<" p("<< fModelContainer -> at(i) -> GetName()
00546 <<" | data) = "<< fModelContainer -> at(i) -> GetModelAPosterioriProbability()
00547 <<std::endl;
00548 std::cout<<std::endl;
00549
00550 std::cout
00551 <<"======================================"<<std::endl
00552 <<std::endl;
00553
00554 if (file)
00555 std::cout.rdbuf(old_buffer);
00556
00557 }
00558
00559
00560
00561 void BCModelManager::PrintModelComparisonSummary(const char * file)
00562 {
00563 ofstream out;
00564 std::streambuf * old_buffer = 0;
00565
00566 if(file)
00567 {
00568 out.open(file);
00569 if (!out.is_open())
00570 {
00571 std::cerr<<"Couldn't open file "<<file<<std::endl;
00572 return;
00573 }
00574 old_buffer = std::cout.rdbuf(out.rdbuf());
00575 }
00576
00577
00578 int nmodels = fModelContainer -> size();
00579 std::cout
00580 <<std::endl
00581 <<"==========================================="<<std::endl
00582 <<" Model Comparison Summary"<<std::endl
00583 <<"==========================================="<<std::endl
00584 <<std::endl
00585 <<" Number of models : "<<nmodels<<std::endl
00586 <<std::endl;
00587
00588
00589 std::cout
00590 <<" - A priori probabilities:"<<std::endl
00591 <<std::endl;
00592
00593 for (int i=0; i<nmodels; i++)
00594 std::cout
00595 <<" p("<< fModelContainer -> at(i) -> GetName()
00596 <<") = "<< fModelContainer -> at(i) -> GetModelAPrioriProbability()
00597 <<std::endl;
00598 std::cout<<std::endl;
00599
00600 std::cout
00601 <<" - A posteriori probabilities:"<<std::endl
00602 <<std::endl;
00603
00604 for (int i = 0; i < nmodels; i++)
00605 std::cout
00606 <<" p("<< fModelContainer -> at(i) -> GetName()
00607 <<" | data) = "<< fModelContainer -> at(i) -> GetModelAPosterioriProbability()
00608 <<std::endl;
00609 std::cout<<std::endl;
00610
00611
00612 std::cout
00613 <<" - Bayes factors:"<<std::endl
00614 <<std::endl;
00615 for (int i = 0; i < nmodels-1; i++)
00616 for (int j = i+1; j < nmodels; j++)
00617 std::cout
00618 <<" K = p(data | "<<fModelContainer -> at(i) -> GetName()<<") / "
00619 <<"p(data | "<<fModelContainer -> at(j) -> GetName()<<") = "
00620 <<BayesFactor(i,j)<<std::endl;
00621 std::cout<<std::endl;
00622
00623
00624 std::cout
00625 <<" - p-values:"<<std::endl
00626 <<std::endl;
00627
00628 for (int i = 0; i < nmodels; i++)
00629 {
00630 double p = fModelContainer -> at(i) -> GetPValue();
00631 std::cout
00632 <<" "<< fModelContainer -> at(i) -> GetName();
00633 if(p>=0.)
00634 std::cout<<": p-value = "<< p;
00635 else
00636 std::cout<<": p-value not calculated";
00637 std::cout<<std::endl;
00638 }
00639 std::cout<<std::endl;
00640
00641 std::cout
00642 <<"==========================================="<<std::endl
00643 <<std::endl;
00644
00645 if (file)
00646 std::cout.rdbuf(old_buffer);
00647
00648 }
00649
00650
00651
00652 void BCModelManager::PrintResults()
00653 {
00654
00655 for (unsigned int i = 0; i < this -> GetNModels(); i++)
00656 this -> GetModel(i) -> PrintResults(Form("%s.txt", this -> GetModel(i) -> GetName().data()));
00657 }
00658
00659
00660
00661 void BCModelManager::Copy(BCModelManager & modelmanager) const
00662 {
00663
00664 modelmanager.fModelContainer = this -> fModelContainer;
00665 modelmanager.fDataSet = this -> fDataSet;
00666 }
00667
00668