MaCh3  2.8.0
Reference Guide
Public Member Functions | Public Attributes | Protected Attributes | List of all members
MulticanonicalMCMCHandler Class Reference

Helper class for configuring and evaluating multicanonical umbrella weights. More...

#include <Fitters/Algorithms/MulticanonicalMCMCHandler.h>

Collaboration diagram for MulticanonicalMCMCHandler:
[legend]

Public Member Functions

 MulticanonicalMCMCHandler ()
 Constructor. More...
 
virtual ~MulticanonicalMCMCHandler ()
 Destructor. More...
 
void FindOscCovParams (const std::vector< ParameterHandlerBase * > &systematics)
 Locate the systematic object which contains the parameters used by the handler. Stores the parameter indices. More...
 
void AdjustUmbrellaStepScale (const std::vector< ParameterHandlerBase * > &systematics)
 Adjust the parameter-of-interest's step scale according to the width of the umbrella bias function. More...
 
void InitializeMulticanonicalHandlerConfig (Manager *fitMan, std::vector< ParameterHandlerBase * > &systematics)
 Read multicanonical configuration from the yaml via manager and initialise handler state. More...
 
void InitializeMulticanonicalParams (std::vector< ParameterHandlerBase * > &systematics)
 Initialise the starting values used by the multicanonical parameter handling. More...
 
double GetMulticanonicalWeight () const
 Compute the multicanonical penalty for the configured bias mode. More...
 
double GetMulticanonicalWeightSpline (double deltacp, double delm23) const
 Compute the multicanonical penalty using a spline. More...
 
double GetMulticanonicalWeightGaussian (double deltacp) const
 Compute a Gaussian multicanonical penalty. More...
 
double GetMulticanonicalWeightTripleGaussian (double deltacp) const
 Compute a triple-Gaussian multicanonical penalty. More...
 
double GetMulticanonicalWeightVonMises (double deltacp) const
 Compute a von Mises multicanonical penalty. More...
 
double GetMulticanonicalWeightGenGaussian (double deltacp) const
 Compute a generalised-Gaussian multicanonical penalty. More...
 
double circularDistance (double x, double mean) const
 Compute the circular distance between two angles. More...
 
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 wrapping of the parameter space at 2pi. More...
 

Public Attributes

int oscCovVar
 Index of the oscillation-covariance systematic in the current fit. More...
 
std::string multicanonicalVarName
 Parameter name used for the multicanonical weight, most often delta_cp. More...
 
int multicanonicalVar
 Parameter index used for the multicanonical weight, most often delta_cp. More...
 
int multicanonicalVar_dm23
 Parameter index used for the multicanonical delm2_23 weight. More...
 
const M3::float_t * multicanonicalVarValue
 Pointer to value of parameter vale used for multicanonical weight, most often delta_cp. More...
 
const M3::float_t * multicanonicalVar_dm23_value
 Pointer to value of delm2_23 weight used for multicanonical weight. More...
 
M3::BiasFunction umbrellaBiasFunction
 Selected bias function for multicanonical weights. More...
 
std::string umbrellaBiasFunctionName
 Configured bias function name for logging. More...
 
bool multicanonicalSpline
 Toggle for spline-based multicanonical weights. More...
 

Protected Attributes

double multicanonicalBeta
 Global scale factor applied to the multicanonical penalty. 1 is full strength, 0 is no penalty. More...
 
TSpline3 * dcp_spline_IO
 Spline for the IO branch, if spline mode is enabled. More...
 
TSpline3 * dcp_spline_NO
 Spline for the NO branch, if spline mode is enabled. More...
 
double umbrellaMean
 Umbrella centre used for the current configuration. More...
 
double umbrellaWidth
 Umbrella width used for the current configuration. More...
 
int umbrellaNumber
 Number of total umbrellas used for the current configuration. More...
 
bool umbrellaOverlapMode
 Toggle for deriving umbrella widths from a desired # of sigma overlaps between umbrellas. More...
 
double umbrellaSigmaOverlap
 Requested overlap for evenly spaced umbrellas. More...
 
bool umbrellaAdjustStepScale
 Toggle for rescaling the step size based on the umbrella width. More...
 
