12 inline void ProcessMCMC(
const std::string& inputFile);
22 inline TH2D*
TMatrixIntoTH2D(TMatrixDSym* Matrix,
const std::string& title);
25 const std::unique_ptr<TCanvas>& Posterior,
26 const TString& canvasname);
32 int main(
int argc,
char *argv[])
36 if (argc != 3 && argc !=6 && argc != 8)
39 MACH3LOG_ERROR(
" single chain: {} <Config> <MCMM_ND_Output.root>", argv[0]);
40 MACH3LOG_ERROR(
" two chain: {} <Config> <MCMM_ND_Output_1.root> <Title 1> <MCMC_ND_Output_2.root> <Title 2>", argv[0]);
41 MACH3LOG_ERROR(
" three chain: {} <Config> <MCMM_ND_Output_1.root> <Title 1> <MCMC_ND_Output_2.root> <Title 2> <MCMC_ND_Output_3.root> <Title 3>", argv[0]);
48 MACH3LOG_ERROR(
"The 'ProcessMCMC' node is not defined in the YAML configuration.");
55 std::string filename = argv[2];
59 else if (argc == 6 || argc == 8)
93 std::map<std::string, std::pair<double, double>>
GetCustomBinning(
const YAML::Node& Settings)
95 std::map<std::string, std::pair<double, double>> CustomBinning;
96 if (Settings[
"CustomBinEdges"]) {
97 const YAML::Node& edges = Settings[
"CustomBinEdges"];
99 for (
const auto& node : edges) {
100 std::string key = node.first.as<std::string>();
101 auto values = node.second.as<std::vector<double>>();
103 if (values.size() == 2) {
104 CustomBinning[key] = std::make_pair(values[0], values[1]);
105 MACH3LOG_DEBUG(
"Adding custom binning {} with {:.4f}, {:.4f}", key, values[0], values[1]);
112 return CustomBinning;
119 auto Processor = std::make_unique<OscProcessor>(inputFile);
122 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
124 const bool PlotCorr = GetFromManager<bool>(Settings[
"PlotCorr"],
false);
126 Processor->SetExcludedTypes(
GetFromManager<std::vector<std::string>>(Settings[
"ExcludedTypes"], {}));
127 Processor->SetExcludedNames(
GetFromManager<std::vector<std::string>>(Settings[
"ExcludedNames"], {}));
128 Processor->SetExcludedGroups(
GetFromManager<std::vector<std::string>>(Settings[
"ExcludedGroups"], {}));
131 Processor->SetPosterior1DCut(GetFromManager<std::string>(Settings[
"Posterior1DCut"],
""));
133 if(PlotCorr) Processor->SetOutputSuffix(
"_drawCorr");
135 Processor->SetPlotRelativeToPrior(GetFromManager<bool>(Settings[
"PlotRelativeToPrior"],
false));
136 Processor->SetPrintToPDF(GetFromManager<bool>(Settings[
"PrintToPDF"],
true));
139 Processor->SetPlotErrorForFlatPrior(GetFromManager<bool>(Settings[
"PlotErrorForFlatPrior"],
true));
140 Processor->SetFancyNames(GetFromManager<bool>(Settings[
"FancyNames"],
true));
141 Processor->SetPlotBinValue(GetFromManager<bool>(Settings[
"PlotBinValue"],
false));
143 Processor->SetPost2DPlotThreshold(GetFromManager<double>(Settings[
"Post2DPlotThreshold"], 0.2));
145 Processor->Initialise();
147 if(Settings[
"BurnInSteps"]) {
148 Processor->SetStepCut(Settings[
"BurnInSteps"].as<int>());
151 Processor->SetStepCut(
static_cast<int>(Processor->GetnSteps()/5));
153 if(Settings[
"MaxEntries"]) {
154 Processor->SetEntries(Get<int>(Settings[
"MaxEntries"], __FILE__, __LINE__));
156 if(Settings[
"NBins"]) {
157 Processor->SetNBins(Get<int>(Settings[
"NBins"], __FILE__, __LINE__));
159 if(Settings[
"Thinning"])
161 if(Settings[
"Thinning"][0].as<bool>()){
162 Processor->ThinMCMC(Settings[
"Thinning"][1].as<int>());
167 Processor->DrawPostfit();
169 if(GetFromManager<bool>(Settings[
"MakeCredibleIntervals"],
true)) {
170 Processor->MakeCredibleIntervals(
GetFromManager<std::vector<double>>(Settings[
"CredibleIntervals"], {0.99, 0.90, 0.68}),
171 GetFromManager<std::vector<short int>>(Settings[
"CredibleIntervalsColours"], {436, 430, 422}),
172 GetFromManager<bool>(Settings[
"CredibleInSigmas"],
false));
174 if(GetFromManager<bool>(Settings[
"CalcBayesFactor"],
true))
CalcBayesFactor(Processor.get());
175 if(GetFromManager<bool>(Settings[
"CalcSavageDickey"],
true))
CalcSavageDickey(Processor.get());
176 if(GetFromManager<bool>(Settings[
"CalcBipolarPlot"],
false))
CalcBipolarPlot(Processor.get());
177 if(GetFromManager<bool>(Settings[
"CalcParameterEvolution"],
false))
CalcParameterEvolution(Processor.get());
181 Processor->SetSmoothing(GetFromManager<bool>(Settings[
"Smoothing"],
true));
184 Processor->CacheSteps();
186 if(GetFromManager<bool>(Settings[
"MakeViolin"],
true)) Processor->MakeViolin();
187 Processor->MakeCovariance_MP();
189 Processor->DrawCovariance();
190 if(GetFromManager<bool>(Settings[
"MakeCovarianceYAML"],
true)) Processor->MakeCovarianceYAML(GetFromManager<std::string>(Settings[
"CovarianceYAMLOutName"],
"UpdatedCorrelationMatrix.yaml"), GetFromManager<std::string>(Settings[
"CovarianceYAMLMeansMethod"],
"HPD"));
192 auto const &MakeSubOptimality = Settings[
"MakeSubOptimality"];
193 if(MakeSubOptimality[0].as<bool>()) Processor->MakeSubOptimality(MakeSubOptimality[1].as<int>());
195 if(GetFromManager<bool>(Settings[
"MakeCredibleRegions"],
false)) {
196 Processor->MakeCredibleRegions(
GetFromManager<std::vector<double>>(Settings[
"CredibleRegions"], {0.99, 0.90, 0.68}),
197 GetFromManager<std::vector<short int>>(Settings[
"CredibleRegionStyle"], {2, 1, 3}),
198 GetFromManager<std::vector<short int>>(Settings[
"CredibleRegionColor"], {413, 406, 416}),
199 GetFromManager<bool>(Settings[
"CredibleInSigmas"],
false),
200 GetFromManager<bool>(Settings[
"Draw2DPosterior"],
true),
201 GetFromManager<bool>(Settings[
"DrawBestFit"],
true));
203 if(GetFromManager<bool>(Settings[
"GetTrianglePlot"],
true))
GetTrianglePlot(Processor.get());
206 if(GetFromManager<bool>(Settings[
"DiagnoseCovarianceMatrix"],
false))
DiagnoseCovarianceMatrix(Processor.get(), inputFile);
208 if(GetFromManager<bool>(Settings[
"JarlskogAnalysis"],
true)) Processor->PerformJarlskogAnalysis();
209 if(GetFromManager<bool>(Settings[
"MakePiePlot"],
true)) Processor->MakePiePlot();
215 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
217 constexpr Color_t PosteriorColor[] = {kBlue-1, kRed, kGreen+2};
220 std::vector<std::unique_ptr<MCMCProcessor>> Processor(
nFiles);
222 if(!Settings[
"BurnInSteps"]) {
226 for (
int ik = 0; ik <
nFiles; ik++)
230 Processor[ik] = std::make_unique<MCMCProcessor>(
FileNames[ik]);
231 Processor[ik]->SetOutputSuffix((
"_" + std::to_string(ik)).c_str());
233 Processor[ik]->SetExcludedTypes(
GetFromManager<std::vector<std::string>>(Settings[
"ExcludedTypes"], {}));
234 Processor[ik]->SetExcludedNames(
GetFromManager<std::vector<std::string>>(Settings[
"ExcludedNames"], {}));
235 Processor[ik]->SetExcludedGroups(
GetFromManager<std::vector<std::string>>(Settings[
"ExcludedGroups"], {}));
238 Processor[ik]->SetPosterior1DCut(GetFromManager<std::string>(Settings[
"Posterior1DCut"],
""));
240 Processor[ik]->SetPlotRelativeToPrior(GetFromManager<bool>(Settings[
"PlotRelativeToPrior"],
false));
241 Processor[ik]->SetFancyNames(GetFromManager<bool>(Settings[
"FancyNames"],
true));
242 Processor[ik]->Initialise();
244 if(Settings[
"BurnInSteps"]) {
245 Processor[ik]->SetStepCut(Settings[
"BurnInSteps"].as<int>());
247 Processor[ik]->SetStepCut(
static_cast<int>(Processor[ik]->GetnSteps()/5));
250 if(Settings[
"MaxEntries"]) {
251 Processor[ik]->SetEntries(Get<int>(Settings[
"MaxEntries"], __FILE__, __LINE__));
253 if(Settings[
"NBins"]) {
254 Processor[ik]->SetNBins(Get<int>(Settings[
"NBins"], __FILE__, __LINE__));
259 Processor[0]->DrawPostfit();
261 std::map<std::string, std::pair<double, double>> ParamEdges;
262 for(
int i = 0; i < Processor[0]->GetNParams(); ++i) {
264 TH1D* hist = Processor[0]->GetHpost(i);
271 std::string paramName = hist->GetTitle();
274 TAxis* axis = hist->GetXaxis();
275 double xmin = axis->GetXmin();
276 double xmax = axis->GetXmax();
278 MACH3LOG_DEBUG(
"Adding bin edges for {} equal to {:.4f}, {:.4f}",paramName, xmin, xmax);
280 ParamEdges[paramName] = std::make_pair(xmin, xmax);
284 for (
int ik = 1; ik <
nFiles; ik++)
287 Processor[ik]->MakePostfit(ParamEdges);
288 Processor[ik]->DrawPostfit();
292 auto Posterior = std::make_unique<TCanvas>(
"PosteriorMulti",
"PosteriorMulti", 0, 0, 1024, 1024);
293 gStyle->SetOptStat(0);
294 gStyle->SetOptTitle(0);
295 Posterior->SetGrid();
296 Posterior->SetBottomMargin(0.1f);
297 Posterior->SetTopMargin(0.05f);
298 Posterior->SetRightMargin(0.03f);
299 Posterior->SetLeftMargin(0.15f);
303 size_t pos =
FileNames[0].rfind(
".root");
304 std::string base = (pos == std::string::npos) ?
FileNames[0] :
FileNames[0].substr(0, pos);
305 TString canvasname = base;
309 for (
int ik = 1; ik <
nFiles; ik++) {
312 pos = base.rfind(
".root");
313 if (pos != std::string::npos) base = base.substr(0, pos);
314 canvasname +=
"_" + TString(base);
317 canvasname = canvasname +
".pdf[";
319 Posterior->Print(canvasname);
321 canvasname.ReplaceAll(
"[",
"");
323 for(
int i = 0; i < Processor[0]->GetNParams(); ++i)
326 std::vector<std::unique_ptr<TH1D>> hpost(
nFiles);
327 std::vector<std::unique_ptr<TLine>> hpd(
nFiles);
328 hpost[0] =
M3::Clone(Processor[0]->GetHpost(i));
329 hpost[0]->GetYaxis()->SetTitle(
"Posterior Density");
331 for (
int ik = 1 ; ik <
nFiles; ik++)
334 const int Index = Processor[ik]->GetParamIndexFromName(hpost[0]->GetTitle());
340 hpost[ik] =
M3::Clone(Processor[ik]->GetHpost(Index));
344 if(hpost[0]->GetMaximum() == hpost[0]->Integral()*1.5 || Skip) {
347 for (
int ik = 0; ik <
nFiles; ik++)
352 hpost[ik]->SetLineColor(PosteriorColor[ik]);
354 hpost[ik]->SetLineWidth(2);
357 hpost[ik]->Scale(1./hpost[ik]->Integral());
361 double PriorError = 1.0;
363 Processor[0]->GetNthParameter(i, Prior, PriorError, Title);
366 auto Asimov = std::make_unique<TLine>(Prior, hpost[0]->GetMinimum(), Prior, hpost[0]->GetMaximum());
367 Asimov->SetLineColor(kRed-3);
368 Asimov->SetLineWidth(2);
369 Asimov->SetLineStyle(kDashed);
372 auto leg = std::make_unique<TLegend>(0.20, 0.7, 0.6, 0.97);
373 leg->SetTextSize(0.03f);
374 leg->SetFillColor(0);
375 leg->SetFillStyle(0);
376 leg->SetLineColor(0);
377 leg->SetLineStyle(0);
378 TString asimovLeg = Form(
"#splitline{Prior}{x = %.2f , #sigma = %.2f}", Prior, PriorError);
379 leg->AddEntry(Asimov.get(), asimovLeg,
"l");
381 for (
int ik = 0; ik <
nFiles; ik++)
383 TString rebinLeg = Form(
"#splitline{%s}{#mu = %.2f, #sigma = %.2f}",
TitleNames[ik].c_str(), hpost[ik]->GetMean(), hpost[ik]->GetRMS());
384 leg->AddEntry(hpost[ik].get(), rebinLeg,
"l");
386 hpd[ik] = std::make_unique<TLine>(hpost[ik]->GetBinCenter(hpost[ik]->GetMaximumBin()), hpost[ik]->GetMinimum(),
387 hpost[ik]->GetBinCenter(hpost[ik]->GetMaximumBin()), hpost[ik]->GetMaximum());
388 hpd[ik]->SetLineColor(hpost[ik]->GetLineColor());
389 hpd[ik]->SetLineWidth(2);
390 hpd[ik]->SetLineStyle(kSolid);
395 for (
int ik = 0; ik <
nFiles; ik++) maximum = std::max(maximum, hpost[ik]->GetMaximum());
396 for (
int ik = 0; ik <
nFiles; ik++) hpost[ik]->SetMaximum(1.3*maximum);
398 hpost[0]->Draw(
"hist");
399 for (
int ik = 1; ik <
nFiles; ik++) hpost[ik]->Draw(
"hist same");
400 Asimov->Draw(
"same");
401 for (
int ik = 0; ik <
nFiles; ik++) hpd[ik]->Draw(
"same");
404 Posterior->Print(canvasname);
412 if(GetFromManager<bool>(Settings[
"PerformKStest"],
true))
KolmogorovSmirnovTest(Processor, Posterior, canvasname);
417 Posterior->Print(canvasname);
424 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
426 std::vector<std::string> ParNames;
427 std::vector<std::vector<double>> Model1Bounds;
428 std::vector<std::vector<double>> Model2Bounds;
429 std::vector<std::vector<std::string>> ModelNames;
430 for (
const auto& dg : Settings[
"BayesFactor"])
432 ParNames.push_back(dg[0].as<std::string>());
433 ModelNames.push_back(dg[1].as<std::vector<std::string>>());
434 Model1Bounds.push_back(dg[2].as<std::vector<double>>());
435 Model2Bounds.push_back(dg[3].as<std::vector<double>>());
438 Processor->
GetBayesFactor(ParNames, Model1Bounds, Model2Bounds, ModelNames);
444 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
446 std::vector<std::string> ParNames;
447 std::vector<double> EvaluationPoint;
448 std::vector<std::vector<double>> Bounds;
450 for (
const auto& d : Settings[
"SavageDickey"])
452 ParNames.push_back(d[0].as<std::string>());
453 EvaluationPoint.push_back(d[1].as<double>());
454 Bounds.push_back(d[2].as<std::vector<double>>());
462 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
464 std::vector<std::string> ParNames;
465 std::vector<int> Intervals;
466 for (
const auto& d : Settings[
"ParameterEvolution"])
468 ParNames.push_back(d[0].as<std::string>());
469 Intervals.push_back(d[1].as<int>());
477 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
479 std::vector<std::string> ParNames;
480 for (
const auto& d : Settings[
"BipolarPlot"])
482 ParNames.push_back(d[0].as<std::string>());
489 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
491 for (
const auto& dg : Settings[
"TrianglePlot"])
493 std::string ParName = dg[0].as<std::string>();
495 std::vector<std::string> NameVec = dg[1].as<std::vector<std::string>>();
497 GetFromManager<std::vector<double>>(Settings[
"CredibleIntervals"], {0.99, 0.90, 0.68}),
498 GetFromManager<std::vector<short int>>(Settings[
"CredibleIntervalsColours"], {436, 430, 422}),
499 GetFromManager<std::vector<double>>(Settings[
"CredibleRegions"], {0.99, 0.90, 0.68}),
500 GetFromManager<std::vector<short int>>(Settings[
"CredibleRegionStyle"], {2, 1, 3}),
501 GetFromManager<std::vector<short int>>(Settings[
"CredibleRegionColor"], {413, 406, 416}),
502 GetFromManager<bool>(Settings[
"CredibleInSigmas"],
false));
512 auto Canvas = std::make_unique<TCanvas>(
"Canvas",
"Canvas", 0, 0, 1024, 1024);
514 gStyle->SetOptStat(0);
515 gStyle->SetOptTitle(0);
518 Canvas->SetBottomMargin(0.1f);
519 Canvas->SetTopMargin(0.05f);
520 Canvas->SetRightMargin(0.15f);
521 Canvas->SetLeftMargin(0.10f);
524 const int NRGBs = 10;
525 TColor::InitializeColors();
526 Double_t stops[NRGBs] = { 0.00, 0.10, 0.25, 0.35, 0.50, 0.60, 0.65, 0.75, 0.90, 1.00 };
527 Double_t red[NRGBs] = { 0.50, 1.00, 1.00, 0.25, 0.00, 0.10, 0.50, 1.00, 0.75, 0.55 };
528 Double_t green[NRGBs] = { 0.00, 0.25, 1.00, 0.25, 0.00, 0.60, 0.90, 1.00, 0.75, 0.75 };
529 Double_t blue[NRGBs] = { 0.00, 0.25, 1.00, 1.00, 0.50, 0.60, 0.90, 1.00, 0.05, 0.05 };
530 TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, 255);
531 gStyle->SetNumberContours(255);
533 std::string OutName = inputFile;
534 OutName = OutName.substr(0, OutName.find(
".root"));
535 Canvas->Print(Form(
"Correlation_%s.pdf[", OutName.c_str()),
"pdf");
536 Canvas->Print(Form(
"Covariance_%s.pdf[", OutName.c_str()),
"pdf");
539 YAML::Node Settings = card_yaml[
"ProcessMCMC"];
541 const int entries = int(Processor->
GetnSteps());
542 const int NIntervals = GetFromManager<int>(Settings[
"NIntervals"], 5);
543 const int IntervalsSize = entries/NIntervals;
546 MACH3LOG_INFO(
"Diagnosing matrices with entries={}, NIntervals={} and IntervalsSize={}", entries, NIntervals, IntervalsSize);
548 TMatrixDSym *Covariance =
nullptr;
549 TMatrixDSym *Correlation =
nullptr;
551 TH2D *CovariancePreviousHist =
nullptr;
552 TH2D *CorrelationPreviousHist =
nullptr;
554 TH2D *CovarianceHist =
nullptr;
555 TH2D *CorrelationHist =
nullptr;
565 Covariance =
nullptr;
567 Correlation =
nullptr;
570 for(
int k = 1; k < NIntervals; ++k)
572 BurnIn = k*IntervalsSize;
580 TH2D *CovarianceDiff =
static_cast<TH2D*
>(CovarianceHist->Clone(
"Covariance_Ratio"));
581 TH2D *CorrelationDiff =
static_cast<TH2D*
>(CorrelationHist->Clone(
"Correlation_Ratio"));
585 #pragma omp parallel for
587 for (
int j = 1; j < CovarianceDiff->GetXaxis()->GetNbins()+1; ++j)
589 for (
int i = 1; i < CovarianceDiff->GetYaxis()->GetNbins()+1; ++i)
591 if( std::fabs (CovarianceDiff->GetBinContent(j, i)) < 1.e-5 && std::fabs (CovariancePreviousHist->GetBinContent(j, i)) < 1.e-5)
596 if( std::fabs (CorrelationDiff->GetBinContent(j, i)) < 1.e-5 && std::fabs (CorrelationPreviousHist->GetBinContent(j, i)) < 1.e-5)
604 CovarianceDiff->Divide(CovariancePreviousHist);
605 CorrelationDiff->Divide(CorrelationPreviousHist);
608 for (
int j = 0; j < CovarianceDiff->GetXaxis()->GetNbins(); ++j)
612 double PriorError = 1.0;
616 CovarianceDiff->GetXaxis()->SetBinLabel(j+1, Title);
617 CovarianceDiff->GetYaxis()->SetBinLabel(j+1, Title);
618 CorrelationDiff->GetXaxis()->SetBinLabel(j+1, Title);
619 CorrelationDiff->GetYaxis()->SetBinLabel(j+1, Title);
621 CovarianceDiff->GetXaxis()->SetLabelSize(0.015f);
622 CovarianceDiff->GetYaxis()->SetLabelSize(0.015f);
623 CorrelationDiff->GetXaxis()->SetLabelSize(0.015f);
624 CorrelationDiff->GetYaxis()->SetLabelSize(0.015f);
626 std::stringstream ss;
631 ss << (k-1)*IntervalsSize;
632 std::string str = ss.str();
634 TString Title =
"Cov " + str;
635 CovarianceDiff->GetZaxis()->SetTitle( Title );
636 Title =
"Corr " + str;
637 CorrelationDiff->GetZaxis()->SetTitle(Title);
639 CovarianceDiff->SetMinimum(-2);
640 CovarianceDiff->SetMaximum(2);
641 CorrelationDiff->SetMinimum(-2);
642 CorrelationDiff->SetMaximum(2);
645 CovarianceDiff->Draw(
"colz");
646 Canvas->Print(Form(
"Covariance_%s.pdf", OutName.c_str()),
"pdf");
648 CorrelationDiff->Draw(
"colz");
649 Canvas->Print(Form(
"Correlation_%s.pdf", OutName.c_str()),
"pdf");
652 delete CovariancePreviousHist;
653 CovariancePreviousHist =
static_cast<TH2D*
>(CovarianceHist->Clone());
654 delete CorrelationPreviousHist;
655 CorrelationPreviousHist =
static_cast<TH2D*
>(CorrelationHist->Clone());
657 delete CovarianceHist;
658 CovarianceHist =
nullptr;
659 delete CorrelationHist;
660 CorrelationHist =
nullptr;
662 delete CovarianceDiff;
663 delete CorrelationDiff;
665 Covariance =
nullptr;
667 Correlation =
nullptr;
670 Canvas->Print(Form(
"Covariance_%s.pdf]", OutName.c_str()),
"pdf");
671 Canvas->Print(Form(
"Correlation_%s.pdf]", OutName.c_str()),
"pdf");
674 if(Covariance !=
nullptr)
delete Covariance;
675 if(Correlation !=
nullptr)
delete Correlation;
676 if(CovariancePreviousHist !=
nullptr)
delete CovariancePreviousHist;
677 if(CorrelationPreviousHist !=
nullptr)
delete CorrelationPreviousHist;
678 if(CovarianceHist !=
nullptr)
delete CovarianceHist;
679 if(CorrelationHist !=
nullptr)
delete CorrelationHist;
685 TH2D* hMatrix =
new TH2D(title.c_str(), title.c_str(), Matrix->GetNrows(), 0.0, Matrix->GetNrows(), Matrix->GetNcols(), 0.0, Matrix->GetNcols());
686 for(
int i = 0; i < Matrix->GetNrows(); i++)
688 for(
int j = 0; j < Matrix->GetNcols(); j++)
691 hMatrix->SetBinContent(i+1,j+1, (*Matrix)(i,j));
699 const std::unique_ptr<TCanvas>& Posterior,
700 const TString& canvasname)
702 constexpr Color_t CumulativeColor[] = {kBlue-1, kRed, kGreen+2};
703 constexpr Style_t CumulativeStyle[] = {kSolid, kDashed, kDotted};
705 for(
int i = 0; i < Processor[0]->GetNParams(); ++i)
708 std::vector<std::unique_ptr<TH1D>> hpost(
nFiles);
709 std::vector<std::unique_ptr<TH1D>> CumulativeDistribution(
nFiles);
713 double PriorError = 1.0;
715 Processor[0]->GetNthParameter(i, Prior, PriorError, Title);
717 for (
int ik = 0 ; ik <
nFiles; ik++)
720 if(ik == 0 ) Index = i;
724 Index = Processor[ik]->GetParamIndexFromName(hpost[0]->GetTitle());
731 hpost[ik] =
M3::Clone(Processor[ik]->GetHpost(Index));
732 CumulativeDistribution[ik] =
M3::Clone(Processor[ik]->GetHpost(Index));
733 CumulativeDistribution[ik]->Fill(0., 0.);
734 CumulativeDistribution[ik]->Reset();
735 CumulativeDistribution[ik]->SetMaximum(1.);
736 TString TempTitle = Title+
" Kolmogorov Smirnov";
737 CumulativeDistribution[ik]->SetTitle(TempTitle);
739 TempTitle = Title+
" Value";
740 CumulativeDistribution[ik]->GetXaxis()->SetTitle(TempTitle);
741 CumulativeDistribution[ik]->GetYaxis()->SetTitle(
"Cumulative Probability");
743 CumulativeDistribution[ik]->SetLineWidth(2);
744 CumulativeDistribution[ik]->SetLineColor(CumulativeColor[ik]);
745 CumulativeDistribution[ik]->SetLineStyle(CumulativeStyle[ik]);
749 if(hpost[0]->GetMaximum() == hpost[0]->Integral()*1.5 || Skip) {
753 for (
int ik = 0 ; ik <
nFiles; ik++)
755 const int NumberOfBins = hpost[ik]->GetXaxis()->GetNbins();
756 double Cumulative = 0;
757 const double Integral = hpost[ik]->Integral();
758 for (
int j = 1; j < NumberOfBins+1; ++j)
760 Cumulative += hpost[ik]->GetBinContent(j)/Integral;
761 CumulativeDistribution[ik]->SetBinContent(j, Cumulative);
764 CumulativeDistribution[ik]->SetBinContent(NumberOfBins+1, 1.);
767 std::vector<int> TestStatBin(
nFiles, 0);
768 std::vector<double> TestStatD(
nFiles, -999);
769 std::vector<std::unique_ptr<TLine>> LineD(
nFiles);
771 for (
int ik = 1 ; ik <
nFiles; ik++)
773 const int NumberOfBins = CumulativeDistribution[0]->GetXaxis()->GetNbins();
774 for (
int j = 1; j < NumberOfBins+1; ++j)
776 const double BinValue = CumulativeDistribution[0]->GetBinCenter(j);
777 const int BinNumber = CumulativeDistribution[ik]->FindBin(BinValue);
779 double TempDstat = std::fabs(CumulativeDistribution[0]->GetBinContent(j) - CumulativeDistribution[ik]->GetBinContent(BinNumber));
780 if(TempDstat > TestStatD[ik])
782 TestStatD[ik] = TempDstat;
788 for (
int ik = 0 ; ik <
nFiles; ik++)
790 LineD[ik] = std::make_unique<TLine>(CumulativeDistribution[0]->GetBinCenter(TestStatBin[ik]), 0, CumulativeDistribution[0]->GetBinCenter(TestStatBin[ik]), CumulativeDistribution[0]->GetBinContent(TestStatBin[ik]));
791 LineD[ik]->SetLineColor(CumulativeColor[ik]);
792 LineD[ik]->SetLineWidth(2.0);
794 CumulativeDistribution[0]->Draw();
795 for (
int ik = 0 ; ik <
nFiles; ik++)
796 CumulativeDistribution[ik]->Draw(
"SAME");
798 auto leg = std::make_unique<TLegend>(0.15, 0.7, 0.5, 0.90);
799 leg->SetTextSize(0.04f);
800 for (
int ik = 0; ik <
nFiles; ik++)
801 leg->AddEntry(CumulativeDistribution[ik].get(),
TitleNames[ik].c_str(),
"l");
802 for (
int ik = 1; ik <
nFiles; ik++)
803 leg->AddEntry(LineD[ik].get(), Form(
"#Delta D = %.4f", TestStatD[ik]),
"l");
805 leg->SetLineColor(0);
806 leg->SetLineStyle(0);
807 leg->SetFillColor(0);
808 leg->SetFillStyle(0);
811 for (
int ik = 1; ik <
nFiles; ik++)
812 LineD[ik]->Draw(
"sam");
815 Posterior->Print(canvasname);
void RemoveFitter(TH1D *hist, const std::string &name)
KS: Remove fitted TF1 from hist to make comparison easier.
void SetMaCh3LoggerFormat()
Set messaging format of the logger.
void GetTrianglePlot(MCMCProcessor *Processor)
void DiagnoseCovarianceMatrix(MCMCProcessor *Processor, const std::string &inputFile)
KS: You validate stability of posterior covariance matrix, you set burn calc cov matrix increase burn...
int main(int argc, char *argv[])
TH2D * TMatrixIntoTH2D(TMatrixDSym *Matrix, const std::string &title)
KS: Convert TMatrix to TH2D, mostly useful for making fancy plots.
std::vector< std::string > TitleNames
void CalcBipolarPlot(MCMCProcessor *Processor)
void CalcParameterEvolution(MCMCProcessor *Processor)
void ProcessMCMC(const std::string &inputFile)
Main function processing MCMC and Producing plots.
void MultipleProcessMCMC()
Function producing comparison of posterior and more betwen a few MCMC chains.
std::vector< std::string > FileNames
void KolmogorovSmirnovTest(const std::vector< std::unique_ptr< MCMCProcessor >> &Processor, const std::unique_ptr< TCanvas > &Posterior, const TString &canvasname)
KS: Perform KS test to check if two posteriors for the same parameter came from the same distribution...
void CalcBayesFactor(MCMCProcessor *Processor)
KS: Calculate Bayes factor for a given hypothesis, most informative are those related to osc params....
std::map< std::string, std::pair< double, double > > GetCustomBinning(const YAML::Node &Settings)
Parse custom binning edges from a YAML configuration node.
void CalcSavageDickey(MCMCProcessor *Processor)
Type GetFromManager(const YAML::Node &node, const Type defval, const std::string File="", const int Line=1)
Get content of config file if node is not found take default value specified.
bool CheckNodeExists(const YAML::Node &node, Args... args)
KS: Wrapper function to call the recursive helper.
#define M3OpenConfig(filename)
Macro to simplify calling LoadYaml with file and line info.
Class responsible for processing MCMC chains, performing diagnostics, generating plots,...
void GetNthParameter(const int param, double &Prior, double &PriorError, TString &Title) const
Get properties of parameter by passing it number.
void Reset2DPosteriors()
Reset 2D posteriors, in case we would like to calculate in again with different BurnInCut.
void GetBayesFactor(const std::vector< std::string > &ParName, const std::vector< std::vector< double >> &Model1Bounds, const std::vector< std::vector< double >> &Model2Bounds, const std::vector< std::vector< std::string >> &ModelNames)
Calculate Bayes factor for vector of params, and model boundaries.
void MakeTrianglePlot(const std::vector< std::string > &ParNames, const std::vector< double > &CredibleIntervals={0.99, 0.90, 0.68 }, const std::vector< Color_t > &CredibleIntervalsColours={kCyan+4, kCyan-2, kCyan-10}, const std::vector< double > &CredibleRegions={0.99, 0.90, 0.68}, const std::vector< Style_t > &CredibleRegionStyle={kDashed, kSolid, kDotted}, const std::vector< Color_t > &CredibleRegionColor={kGreen-3, kGreen-10, kGreen}, const bool CredibleInSigmas=false)
Make fancy triangle plot for selected parameters.
void SetPrintToPDF(const bool PlotOrNot)
Whether to dump all plots into PDF.
Long64_t GetnSteps()
Get Number of Steps that Chain has, for merged chains will not be the same nEntries.
void GetPolarPlot(const std::vector< std::string > &ParNames)
Make funny polar plot.
void ParameterEvolution(const std::vector< std::string > &Names, const std::vector< int > &NIntervals)
Make .gif of parameter evolution.
void GetCovariance(TMatrixDSym *&Cov, TMatrixDSym *&Corr)
Get the post-fit covariances and correlations.
void SetStepCut(const std::string &Cuts)
Set the step cutting by string.
void GetSavageDickey(const std::vector< std::string > &ParName, const std::vector< double > &EvaluationPoint, const std::vector< std::vector< double >> &Bounds)
Calculate Bayes factor for point like hypothesis using SavageDickey.
Custom exception class used throughout MaCh3.
std::unique_ptr< ObjectType > Clone(const ObjectType *obj, const std::string &name="")
KS: Creates a copy of a ROOT-like object and wraps it in a smart pointer.
constexpr static const double _BAD_DOUBLE_
Default value used for double initialisation.
constexpr static const int _BAD_INT_
Default value used for int initialisation.