8 : inputFile(file), pca(true) {
14 if (threshold < 0 || threshold >= 1) {
16 MACH3LOG_INFO(
"Principal component analysis but given the threshold for the principal components to be less than 0, or greater than (or equal to) 1. This will not work");
19 MACH3LOG_INFO(
"Am instead calling the usual non-PCA constructor...");
49 MACH3LOG_ERROR(
"Adaption has been enabled and now trying to enable PCA. Right now both configuration don't work with each other");
53 PCAObj = std::make_unique<PCAHandler>();
55 if(FirstPCAdpar == -999 || LastPCAdpar == -999) {
56 if(FirstPCAdpar == -999 && LastPCAdpar == -999) {
61 MACH3LOG_ERROR(
"You must either leave FirstPCAdpar and LastPCAdpar at -999 or set them both to something");
76 TFile *infile =
new TFile(file.c_str(),
"READ");
77 if (infile->IsZombie()) {
78 MACH3LOG_ERROR(
"Could not open input covariance ROOT file {} !!!", file);
83 TMatrixDSym *CovMat =
static_cast<TMatrixDSym*
>(infile->Get(name.c_str()));
86 MACH3LOG_ERROR(
"Could not find covariance matrix name {} in file {}", name, file);
87 MACH3LOG_ERROR(
"Are you really sure {} exists in the file?", name);
111 bool CircEnabled =
false;
112 std::pair<double, double> circular_bounds;
114 bool FlipEnabled =
false;
115 std::string flip_group;
118 bool FunctionalFlipEnabled =
false;
119 YAML::Node functional_flip;
121 if (param[
"CircularBounds"]) {
123 circular_bounds = Get<std::pair<double, double>>(param[
"CircularBounds"], __FILE__, __LINE__);
126 if (param[
"FlipParameter"]) {
129 if (param[
"FlipGroup"]) {
130 flip_group = Get<std::string>(param[
"FlipGroup"], __FILE__, __LINE__);
134 flip_point = Get<double>(param[
"FlipParameter"], __FILE__, __LINE__);
137 if (param[
"FunctionalFlip"]) {
138 FunctionalFlipEnabled =
true;
140 if (param[
"FlipGroup"]) {
141 flip_group = Get<std::string>(param[
"FlipGroup"], __FILE__, __LINE__);
145 functional_flip = param[
"FunctionalFlip"];
148 if (!CircEnabled && !FlipEnabled && !FunctionalFlipEnabled) {
154 if (FlipEnabled && FunctionalFlipEnabled) {
162 MACH3LOG_INFO(
"Enabling CircularBounds for parameter {} with range [{}, {}]",
164 circular_bounds.first,
165 circular_bounds.second);
167 if (circular_bounds.first <
_fLowBound.at(Index) || circular_bounds.second >
_fUpBound.at(Index)) {
168 MACH3LOG_ERROR(
"Circular bounds [{}, {}] for parameter {} exceed physical bounds [{}, {}]",
169 circular_bounds.first, circular_bounds.second,
177 MACH3LOG_ERROR(
"This is not supported, CircularPrior only works with flat prior");
188 MACH3LOG_INFO(
"Enabling Flipping for parameter {} in group {} with value {}",
194 if (FunctionalFlipEnabled) {
198 MACH3LOG_INFO(
"Enabling Functional Flipping for parameter {} in group {} with config {}",
201 YAML::Dump(functional_flip));
204 if (CircEnabled && FlipEnabled) {
205 if (flip_point < circular_bounds.first || flip_point > circular_bounds.second) {
206 MACH3LOG_ERROR(
"FlipParameter value {} for parameter {} is outside the CircularBounds [{}, {}]",
207 flip_point,
GetParFancyName(Index), circular_bounds.first, circular_bounds.second);
211 const double low = circular_bounds.first;
212 const double high = circular_bounds.second;
215 const double flipped_low = 2 * flip_point - low;
216 const double flipped_high = 2 * flip_point - high;
217 const double min_flip = std::min(flipped_low, flipped_high);
218 const double max_flip = std::max(flipped_low, flipped_high);
220 if (min_flip < low || max_flip > high) {
221 MACH3LOG_ERROR(
"Flipping about point {} for parameter {} would leave circular bounds [{}, {}]",
242 AddFunctionalFlip(pending_flip.config, pending_flip.target_index, pending_flip.group_name);
252 const YAML::Node formula = functional_flip[
"Formula"];
253 const YAML::Node parameters = functional_flip[
"Parameters"];
266 flip.
formula = Get<std::string>(formula, __FILE__, __LINE__);
267 flip.
argument_names = Get<std::vector<std::string>>(parameters, __FILE__, __LINE__);
272 MACH3LOG_ERROR(
"FunctionalFlip for parameter {} refers to unknown parameter {}",
279 const std::string flip_name = fmt::format(
"{}_{}_functional_flip_{}",
282 FlipGroups[group_name].FunctionalFlipParameters.size());
283 flip.
evaluator = std::make_unique<TF1>(flip_name.c_str(), flip.
formula.c_str(), 0.0, 1.0);
286 MACH3LOG_ERROR(
"Failed to parse FunctionalFlip formula for parameter {}: {}",
292 MACH3LOG_ERROR(
"FunctionalFlip formula for parameter {} expects {} auxiliary parameters, but {} names were provided",
294 MACH3LOG_ERROR(
"Use x for the target parameter and [0], [1], ... for the listed Parameters entries");
298 MACH3LOG_INFO(
"Enabling FunctionalFlip for parameter {} with formula '{}'",
300 FlipGroups[group_name].FunctionalFlipParameters.push_back(std::move(flip));
307 if (cov ==
nullptr) {
308 MACH3LOG_ERROR(
"Could not find covariance matrix you provided to {}", __func__ );
313 invCovMatrix =
static_cast<TMatrixDSym *
>(cov->Clone());
334 _fNames = std::vector<std::string>(SizeVec);
337 _fError = std::vector<double>(SizeVec, 1.0);
338 _fCurrVal = std::vector<double>(SizeVec, 0.0);
339 _fPropVal = std::vector<M3::float_t>(SizeVec, 0.0);
340 _fLowBound = std::vector<double>(SizeVec, -999.99);
341 _fUpBound = std::vector<double>(SizeVec, 999.99);
350 for(
int i = 0; i < SizeVec; i++) {
358 for(
int i = 0; i < SizeVec; i++) {
360 for (
int j = 0; j < SizeVec; j++) {
373 MACH3LOG_DEBUG(
"Over-riding {}: _fPropVal ({}), _fCurrVal ({}), _fPreFitValue ({}) to ({})",
387 std::vector<double> props(
_fNumPar);
401 #pragma GCC diagnostic push
402 #pragma GCC diagnostic ignored "-Wuseless-cast"
406 if (__builtin_expect(!
pca, 1)) {
408 #pragma omp parallel for
410 for (
int i = 0; i <
_fNumPar; ++i) {
425 MACH3LOG_WARN(
"Tried {} times to throw parameter {} but failed",
throws, i);
444 #pragma GCC diagnostic pop
454 #pragma GCC diagnostic push
455 #pragma GCC diagnostic ignored "-Wuseless-cast"
460 for (
int i = 0; i <
_fNumPar; ++i) {
466 const double sigma = sqrt((*
covMatrix)(i,i));
467 double throwrange = sigma;
468 if (paramrange < sigma) throwrange = paramrange;
475 MACH3LOG_WARN(
"Tried {} times to throw parameter {} but failed",
throws, i);
486 #pragma GCC diagnostic pop
541 for (
const auto& [group_name, group] :
FlipGroups) {
555 #pragma omp parallel for
557 for (
int i = 0; i <
_fNumPar; ++i) {
570 #pragma omp parallel for
572 for (
int i = 0; i <
PCAObj->GetNumberPCAedParameters(); ++i)
575 if (
PCAObj->IsParameterFixedPCA(i)) {
594 #pragma omp parallel for
596 for (
int i = 0; i <
_fNumPar; ++i) {
598 #pragma GCC diagnostic push
599 #pragma GCC diagnostic ignored "-Wuseless-cast"
601 #pragma GCC diagnostic pop
615 #pragma omp parallel for
617 for (
int i = 0; i <
_fNumPar; ++i) {
630 #pragma GCC diagnostic push
631 #pragma GCC diagnostic ignored "-Wuseless-cast"
638 }
else if (
_fPropVal[index] < LowBound) {
656 std::vector<double> proposed_values(
_fNumPar, 0.0);
657 for (
int i = 0; i <
_fNumPar; ++i) {
683 const std::vector<double>& proposed_values)
const {
690 const double target_value = proposed_values[flip.
target_index];
691 const double flipped_value = flip.
evaluator->EvalPar(&target_value, parameter_values.data());
694 #pragma GCC diagnostic pop
704 for (
int i = 0; i <
_fNumPar; ++i) {
708 for (
const auto& line : table.Render()) {
727 for (
int i = 0; i <
_fNumPar; ++i) {
734 for (
const auto& line : table.Render()) {
748 #pragma omp parallel for reduction(+:logL)
760 for (
int j = 0; j <= i; ++j) {
763 double scale = (i != j) ? 1. : 0.5;
775 for (
int i = 0; i <
_fNumPar; ++i) {
799 #pragma GCC diagnostic push
800 #pragma GCC diagnostic ignored "-Wuseless-cast"
803 for (
int i = 0; i <
_fNumPar; i++) {
808 if (pars.size() !=
static_cast<size_t>(
_fNumPar)) {
812 int parsSize = int(pars.size());
813 for (
int i = 0; i < parsSize; i++) {
815 if(std::isnan(pars[i])) {
826 PCAObj->TransferToParam();
828 #pragma GCC diagnostic pop
835 for (
int i = 0; i <
_fNumPar; ++i) {
845 for (
int i = 0; i <
_fNumPar; ++i) {
858 MACH3LOG_ERROR(
"You are trying so set StepScale to 0 or negative this will not work");
864 const double SuggestedScale = 2.38/std::sqrt(
_fNumPar);
865 if(std::fabs(scale - SuggestedScale)/SuggestedScale > 1) {
866 MACH3LOG_WARN(
"Defined Global StepScale is {}, while suggested suggested {}", scale, SuggestedScale);
959 MACH3LOG_WARN(
"I couldn't find parameter with name {}, therefore will not fix it", name);
970 MACH3LOG_WARN(
"I couldn't find parameter with name {}, therefore don't know if it fixed", name);
996 if (
static_cast<int>(stepscale.size()) !=
_fNumPar)
998 MACH3LOG_WARN(
"Stepscale vector not equal to number of parameters. Quitting..");
999 MACH3LOG_WARN(
"Size of argument vector: {}", stepscale.size());
1004 for (
int iParam = 0 ; iParam <
_fNumPar; iParam++) {
1016 for (
int iParam = 0; iParam <
_fNumPar; ++iParam) {
1020 for (
const auto& line : table.Render()) {
1036 if(n_attempts > 0 && verbose) {
1037 MACH3LOG_WARN(
"Covariance matrix {} was not positive-definite, made it positive-definite after {} attempts",
matrixName, n_attempts);
1044 std::vector<double> stepScales(
_fNumPar, 1.0);
1053 MACH3LOG_ERROR(
"Parameter skip adapt flags not set, cannot set individual step scales for skipped parameters.");
1057 for (
int i = 0; i <
_fNumPar; i++) {
1062 MACH3LOG_DEBUG(
"Updating individual step scales for non-adapting parameters to cancel global step scale change.");
1070 if (cov ==
nullptr) {
1071 MACH3LOG_ERROR(
"Could not find covariance matrix you provided to {}", __func__);
1075 if (
covMatrix->GetNrows() != cov->GetNrows()) {
1076 MACH3LOG_ERROR(
"Matrix given for throw Matrix is not the same size as the covariance matrix stored in object!");
1082 throwMatrix =
static_cast<TMatrixDSym*
>(cov->Clone());
1094 #pragma omp parallel for collapse(2)
1107 TMatrixDSym
const &subcov) {
1109 if ((last_index - first_index) >= subcov.GetNrows()) {
1110 MACH3LOG_ERROR(
"Trying to SetSubThrowMatrix into range: ({},{}) with a "
1111 "submatrix with only {} rows {}",
1112 first_index, last_index, subcov.GetNrows(), __func__);
1116 TMatrixDSym *current_ThrowMatrix =
1118 for (
int i = first_index; i <= last_index; ++i) {
1119 for (
int j = first_index; j <= last_index; ++j) {
1120 current_ThrowMatrix->operator()(i, j) =
1121 subcov(i - first_index, j - first_index);
1126 delete current_ThrowMatrix;
1141 for (
size_t i = 0; i < group.FlipParameterIndex.size(); ++i) {
1142 const int index = group.FlipParameterIndex[i];
1145 MACH3LOG_ERROR(
"Right now flipping and adapting doesn't work very well");
1155 double max_correlation = 0.01;
1156 for (
int i = 0; i <
_fNumPar; ++i) {
1157 for (
int j = 0; j <= i; ++j) {
1161 if(std::fabs(corr) > max_correlation) {
1162 MACH3LOG_ERROR(
"Correlation between skipped parameter {} ({}) and non-skipped parameter {} ({}) is {:.6e}, above the allowed threshold of {:.6e}.",
1176 MACH3LOG_ERROR(
"PCA has been enabled and now trying to enable Adaption. Right now both configuration don't work with each other");
1180 MACH3LOG_ERROR(
"Adaptive Handler has already been initialise can't do it again so skipping.");
1190 auto params_to_skip = GetFromManager<std::vector<std::string>>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ParametersToSkip"], {}, __FILE__ , __LINE__);
1193 for (
int i = 0; i <
_fNumPar; ++i) {
1220 if(GetFromManager<bool>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"UseExternalMatrix"],
false, __FILE__ , __LINE__)) {
1222 auto external_file_name = GetFromManager<std::string>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ExternalMatrixFileName"],
"", __FILE__ , __LINE__);
1223 auto external_matrix_name = GetFromManager<std::string>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ExternalMatrixName"],
"", __FILE__ , __LINE__);
1224 auto external_mean_name = GetFromManager<std::string>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ExternalMeansName"],
"", __FILE__ , __LINE__);
1234 MACH3LOG_INFO(
"Successfully Set External Throw Matrix Stored in {}", external_file_name);
1237 if (!success)
return;
1282 TMatrixDSym* update_matrix =
static_cast<TMatrixDSym*
>(
AdaptiveHandler->GetAdaptiveCovariance()->Clone());
1304 TMatrixDSym* cov_trans = cov;
1306 TMatrixDSym cov_sym = 0.5*(*cov+*cov_trans);
1309 TDecompSVD cov_sym_svd=TDecompSVD(cov_sym);
1310 if(!cov_sym_svd.Decompose()){
1311 MACH3LOG_WARN(
"Cannot do SVD on input matrix, trying MakePosDef() first!");
1315 TMatrixD cov_sym_v = cov_sym_svd.GetV();
1316 TMatrixD cov_sym_vt = cov_sym_v;
1319 TVectorD cov_sym_sigvect = cov_sym_svd.GetSig();
1321 const Int_t nCols = cov_sym_v.GetNcols();
1322 TMatrixDSym cov_sym_sig(nCols);
1323 TMatrixDDiag cov_sym_sig_diag(cov_sym_sig);
1324 cov_sym_sig_diag=cov_sym_sigvect;
1327 TMatrixDSym cov_sym_polar = cov_sym_sig.SimilarityT(cov_sym_vt);
1330 TMatrixDSym cov_closest_approx = 0.5*(cov_sym+cov_sym_polar);
1335 *cov = cov_closest_approx;
1345 hMatrix->SetDirectory(
nullptr);
1348 hMatrix->SetBinContent(i+1, i+1, 1.);
1354 #pragma omp parallel for
1358 for(
int j = 0; j <= i; j++)
1361 hMatrix->SetBinContent(i+1, j+1, Corr);
1362 hMatrix->SetBinContent(j+1, i+1, Corr);
1382 for (YAML::Node param : copyNode[
"Systematics"])
1389 std::ofstream fout(
"Modified_Matrix.yaml");
1398 if(
Tunes ==
nullptr) {
1399 MACH3LOG_ERROR(
"Tunes haven't been initialised, which are being loaded from YAML, have you used some deprecated constructor");
1402 auto Values =
Tunes->GetTune(TuneName);
1409 std::vector<double>& BranchValues,
1410 std::vector<std::string>& BranchNames,
1411 const std::vector<std::string>& FancyNames) {
1419 if(FancyNames.size() != 0){
1424 bool matched =
false;
1425 for (
size_t iPar = 0; iPar < FancyNames.size(); ++iPar) {
1428 PosteriorFile->SetBranchStatus(BranchNames[iPar].c_str(),
true);
1429 PosteriorFile->SetBranchAddress(BranchNames[iPar].c_str(), &BranchValues[i]);
1442 if (!PosteriorFile->GetBranch(BranchNames[i].c_str())) {
1443 MACH3LOG_WARN(
"Branch '{}' does not exist in the TTree, is this what you want?", BranchNames[i]);
1446 PosteriorFile->SetBranchStatus(BranchNames[i].c_str(),
true);
1447 PosteriorFile->SetBranchAddress(BranchNames[i].c_str(), &BranchValues[i]);
#define _noexcept_
KS: noexcept can help with performance but is terrible for debugging, this is meant to help easy way ...
#define MACH3LOG_CRITICAL
Creates fancy formatted text tables for terminal output.
void AddRow(Args &&... args)
Add a row to the table.
Custom exception class used throughout MaCh3.
std::vector< int > CircularBoundsIndex
Indices of parameters with circular bounds.
int GetNumParams() const
Get total number of parameters.
std::vector< bool > param_skip_adapt_flags
Flags telling if parameter should be skipped during adaption.
void ToggleFixParameter(const int i)
Toggle fixing parameter at prior values.
bool use_adaptive
Are we using AMCMC?
void SetFixAllParameters()
Set all parameters to be fixed at prior values.
virtual void ProposeStep()
Generate a new proposed state.
TH2D * GetCorrelationMatrix() const
KS: Convert covariance matrix to correlation matrix and return TH2D which can be used for fancy plott...
void SanitizeAdaption() const
Perform sanity check to ensure adaption isn't misbehaving before fit starts.
double * randParams
Random number taken from gaussian around prior error used for corr_throw.
void SetName(const std::string &name)
Set matrix name.
std::map< std::string, FlipGroup > FlipGroups
Map of flip groups, where the key is the group name and the value is a FlipGroup struct.
void AddFunctionalFlip(const YAML::Node ¶m, const int index, const std::string &group_name)
Parse and register a functional flip defined in YAML.
double ** throwMatrixCholDecomp
Throw matrix that is being used in the fit, much faster as TMatrixDSym cache miss.
void SetStepScale(const double scale, const bool verbose=true)
Set global step scale for covariance object.
virtual ~ParameterHandlerBase()
Destructor.
TMatrixDSym * invCovMatrix
The inverse covariance matrix.
void SetCovMatrix(TMatrixDSym *cov)
Set covariance matrix.
std::string GetParName(const int i) const
Get name of parameter.
std::vector< double > GetProposed() const
Get vector of all proposed parameter values.
void SetFlatPrior(const int i, const bool eL)
Set if parameter should have flat prior or not.
void ResolveFunctionalFlips()
Resolve queued functional flips after parameter names are known.
void AcceptStep() _noexcept_
Accepted this step.
virtual double GetLikelihood()
Return CalcLikelihood if some params were thrown out of boundary return LARGE_LOGL
std::unique_ptr< AdaptiveMCMCHandler > AdaptiveHandler
Struct containing information about adaption.
void QueueFunctionalFlip(const YAML::Node ¶m, const int index, const std::string &group_name)
Queue a functional flip until all parameters have been loaded.
std::vector< M3::float_t > _fPropVal
Proposed value of the parameter.
std::unique_ptr< ParameterTunes > Tunes
Struct containing information about adaption.
void InitialiseAdaption(const YAML::Node &adapt_manager)
Initialise adaptive MCMC.
TMatrixDSym * throwMatrix
Matrix which we use for step proposal before Cholesky decomposition (not actually used for step propo...
double _fGlobalStepScale
Global step scale applied to all params in this class.
void FlipParameterGroup(const std::string &group)
With a 50% chance, flip all parameters in a group around their respective flip points.
int GetParIndex(const std::string &name) const
Get index based on name.
void ReserveMemory(const int size)
Initialise vectors with parameters information.
M3::float_t EvaluateFunctionalFlip(const FunctionalFlipProposal &flip, const std::vector< double > &proposed_values) const
Evaluate a formula-driven flip for a target parameter.
std::vector< std::string > _fFancyNames
Fancy name for example rather than param_0 it is MAQE, useful for human reading.
bool doSpecialStepProposal
Check if any of special step proposal were enabled.
std::vector< bool > _fFlatPrior
Whether to apply flat prior or not.
void ThrowParameters()
Throw the parameters according to the covariance matrix. This shouldn't be used in MCMC code ase it c...
double _fGlobalStepScaleInitial
Backup of _fGlobalStepScale for parameters which are skipped during adaption.
std::string matrixName
Name of cov matrix.
void MakeClosestPosDef(TMatrixDSym *cov)
HW: Finds closest possible positive definite matrix in Frobenius Norm ||.||_frob Where ||X||_frob=sqr...
void RandomConfiguration()
Randomly throw the parameters in their 1 sigma range.
TMatrixDSym * GetCovMatrix() const
Return covariance matrix.
void UpdateAdaptiveCovariance()
Method to update adaptive MCMC .
std::string GetParFancyName(const int i) const
Get fancy name of the Parameter.
std::vector< double > _fError
Prior error on the parameter.
void SetFreeAllParameters()
Set all parameters to be treated as free.
void SetFixParameter(const int i)
Set parameter to be fixed at prior value.
void SetParameters(const std::vector< double > &pars={})
Set parameter values using vector, it has to have same size as covariance class.
YAML::Node _fYAMLDoc
Stores config describing systematics.
void SetThrowMatrix(const TMatrixDSym *cov)
Use new throw matrix, used in adaptive MCMC.
bool IsParameterFixed(const int i) const
Is parameter fixed or not.
void MatchMaCh3OutputBranches(TTree *PosteriorFile, std::vector< double > &BranchValues, std::vector< std::string > &BranchNames, const std::vector< std::string > &FancyNames={})
Matches branches in a TTree to parameters in a systematic handler.
void UpdateThrowMatrix(TMatrixDSym *cov)
Replaces old throw matrix with new one.
void CircularParBounds(const int i, const double LowBound, const double UpBound)
HW :: This method is a tad hacky but modular arithmetic gives me a headache.
void SetBranches(TTree &tree, const bool SaveProposal=false)
set branches for output file
void SaveUpdatedMatrixConfig()
KS: After step scale, prefit etc. value were modified save this modified config.
void InitFromFile(const std::string &name, const std::string &file)
Initialisation of the class using matrix from root file.
void ResetIndivStepScale()
Adaptive Step Tuning Stuff.
std::unique_ptr< PCAHandler > PCAObj
Struct containing information about PCA.
int _fNumPar
Number of systematic parameters.
double CalcLikelihood() const _noexcept_
Calc penalty term based on inverted covariance matrix.
void ConstructPCA(const double eigen_threshold, int FirstPCAdpar, int LastPCAdpar)
CW: Calculate eigen values, prepare transition matrices and remove param based on defined threshold.
std::vector< double > _fIndivStepScaleInitial
Backup of _fIndivStepScale for parameters which are skipped during adaption.
std::vector< double > _fLowBound
Lowest physical bound, parameter will not be able to go beyond it.
std::vector< PendingFunctionalFlipProposal > PendingFunctionalFlipParameters
Functional flips waiting for full parameter-name registration.
std::vector< double > _fCurrVal
Current value of the parameter.
std::vector< std::vector< double > > InvertCovMatrix
KS: Same as above but much faster as TMatrixDSym cache miss.
TMatrixDSym * covMatrix
The covariance matrix.
std::vector< double > _fPreFitValue
Parameter value dictated by the prior model. Based on it penalty term is calculated.
void Randomize() _noexcept_
"Randomize" the parameters in the covariance class for the proposed step. Used the proposal kernel an...
void PrintIndivStepScale() const
Print step scale for each parameter.
std::vector< std::string > _fNames
ETA _fNames is set automatically in the covariance class to be something like param_i,...
std::vector< std::pair< double, double > > CircularBoundsValues
Circular bounds for each parameter (lower, upper)
void EnableSpecialProposal(const YAML::Node ¶m, const int Index)
Enable special proposal.
double * corr_throw
Result of multiplication of Cholesky matrix and randParams.
bool GetFlatPrior(const int i) const
Get if param has flat prior or not.
std::string GetName() const
Get name of covariance.
double GetParPreFit(const int i) const
Get prior parameter value.
void SetParCurrProp(const int i, const double val)
Set current parameter value.
void SetFreeParameter(const int i)
Set parameter to be treated as free.
std::vector< double > _fUpBound
Upper physical bound, parameter will not be able to go beyond it.
void SetSingleParameter(const int parNo, const double parVal)
Set value of single param to a given value.
void SetPar(const int i, const double val)
Set all the covariance matrix parameters to a user-defined value.
void SetIndivStepScale(const int ParameterIndex, const double StepScale)
DB Function to set fIndivStepScale from a vector (Can be used from execs and inside covariance constr...
void SetIndivStepScaleForSkippedAdaptParams()
Set individual step scale for parameters which are skipped during adaption to initial values.
double GetDiagonalError(const int i) const
Get diagonal error for ith parameter.
ParameterHandlerBase()=default
void SetSubThrowMatrix(int first_index, int last_index, TMatrixDSym const &subcov)
void SetTune(const std::string &TuneName)
KS: Set proposed parameter values vector to be base on tune values, for example set proposed values t...
bool pca
perform PCA or not
std::vector< double > _fIndivStepScale
Individual step scale used by MCMC algorithm.
void PrintPreFitValues() const
Print prior value for every parameter.
void SpecialStepProposal()
Perform Special Step Proposal.
void PrintPreFitCurrPropValues() const
Print prior, current and proposed value for each parameter.
void CorrelateSteps() _noexcept_
Use Cholesky throw matrix for better step proposal.
void MakePosDef(TMatrixDSym *cov=nullptr, bool verbose=true)
Make matrix positive definite by adding small values to diagonal, necessary for inverting matrix.
int CheckBounds() const _noexcept_
Check if parameters were proposed outside physical boundary.
static std::string Cell(T &&value, std::string_view format)
Format a value using a runtime fmt format string.
std::string FormatDouble(const double value, const int precision)
Convert double into string for precision, useful for playing with yaml if you don't want to have in c...
@ Right
Align text to the right.
@ Left
Align text to the left.
double Uniform(const double min=0.0, const double max=1.0)
Generate a uniform random number in [min, max).
double Gaus(const double mean=0.0, const double sigma=1.0)
Generate a Gaussian random number.
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 _LARGE_LOGL_
Large Likelihood is used it parameter go out of physical boundary, this indicates in MCMC that such s...
void MatrixVectorMulti(double *_restrict_ VecMulti, double **_restrict_ matrix, const double *_restrict_ vector, const int n)
KS: Custom function to perform multiplication of matrix and vector with multithreading.
double MatrixVectorMultiSingle(double **_restrict_ matrix, const double *_restrict_ vector, const int Length, const int i)
KS: Custom function to perform multiplication of matrix and single element which is thread safe.
int MakeMatrixPosDef(TMatrixDSym *cov)
Makes sure that matrix is positive-definite by adding a small number to on-diagonal elements.
constexpr static const int _BAD_INT_
Default value used for int initialisation.
bool CaseInsensitiveMatchAny(std::string Text, const std::vector< std::string > &Patterns)
Matches a string against a simple wildcard Pattern using regex. Is not case sensitive.
std::vector< std::vector< double > > GetCholeskyDecomposedMatrix(const TMatrixDSym &matrix, const std::string &matrixName)
Computes Cholesky decomposition of a symmetric positive definite matrix using custom function which c...
Struct to hold information about a group of parameters that flip together at the same time.
std::vector< int > FlipParameterIndex
Indices of parameters with flip symmetry.
std::vector< double > FlipParameterPoint
Central points around which parameters are flipped.
std::vector< FunctionalFlipProposal > FunctionalFlipParameters
Formula-driven flips that should be applied when this group flips.
Configuration for a formula-based functional flip.
std::vector< int > argument_indices
std::vector< std::string > argument_names
std::unique_ptr< TF1 > evaluator
Configuration for a pending functional flip awaiting all parameters to be initialised.