double umbrellaStepScaleFactor
 Additional scale factor applied when rescaling the step size. This is for fine tuning. More...
 
bool flipWindow
 Optional flip-window control. More...
 
double vonMises_kappa
 Von Mises kappa parameter. Analogue of sigma for a gaussian. More...
 
double vonMises_I0_kappa
 Cached I0(kappa) value for the von Mises form. More...
 

Detailed Description

Helper class for configuring and evaluating multicanonical umbrella weights.

this method is used to bias the MCMC sampling of chains to particular regions of the parameter space The method relies on a bias function defined via a yaml configuration file in experimental specific code With a bias function defined chains run as normal and are combined after the fact using the information stored in the chains saved yaml configuration file.

[29]

Author
David Riley

The method is visualised below:

/// ///

Definition at line 72 of file MulticanonicalMCMCHandler.h.

Constructor & Destructor Documentation

◆ MulticanonicalMCMCHandler()

MulticanonicalMCMCHandler::MulticanonicalMCMCHandler ( )

Constructor.

Definition at line 11 of file MulticanonicalMCMCHandler.cpp.

11  {
12  // Initialize member variables with defaults
13  dcp_spline_IO = nullptr;
14  dcp_spline_NO = nullptr;
15  flipWindow = false;
16 
17  vonMises_kappa = -1.0;
18  vonMises_I0_kappa = -1.0;
19 }
double vonMises_I0_kappa
Cached I0(kappa) value for the von Mises form.
TSpline3 * dcp_spline_IO
Spline for the IO branch, if spline mode is enabled.
TSpline3 * dcp_spline_NO
Spline for the NO branch, if spline mode is enabled.
double vonMises_kappa
Von Mises kappa parameter. Analogue of sigma for a gaussian.
bool flipWindow
Optional flip-window control.

◆ ~MulticanonicalMCMCHandler()

MulticanonicalMCMCHandler::~MulticanonicalMCMCHandler ( )
virtual

Destructor.

Definition at line 22 of file MulticanonicalMCMCHandler.cpp.

22  {
23 
24 }

Member Function Documentation

◆ AdjustUmbrellaStepScale()

void MulticanonicalMCMCHandler::AdjustUmbrellaStepScale ( const std::vector< ParameterHandlerBase * > &  systematics)

Adjust the parameter-of-interest's step scale according to the width of the umbrella bias function.

This is used to adjust the step scale of the parameter to keep the size of the step scale relative to the new biased space the chain sees the same. Current assumes that your are sampling delta cp (ie circular on 2pi)

Todo:
grab the step scale from the object directly and update based on the radtio to the umbrella width, removing assumption that its dcp

Definition at line 180 of file MulticanonicalMCMCHandler.cpp.

180  {
182  MACH3LOG_INFO("Adjusting umbrella step scale to keep ratio of step scale to multicanonical sigma constant");
183  MACH3LOG_INFO("Setting umbrella step scale factor to {}", umbrellaStepScaleFactor);
184  double stepScale = (umbrellaWidth * umbrellaStepScaleFactor) / (2.0 * TMath::Pi());
185  MACH3LOG_INFO("Setting individual step scale for multicanonical separate to {}", stepScale);
186  systematics[oscCovVar]->SetIndivStepScale(multicanonicalVar, stepScale);
187  MACH3LOG_INFO("Setting individual step scale for {} systematic to {}", multicanonicalVar, stepScale);
188  } else {
189  MACH3LOG_INFO("Not adjusting umbrella step scale, using value in OscCov config");
190  }
191 }
#define MACH3LOG_INFO
Definition: MaCh3Logger.h:35
double umbrellaWidth
Umbrella width used for the current configuration.
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 weight, most often delta_cp.
bool umbrellaAdjustStepScale
Toggle for rescaling the step size based on the umbrella width.

◆ circularDistance()

double MulticanonicalMCMCHandler::circularDistance ( double  x,
double  mean 
) const

Compute the circular distance between two angles.

This is used to calculate the distance between two angles in a circular space, such as delta_cp. It returns the shortest distance between the two angles, taking into account the wrapping at 2pi.

