MaCh3  2.4.2
Reference Guide
Functions
MaCh3Factory.h File Reference

Factory methods for MaCh3 software which streamline initialisation of different objects. More...

#include "Fitters/FitterBase.h"
#include "Fitters/MR2T2.h"
#include "Fitters/DelayedMR2T2.h"
#include "Fitters/PSO.h"
#include "Fitters/LikelihoodFit.h"
#include "Parameters/ParameterHandlerGeneric.h"
Include dependency graph for MaCh3Factory.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

std::unique_ptr< FitterBaseMaCh3FitterFactory (Manager *FitManager)
 MaCh3 Factory initiates one of implemented fitting algorithms. More...
 
std::unique_ptr< ManagerMaCh3ManagerFactory (int argc, char **argv)
 Initializes the config Manager class and allows overriding settings via command-line arguments. More...
 
template<typename CovType >
std::unique_ptr< CovType > MaCh3CovarianceFactory (Manager *FitManager, const std::string &PreFix)
 Factory function for creating a covariance class for systematic handling. More...
 
template<typename SampleType >
std::vector< SampleType * > MaCh3SampleHandlerFactory (const std::vector< std::string > &SampleConfig, ParameterHandlerGeneric *xsec)
 Factory function for creating SampleHandler and initialisation with systematic. More...
 

Detailed Description

Factory methods for MaCh3 software which streamline initialisation of different objects.

Author
Kamil Skwarczynski

Definition in file MaCh3Factory.h.

Function Documentation

◆ MaCh3CovarianceFactory()

template<typename CovType >
std::unique_ptr<CovType> MaCh3CovarianceFactory ( Manager FitManager,
const std::string &  PreFix 
)

Factory function for creating a covariance class for systematic handling.

Parameters
FitManagerPointer to the Manager class that holds the configuration settings.
PreFixPrefix, for example Xsec, then code will look for XsecCovFile
Returns
Pointer to the initialized covarianceXsec matrix object.
Note
Example YAML configuration:
General:
Systematics:
XsecCovName: "xsec_cov"
XsecCovFile: ["inputs/blarb1.yaml",
"inputs/blarb2.yaml"]
XsecFix: ["Param_0",
"Param_1"]
XsecPCAThreshold: -1
#XsecPCAThreshold: 0.00001
XsecPCAParams: [-999, -999]
XsecStepScale: 0.0075
std::unique_ptr< CovType > MaCh3CovarianceFactory(Manager *FitManager, const std::string &PreFix)
Factory function for creating a covariance class for systematic handling.
Definition: MaCh3Factory.h:70
Todo:
add adaptive stuff

Definition at line 70 of file MaCh3Factory.h.

70  {
71 // ********************************************
72  // config for our matrix
73  YAML::Node Settings = FitManager->raw()["General"]["Systematics"];
74  auto CovMatrixName = Get<std::string>(Settings[std::string(PreFix) + "CovName"], __FILE__, __LINE__);
75  MACH3LOG_INFO("Initialising {} matrix", CovMatrixName);
76 
77  // yaml files initialising out matrix
78  auto CovMatrixFile = Get<std::vector<std::string>>(Settings[std::string(PreFix) + "CovFile"], __FILE__, __LINE__);
79 
80  // PCA threshold, -1 means no pca
81  auto PCAThreshold = GetFromManager<int>(Settings[std::string(PreFix) + "PCAThreshold"], -1);
82  // do we pca whole matrix or only submatrix
83  auto PCAParamRegion = GetFromManager<std::vector<int>>(Settings[std::string(PreFix) + "PCAParams"], {-999, -999});
84 
85  auto CovObject = std::make_unique<CovType>(CovMatrixFile, CovMatrixName, PCAThreshold, PCAParamRegion[0], PCAParamRegion[1]);
86 
87  // Fill the parameter values with their nominal values
88  // should _ALWAYS_ be done before overriding with fix or flat
89  CovObject->SetParameters();
90 
91  auto FixParams = GetFromManager<std::vector<std::string>>(Settings[std::string(PreFix) + "Fix"], {});
92 
93  // Fixed CovObject parameters loop
94  if (FixParams.size() == 1 && FixParams.at(0) == "All") {
95  for (int j = 0; j < CovObject->GetNumParams(); j++) {
96  CovObject->ToggleFixParameter(j);
97  }
98  } else {
99  for (unsigned int j = 0; j < FixParams.size(); j++) {
100  CovObject->ToggleFixParameter(FixParams.at(j));
101  }
102  }
103 
104  if (CheckNodeExists(Settings, std::string(PreFix) + "Tune"))
105  {
106  CovObject->SetTune(Get<std::string>(Settings[std::string(PreFix) + "Tune"], __FILE__, __LINE__));
107  }
108 
109  //Global step scale for matrix
110  auto StepScale = Get<double>(Settings[std::string(PreFix) + "StepScale"], __FILE__, __LINE__);
111 
112  CovObject->SetStepScale(StepScale);
113 
114  // Adaptive MCMC stuff
115  if (CheckNodeExists(FitManager->raw(), "AdaptionOptions")) {
116  CovObject->InitialiseAdaption(FitManager->raw());
117  }
118 
119  return CovObject;
120 }
#define MACH3LOG_INFO
Definition: MaCh3Logger.h:35
bool CheckNodeExists(const YAML::Node &node, Args... args)
KS: Wrapper function to call the recursive helper.
Definition: YamlHelper.h:60
YAML::Node const & raw() const
Return config.
Definition: Manager.h:41

