12 if (biasFunctionName ==
"gaussian") {
15 if (biasFunctionName ==
"vonMises") {
18 if (biasFunctionName ==
"generalisedGaussian") {
22 throw MaCh3Exception(__FILE__, __LINE__,
"Unknown multicanonical bias function: " + biasFunctionName);
56 void MulticanonicalMCMCHandler::setDebugStream(std::ostream* os,
bool enabled) {
58 debugEnabled = enabled;
64 bool foundDeltaCP =
false;
65 bool foundDelm23 =
false;
68 MACH3LOG_INFO(
"Looping over systematics to find delta_cp parameter");
69 MACH3LOG_INFO(
"Number of systematics: {}", systematics.size());
71 for (
size_t iCov = 0; iCov < systematics.size(); iCov++){
72 auto* syst = systematics[
static_cast<int>(iCov)];
73 for (
int i = 0; i < syst->GetNumParams(); i++) {
74 if (syst->GetParName(i) ==
"delta_cp") {
75 MACH3LOG_INFO(
"Found delta_cp parameter in systematic {} at index {}", syst->GetName(), i);
80 if (syst->GetParName(i) ==
"delm2_23") {
81 MACH3LOG_INFO(
"Found delm2_23 parameter in systematic {} at index {}", syst->GetName(), i);
90 MACH3LOG_ERROR(
"Could not find delta_cp parameter in osc_cov systematic");
91 throw MaCh3Exception(__FILE__, __LINE__,
"Could not find delta_cp parameter in osc_cov systematic");
94 MACH3LOG_ERROR(
"Could not find delm2_23 parameter in osc_cov systematic");
95 throw MaCh3Exception(__FILE__, __LINE__,
"Could not find delm2_23 parameter in osc_cov systematic");
103 const auto mcmcConfig = fitMan->
raw()[
"General"][
"MCMC"];
112 multicanonicalSpline = GetFromManager<bool>(mcmcConfig[
"Multicanonical"][
"Spline"][
"SplineMode"],
false);
114 const std::string biasFunctionName = GetFromManager<std::string>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaBiasFunction"],
"");
115 const bool hasBiasFunction = !biasFunctionName.empty();
119 MACH3LOG_ERROR(
"Cannot use multicanonical spline together with umbrella bias function selection.");
120 throw MaCh3Exception(__FILE__, __LINE__,
"Cannot use multicanonical spline together with umbrella bias function selection.");
125 MACH3LOG_ERROR(
"Multicanonical umbrella mode requires UmbrellaBiasFunction to be set (gaussian, vonMises, or generalisedGaussian).");
126 throw MaCh3Exception(__FILE__, __LINE__,
"Multicanonical umbrella mode requires UmbrellaBiasFunction to be set.");
130 if (hasBiasFunction) {
139 std::string splineFileName = GetFromManager<std::string>(mcmcConfig[
"Multicanonical"][
"Spline"][
"SplineFile"],
"nofile");
141 TFile* splineFile =
M3::Open(splineFileName.c_str(),
"READ",__FILE__, __LINE__);
144 TSpline3* dcp_spline_IO_fromfile =
static_cast<TSpline3*
>(splineFile->Get(
"dcp_spline_IO"));
145 dcp_spline_IO =
static_cast<TSpline3*
>(dcp_spline_IO_fromfile->Clone(
"dcp_spline_IO"));
146 MACH3LOG_INFO(
"Using multicanonical spline from file {}", splineFileName);
150 TSpline3* dcp_spline_NO_fromfile =
static_cast<TSpline3*
>(splineFile->Get(
"dcp_spline_NO"));
151 dcp_spline_NO =
static_cast<TSpline3*
>(dcp_spline_NO_fromfile->Clone(
"dcp_spline_NO"));
152 MACH3LOG_INFO(
"Using multicanonical spline from file {}", splineFileName);
157 splineFile =
nullptr;
162 umbrellaMean = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaMean"], 0);
165 umbrellaNumber = GetFromManager<int>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaNumber"], 5);
170 umbrellaOverlapMode = GetFromManager<bool>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"AutoOverlapMode"],
false);
173 MACH3LOG_INFO(
"Setting width based on # of sigma overlapping between umbrellas");
174 umbrellaSigmaOverlap = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"SigmaOverlap"], 3.0);
179 umbrellaWidth = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaWidth"], (2 * TMath::Pi()) /
umbrellaNumber);
185 umbrellaAdjustStepScale = GetFromManager<bool>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaAdjustStepScale"],
false);
186 umbrellaStepScaleFactor = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaStepScaleFactor"], 1.0);
198 double temp_vonMises_sigma;
199 temp_vonMises_sigma = GetFromManager<double>(mcmcConfig[
"Multicanonical"][
"Umbrella"][
"UmbrellaWidth"],
umbrellaWidth);
200 vonMises_kappa = 1.0 / (temp_vonMises_sigma * temp_vonMises_sigma);
212 MACH3LOG_INFO(
"Adjusting umbrella step scale to keep ratio of step scale to multicanonical sigma constant");
215 MACH3LOG_INFO(
"Setting individual step scale for multicanonical separate to {}", stepScale);
219 MACH3LOG_INFO(
"Not adjusting umbrella step scale, using value in OscCov config");
226 systematics[
oscCovVar]->PrintPreFitCurrPropValues();
237 systematics[
oscCovVar]->PrintPreFitCurrPropValues();
269 double dcp_spline_val;
284 const double inv_sqrt_2pi = 1 / std::sqrt(2 * TMath::Pi());
293 const double normFactor = 1 / ((0.906402477055) * 2 * std::sqrt(2) * width);
294 double likelihood = normFactor * std::exp(-std::pow((std::pow(x - mean, 2) / (2 * std::pow(width, 2))), n));
307 if (debugStream && debugEnabled) (*debugStream) <<
" g0: " << g0 <<
" g1: " << g1 <<
" g2: " << g2 << std::endl;
314 constexpr
double inv_sqrt_2pi = 0.3989422804014337;
316 const double neg_half_sigma_sq = -1 / (2 * sigma * sigma);
318 double exp1 = std::exp(neg_half_sigma_sq * (deltacp - TMath::Pi()) * (deltacp - TMath::Pi()));
319 double exp2 = std::exp(neg_half_sigma_sq * (deltacp) * (deltacp));
320 double exp3 = std::exp(neg_half_sigma_sq * (deltacp + TMath::Pi()) * (deltacp + TMath::Pi()));
325 return -std::log(inv_sqrt_2pi * (1 / sigma) * (exp1 + exp2 + exp3)) * (
multicanonicalBeta);
M3::BiasFunction ParseBiasFunction(const std::string &biasFunctionName)
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 delm23_value
delm2_23 value used during proposal evaluation.
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.
double GetMulticanonicalWeightVonMises(double deltacp)
Compute a von Mises multicanonical penalty.
TSpline3 * dcp_spline_NO
Spline for the NO branch, if spline mode is enabled.
bool multicanonicalSpline
Toggle for spline-based multicanonical weights.
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.
bool flipWindow
Optional flip-window control.
double delta_cp_value
delta_cp value used during proposal evaluation.
MulticanonicalMCMCHandler()
Constructor.
double GetMulticanonicalWeight(double deltacp, double delm23_value)
Compute the multicanonical penalty for the configured bias mode.
std::string umbrellaBiasFunctionName
Configured bias function name for logging.
double GetMulticanonicalWeightSpline(double deltacp, double delm23_value)
Compute the multicanonical penalty using a spline.
double umbrellaMean
Umbrella centre used for the current configuration.
virtual ~MulticanonicalMCMCHandler()
Destructor.
double GetMulticanonicalWeightTripleGaussian(double deltacp)
Compute a triple-Gaussian multicanonical penalty.
double umbrellaStepScaleFactor
Additional scale factor applied when rescaling the step size. This is for fine tuning.
int oscCovVar
Index of the oscillation-covariance systematic in the current fit.
int multicanonicalVar
Parameter index used for the multicanonical delta_cp weight.
int umbrellaNumber
Number of total umbrellas used for the current configuration.
double generalisedGaussian2(double x, double mean, double width)
Wraps the generalised gaussian function for a given x, mean, and width. Required to handle the wrappi...
double GetMulticanonicalWeightGenGaussian(double deltacp)
Compute a generalised-Gaussian multicanonical penalty.
bool umbrellaAdjustStepScale
Toggle for rescaling the step size based on the umbrella width.
double GetMulticanonicalWeightGaussian(double deltacp)
Compute a Gaussian multicanonical penalty.
double multicanonicalBeta
Global scale factor applied to the multicanonical penalty. 1 is full strength, 0 is no penalty.
double circularDistance(double x, double mean)
Compute the circular distance between two angles.
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.
@ kGaussian
Assumes gaussian prior.