Definition at line 265 of file MulticanonicalMCMCHandler.cpp.

265  {
266  return std::atan2(std::sin(x - mean), std::cos(x - mean));
267 }

◆ FindOscCovParams()

void MulticanonicalMCMCHandler::FindOscCovParams ( const std::vector< ParameterHandlerBase * > &  systematics)

Locate the systematic object which contains the parameters used by the handler. Stores the parameter indices.

Definition at line 33 of file MulticanonicalMCMCHandler.cpp.

33  {
34  bool foundVariableOfInterest = false;
35  bool foundDelm23 = false;
36 
37  // Loop over the systematics and find the osc_cov systematic and the delta_cp parameter number
38  MACH3LOG_INFO("Looping over systematics to find {} parameter", multicanonicalVarName);
39  MACH3LOG_INFO("Number of systematics: {}", systematics.size());
40 
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++) {
44  if (syst->GetParName(i) == multicanonicalVarName) {
45  MACH3LOG_INFO("Found {} parameter in systematic {} at index {}", multicanonicalVarName, syst->GetName(), i);
46  oscCovVar = static_cast<int>(iCov);
48  multicanonicalVarValue = syst->RetPointer(i);
49  foundVariableOfInterest = true;
50  }
51  if (syst->GetParName(i) == "delm2_23") {
52  MACH3LOG_INFO("Found delm2_23 parameter in systematic {} at index {}", syst->GetName(), i);
54  multicanonicalVar_dm23_value = syst->RetPointer(i);
55  foundDelm23 = true;
56  }
57  }
58  }
59 
60  // if we didn't find both parameters we need to throw
61  if (!foundVariableOfInterest) {
62  MACH3LOG_ERROR("Could not find {} parameter in osc_cov systematic", multicanonicalVarName);
63  throw MaCh3Exception(__FILE__, __LINE__);
64  }
65  if (!foundDelm23) {
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");
68  }
69 }
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:37
Custom exception class used throughout MaCh3.
int multicanonicalVar_dm23
Parameter index used for the multicanonical delm2_23 weight.
std::string multicanonicalVarName
Parameter name used for the multicanonical weight, most often delta_cp.
const M3::float_t * multicanonicalVarValue
Pointer to value of parameter vale used for multicanonical weight, most often delta_cp.
const M3::float_t * multicanonicalVar_dm23_value
Pointer to value of delm2_23 weight used for multicanonical weight.

◆ generalisedGaussian2()

double MulticanonicalMCMCHandler::generalisedGaussian2 ( double  x,
double  mean,
double  width 
) const

Wraps the generalised gaussian function for a given x, mean, and width. Required to handle the wrapping of the parameter space at 2pi.

Definition at line 257 of file MulticanonicalMCMCHandler.cpp.

257  {
258  constexpr int n = 2; // this controls the tightness of the gaussian fixed at 2 for now due to normalisation
259  // 1/4 * Gamma(1/4) = 0.906402477055 (this factor from 2n/Gamma(1/2n) for n=2)
260  const double normFactor = 1 / ((M3::UmbrellaGaussianNormFactor) * 2 * std::sqrt(2) * width); // the normalisation is a little ugly (uses gamma functions), im just going to hardcode them for now
261  double likelihood = normFactor * std::exp(-std::pow((std::pow(x - mean, 2) / (2 * std::pow(width, 2))), n));
262  return likelihood;
263 }
constexpr double UmbrellaGaussianNormFactor

◆ GetMulticanonicalWeight()

double MulticanonicalMCMCHandler::GetMulticanonicalWeight ( ) const

Compute the multicanonical penalty for the configured bias mode.

This wraps the various bias function implementations and returns the appropriate penalty

Returns
Returns the log likelihood penalty for the selected bias function at the proposed parameter values.

Definition at line 221 of file MulticanonicalMCMCHandler.cpp.