◆ MaCh3ManagerFactory()

std::unique_ptr<Manager> MaCh3ManagerFactory ( int  argc,
char **  argv 
)

Initializes the config Manager class and allows overriding settings via command-line arguments.

Parameters
argcnumber of arguments
argvname of arguments
Returns
A unique pointer to the initialized Manager instance with optional overrides applied.
Note
Usage examples:
./bin/MCMCTutorial Inputs/FitterConfig.yaml General:OutputFile:blarb.root
./bin/MCMCTutorial Inputs/FitterConfig.yaml General:OutputFile:blarb.root General:MCMC:NSteps:50000
Todo:
KS: May need some recursive magic to reduce amount of hardcoding

Definition at line 41 of file MaCh3Factory.cpp.

41  {
42 // ********************************************
43  if (argc < 2) {
44  MACH3LOG_ERROR("Wrong usage of MaCh3 executable!");
45  MACH3LOG_ERROR("Syntax is $: {} config.yaml", argv[0]);
46  MACH3LOG_ERROR("Where config.yaml is a valid config file, compatible with the Manager class (Manager/Manager.cpp/h)");
47  throw MaCh3Exception(__FILE__, __LINE__);
48  }
49 
50  // Check if we are using --override mode
51  if (argc >= 4 && std::string(argv[2]) == "--override") {
52  const std::string overrideFile = argv[3];
53  MACH3LOG_INFO("Merging configuration files: base config '{}', override config '{}'. "
54  "Options in '{}' will take precedence over '{}'.",
55  argv[1], overrideFile, overrideFile, argv[1]);
56 
57  if(argc > 4) {
58  MACH3LOG_ERROR("Too many arguments provided when using '--override'. "
59  "Expected only two config files. "
60  "If using override feature, you cannot provide any additional arguments.");
61  throw MaCh3Exception(__FILE__, __LINE__);
62  }
63  // Load the two YAML files
64  YAML::Node config1 = M3OpenConfig(argv[1]);
65  YAML::Node config2 = M3OpenConfig(overrideFile);
66 
67  // Merge them
68  YAML::Node merged = MergeNodes(config1, config2);
69  auto FitManager = std::make_unique<Manager>(merged);
70 
71  return FitManager;
72  }
73 
74  // Initialise manger responsible for config handling
75  auto FitManager = std::make_unique<Manager>(argv[1]);
76 
77  //KS: Lambda to make sure we are not overwriting setting which should be committed
78  auto SanityOverwrite = [](const std::string& Name) {
79  if (Name.find("Systematics") != std::string::npos ||
80  Name.find("Samples") != std::string::npos)
81  {
82  MACH3LOG_CRITICAL("You are overwriting settings ({}) that are highly likely intended to be committed.", Name);
83  throw MaCh3Exception(__FILE__ , __LINE__ );
84  }
85  };
86 
87  for (int i = 2; i < argc; ++i)
88  {
89  const std::string arg = argv[i];
90  const size_t colonCount = std::count(arg.begin(), arg.end(), ':');
91 
93  if (colonCount == 1) {
94  const size_t firstColon = arg.find(':');
95  const std::string section = arg.substr(0, firstColon);
96  const std::string value = arg.substr(firstColon + 1);
97 
98  MACH3LOG_INFO("Overriding setting: Section={}, Value={}", section, value);
99  SanityOverwrite(section);
100  FitManager->OverrideSettings(section, value);
101  } else if (colonCount == 2) {
102  const size_t firstColon = arg.find(':');
103  const size_t secondColon = arg.find(':', firstColon + 1);
104 
105  const std::string section = arg.substr(0, firstColon);
106  const std::string key = arg.substr(firstColon + 1, secondColon - firstColon - 1);
107  const std::string value = arg.substr(secondColon + 1);
108 
109  MACH3LOG_INFO("Overriding setting: Section={}, Key={}, Value={}", section, key, value);
110  SanityOverwrite(section);
111  SanityOverwrite(key);
112  FitManager->OverrideSettings(section, key, value);
113  } else if (colonCount == 3) {
114  const size_t firstColon = arg.find(':');
115  const size_t secondColon = arg.find(':', firstColon + 1);
116  const size_t thridColon = arg.find(':', secondColon + 1);
117 
118  const std::string section = arg.substr(0, firstColon);
119  const std::string key = arg.substr(firstColon + 1, secondColon - firstColon - 1);
120  const std::string key2 = arg.substr(secondColon + 1, thridColon - secondColon - 1);
121  const std::string value = arg.substr(thridColon + 1);
122 
123  MACH3LOG_INFO("Overriding setting: Section={}, Key={}, Key={}, Value={}", section, key, key2, value);
124  SanityOverwrite(section);
125  SanityOverwrite(key);
126  SanityOverwrite(key2);
127  FitManager->OverrideSettings(section, key, key2, value);
128  } else {
129  MACH3LOG_ERROR("Invalid override argument format: {}", arg);
130  MACH3LOG_ERROR("Expected format:Section:Key:Key:Value, Section:Key:Value or Section:Value");
131  throw MaCh3Exception(__FILE__, __LINE__);
132  }
133  }
134  return FitManager;
135 }
#define MACH3LOG_CRITICAL
Definition: MaCh3Logger.h:38
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:37
YAML::Node MergeNodes(const YAML::Node &a, const YAML::Node &b)
KS: Recursively merges two YAML nodes.
Definition: YamlHelper.h:434
#define M3OpenConfig(filename)
Macro to simplify calling LoadYaml with file and line info.
Definition: YamlHelper.h:589
Custom exception class used throughout MaCh3.

