27 void MulticanonicalMCMCHandler::setDebugStream(std::ostream* os,
bool enabled) {
29 debugEnabled = enabled;
34 bool foundVariableOfInterest =
false;
35 bool foundDelm23 =
false;
39 MACH3LOG_INFO(
"Number of systematics: {}", systematics.size());
41 for (
size_t iCov = 0; iCov < systematics.size(); iCov++){
42 auto* syst = systematics[
static_cast<int>(iCov)];
43 for (
int i = 0; i < syst->GetNumParams(); i++) {
49 foundVariableOfInterest =
true;
51 if (syst->GetParName(i) ==
"delm2_23") {
52 MACH3LOG_INFO(
"Found delm2_23 parameter in systematic {} at index {}", syst->GetName(), i);
61 if (!foundVariableOfInterest) {
66 MACH3LOG_ERROR(
"Could not find delm2_23 parameter in osc_cov systematic");
67 throw MaCh3Exception(__FILE__, __LINE__,
"Could not find delm2_23 parameter in osc_cov systematic");
72 const auto mcmcConfig = fitMan->
raw()[
"General"][
"MCMC"];
74 multicanonicalVarName = Get<std::string>(mcmcConfig[
"Multicanonical"][
"VariableName"], __FILE__, __LINE__);
80 multicanonicalBeta = Get<double>(mcmcConfig[
"Multicanonical"][
"Beta"], __FILE__, __LINE__);
85 multicanonicalSpline = GetFromManager<bool>(mcmcConfig[
"Multicanonical"][
"Spline"][
"SplineMode"],
false, __FILE__, __LINE__);
87 const std::string biasFunctionName = GetFromManager<std::string>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaBiasFunction"],
"", __FILE__, __LINE__);
88 const bool hasBiasFunction = !biasFunctionName.empty();
92 MACH3LOG_ERROR(
"Cannot use multicanonical spline together with umbrella bias function selection.");
93 throw MaCh3Exception(__FILE__, __LINE__,
"Cannot use multicanonical spline together with umbrella bias function selection.");
98 MACH3LOG_ERROR(
"Multicanonical umbrella mode requires UmbrellaBiasFunction to be set (gaussian, vonMises, or generalisedGaussian).");
99 throw MaCh3Exception(__FILE__, __LINE__,
"Multicanonical umbrella mode requires UmbrellaBiasFunction to be set.");
103 if (hasBiasFunction) {
111 auto splineFileName = Get<std::string>(mcmcConfig[
"Multicanonical"][
"Spline"][
"SplineFile"], __FILE__, __LINE__);
112 TFile* splineFile =
M3::Open(splineFileName.c_str(),
"READ",__FILE__, __LINE__);
115 TSpline3* dcp_spline_IO_fromfile =
static_cast<TSpline3*
>(splineFile->Get(
"dcp_spline_IO"));
116 dcp_spline_IO =
static_cast<TSpline3*
>(dcp_spline_IO_fromfile->Clone(
"dcp_spline_IO"));
117 MACH3LOG_INFO(
"Using multicanonical spline from file {}", splineFileName);
121 TSpline3* dcp_spline_NO_fromfile =
static_cast<TSpline3*
>(splineFile->Get(
"dcp_spline_NO"));
122 dcp_spline_NO =
static_cast<TSpline3*
>(dcp_spline_NO_fromfile->Clone(
"dcp_spline_NO"));
123 MACH3LOG_INFO(
"Using multicanonical spline from file {}", splineFileName);
128 splineFile =
nullptr;
132 umbrellaMean = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaMean"], 0, __FILE__, __LINE__);
135 umbrellaNumber = GetFromManager<int>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaNumber"], 5, __FILE__, __LINE__);
140 umbrellaOverlapMode = GetFromManager<bool>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"AutoOverlapMode"],
false, __FILE__, __LINE__);
143 MACH3LOG_INFO(
"Setting width based on # of sigma overlapping between umbrellas");
144 umbrellaSigmaOverlap = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"SigmaOverlap"], 3.0, __FILE__, __LINE__);
149 umbrellaWidth = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaWidth"], (2 * TMath::Pi()) /
umbrellaNumber, __FILE__, __LINE__);
155 umbrellaAdjustStepScale = GetFromManager<bool>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaAdjustStepScale"],
false, __FILE__, __LINE__);
156 umbrellaStepScaleFactor = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaStepScaleFactor"], 1.0, __FILE__, __LINE__);
168 double temp_vonMises_sigma;
169 temp_vonMises_sigma = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaWidth"],
umbrellaWidth, __FILE__, __LINE__);
170 vonMises_kappa = 1.0 / (temp_vonMises_sigma * temp_vonMises_sigma);
182 MACH3LOG_INFO(
"Adjusting umbrella step scale to keep ratio of step scale to multicanonical sigma constant");
185 MACH3LOG_INFO(
"Setting individual step scale for multicanonical separate to {}", stepScale);
189 MACH3LOG_INFO(
"Not adjusting umbrella step scale, using value in OscCov config");
196 systematics[
oscCovVar]->PrintPreFitCurrPropValues();
207 systematics[
oscCovVar]->PrintPreFitCurrPropValues();
251 const double inv_sqrt_2pi = 1 / std::sqrt(2 * TMath::Pi());
261 double likelihood = normFactor * std::exp(-std::pow((std::pow(x - mean, 2) / (2 * std::pow(width, 2))), n));
266 return std::atan2(std::sin(x - mean), std::cos(x - mean));
283 constexpr
double inv_sqrt_2pi = 0.3989422804014337;
285 const double neg_half_sigma_sq = -1 / (2 * sigma * sigma);
287 double exp1 = std::exp(neg_half_sigma_sq * (deltacp - TMath::Pi()) * (deltacp - TMath::Pi()));
288 double exp2 = std::exp(neg_half_sigma_sq * (deltacp) * (deltacp));
289 double exp3 = std::exp(neg_half_sigma_sq * (deltacp + TMath::Pi()) * (deltacp + TMath::Pi()));
294 return -std::log(inv_sqrt_2pi * (1 / sigma) * (exp1 + exp2 + exp3)) * (
multicanonicalBeta);
Custom exception class used throughout MaCh3.
The manager class is responsible for managing configurations and settings.
YAML::Node const & raw() const
Return config.
double vonMises_I0_kappa
Cached I0(kappa) value for the von Mises form.
double umbrellaSigmaOverlap
Requested overlap for evenly spaced umbrellas.
void InitializeMulticanonicalParams(std::vector< ParameterHandlerBase * > &systematics)
Initialise the starting values used by the multicanonical parameter handling.
void InitializeMulticanonicalHandlerConfig(Manager *fitMan, std::vector< ParameterHandlerBase * > &systematics)
Read multicanonical configuration from the yaml via manager and initialise handler state.
double GetMulticanonicalWeightGenGaussian(double deltacp) const
Compute a generalised-Gaussian multicanonical penalty.
double umbrellaWidth
Umbrella width used for the current configuration.
TSpline3 * dcp_spline_IO
Spline for the IO branch, if spline mode is enabled.
void AdjustUmbrellaStepScale(const std::vector< ParameterHandlerBase * > &systematics)
Adjust the parameter-of-interest's step scale according to the width of the umbrella bias function.
int multicanonicalVar_dm23
Parameter index used for the multicanonical delm2_23 weight.
M3::BiasFunction umbrellaBiasFunction
Selected bias function for multicanonical weights.
TSpline3 * dcp_spline_NO
Spline for the NO branch, if spline mode is enabled.
std::string multicanonicalVarName
Parameter name used for the multicanonical weight, most often delta_cp.
double GetMulticanonicalWeight() const
Compute the multicanonical penalty for the configured bias mode.
bool multicanonicalSpline
Toggle for spline-based multicanonical weights.
double GetMulticanonicalWeightVonMises(double deltacp) const
Compute a von Mises multicanonical penalty.
bool umbrellaOverlapMode
Toggle for deriving umbrella widths from a desired # of sigma overlaps between umbrellas.
void FindOscCovParams(const std::vector< ParameterHandlerBase * > &systematics)
Locate the systematic object which contains the parameters used by the handler. Stores the parameter ...
double vonMises_kappa
Von Mises kappa parameter. Analogue of sigma for a gaussian.
double circularDistance(double x, double mean) const
Compute the circular distance between two angles.
bool flipWindow
Optional flip-window control.
MulticanonicalMCMCHandler()
Constructor.
std::string umbrellaBiasFunctionName
Configured bias function name for logging.
const M3::float_t * multicanonicalVarValue
Pointer to value of parameter vale used for multicanonical weight, most often delta_cp.
double generalisedGaussian2(double x, double mean, double width) const
Wraps the generalised gaussian function for a given x, mean, and width. Required to handle the wrappi...
double umbrellaMean
Umbrella centre used for the current configuration.
double GetMulticanonicalWeightGaussian(double deltacp) const
Compute a Gaussian multicanonical penalty.
const M3::float_t * multicanonicalVar_dm23_value
Pointer to value of delm2_23 weight used for multicanonical weight.
virtual ~MulticanonicalMCMCHandler()
Destructor.
double GetMulticanonicalWeightTripleGaussian(double deltacp) const
Compute a triple-Gaussian multicanonical penalty.
double umbrellaStepScaleFactor
Additional scale factor applied when rescaling the step size. This is for fine tuning.
double GetMulticanonicalWeightSpline(double deltacp, double delm23) const
Compute the multicanonical penalty using a spline.
int oscCovVar
Index of the oscillation-covariance systematic in the current fit.
int multicanonicalVar
Parameter index used for the multicanonical weight, most often delta_cp.
int umbrellaNumber
Number of total umbrellas used for the current configuration.
bool umbrellaAdjustStepScale
Toggle for rescaling the step size based on the umbrella width.
double multicanonicalBeta
Global scale factor applied to the multicanonical penalty. 1 is full strength, 0 is no penalty.
M3::BiasFunction ParseBiasFunction(const std::string &biasFunctionName)
constexpr static const double _BAD_DOUBLE_
Default value used for double initialisation.
TFile * Open(const std::string &Name, const std::string &Type, const std::string &File, const int Line)
Opens a ROOT file with the given name and mode.
constexpr double UmbrellaGaussianNormFactor
@ kGaussian
Assumes gaussian prior.