221  {
222  auto deltacp = *multicanonicalVarValue;
223 
224  if (multicanonicalSpline) {
225  auto delm23 = *multicanonicalVar_dm23_value;
226  return GetMulticanonicalWeightSpline(deltacp, delm23);
227  }
228 
229  switch (umbrellaBiasFunction) {
231  return GetMulticanonicalWeightGaussian(deltacp);
233  return GetMulticanonicalWeightVonMises(deltacp);
235  return GetMulticanonicalWeightGenGaussian(deltacp);
236  }
237  return M3::_BAD_DOUBLE_;
238 }
double GetMulticanonicalWeightGenGaussian(double deltacp) const
Compute a generalised-Gaussian multicanonical penalty.
M3::BiasFunction umbrellaBiasFunction
Selected bias function for multicanonical weights.
bool multicanonicalSpline
Toggle for spline-based multicanonical weights.
double GetMulticanonicalWeightVonMises(double deltacp) const
Compute a von Mises multicanonical penalty.
double GetMulticanonicalWeightGaussian(double deltacp) const
Compute a Gaussian multicanonical penalty.
double GetMulticanonicalWeightSpline(double deltacp, double delm23) const
Compute the multicanonical penalty using a spline.
constexpr static const double _BAD_DOUBLE_
Default value used for double initialisation.
Definition: Core.h:53
@ kGaussian
Assumes gaussian prior.

◆ GetMulticanonicalWeightGaussian()

double MulticanonicalMCMCHandler::GetMulticanonicalWeightGaussian ( double  deltacp) const

Compute a Gaussian multicanonical penalty.

Definition at line 250 of file MulticanonicalMCMCHandler.cpp.

250  {
251  const double inv_sqrt_2pi = 1 / std::sqrt(2 * TMath::Pi());
252  const double neg_half_sigma_sq = -1 / (2 * umbrellaWidth * umbrellaWidth);
253  // return the log likelihood, ie the log of the normalised gaussian
254  return (-std::log(inv_sqrt_2pi * (1 / umbrellaWidth) * std::exp(neg_half_sigma_sq * (deltacp - umbrellaMean) * (deltacp - umbrellaMean)))) * (multicanonicalBeta);
255 }
double umbrellaMean
Umbrella centre used for the current configuration.
double multicanonicalBeta
Global scale factor applied to the multicanonical penalty. 1 is full strength, 0 is no penalty.

◆ GetMulticanonicalWeightGenGaussian()

double MulticanonicalMCMCHandler::GetMulticanonicalWeightGenGaussian ( double  deltacp) const

Compute a generalised-Gaussian multicanonical penalty.

the generalised gaussian is like a gaussian with an extra factor of n on the exponent of the gaussian. This allows for a stronger constraint in the tails of the distribution, more like a tophat function. The normalisation is a little ugly and uses gamma functions, so for now it is hardcoded to n=2. This is the current recommended configuration for umbrella sampling.

Todo:

implement the wrapping with circular distance function to avoid the need to calculate the weight multiple times for each parameter to ensure it receives a bias even when it jumps the boundary

implement the normalisation for n != 2, and allow n to be set in the yaml configuration file

Definition at line 269 of file MulticanonicalMCMCHandler.cpp.

269  {
270  // implementation of the generalised gaussian as a bias function
271  // for now with a fixed n = 2 for simplicity
272  double g0 = generalisedGaussian2(deltacp, umbrellaMean, umbrellaWidth); // these two repeats are required for wrapping the gaussian around -pi and pi
273  double g1 = generalisedGaussian2(deltacp, umbrellaMean - 2 * TMath::Pi(), umbrellaWidth);
274  double g2 = generalisedGaussian2(deltacp, umbrellaMean + 2 * TMath::Pi(), umbrellaWidth);
275 
276  MACH3LOG_TRACE("g0: {}, g1: {}, g2: {}", g0, g1, g2);
277  return -std::log(g0 + g1 + g2) * (multicanonicalBeta);
278 }
#define MACH3LOG_TRACE
Definition: MaCh3Logger.h:33
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...

◆ GetMulticanonicalWeightSpline()

double MulticanonicalMCMCHandler::GetMulticanonicalWeightSpline ( double  deltacp,
double  delm23 
) const

Compute the multicanonical penalty using a spline.

Definition at line 240 of file MulticanonicalMCMCHandler.cpp.