◆ MaCh3SampleHandlerFactory()

template<typename SampleType >
std::vector<SampleType*> MaCh3SampleHandlerFactory ( const std::vector< std::string > &  SampleConfig,
ParameterHandlerGeneric xsec 
)

Factory function for creating SampleHandler and initialisation with systematic.

Template Parameters
SampleTypeThe class type of the sample to create, e.g., SampleHandlerTutorial.
Parameters
SampleConfigPath to sample config.
xsecA pointer to a ParameterHandlerGeneric object for cross-section systematic settings.
Returns
Vector of SampleType object, initialized and ready for use.
Note
Example
auto mySamples = MaCh3SampleHandlerFactory<SampleHandlerTutorial>(SampleConfig, xsec);

Definition at line 135 of file MaCh3Factory.h.

136  {
137 // ********************************************
138  std::vector<SampleType*> Handlers(SampleConfig.size());
139  for (size_t i = 0; i < SampleConfig.size(); ++i)
140  {
141  // Instantiate the sample using the specified class type
142  SampleType* Sample = new SampleType(SampleConfig[i], xsec);
143  Sample->Reweight();
144 
145  for(int iSample = 0; iSample < Sample->GetNsamples(); iSample++)
146  {
147  // Obtain sample name and create a TString version for histogram naming
148  std::string name = Sample->GetSampleTitle(iSample);
149  TString NameTString = TString(name.c_str());
150 
151  // Clone the 1D histogram with a modified name
152  Sample->AddData(iSample, Sample->GetMCArray(iSample));
153  }
154  Handlers[i] = Sample;
155  }
156  return Handlers;
157 }