17 #include <../../BAT/BCLog.h>
18 #include <../../BAT/BCMath.h>
19 #include <../../BAT/BCParameter.h>
30 , fNNuisanceCorrelation(0)
40 for (
int i = 0; i < nuncertainties; ++i) {
46 for (
int i = 0; i < nmeasurements; ++i) {
90 BCLog::OutWarning(Form(
"BCMVCombination::AddMeasurement. Observable \"%s\" does not exist. Measurement was not added.", observable.c_str()));
122 TVectorD observables(nmeas);
124 for (
int i = 0; i < nmeas; ++i) {
130 double prod = prod1 * prod2;
132 logprob = -0.5 * prod - log(TMath::Power(2*TMath::Pi(), nmeas/2.) * sqrt(fabs(
fDetCovariance)));
142 infile.open(filename.c_str(), std::ifstream::in);
145 if (!infile.is_open()) {
146 BCLog::OutWarning(Form(
"BCMVCombination::ReadInput. Could not open input file %s.", filename.c_str()));
155 infile >> nobservables >> nmeasurements >> nuncertainties >> nnuisance;
157 std::vector<std::string> observable_names;
159 for (
int i = 0; i < nobservables; ++i) {
163 infile >> name >> min >> max;
169 for (
int i = 0; i < nuncertainties; ++i) {
177 for (
int i = 0; i < nmeasurements; ++i) {
179 std::string observable;
181 std::vector<double> uncertainties(0);
184 infile >> observable;
187 for (
int j = 0; j < nuncertainties; ++j) {
189 infile >> uncertainty;
190 uncertainties.push_back(uncertainty);
197 for (
int i = 0; i < nuncertainties; ++i) {
198 TMatrixD mat(nmeasurements, nmeasurements);
200 for (
int j = 0; j < nmeasurements; ++j)
201 for (
int k = 0; k < nmeasurements; ++k) {
211 for (
int i = 0; i < nnuisance; ++i) {
212 std::string uncertainty;
213 std::string measurement1;
214 std::string observable1;
215 std::string measurement2;
216 std::string observable2;
221 std::string priorshape;
223 infile >> uncertainty >> measurement1 >> observable1 >> measurement2 >> observable2 >> parname;
235 else if (index < 0) {
237 infile >> min >> max >> priorshape;
248 if (priorshape ==
"flat") {
251 else if (priorshape ==
"gauss") {
255 infile >> mean >> std;
260 BCLog::OutWarning(Form(
"BCMVCombination::ReadInput. Unknown prior shape %s.", priorshape.c_str()));
292 for (
int i = 0; i < nuncertainties; ++i)
298 BCLog::OutWarning(
"BCMVCombination::PrepareAnalysis. Covariance matrix is not positive definite.");
312 for (
int i = 0; i < n; ++i) {
329 for (
int i = 0; i < nmeasurements; ++i) {
342 for (
int i = 0; i < nmeasurements; ++i) {
361 TMatrixD cov(nactive, nactive);
366 for (
int i = 0; i < n; ++i) {
375 for (
int j = 0; j < n; ++j) {
380 cov[counteri][counterj] = corr[i][j]*sigma_i*sigma_j;
401 for (
int unc_i = 0; unc_i < n; ++unc_i) {
409 for (
int meas_i = 0; meas_i < nmeasurements; ++meas_i) {
418 for (
int meas_j = 0; meas_j < nmeasurements; ++meas_j) {
426 if (parameters.size() > 0) {
429 for (
int nuis_k = 0; nuis_k < nnuisance; ++nuis_k) {
442 mat_small[counteri][counterj] = pre * parameters.at(p.
index_rhoparameter) * sigma_i*sigma_j;
443 mat_small[counterj][counteri] = mat_small[counteri][counterj];
475 TVectorD eigen_re = m.GetEigenValuesRe();
477 int n_eigen = eigen_re.GetNoElements();
479 bool flag_ispositive =
true;
482 for (
int i = 0; i < n_eigen; ++i) {
484 flag_ispositive =
false;
488 return flag_ispositive;
501 TMatrixD u(nactivemeas, nobs);
504 for (
int i = 0; i < nmeas; ++i) {
509 for (
int j = 0; j < nobs; ++j) {
524 TMatrixD m2 = m1 * u;
545 weightt.Transpose(weightt);
550 for (
int i = 0; i < nunc; ++i) {
563 for (
int j = 0; j < nobs; ++j) {
564 double sigma_j = sqrt(mat[j][j]);
569 TMatrixD mat2(nobs, nobs);
570 for (
int j = 0; j < nobs; ++j)
571 for (
int k = 0; k < nobs; ++k) {
572 mat2[j][k] = mat[j][k]/vec[j]/vec[k];
581 for (
int i = 0; i < nobs; ++i)
588 for (
int i = 0; i < nobs; ++i)
589 for (
int j = 0; j < nobs; ++j)
597 std::ofstream ofi(filename.c_str());
600 if (!ofi.is_open()) {
601 std::cerr <<
"Couldn't open file " << filename << std::endl;
610 ofi <<
"Summary of the combination" << std::endl;
611 ofi <<
"==========================" << std::endl << std::endl;
613 ofi <<
"* Observables:" << std::endl;
614 ofi <<
" Observable (range): " << std::endl;
615 for (
int i = 0; i < nobs; ++i)
620 ofi <<
"* Measurements:" << std::endl;
621 ofi <<
" Measurement (observable): central value +- total uncertainty" << std::endl;
622 for (
int i = 0; i < nmeas; ++i) {
626 for (
int j = 0; j < nunc; ++j) {
630 ofi <<
" " << std::setiosflags(std::ios::left) << std::setw(20) << m->
GetName()
632 <<
": " << std::setiosflags(std::ios::left) << std::setw(7) << std::setprecision(4) << m->
GetCentralValue()
633 <<
" +- " << std::setiosflags(std::ios::left) << std::setw(7) << std::setprecision(4) << sqrt(total2) << std::endl;
638 ofi <<
"* Uncertainties:" << std::endl;
639 ofi <<
" Measurement (observable): Uncertainty (";
640 for (
int j = 0; j < nunc-1; ++j )
646 ofi <<
")" << std::endl;
648 for (
int i = 0; i < nmeas; ++i) {
651 ofi <<
" " << std::setiosflags(std::ios::left) << std::setw(20) << m->
GetName()
653 for (
int j = 0; j < nunc; ++j )
655 ofi << std::setiosflags(std::ios::left) << std::setw(7) << m->
GetUncertainty(j);
661 for (
int i = 0; i < nunc; ++i) {
667 ofi <<
" " << u->
GetName() <<
" " <<
"(correlation matrix)" << std::endl;
671 for (
int k = 0; k < nmeas; ++k) {
681 for (
int j = 0; j < nmeas; ++j) {
685 ofi << std::setw(7) << std::showpos << mat[k][j] <<
" ";
689 ofi << std::noshowpos << std::endl;
695 ofi <<
"* BLUE results: " << std::endl;
696 ofi <<
" Observable: estimate +- total uncertainty" << std::endl;
697 for (
int i = 0; i < nobs; ++i) {
703 ofi <<
" Observable: Uncertainty (";
704 for (
int j = 0; j < nunc-1; ++j )
710 ofi <<
")" << std::endl;
712 for (
int i = 0; i < nobs; ++i) {
715 for (
int j = 0; j < nunc; ++j )
717 ofi <<
" " << std::setiosflags(std::ios::left) << std::setw(7) << std::setprecision(4) <<
GetBLUEUncertainties(counterj)[i];
725 ofi <<
" Individual correlation matrices " << std::endl;
726 for (
int i = 0; i < nunc; ++i) {
730 for (
int j = 0; j < nobs; ++j) {
732 for (
int k = 0; k < nobs; ++k) {
733 ofi << std::setw(7) << std::setprecision(4) << std::showpos << mat[j][k] <<
" ";
735 ofi << std::noshowpos << std::endl;
743 ofi <<
" Overall correlation matrix" << std::endl;
745 for (
int j = 0; j < nobs; ++j) {
747 for (
int k = 0; k < nobs; ++k)
748 ofi << std::setw(7) << std::setprecision(4) << std::showpos << mat[j][k] <<
" ";
749 ofi << std::noshowpos << std::endl;
754 ofi <<
" Weights [%]:" <<std::endl;
756 for (
int j = 0; j < nmeas; ++j) {
759 for (
int k = 0; k < nobs; ++k)
760 ofi << std::setw(7) << std::setprecision(4) << std::showpos <<
fBLUEWeights[k][counter]*100. <<
" ";
774 int nrows = matrix.GetNrows();
775 int ncols = matrix.GetNcols();
777 std::cout << std::endl;
778 std::cout << name.c_str() <<
" (" << nrows <<
"x" << ncols <<
"):" << std::endl;
780 for (
int i = 0; i < nrows; ++i) {
781 for (
int j = 0; j < ncols; ++j)
782 std::cout << std::setprecision(3) << std::setw(7) << matrix[i][j] <<
" ";
783 std::cout << std::endl;
790 int nrows = vector.GetNoElements();
792 std::cout << std::endl;
793 std::cout << name.c_str() <<
" (" << nrows <<
"):" << std::endl;
795 for (
int i = 0; i < nrows; ++i) {
796 std::cout << std::setprecision(3) << std::setw(7) << vector[i] <<
" ";
797 std::cout << std::endl;
808 for (
int i = 0; i < nmeasurements; ++i) {
823 for (
int i = 0; i < nuncertainties; ++i) {
837 for (
int i = 0; i < n; ++i) {