240  {
241  if (delm23 < 0) {
242  double dcp_spline_val = dcp_spline_IO->Eval(deltacp);
243  return -(-std::log(dcp_spline_val) + std::log(dcp_spline_IO->Eval(-TMath::Pi() / 2))) * (multicanonicalBeta); // do I want this offset?? does it matter?
244  } else {
245  double dcp_spline_val = dcp_spline_NO->Eval(deltacp);
246  return -(-std::log(dcp_spline_val) + std::log(dcp_spline_NO->Eval(-TMath::Pi() / 2))) * (multicanonicalBeta);
247  }
248 }

◆ GetMulticanonicalWeightTripleGaussian()

double MulticanonicalMCMCHandler::GetMulticanonicalWeightTripleGaussian ( double  deltacp) const

Compute a triple-Gaussian multicanonical penalty.

This was mostly for testing the first implementation, probably not used anymore.

delta_cp_log_likelihood = -TMath::Log(TMath::Gaus(deltacp,TMath::Pi(),1,kTRUE)+TMath::Gaus(deltacp,0,1,kTRUE)+TMath::Gaus(deltacp,-TMath::Pi(),1,kTRUE));

Definition at line 281 of file MulticanonicalMCMCHandler.cpp.

281  {
282  // precalculated constants
283  constexpr double inv_sqrt_2pi = 0.3989422804014337;
284  double sigma = umbrellaWidth;
285  const double neg_half_sigma_sq = -1 / (2 * sigma * sigma);
286  // three gaussians centered at -pi, 0, pi with sigma pre-defined above
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()));
291 
292  // return the log likelihood, ie the log of the normalised sum of the
293  // gaussians
294  return -std::log(inv_sqrt_2pi * (1 / sigma) * (exp1 + exp2 + exp3)) * (multicanonicalBeta);
295 }

◆ GetMulticanonicalWeightVonMises()

double MulticanonicalMCMCHandler::GetMulticanonicalWeightVonMises ( double  deltacp) const

Compute a von Mises multicanonical penalty.

This is the circular analogue of a gaussian, meaning it handles the wrapping of the parameter space at 2pi automatically this avoids the need to calculate the weight multiple times for each parameter to ensure it receives a bias even when it jumps the boundary the normalisation grows extremely quickly, widths of less that 0.05 should not be used until properly tested.

Definition at line 212 of file MulticanonicalMCMCHandler.cpp.

212  {
213  // calculate the Log form of the von Mises instead to avoid numerical issues
214  // and return directly
215  double log_vonMises = vonMises_kappa * std::cos(deltacp - umbrellaMean) - std::log(2 * TMath::Pi() * vonMises_I0_kappa);
216  // return the log likelihood, ie the log of the normalised von Mises
217  return -log_vonMises * (multicanonicalBeta);
218 }

◆ InitializeMulticanonicalHandlerConfig()

void MulticanonicalMCMCHandler::InitializeMulticanonicalHandlerConfig ( Manager *  fitMan,
std::vector< ParameterHandlerBase * > &  systematics 
)

Read multicanonical configuration from the yaml via manager and initialise handler state.

Todo:
DR: I realised this will fail if you set spline to true but don't

Definition at line 71 of file MulticanonicalMCMCHandler.cpp.

