11 #include "BCMVCDataModel.h"
13 #include "../../BAT/BCH1D.h"
14 #include "../../BAT/BCH2D.h"
15 #include "../../BAT/BCLog.h"
16 #include "../../BAT/BCMath.h"
17 #include "../../BAT/BCParameter.h"
28 SetNMeasurements(mvc->GetNMeasurements(),
29 mvc->GetParameter(0)->GetLowerLimit(),
30 mvc->GetParameter(0)->GetUpperLimit());
31 SetVectorMeasurements(mvc->GetVectorMeasurements());
32 SetVectorObservable(mvc->GetVectorObservable());
33 SetCovarianceMatrix(mvc->GetCovarianceMatrix());
37 BCMVCDataModel::~BCMVCDataModel()
42 void BCMVCDataModel::SetNMeasurements(
int n,
double min,
double max)
44 for (
int i = 0; i < n; ++i)
49 void BCMVCDataModel::SetCovarianceMatrix(TMatrixD matrix)
51 fCovarianceMatrix.Clear();
52 fCovarianceMatrix.ResizeTo(matrix);
53 fCovarianceMatrix = matrix;
55 fInvCovarianceMatrix.Clear();
56 fInvCovarianceMatrix.ResizeTo(fCovarianceMatrix);
57 fInvCovarianceMatrix = fCovarianceMatrix;
58 fInvCovarianceMatrix.Invert();
60 fDetCovariance = fCovarianceMatrix.Determinant();
64 void BCMVCDataModel::SetParameters(std::vector<double> parameters)
67 int nmeas = GetNParameters();
69 fVectorObservables.Clear();
70 fVectorObservables.ResizeTo(nmeas);
72 for (
int i = 0; i < nmeas; ++i) {
73 fVectorObservables[i] = fPars[fVectorObservable[i]];
78 void BCMVCDataModel::SetMeasurementRanges(
const std::vector<double> & min,
const std::vector<double> & max)
80 unsigned npar = GetNParameters();
82 if ( (min.size() != npar) || (max.size() != npar) ) {
83 BCLog::OutWarning(
"BCMVCDataModel::SetnMeasurementRanges. Size of ranges does not fit the number of measurements.");
88 for (
unsigned i = 0; i < npar; ++i) {
89 GetParameter(i)->SetLimits(min.at(i), max.at(i));
95 void BCMVCDataModel::SetMeasurementRanges(
double min,
double max)
97 std::vector<double> min_vec(GetNParameters(), min);
98 std::vector<double> max_vec(GetNParameters(), max);
99 SetMeasurementRanges(min_vec, max_vec);
107 int nmeas = GetNParameters();
110 TVectorD observables(nmeas);
111 TVectorD measurements(nmeas);
113 for (
int i = 0; i < nmeas; ++i) {
114 observables[i] = fPars[fVectorObservable[i]];
115 measurements[i] = parameters[i];
118 TVectorD prod1 = observables - measurements;
119 TVectorD prod2 = fInvCovarianceMatrix * prod1;
120 double prod = prod1 * prod2;
122 logprob = -0.5 * prod - log(TMath::Power(2*TMath::Pi(), nmeas/2.) * sqrt(fDetCovariance));
138 void BCMVCDataModel::MCMCUserIterationInterface()
141 int nchains = MCMCGetNChains();
144 int npar = GetNParameters();
147 for (
int i = 0; i < nchains; ++i) {
151 TVectorD observables(npar);
152 TVectorD measurements(npar);
154 for (
int j = 0; j < npar; ++j) {
155 observables[j] = fPars[fVectorObservable[j]];
156 measurements[j] = fMCMCx.at(i * npar + j);
159 double chi2 = Chi2(observables, measurements);
163 fHistChi2->Fill(chi2);
168 void BCMVCDataModel::PrintToys(std::string filename)
171 if ( (filename.find_last_of(
".") != std::string::npos) &&
172 (filename.substr(filename.find_last_of(
".")+1) ==
"pdf") ) {
176 else if ( (filename.find_last_of(
".") != std::string::npos) &&
177 (filename.substr(filename.find_last_of(
".")+1) ==
"ps") ) {
185 int npars = GetNParameters();
187 TCanvas* c1 =
new TCanvas(
"");
191 double chi2 = Chi2(fVectorObservables, fVectorMeasurements);
198 BCLog::OutWarning(
"BCMVCDataModel::PrintToys. Chi2 histogram not normalized. Abort printing.");
206 hist_chi2->
Draw(
"BTllB1CS1L", 1-pvalue);
208 c1->Print(std::string(filename+
"(").c_str());
211 for (
int i = 0; i < npars; ++i) {
212 double obs = fVectorMeasurements[i];
214 BCH1D* hist_par = GetMarginalized(par);
216 hist_par->
Draw(
"BTllB1CS1L", 1-p);
217 c1->Print(filename.c_str());
221 for (
int i = 0; i < npars; ++i) {
222 for (
int j = 0; j < i; ++j) {
223 double obs_i = fVectorMeasurements[i];
224 double obs_j = fVectorMeasurements[j];
227 BCH2D* hist_par = GetMarginalized(par_i, par_j);
228 hist_par->
Draw(
"BTfB3CS1");
229 TMarker* m =
new TMarker();
230 m->SetMarkerStyle(21);
231 m->DrawMarker(obs_j, obs_i);
232 if (i == npars - 1 && j == i-1)
233 c1->Print(std::string(filename+
")").c_str());
235 c1->Print(filename.c_str());
242 void BCMVCDataModel::PrintSummary() {
244 std::cout <<
" Goodness-of-fit test:" << std::endl << std::endl;
247 double chi2 = Chi2(fVectorObservables, fVectorMeasurements);
256 std::cout <<
" chi2 : " << chi2 << std::endl;
257 std::cout <<
" p-value : " << pvalue << std::endl;
258 std::cout << std::endl;
263 double BCMVCDataModel::Chi2(TVectorD observables, TVectorD measurements)
265 TVectorD prod1 = observables - measurements;
266 TVectorD prod2 = fInvCovarianceMatrix * prod1;
267 double chi2 = prod1 * prod2;
void Draw(std::string options="BTfB3CS1meangmodelmode", std::vector< double > intervals=std::vector< double >(0))
The base class for all user-defined models.
A class for handling 2D distributions.
A class representing a parameter of a model.
virtual int AddParameter(BCParameter *parameter)
double LogLikelihood(const std::vector< double > ¶meters)
A class for handling 1D distributions.
double LogAPrioriProbability(const std::vector< double > ¶meters)
void Draw(std::string options="BTsiB3CS1D0Lmeanmode", std::vector< double > intervals=std::vector< double >(0))