247 for (
unsigned i = 0; i < other.
fMCMCTrees.size(); ++i) {
292 BCLog::OutError(Form(
"BCEngineMCMC::MCMCGetH1Marginalized. Index %u out of range.", index));
298 BCLog::OutWarning(Form(
"BCEngineMCMC::MCMCGetH1Marginalized: marginal distribution not computed/stored for par. %d", index));
317 BCLog::OutError(Form(
"BCEngineMCMC::MCMCGetH2Marginalized. Index %u out of range.", i));
321 BCLog::OutError(Form(
"BCEngineMCMC::MCMCGetH2Marginalized. Index %u out of range.", j));
325 BCLog::OutError(Form(
"BCEngineMCMC::MCMCGetH2Marginalized. Called with identical indices %u.", i));
331 unsigned indexTemp = i;
355 BCLog::OutError(
"BCIntegrate::GetBestFitParameterMarginalized : MCMC not yet run, returning center of the range.");
364 std::vector<double> x;
393 unsigned n = x0s.size();
395 for (
unsigned i = 0; i < n; ++i)
406 std::vector<double> y0s;
409 for (
unsigned i = 0; i < x0s.size(); ++i)
410 for (
unsigned j = 0; j < x0s.at(i).size(); ++j)
411 y0s.push_back((x0s.at(i)).at(j));
430 for (
unsigned i = 0; i < trees.size(); ++i)
449 BCLog::OutError(Form(
"#chains does not match #(thread local storages): %d vs %u",
468 fMCMCTrees.push_back(
new TTree(TString::Format(
"MarkovChainTree_%i", i),
"MarkovChainTree"));
476 fMCMCTrees[i]->Branch(TString::Format(
"Parameter%i", j),
478 TString::Format(
"parameter %i/D", j));
507 std::vector<double> x;
539 std::vector<double> x;
619 x[ipar] += proposal *
fParameters[ipar]->GetRangeWidth();
780 for (
unsigned i = 0; i < nentries; ++i) {
815 unsigned counter = 0;
833 bool flag_convergence =
true;
840 for (
unsigned iparameters = 0; iparameters <
fParameters.
Size(); ++iparameters){
845 for (
unsigned ichains = 0; ichains <
fMCMCNChains; ++ichains) {
855 flag_convergence =
false;
864 flag_convergence =
false;
915 unsigned counterupdate = 1;
916 bool convergence =
false;
917 bool flagefficiency =
false;
920 std::vector<double> efficiency;
931 for (
unsigned ichains = 0; ichains <
fMCMCNChains; ++ichains) {
933 for (
unsigned iparameter = 0; iparameter <
fParameters.
Size(); ++iparameter){
974 for (
unsigned iparameters = 0; iparameters <
fParameters.
Size(); ++iparameters)
980 unsigned chunk = 1; (void) chunk;
981 unsigned ichains; (void) ichains;
982 #pragma omp parallel for shared(chunk) private(ichains) schedule(static, chunk)
997 unsigned chunk = 1; (void) chunk;
998 unsigned ichains; (void) ichains;
999 #pragma omp parallel for shared(chunk) private(ichains) schedule(static, chunk)
1020 if (counterupdate > 1)
1035 bool rvalues_ok =
true;
1037 static bool has_converged =
false;
1055 if (convergence && fMCMCNChains > 1)
1057 else if (!convergence && fMCMCNChains > 1)
1062 for (
unsigned iparameter = 0; iparameter <
fParameters.
Size(); ++iparameter)
1073 BCLog::OutDetail(TString::Format(
" parameter %*i : MAX_DOUBLE <--",ndigits, iparameter));
1081 if (
fMCMCRValue != std::numeric_limits<double>::max() )
1092 has_converged =
true;
1099 flagefficiency =
true;
1101 bool flagprintefficiency =
true;
1104 for (
unsigned ichains = 0; ichains <
fMCMCNChains; ++ichains)
1107 for (
unsigned iparameter = 0; iparameter <
fParameters.
Size(); ++iparameter)
1121 if (flagprintefficiency)
1123 BCLog::OutDetail(Form(
" * Efficiency status: Efficiencies not within pre-defined range."));
1125 flagprintefficiency =
false;
1133 BCLog::OutDetail(Form(
" Efficiency of parameter %i dropped below %.2f%% (eps = %.2f%%) in chain %i. Set scale to %.4g",
1140 if (flagprintefficiency)
1142 BCLog::OutDetail(Form(
" * Efficiency status: Efficiencies not within pre-defined ranges."));
1144 flagprintefficiency =
false;
1149 BCLog::OutDetail(Form(
" Efficiency of parameter %i above %.2f%% (eps = %.2f%%) in chain %i. Set scale to %.4g",
1156 flagefficiency =
false;
1162 BCLog::OutDetail(Form(
" * Efficiency status: Efficiencies within pre-defined ranges."));
1172 for (
unsigned ichains = 0; ichains <
fMCMCNChains; ++ichains) {
1174 for (
unsigned iparameter = 0; iparameter <
fParameters.
Size(); ++iparameter){
1207 BCLog::OutWarning(
" Increase maximum number of iterations in the pre-run /MCMCSetNIterationsMax()/");
1208 BCLog::OutWarning(
" or decrease maximum number of iterations for update /MCMCSetNIterationsUpdateMax()/");
1234 else if(fMCMCNChains == 1)
1238 BCLog::OutSummary(
" --> Only one Markov chain. No global convergence criterion defined.");
1244 std::vector<double> efficiencies;
1247 efficiencies.push_back(0.);
1256 efficiencies[i] += efficiency[j *
fParameters.
Size() + i] / double(fMCMCNChains);
1258 BCLog::OutDetail(TString::Format(
" --> parameter %*d : %.02f%%",ndigits, i, 100. * efficiencies[i]));
1263 std::vector<double> scalefactors;
1266 scalefactors.push_back(0.0);
1276 BCLog::OutDetail(TString::Format(
" --> parameter %*i : %.02f%%",ndigits, i, 100. * scalefactors[i]));
1297 BCLog::OutWarning(
"BCEngineMCMC::MCMCMetropolis. Number of free parameters <= 0. Do not run Metropolis.");
1305 BCLog::OutWarning(
"BCEngineMCMC::MCMCMetropolis. Not running prerun. This can cause trouble if the data have changed.");
1322 else if(nwrite < 500)
1324 else if(nwrite < 10000)
1339 for (
unsigned iparameters = 0; iparameters <
fParameters.
Size(); ++iparameters)
1346 unsigned chunk = 1; (void) chunk;
1347 unsigned ichains; (void) ichains;
1348 #pragma omp parallel for shared(chunk) private(ichains) schedule(static, chunk)
1349 for (
unsigned ichains = 0; ichains <
fMCMCNChains; ++ichains)
1382 unsigned chunk = 1; (void) chunk;
1383 unsigned ichains; (void) ichains;
1384 #pragma omp parallel for shared(chunk) private(ichains) schedule(static, chunk)
1385 for (
unsigned ichains = 0; ichains <
fMCMCNChains; ++ichains)
1422 unsigned probmaxindex = 0;
1508 std::vector<double> x0;
1602 BCLog::OutError(
"BCEngine::MCMCInitialize : Length of vector containing initial positions does not have required length.");
1613 BCLog::OutError(
"BCEngine::MCMCInitialize : Initial position out of boundaries.");
1638 BCLog::OutWarning(
"BCEngineMCMC::MCMCInitialize. Inconsisten start value. Changed parameter value to fixed value.");
1666 h1 =
new TH1D(TString::Format(
"h1_%d_parameter_%i",
BCLog::GetHIndex() ,i),
1669 h1->SetStats(kFALSE);
1687 h2 =
new TH2D(Form(
"h2_%d_parameters_%i_vs_%i",
BCLog::GetHIndex(), i, j),
"",
1694 h2->SetStats(kFALSE);
1730 unsigned counter = 0;
1735 for (
unsigned j = 0; j < i; ++j)
1737 if(j == index1 && i == index2)
1759 rng(new TRandom3(0))
1765 xLocal(other.xLocal),
1766 rng(new TRandom3(*other.rng))
1780 rng =
new TRandom3(*other.
rng);
1800 for (
int i = 0; i < -n; ++i){
1810 for (
int i = 0; i < n; ++i){