71  {
72  const auto mcmcConfig = fitMan->raw()["General"]["MCMC"];
73  // need to find param name before calling FindOscCovParams
74  multicanonicalVarName = Get<std::string>(mcmcConfig["Multicanonical"]["VariableName"], __FILE__, __LINE__);
75  // Set pointers to relevant parameters
76  FindOscCovParams(systematics);
77 
78  // Get the multicanonical beta value from the configuration file
79  // This acts as a global bias strength factor
80  multicanonicalBeta = Get<double>(mcmcConfig["Multicanonical"]["Beta"], __FILE__, __LINE__);
81  MACH3LOG_INFO("Setting multicanonical beta to {}", multicanonicalBeta);
82 
84  // delete the umbrella section, thats not ideal
85  multicanonicalSpline = GetFromManager<bool>(mcmcConfig["Multicanonical"]["Spline"]["SplineMode"], false, __FILE__, __LINE__);
86 
87  const std::string biasFunctionName = GetFromManager<std::string>(mcmcConfig["Multicanonical"]["Umbrella"]["UmbrellaBiasFunction"], "", __FILE__, __LINE__);
88  const bool hasBiasFunction = !biasFunctionName.empty();
89 
90  // Spline and umbrella modes are mutually exclusive
91  if (multicanonicalSpline && hasBiasFunction) {
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.");
94  }
95 
96  // Umbrella mode requires an explicit bias function selection
97  if (!multicanonicalSpline && !hasBiasFunction) {
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.");
100  }
101 
102  // Parse and set the umbrella bias function enum
103  if (hasBiasFunction) {
104  umbrellaBiasFunction = M3::ParseBiasFunction(biasFunctionName);
105  umbrellaBiasFunctionName = biasFunctionName;
106  MACH3LOG_INFO("Using umbrella bias function {}", umbrellaBiasFunctionName);
107  }
108 
109  // setup for spline bias mode
110  if (multicanonicalSpline) {
111  auto splineFileName = Get<std::string>(mcmcConfig["Multicanonical"]["Spline"]["SplineFile"], __FILE__, __LINE__);
112  TFile* splineFile = M3::Open(splineFileName.c_str(), "READ",__FILE__, __LINE__);
113 
114  // grab the splines and do a quick check that they are evaluatable
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);
118  dcp_spline_IO->Eval(0.0); // check that the spline is valid
119  MACH3LOG_INFO("Spline evaluated at 0.0 gives value: {}", dcp_spline_IO->Eval(0.0));
120 
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);
124  dcp_spline_NO->Eval(0.0); // check that the spline is valid
125  MACH3LOG_INFO("Spline evaluated at 0.0 gives value {}", dcp_spline_NO->Eval(0.0));
126 
127  splineFile->Close();
128  splineFile = nullptr;
129  } else {
130  // Umbrella mode with explicit bias function selection
131  MACH3LOG_INFO("Using umbrella multicanonical method with bias function {}", umbrellaBiasFunctionName);
132  umbrellaMean = GetFromManager<double>(mcmcConfig["Multicanonical"]["Umbrella"]["UmbrellaMean"], 0, __FILE__, __LINE__);
133  MACH3LOG_INFO("Setting multicanonical mean to {}", umbrellaMean);
134 
135  umbrellaNumber = GetFromManager<int>(mcmcConfig["Multicanonical"]["Umbrella"]["UmbrellaNumber"], 5, __FILE__, __LINE__);
136 
137  // dynamically adjust the width of the gaussians to ensure a certain level
138  // of overlap? be careful, not enough windows here will lead to posterior
139  // (rather than bias) dominated results
140  umbrellaOverlapMode = GetFromManager<bool>(mcmcConfig["Multicanonical"]["Umbrella"]["AutoOverlapMode"], false, __FILE__, __LINE__);
141 
142  if (umbrellaOverlapMode) {
143  MACH3LOG_INFO("Setting width based on # of sigma overlapping between umbrellas");
144  umbrellaSigmaOverlap = GetFromManager<double>(mcmcConfig["Multicanonical"]["Umbrella"]["SigmaOverlap"], 3.0, __FILE__, __LINE__);
145  MACH3LOG_INFO("Setting umbrella number to {}", umbrellaNumber);
146  umbrellaWidth = TMath::Pi() / ((umbrellaNumber - 1) * (umbrellaSigmaOverlap));
147  } else {
148  // just grab the width directly from the config
149  umbrellaWidth = GetFromManager<double>(mcmcConfig["Multicanonical"]["Umbrella"]["UmbrellaWidth"], (2 * TMath::Pi()) / umbrellaNumber, __FILE__, __LINE__);
150  MACH3LOG_INFO("Setting width based on value in config {}", umbrellaWidth);
151  }
152 
153  // set individual step scale for dcp, so that the ratio of the step scale to
154  // the multicanonical sigma is stepscale/1sigmaerror = 1/2pi
155  umbrellaAdjustStepScale = GetFromManager<bool>(mcmcConfig["Multicanonical"]["Umbrella"]["UmbrellaAdjustStepScale"], false, __FILE__, __LINE__);
156  umbrellaStepScaleFactor = GetFromManager<double>(mcmcConfig["Multicanonical"]["Umbrella"]["UmbrellaStepScaleFactor"], 1.0, __FILE__, __LINE__);
157 
158  AdjustUmbrellaStepScale(systematics);
159 
160  // Set the flip window flag for the oscillation systematic DO NOT USE THIS
161  // flipWindow =
162  // GetFromManager<bool>(mcmcConfig["Multicanonical"]["Umbrella"]["FlipWindow"],
163  // false, __FILE__, __LINE__); MACH3LOG_INFO("Flip Window: {}", flipWindow);
164  }
165 
166  // initialize von Mises parameters
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);
171  vonMises_I0_kappa = TMath::BesselI0(vonMises_kappa);
172  MACH3LOG_INFO("Using von Mises distribution with kappa = {} and I0(kappa) = {}", vonMises_kappa, vonMises_I0_kappa);
173  }
174 
176  MACH3LOG_INFO("Using generalised Gaussian with mean {} and width {}", umbrellaMean, umbrellaWidth);
177  }
178 }
YAML::Node const & raw() const
Return config.
Definition: Manager.h:48
double umbrellaSigmaOverlap
Requested overlap for evenly spaced umbrellas.
void AdjustUmbrellaStepScale(const std::vector< ParameterHandlerBase * > &systematics)
Adjust the parameter-of-interest's step scale according to the width of the umbrella bias function.
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 ...
std::string umbrellaBiasFunctionName
Configured bias function name for logging.
int umbrellaNumber
Number of total umbrellas used for the current configuration.
M3::BiasFunction ParseBiasFunction(const std::string &biasFunctionName)
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.

