9 : inputFile(file), pca(true) {
13 if (threshold < 0 || threshold >= 1) {
15 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");
18 MACH3LOG_INFO(
"Am instead calling the usual non-PCA constructor...");
28 : inputFile(YAMLFile[0].c_str()), matrixName(name), pca(true) {
30 MACH3LOG_INFO(
"Constructing instance of ParameterHandler using");
32 for(
unsigned int i = 0; i < YAMLFile.size(); i++)
38 if (threshold < 0 || threshold >= 1) {
39 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");
42 MACH3LOG_INFO(
"Am instead calling the usual non-PCA constructor...");
71 MACH3LOG_ERROR(
"Adaption has been enabled and now trying to enable PCA. Right now both configuration don't work with each other");
75 PCAObj = std::make_unique<PCAHandler>();
77 if(FirstPCAdpar == -999 || LastPCAdpar == -999){
78 if(FirstPCAdpar == -999 && LastPCAdpar == -999){
83 MACH3LOG_ERROR(
"You must either leave FirstPCAdpar and LastPCAdpar at -999 or set them both to something");
98 TFile *infile =
new TFile(file.c_str(),
"READ");
99 if (infile->IsZombie()) {
100 MACH3LOG_ERROR(
"Could not open input covariance ROOT file {} !!!", file);
101 MACH3LOG_ERROR(
"Was about to retrieve matrix with name {}", name);
105 TMatrixDSym *CovMat =
static_cast<TMatrixDSym*
>(infile->Get(name.c_str()));
108 MACH3LOG_ERROR(
"Could not find covariance matrix name {} in file {}", name, file);
109 MACH3LOG_ERROR(
"Are you really sure {} exists in the file?", name);
119 for (
int iThread = 0; iThread < nThreads; iThread++) {
132 for (
int j = 0; j <
_fNumPar; j++) {
158 std::map<std::pair<int, int>, std::unique_ptr<TMatrixDSym>> ThrowSubMatrixOverrides;
159 int running_num_file_pars = 0;
161 _fYAMLDoc[
"Systematics"] = YAML::Node(YAML::NodeType::Sequence);
162 for(
unsigned int i = 0; i < YAMLFile.size(); i++)
166 if (YAMLDocTemp[
"ThrowMatrixOverride"]) {
173 YAMLDocTemp[
"ThrowMatrixOverride"][
"file"].as<std::string>();
174 TFile *submatrix_file =
TFile::Open(filename.c_str());
177 YAMLDocTemp[
"ThrowMatrixOverride"][
"matrix"].as<std::string>();
178 std::unique_ptr<TMatrixDSym> submatrix{
179 submatrix_file->Get<TMatrixDSym>(matrixname.c_str())};
182 matrixname, filename);
185 auto numrows = submatrix->GetNrows();
189 ThrowSubMatrixOverrides[{running_num_file_pars,
190 running_num_file_pars + (numrows - 1)}] =
191 std::move(submatrix);
195 if (!
bool(YAMLDocTemp[
"ThrowMatrixOverride"][
"check_names"]) ||
196 YAMLDocTemp[
"ThrowMatrixOverride"][
"check_names"].as<bool>()) {
197 auto nametree = submatrix_file->Get<TTree>(
"param_names");
200 "ThrowMatrixOverride: {{ check_names: False }} to "
201 "disable this check.",
205 std::string *param_name =
nullptr;
206 nametree->SetBranchAddress(
"name", ¶m_name);
208 if (nametree->GetEntries() !=
int(YAMLDocTemp[
"Systematics"].size())) {
210 "the corresponding yaml file only declares {} "
211 "parameters. Set ThrowMatrixOverride: {{ "
212 "check_names: False }} to disable this check.",
213 filename, nametree->GetEntries(),
214 YAMLDocTemp[
"Systematics"].size());
219 for (
const auto ¶m : YAMLDocTemp[
"Systematics"]) {
220 nametree->GetEntry(pit++);
221 auto yaml_pname = Get<std::string>(
222 param[
"Systematic"][
"Names"][
"FancyName"], __FILE__, __LINE__);
223 if ((*param_name) != yaml_pname) {
225 "TTree param_names in file: {} at entry {} has parameter {}, "
227 "the corresponding yaml parameter is named {}. Set "
228 "ThrowMatrixOverride: {{ "
229 "check_names: False }} to disable this check.",
230 filename, pit, (*param_name), yaml_pname);
235 submatrix_file->Close();
238 for (
const auto& item : YAMLDocTemp[
"Systematics"]) {
239 _fYAMLDoc[
"Systematics"].push_back(item);
240 running_num_file_pars++;
248 for (
int iThread = 0; iThread < nThreads; iThread++) {
262 for (
int j = 0; j <
_fNumPar; j++) {
268 TMatrixDSym* _fCovMatrix =
new TMatrixDSym(
_fNumPar);
270 std::vector<std::map<std::string,double>> Correlations(
_fNumPar);
271 std::map<std::string, int> CorrNamesMap;
277 for (
auto const ¶m :
_fYAMLDoc[
"Systematics"])
279 _fFancyNames[i] = Get<std::string>(param[
"Systematic"][
"Names"][
"FancyName"], __FILE__ , __LINE__);
280 _fPreFitValue[i] = Get<double>(param[
"Systematic"][
"ParameterValues"][
"PreFitValue"], __FILE__ , __LINE__);
281 _fIndivStepScale[i] = Get<double>(param[
"Systematic"][
"StepScale"][
"MCMC"], __FILE__ , __LINE__);
282 _fError[i] = Get<double>(param[
"Systematic"][
"Error"], __FILE__ , __LINE__);
283 _fSampleNames[i] = GetFromManager<std::vector<std::string>>(param[
"Systematic"][
"SampleNames"], {}, __FILE__, __LINE__);
289 auto TempBoundsVec =
GetBounds(param[
"Systematic"][
"ParameterBounds"]);
294 _fFlatPrior[i] = GetFromManager<bool>(param[
"Systematic"][
"FlatPrior"],
false, __FILE__ , __LINE__);
297 if(GetFromManager<bool>(param[
"Systematic"][
"FixParam"],
false, __FILE__ , __LINE__)) {
301 if(param[
"Systematic"][
"SpecialProposal"]) {
306 CorrNamesMap[param[
"Systematic"][
"Names"][
"FancyName"].as<std::string>()]=i;
309 if(param[
"Systematic"][
"Correlations"]) {
310 for(
unsigned int Corr_i = 0; Corr_i < param[
"Systematic"][
"Correlations"].size(); ++Corr_i){
311 for (YAML::const_iterator it = param[
"Systematic"][
"Correlations"][Corr_i].begin(); it!=param[
"Systematic"][
"Correlations"][Corr_i].end();++it) {
312 Correlations[i][it->first.as<std::string>()] = it->second.as<
double>();
327 for (
auto const& pair : Correlations[j]) {
328 auto const& key = pair.first;
329 auto const& val = pair.second;
332 if (CorrNamesMap.find(key) != CorrNamesMap.end()) {
333 index = CorrNamesMap[key];
335 MACH3LOG_ERROR(
"Parameter {} not in list! Check your spelling?", key);
340 if(Correlations[index].find(
_fFancyNames[j]) != Correlations[index].end()) {
343 if(std::abs(Corr2 - Corr1) > FLT_EPSILON) {
352 (*_fCovMatrix)(j, index)= (*_fCovMatrix)(index, j) = Corr1*
_fError[j]*
_fError[index];
365 for(
auto const & matovr : ThrowSubMatrixOverrides){
369 Tunes = std::make_unique<ParameterTunes>(
_fYAMLDoc[
"Systematics"]);
372 for(
const auto &file : YAMLFile){
385 bool CircEnabled =
false;
386 bool FlipEnabled =
false;
388 if (param[
"CircularBounds"]) {
392 if (param[
"FlipParameter"]) {
396 if (!CircEnabled && !FlipEnabled) {
404 MACH3LOG_INFO(
"Enabling CircularBounds for parameter {} with range [{}, {}]",
410 MACH3LOG_ERROR(
"Circular bounds [{}, {}] for parameter {} exceed physical bounds [{}, {}]",
420 FlipParameterPoint.push_back(Get<double>(param[
"FlipParameter"], __FILE__, __LINE__));
421 MACH3LOG_INFO(
"Enabling Flipping for parameter {} with value {}",
426 if (CircEnabled && FlipEnabled) {
428 MACH3LOG_ERROR(
"FlipParameter value {} for parameter {} is outside the CircularBounds [{}, {}]",
439 const double min_flip = std::min(flipped_low, flipped_high);
440 const double max_flip = std::max(flipped_low, flipped_high);
442 if (min_flip < low || max_flip > high) {
443 MACH3LOG_ERROR(
"Flipping about point {} for parameter {} would leave circular bounds [{}, {}]",
454 if (cov ==
nullptr) {
455 MACH3LOG_ERROR(
"Could not find covariance matrix you provided to {}", __func__ );
460 invCovMatrix =
static_cast<TMatrixDSym *
>(cov->Clone());
476 _fNames = std::vector<std::string>(SizeVec);
479 _fError = std::vector<double>(SizeVec);
480 _fCurrVal = std::vector<double>(SizeVec);
481 _fPropVal = std::vector<M3::float_t>(SizeVec);
483 _fUpBound = std::vector<double>(SizeVec);
493 for(
int i = 0; i < SizeVec; i++) {
514 MACH3LOG_DEBUG(
"Over-riding {}: _fPropVal ({}), _fCurrVal ({}), _fPreFitValue ({}) to ({})",
528 std::vector<double> props(
_fNumPar);
542 #pragma GCC diagnostic push
543 #pragma GCC diagnostic ignored "-Wuseless-cast"
547 if (__builtin_expect(!
pca, 1)) {
549 #pragma omp parallel for
551 for (
int i = 0; i <
_fNumPar; ++i) {
566 MACH3LOG_WARN(
"Tried {} times to throw parameter {} but failed",
throws, i);
585 #pragma GCC diagnostic pop
595 #pragma GCC diagnostic push
596 #pragma GCC diagnostic ignored "-Wuseless-cast"
601 for (
int i = 0; i <
_fNumPar; ++i) {
607 const double sigma = sqrt((*
covMatrix)(i,i));
608 double throwrange = sigma;
609 if (paramrange < sigma) throwrange = paramrange;
616 MACH3LOG_WARN(
"Tried {} times to throw parameter {} but failed",
throws, i);
627 #pragma GCC diagnostic pop
698 #pragma omp parallel for
700 for (
int i = 0; i <
_fNumPar; ++i) {
713 #pragma omp parallel for
715 for (
int i = 0; i <
PCAObj->GetNumberPCAedParameters(); ++i)
718 if (
PCAObj->IsParameterFixedPCA(i)) {
737 #pragma omp parallel for
739 for (
int i = 0; i <
_fNumPar; ++i) {
741 #pragma GCC diagnostic push
742 #pragma GCC diagnostic ignored "-Wuseless-cast"
744 #pragma GCC diagnostic pop
758 #pragma omp parallel for
760 for (
int i = 0; i <
_fNumPar; ++i) {
773 #pragma GCC diagnostic push
774 #pragma GCC diagnostic ignored "-Wuseless-cast"
779 #pragma GCC diagnostic push
780 #pragma GCC diagnostic ignored "-Wuseless-cast"
783 }
else if (
_fPropVal[index] < LowBound) {
786 #pragma GCC diagnostic pop
796 #pragma GCC diagnostic pop
802 for (
int i = 0; i <
_fNumPar; i++) {
816 MACH3LOG_INFO(
"{:<30} {:<10} {:<10} {:<10}",
"Name",
"Prior",
"Current",
"Proposed");
817 for (
int i = 0; i <
_fNumPar; ++i) {
831 #pragma omp parallel for reduction(+:logL)
843 for (
int j = 0; j <= i; ++j) {
846 double scale = (i != j) ? 1. : 0.5;
859 #pragma omp parallel for reduction(+:NOutside)
884 #pragma GCC diagnostic push
885 #pragma GCC diagnostic ignored "-Wuseless-cast"
889 for (
int i = 0; i <
_fNumPar; i++) {
894 if (pars.size() != size_t(
_fNumPar)) {
898 int parsSize = int(pars.size());
899 for (
int i = 0; i < parsSize; i++) {
901 if(std::isnan(pars[i])) {
912 PCAObj->TransferToParam();
914 #pragma GCC diagnostic pop
921 for (
int i = 0; i <
_fNumPar; ++i) {
931 for (
int i = 0; i <
_fNumPar; ++i) {
944 MACH3LOG_ERROR(
"You are trying so set StepScale to 0 or negative this will not work");
950 const double SuggestedScale = 2.38/std::sqrt(
_fNumPar);
951 if(std::fabs(scale - SuggestedScale)/SuggestedScale > 1) {
952 MACH3LOG_WARN(
"Defined Global StepScale is {}, while suggested suggested {}", scale, SuggestedScale);
1054 MACH3LOG_WARN(
"I couldn't find parameter with name {}, therefore will not fix it", name);
1065 MACH3LOG_WARN(
"I couldn't find parameter with name {}, therefore don't know if it fixed", name);
1091 if (
int(stepscale.size()) !=
_fNumPar)
1093 MACH3LOG_WARN(
"Stepscale vector not equal to number of parameters. Quitting..");
1094 MACH3LOG_WARN(
"Size of argument vector: {}", stepscale.size());
1099 for (
int iParam = 0 ; iParam <
_fNumPar; iParam++) {
1108 MACH3LOG_INFO(
"============================================================");
1110 for (
int iParam = 0; iParam <
_fNumPar; iParam++) {
1113 MACH3LOG_INFO(
"============================================================");
1131 std::vector<double> stepScales(
_fNumPar);
1132 for (
int i = 0; i <
_fNumPar; i++) {
1143 MACH3LOG_ERROR(
"Parameter skip adapt flags not set, cannot set individual step scales for skipped parameters.");
1147 for (
int i = 0; i <
_fNumPar; i++) {
1152 MACH3LOG_INFO(
"Updating individual step scales for non-adapting parameters to cancel global step scale change.");
1162 if (cov ==
nullptr) {
1163 MACH3LOG_ERROR(
"Could not find covariance matrix you provided to {}", __func__);
1167 if (
covMatrix->GetNrows() != cov->GetNrows()) {
1168 MACH3LOG_ERROR(
"Matrix given for throw Matrix is not the same size as the covariance matrix stored in object!");
1174 throwMatrix =
static_cast<TMatrixDSym*
>(cov->Clone());
1182 #pragma omp parallel for collapse(2)
1194 TMatrixDSym
const &subcov) {
1196 if ((last_index - first_index) >= subcov.GetNrows()) {
1197 MACH3LOG_ERROR(
"Trying to SetSubThrowMatrix into range: ({},{}) with a "
1198 "submatrix with only {} rows {}",
1199 first_index, last_index, subcov.GetNrows(), __func__);
1203 TMatrixDSym *current_ThrowMatrix =
1205 for (
int i = first_index; i <= last_index; ++i) {
1206 for (
int j = first_index; j <= last_index; ++j) {
1207 current_ThrowMatrix->operator()(i, j) =
1208 subcov(i - first_index, j - first_index);
1213 delete current_ThrowMatrix;
1229 MACH3LOG_ERROR(
"PCA has been enabled and now trying to enable Adaption. Right now both configuration don't work with each other");
1233 MACH3LOG_ERROR(
"Adaptive Handler has already been initialise can't do it again so skipping.");
1243 std::vector<std::string> params_to_skip = GetFromManager<std::vector<std::string>>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ParametersToSkip"], {});
1246 for (
int i = 0; i <
_fNumPar; ++i) {
1247 for (
const auto& name : params_to_skip) {
1257 double max_correlation = 0.01;
1258 for (
int i = 0; i <
_fNumPar; ++i) {
1259 for (
int j = 0; j <= i; ++j) {
1263 if(std::fabs(corr) > max_correlation) {
1264 MACH3LOG_ERROR(
"Correlation between skipped parameter {} ({}) and non-skipped parameter {} ({}) is {:.6e}, above the allowed threshold of {:.6e}.",
1293 if(GetFromManager<bool>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"UseExternalMatrix"],
false, __FILE__ , __LINE__)) {
1295 auto external_file_name = GetFromManager<std::string>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ExternalMatrixFileName"],
"", __FILE__ , __LINE__);
1296 auto external_matrix_name = GetFromManager<std::string>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ExternalMatrixName"],
"", __FILE__ , __LINE__);
1297 auto external_mean_name = GetFromManager<std::string>(adapt_manager[
"AdaptionOptions"][
"Covariance"][
matrixName][
"ExternalMeansName"],
"", __FILE__ , __LINE__);
1307 MACH3LOG_INFO(
"Successfully Set External Throw Matrix Stored in {}", external_file_name);
1310 if (!success)
return;
1355 TMatrixDSym* update_matrix =
static_cast<TMatrixDSym*
>(
AdaptiveHandler->GetAdaptiveCovariance()->Clone());
1377 TMatrixDSym* cov_trans = cov;
1379 TMatrixDSym cov_sym = 0.5*(*cov+*cov_trans);
1382 TDecompSVD cov_sym_svd=TDecompSVD(cov_sym);
1383 if(!cov_sym_svd.Decompose()){
1384 MACH3LOG_WARN(
"Cannot do SVD on input matrix, trying MakePosDef() first!");
1388 TMatrixD cov_sym_v = cov_sym_svd.GetV();
1389 TMatrixD cov_sym_vt = cov_sym_v;
1392 TVectorD cov_sym_sigvect = cov_sym_svd.GetSig();
1394 const Int_t nCols = cov_sym_v.GetNcols();
1395 TMatrixDSym cov_sym_sig(nCols);
1396 TMatrixDDiag cov_sym_sig_diag(cov_sym_sig);
1397 cov_sym_sig_diag=cov_sym_sigvect;
1400 TMatrixDSym cov_sym_polar = cov_sym_sig.SimilarityT(cov_sym_vt);
1403 TMatrixDSym cov_closest_approx = 0.5*(cov_sym+cov_sym_polar);
1408 *cov = cov_closest_approx;
1418 hMatrix->SetDirectory(
nullptr);
1421 hMatrix->SetBinContent(i+1, i+1, 1.);
1427 #pragma omp parallel for
1431 for(
int j = 0; j <= i; j++)
1434 hMatrix->SetBinContent(i+1, j+1, Corr);
1435 hMatrix->SetBinContent(j+1, i+1, Corr);
1455 for (YAML::Node param : copyNode[
"Systematics"])
1462 std::ofstream fout(
"Modified_Matrix.yaml");
1474 std::string SampleNameCopy = SampleName;
1475 std::transform(SampleNameCopy.begin(), SampleNameCopy.end(), SampleNameCopy.begin(), ::tolower);
1478 if (SampleNameCopy.find(
'*') != std::string::npos) {
1479 MACH3LOG_ERROR(
"Wildcards ('*') are not supported in sample name: '{}'", SampleName);
1483 bool Applies =
false;
1485 for (
size_t i = 0; i <
_fSampleNames[SystIndex].size(); i++) {
1488 std::transform(pattern.begin(), pattern.end(), pattern.begin(), ::tolower);
1491 std::string regexPattern =
"^" + std::regex_replace(pattern, std::regex(
"\\*"),
".*") +
"$";
1493 std::regex regex(regexPattern);
1494 if (std::regex_match(SampleNameCopy, regex)) {
1498 }
catch (
const std::regex_error& e) {
1510 if(
Tunes ==
nullptr) {
1511 MACH3LOG_ERROR(
"Tunes haven't been initialised, which are being loaded from YAML, have you used some deprecated constructor");
1514 auto Values =
Tunes->GetTune(TuneName);
1521 std::vector<double>& BranchValues,
1523 const std::vector<std::string>& FancyNames) {
1531 if(FancyNames.size() != 0){
1536 bool matched =
false;
1537 for (
size_t iPar = 0; iPar < FancyNames.size(); ++iPar) {
1540 PosteriorFile->SetBranchStatus(
BranchNames[i].c_str(),
true);
1541 PosteriorFile->SetBranchAddress(
BranchNames[i].c_str(), &BranchValues[i]);
1554 if (!PosteriorFile->GetBranch(
BranchNames[i].c_str())) {
1558 PosteriorFile->SetBranchStatus(
BranchNames[i].c_str(),
true);
1559 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
std::vector< TString > BranchNames
Type Get(const YAML::Node &node, const std::string File, const int Line)
Get content of config file.
#define M3OpenConfig(filename)
Macro to simplify calling LoadYaml with file and line info.
#define GetBounds(filename)
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.
double * randParams
Random number taken from gaussian around prior error used for corr_throw.
void SetName(const std::string &name)
Set matrix name.
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.
std::vector< int > FlipParameterIndex
Indices of parameters with flip symmetry.
bool AppliesToSample(const int SystIndex, const std::string &SampleName) const
Check if parameter is affecting given sample name.
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.
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.
int GetParIndex(const std::string &name) const
Get index based on name.
void ReserveMemory(const int size)
Initialise vectors with parameters information.
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.
void Init(const std::string &name, const std::string &file)
Initialisation of the class using matrix from root file.
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.
std::vector< double > FlipParameterPoint
Central points around which parameters are flipped.
void UpdateAdaptiveCovariance()
Method to update adaptive MCMC .
void SetThrowMatrix(TMatrixDSym *cov)
Use new throw matrix, used in adaptive MCMC.
std::string GetParFancyName(const int i) const
Get fancy name of the Parameter.
std::vector< double > _fError
Prior error on the parameter.
TH2D * GetCorrelationMatrix()
KS: Convert covariance matrix to correlation matrix and return TH2D which can be used for fancy plott...
void SetFreeAllParameters()
Set all parameters to be treated as free.
void SetFixParameter(const int i)
Set parameter to be fixed at prior value.
void PrintNominal() const
Print prior value for every parameter.
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.
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 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 FlipParameterValue(const int index, const double FlipPoint)
KS: Flip parameter around given value, for example mass ordering around 0.
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< double > _fCurrVal
Current value of the parameter.
void PrintNominalCurrProp() const
Print prior, current and proposed value for each parameter.
ParameterHandlerBase(const std::vector< std::string > &YAMLFile, std::string name, double threshold=-1, int FirstPCAdpar=-999, int LastPCAdpar=-999)
ETA - constructor for a YAML file.
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.
std::string GetName() const
Get name of covariance.
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.
double GetParInit(const int i) const
Get prior parameter 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.
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.
std::vector< std::unique_ptr< TRandom3 > > random_number
KS: Set Random numbers for each thread so each thread has different seed.
void MakePosDef(TMatrixDSym *cov=nullptr)
Make matrix positive definite by adding small values to diagonal, necessary for inverting matrix.
void SpecialStepProposal()
Perform Special Step Proposal.
int PrintLength
KS: This is used when printing parameters, sometimes we have super long parameters name,...
void CorrelateSteps() _noexcept_
Use Cholesky throw matrix for better step proposal.
std::vector< std::vector< std::string > > _fSampleNames
Tells to which samples object param should be applied.
int CheckBounds() const _noexcept_
Check if parameters were proposed outside physical boundary.
void ToggleFixAllParameters()
Toggle fixing parameters at prior values.
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...
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.
int GetThreadIndex()
thread index inside parallel loop
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.
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.
void 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.
int GetNThreads()
number of threads which we need for example for TRandom3
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...