00001
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __BCMODEL__H
00026 #define __BCMODEL__H
00027
00028 #include <vector>
00029 #include <string>
00030
00031 #include <TROOT.h>
00032 #include <TGraph.h>
00033 #include <TCanvas.h>
00034 #include <TPostScript.h>
00035
00036 #include "BCDataPoint.h"
00037 #include "BCDataSet.h"
00038 #include "BCParameter.h"
00039 #include "BCH1D.h"
00040 #include "BCH2D.h"
00041 #include "BCIntegrate.h"
00042
00043 const int MAXNDATAPOINTVALUES = 20;
00044
00045
00046
00047 class BCModel : public BCIntegrate
00048 {
00049
00050 public:
00051
00053
00054
00058 BCModel();
00059
00064 BCModel(const char * name);
00065
00069 virtual ~BCModel();
00070
00071
00072
00074
00075
00079 std::string GetName()
00080 { return fName; };
00081
00085 int GetIndex()
00086 { return fIndex; };
00087
00091 double GetModelAPrioriProbability()
00092 { return fModelAPriori; };
00093
00097 double GetModelAPosterioriProbability()
00098 { return fModelAPosteriori; };
00099
00103 double GetNormalization()
00104 { return fNormalization; };
00105
00109 BCDataSet* GetDataSet()
00110 { return fDataSet; };
00111
00115 BCDataPoint* GetDataPointLowerBoundaries()
00116 { return fDataPointLowerBoundaries; };
00117
00121 BCDataPoint* GetDataPointUpperBoundaries()
00122 { return fDataPointUpperBoundaries; };
00123
00128 double GetDataPointLowerBoundary(int index)
00129 { return fDataPointLowerBoundaries -> GetValue(index); };
00130
00135 double GetDataPointUpperBoundary(int index)
00136 { return fDataPointUpperBoundaries -> GetValue(index); };
00137
00138
00139
00140
00141
00142 bool GetFlagBoundaries();
00143
00147 int GetNDataPoints();
00148
00153 BCDataPoint* GetDataPoint(int index);
00154
00158 int GetNDataPointsMinimum()
00159 { return fNDataPointsMinimum; };
00160
00164 int GetNDataPointsMaximum()
00165 { return fNDataPointsMaximum; };
00166
00170 int GetNParameters()
00171 { return fParameterSet -> size(); };
00172
00177 BCParameter* GetParameter(int index);
00178
00183 BCParameter* GetParameter(const char * name);
00184
00191 double GetBestFitParameter(int index)
00192 { return fBestFitParameters.at(index); };
00193
00199 std::vector <double> GetBestFitParameters()
00200 { return fBestFitParameters; };
00201
00208 double GetBestFitParameterMarginalized(int index)
00209 { return fBestFitParametersMarginalized.at(index); };
00210
00216 std::vector <double> GetBestFitParametersMarginalized()
00217 { return fBestFitParametersMarginalized; };
00218
00222 TH2D * GetErrorBandXY()
00223 { return fErrorBandXY; };
00224
00230 std::vector <double> GetErrorBand(double level);
00231
00232 TGraph * GetErrorBandGraph(double level1, double level2);
00233
00234 TGraph * GetFitFunctionGraph(std::vector <double> parameters);
00235
00236 TGraph * GetFitFunctionGraph()
00237 { return this -> GetFitFunctionGraph(this -> GetBestFitParameters()); };
00238
00239 TGraph * GetFitFunctionGraph(std::vector <double> parameters, double xmin, double xmax, int n=1000);
00240
00241 bool GetFixedDataAxis(int index);
00242
00243
00244
00246
00247
00252 void SetName(const char * name)
00253 { fName = name; };
00254
00259 void SetIndex(int index)
00260 { fIndex = index; };
00261
00267 void SetModelAPrioriProbability(double probability)
00268 { fModelAPriori = probability; };
00269
00275 void SetModelAPosterioriProbability(double probability)
00276 { fModelAPosteriori = probability; };
00277
00283 void SetNormalization(double norm)
00284 { fNormalization = norm; };
00285
00290 void SetDataSet(BCDataSet* dataset)
00291 { fDataSet = dataset; fNormalization = -1.0; };
00292
00297 void SetSingleDataPoint(BCDataPoint * datapoint);
00298
00299 void SetSingleDataPoint(BCDataSet * dataset, int index);
00300
00304 void SetNDataPointsMinimum(int minimum)
00305 { fNDataPointsMinimum = minimum; };
00306
00310 void SetNDataPointsMaximum(int maximum)
00311 { fNDataPointsMaximum = maximum; };
00312
00313 void SetDataBoundaries(int index, double lowerboundary, double upperboundary, bool fixed=false);
00314
00318 void SetErrorBandContinuous(bool flag);
00319
00320
00321
00323
00324
00332 int AddParameter(const char * name, double lowerlimit, double upperlimit);
00333
00339 int AddParameter(BCParameter* parameter);
00340
00345 virtual void DefineParameters()
00346 { ;};
00347
00354 double APrioriProbability(std::vector <double> parameters)
00355 { return exp( this->LogAPrioriProbability(parameters) ); };
00356
00364 virtual double LogAPrioriProbability(std::vector <double> parameters)
00365 { return 1.0; };
00366
00372 double Likelihood(std::vector <double> parameter)
00373 { return exp( this->LogLikelihood(parameter) ); };
00374
00381 virtual double LogLikelihood(std::vector <double> parameter);
00382
00388 double ProbabilityNN(std::vector <double> parameter)
00389 { return exp( this->LogProbabilityNN(parameter) ); };
00390
00397 double LogProbabilityNN(std::vector <double> parameter);
00398
00404 double Probability(std::vector <double> parameter)
00405 { return exp( this->LogProbability(parameter) ); };
00406
00412 double LogProbability(std::vector <double> parameter);
00413
00422 double ConditionalProbabilityEntry(BCDataPoint * datapoint, std::vector <double> parameters)
00423 { return exp( this->LogConditionalProbabilityEntry(datapoint, parameters) ); };
00424
00433 virtual double LogConditionalProbabilityEntry(BCDataPoint * datapoint, std::vector <double> parameters)
00434 { flag_ConditionalProbabilityEntry = false; return 0.; };
00435
00442 double PoissonProbability(int nentries, std::vector <double> parameters)
00443 { return exp( this->LogPoissonProbability(nentries, parameters) ); };
00444
00452 virtual double LogPoissonProbability(int nentries, std::vector <double> parameters)
00453 { return .0; };
00454
00461 void CalculateErrorBandXY(int nx, double xmin, double xmax, int ny, double ymin, double ymax, int niter);
00462
00469 virtual double SamplingFunction(std::vector <double> parameters);
00470
00474 double Eval(std::vector <double> parameters)
00475 { return exp( this->LogEval(parameters) ); };
00476
00480 double LogEval(std::vector <double> parameters);
00481
00485 double EvalSampling(std::vector <double> parameters);
00486
00490 double Normalize();
00491
00497 int CheckParameters(std::vector <double> parameters);
00498
00502 void FindMode();
00503
00504
00508 void WriteMode(const char * file);
00509
00513 int ReadMode(const char * file);
00514
00518 int ReadMarginalizedFromFile(const char * file);
00519
00523 int ReadErrorBandFromFile(const char * file);
00524
00530 BCH1D * MarginalizeProbability(BCParameter* parameter);
00531
00532 BCH1D * MarginalizeProbability(const char * name)
00533 { return this -> MarginalizeProbability(this -> GetParameter(name)); };
00534
00541 BCH2D * MarginalizeProbability(BCParameter * parameter1, BCParameter * parameter2);
00542
00543 BCH2D * MarginalizeProbability(const char * name1, const char * name2)
00544 { return this -> MarginalizeProbability(this -> GetParameter(name1), this -> GetParameter(name2)); };
00545
00552 int MarginalizeAll();
00553
00560 BCH1D * GetMarginalized(BCParameter * parameter);
00561
00562 BCH1D * GetMarginalized(const char * name)
00563 { return this -> GetMarginalized(this -> GetParameter(name)); };
00564
00572 BCH2D * GetMarginalized(BCParameter * parameter1, BCParameter * parameter2);
00573
00574 BCH2D * GetMarginalized(const char * name1, const char * name2)
00575 { return this -> GetMarginalized(this -> GetParameter(name1), this -> GetParameter(name2)); };
00576
00580 int PrintAllMarginalized1D(const char * filebase);
00581 int PrintAllMarginalized2D(const char * filebase);
00582 int PrintAllMarginalized(const char * file, int hdiv=1, int ndiv=1);
00583
00589 void CreateData(int ndatasets, std::vector <double> parameters);
00590
00598 void CreateDataGrid(int ndatasets, std::vector <double> parameters, std::vector <bool> grid, std::vector <double> limits);
00599
00600
00608 void CreateDataGridROOT(int ndatasets, std::vector <double> parameters, std::vector <bool> grid, std::vector <double> limits);
00609
00614 virtual void CorrelateDataPointValues(std::vector<double> &x);
00615
00625 BCH1D * GoodnessOfFitTest(const char * filenname, std::vector <double> parameters);
00626
00638 BCH1D * DoGoodnessOfFitTest(int ndatasets, std::vector<double> parameters, std::vector <bool> grid, std::vector <double> limits);
00639 BCH1D * DoGoodnessOfFitTest(int ndatasets, std::vector<double> parameters);
00640 BCH1D * DoGoodnessOfFitTest(int ndatasets);
00641 BCH1D * DoGoodnessOfFitTest(const char * filename);
00642 BCH1D * DoGoodnessOfFitTest(const char * filename, std::vector<double> parameters);
00643 BCH1D * DoGoodnessOfFitTestROOT(int ndatasets, std::vector<double> parameters, std::vector <bool> grid, std::vector <double> limits);
00644 BCH1D * GoodnessOfFitTestROOT(int ndatasets, const char * filename, std::vector <double> parameters);
00645
00652 double GetPvalueFromChi2(std::vector<double> par, int sigma_index);
00653
00654 BCH1D * CalculatePValue(std::vector<double> par, bool flag_histogram=false);
00655
00656
00657
00658
00659 double GetPValue()
00660 { return fPValue; };
00661
00668 double HessianMatrixElement(BCParameter * parameter1, BCParameter * parameter2, std::vector<double> point);
00669
00673 void PrintSummary();
00674
00678 void PrintResults(const char * file);
00679
00684 void PrintHessianMatrix(std::vector<double> parameters);
00685
00686 void FixDataAxis(int index, bool fixed);
00687
00688
00689
00690 protected:
00691
00695 int fIndex;
00696
00700 std::string fName;
00701
00705 double fModelAPriori;
00706
00710 double fModelAPosteriori;
00711
00715 BCParameterSet * fParameterSet;
00716
00720 BCDataSet * fDataSet;
00721
00725 int fNDataPointsMinimum;
00726
00730 int fNDataPointsMaximum;
00731
00732
00733
00734
00735 bool flag_ConditionalProbabilityEntry;
00736
00740 double fPValue;
00741
00742 private:
00743
00747 BCDataPoint * VectorToDataPoint(std::vector<double> data);
00748
00752 int CompareStrings(const char * string1, const char * string2);
00753
00757 double fNormalization;
00758
00759 };
00760
00761
00762
00763 typedef std::vector<BCModel*> BCModelContainer;
00764
00765
00766
00767 #endif