◆ InitializeMulticanonicalParams()

void MulticanonicalMCMCHandler::InitializeMulticanonicalParams ( std::vector< ParameterHandlerBase * > &  systematics)

Initialise the starting values used by the multicanonical parameter handling.

This moves the starting point of the chain to the centre of the umbrella bias function. Only affects the parameter of interest.

Definition at line 193 of file MulticanonicalMCMCHandler.cpp.

193  {
194  // Set starting point of chain to umbrella center for non-spline umbrella modes
195  if (!multicanonicalSpline) {
196  systematics[oscCovVar]->PrintPreFitCurrPropValues();
197  systematics[oscCovVar]->SetParCurrProp(multicanonicalVar, umbrellaMean);
198  MACH3LOG_INFO("Setting starting point of chain to mean value for multicanonical separate: {}", umbrellaMean);
199  // pass the mean to the covarianceOsc object for parameter flipping DO NOT USE: UNTESTED
200  // if (flipWindow) {
201  // auto* oscCov = dynamic_cast<covarianceOsc*>(syst);
202  // if (oscCov) {
203  // oscCov->setFlipWindow(flipWindow);
204  // oscCov->setMulticanonicalSeparateMean(umbrellaMean);
205  // }
206  //}
207  systematics[oscCovVar]->PrintPreFitCurrPropValues();
208  MACH3LOG_INFO("Setting starting point of chain to umbrella center: {}", umbrellaMean);
209  }
210 }

Member Data Documentation

◆ dcp_spline_IO

TSpline3* MulticanonicalMCMCHandler::dcp_spline_IO
protected

Spline for the IO branch, if spline mode is enabled.

Definition at line 164 of file MulticanonicalMCMCHandler.h.

◆ dcp_spline_NO

TSpline3* MulticanonicalMCMCHandler::dcp_spline_NO
protected

Spline for the NO branch, if spline mode is enabled.

Definition at line 166 of file MulticanonicalMCMCHandler.h.

◆ flipWindow

bool MulticanonicalMCMCHandler::flipWindow
protected

Optional flip-window control.

briefly tested feature to mirror windows about their centres. Not tested but may be useful in the future. Currently disabled and not used.

Definition at line 185 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalBeta

double MulticanonicalMCMCHandler::multicanonicalBeta
protected

Global scale factor applied to the multicanonical penalty. 1 is full strength, 0 is no penalty.

Definition at line 161 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalSpline

bool MulticanonicalMCMCHandler::multicanonicalSpline

Toggle for spline-based multicanonical weights.

Definition at line 157 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalVar

int MulticanonicalMCMCHandler::multicanonicalVar

Parameter index used for the multicanonical weight, most often delta_cp.

Definition at line 141 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalVar_dm23

int MulticanonicalMCMCHandler::multicanonicalVar_dm23

Parameter index used for the multicanonical delm2_23 weight.

Definition at line 143 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalVar_dm23_value

const M3::float_t* MulticanonicalMCMCHandler::multicanonicalVar_dm23_value

Pointer to value of delm2_23 weight used for multicanonical weight.

Definition at line 148 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalVarName

std::string MulticanonicalMCMCHandler::multicanonicalVarName

Parameter name used for the multicanonical weight, most often delta_cp.

Definition at line 139 of file MulticanonicalMCMCHandler.h.

◆ multicanonicalVarValue

const M3::float_t* MulticanonicalMCMCHandler::multicanonicalVarValue

Pointer to value of parameter vale used for multicanonical weight, most often delta_cp.

Definition at line 146 of file MulticanonicalMCMCHandler.h.

◆ oscCovVar

int MulticanonicalMCMCHandler::oscCovVar

Index of the oscillation-covariance systematic in the current fit.

Definition at line 137 of file MulticanonicalMCMCHandler.h.

◆ umbrellaAdjustStepScale

bool MulticanonicalMCMCHandler::umbrellaAdjustStepScale
protected

Toggle for rescaling the step size based on the umbrella width.

Definition at line 180 of file MulticanonicalMCMCHandler.h.

◆ umbrellaBiasFunction

M3::BiasFunction MulticanonicalMCMCHandler::umbrellaBiasFunction

Selected bias function for multicanonical weights.

Definition at line 151 of file MulticanonicalMCMCHandler.h.

◆ umbrellaBiasFunctionName

std::string MulticanonicalMCMCHandler::umbrellaBiasFunctionName

Configured bias function name for logging.

Definition at line 154 of file MulticanonicalMCMCHandler.h.

◆ umbrellaMean

double MulticanonicalMCMCHandler::umbrellaMean
protected

Umbrella centre used for the current configuration.

Definition at line 169 of file MulticanonicalMCMCHandler.h.

◆ umbrellaNumber

int MulticanonicalMCMCHandler::umbrellaNumber
protected

Number of total umbrellas used for the current configuration.

Currently only used when auto-overlap mode is enabled. This is not fully tested.

Definition at line 174 of file MulticanonicalMCMCHandler.h.

◆ umbrellaOverlapMode

bool MulticanonicalMCMCHandler::umbrellaOverlapMode
protected

Toggle for deriving umbrella widths from a desired # of sigma overlaps between umbrellas.

Definition at line 176 of file MulticanonicalMCMCHandler.h.

◆ umbrellaSigmaOverlap

double MulticanonicalMCMCHandler::umbrellaSigmaOverlap
protected

Requested overlap for evenly spaced umbrellas.

Definition at line 178 of file MulticanonicalMCMCHandler.h.

◆ umbrellaStepScaleFactor

double MulticanonicalMCMCHandler::umbrellaStepScaleFactor
protected

Additional scale factor applied when rescaling the step size. This is for fine tuning.

Definition at line 182 of file MulticanonicalMCMCHandler.h.

◆ umbrellaWidth

double MulticanonicalMCMCHandler::umbrellaWidth
protected

Umbrella width used for the current configuration.

Definition at line 171 of file MulticanonicalMCMCHandler.h.

◆ vonMises_I0_kappa

double MulticanonicalMCMCHandler::vonMises_I0_kappa
protected

Cached I0(kappa) value for the von Mises form.

Definition at line 190 of file MulticanonicalMCMCHandler.h.

◆ vonMises_kappa

double MulticanonicalMCMCHandler::vonMises_kappa
protected

Von Mises kappa parameter. Analogue of sigma for a gaussian.

Definition at line 188 of file MulticanonicalMCMCHandler.h.


The documentation for this class was generated from the following files: