MaCh3  2.6.1
Reference Guide
Functions
MaCh3Factory.cpp File Reference
#include "Fitters/MaCh3Factory.h"
Include dependency graph for MaCh3Factory.cpp:

Go to the source code of this file.

Functions

std::unique_ptr< FitterBaseMaCh3FitterFactory (Manager *fitMan)
 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...
 

Function Documentation

◆ 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:
DL: Should probably replace this with something that doesn't require modifying core code
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  std::string arg2;
51  if (argc > 2) {
52  arg2 = argv[2];
53  }
54  // Check if we are using --override mode, or for some CLI whether we simply passed .yaml
55  if ((argc == 4 && arg2 == "--override") ||
56  (argc == 3 && arg2.size() >= 5 && arg2.compare(arg2.size() - 5, 5, ".yaml") == 0)) {
57  std::string overrideFile;
58 
59  if (arg2 == "--override") {
60  overrideFile = argv[3];
61  } else {
62  overrideFile = arg2;
63  }
64  MACH3LOG_INFO("Merging configuration files: base config '{}', override config '{}'. "
65  "Options in '{}' will take precedence over '{}'.",
66  argv[1], overrideFile, overrideFile, argv[1]);
67 
68  // Load the two YAML files
69  YAML::Node config1 = M3OpenConfig(argv[1]);
70  YAML::Node config2 = M3OpenConfig(overrideFile);
71 
72  // Merge them
73  YAML::Node merged = MergeNodes(config1, config2);
74  auto FitManager = std::make_unique<Manager>(merged);
75 
76  return FitManager;
77  }
78 
79  // Initialise manger responsible for config handling
80  auto FitManager = std::make_unique<Manager>(argv[1]);
81 
82  //KS: Lambda to make sure we are not overwriting setting which should be committed
83  auto SanityOverwrite = [](const std::string& Name) {
84  if (Name.find("Systematics") != std::string::npos ||
85  Name.find("Samples") != std::string::npos)
86  {
87  MACH3LOG_CRITICAL("You are overwriting settings ({}) that are highly likely intended to be committed.", Name);
89  MACH3LOG_CRITICAL("If you're sure you want to do this, e.g. for testing or step size tuning, you can remove the throw that lives here:");
90  throw MaCh3Exception(__FILE__ , __LINE__ );
91  }
92  };
93 
94  for (int i = 2; i < argc; ++i)
95  {
96  const std::string arg = argv[i];
97  const size_t colonCount = std::count(arg.begin(), arg.end(), ':');
98 
100  if (colonCount == 1) {
101  const size_t firstColon = arg.find(':');
102  const std::string section = arg.substr(0, firstColon);
103  const std::string value = arg.substr(firstColon + 1);
104 
105  MACH3LOG_INFO("Overriding setting: Section={}, Value={}", section, value);
106  SanityOverwrite(section);
107  FitManager->OverrideSettings(section, value);
108  } else if (colonCount == 2) {
109  const size_t firstColon = arg.find(':');
110  const size_t secondColon = arg.find(':', firstColon + 1);
111 
112  const std::string section = arg.substr(0, firstColon);
113  const std::string key = arg.substr(firstColon + 1, secondColon - firstColon - 1);
114  const std::string value = arg.substr(secondColon + 1);
115 
116  MACH3LOG_INFO("Overriding setting: Section={}, Key={}, Value={}", section, key, value);
117  SanityOverwrite(section);
118  SanityOverwrite(key);
119  FitManager->OverrideSettings(section, key, value);
120  } else if (colonCount == 3) {
121  const size_t firstColon = arg.find(':');
122  const size_t secondColon = arg.find(':', firstColon + 1);
123  const size_t thridColon = arg.find(':', secondColon + 1);
124 
125  const std::string section = arg.substr(0, firstColon);
126  const std::string key = arg.substr(firstColon + 1, secondColon - firstColon - 1);
127  const std::string key2 = arg.substr(secondColon + 1, thridColon - secondColon - 1);
128  const std::string value = arg.substr(thridColon + 1);
129 
130  MACH3LOG_INFO("Overriding setting: Section={}, Key={}, Key={}, Value={}", section, key, key2, value);
131  SanityOverwrite(section);
132  SanityOverwrite(key);
133  SanityOverwrite(key2);
134  FitManager->OverrideSettings(section, key, key2, value);
135  } else if (colonCount == 4) {
136  const size_t firstColon = arg.find(':');
137  const size_t secondColon = arg.find(':', firstColon + 1);
138  const size_t thirdColon = arg.find(':', secondColon + 1);
139  const size_t fourthColon = arg.find(':', thirdColon + 1);
140 
141  const std::string section = arg.substr(0, firstColon);
142  const std::string key = arg.substr(firstColon + 1, secondColon - firstColon - 1);
143  const std::string key2 = arg.substr(secondColon + 1, thirdColon - secondColon - 1);
144  const std::string key3 = arg.substr(thirdColon + 1, fourthColon - thirdColon - 1);
145  const std::string value = arg.substr(fourthColon + 1);
146 
148  "Overriding setting: Section={}, Key={}, Key={}, Key={}, Value={}",
149  section, key, key2, key3, value);
150 
151  SanityOverwrite(section);
152  SanityOverwrite(key);
153  SanityOverwrite(key2);
154  SanityOverwrite(key3);
155 
156  FitManager->OverrideSettings(section, key, key2, key3, value);
157  } else {
158  MACH3LOG_ERROR("Invalid override argument format: {}", arg);
159  MACH3LOG_ERROR("Expected format:Section:Key:Key:Value, Section:Key:Value or Section:Value");
160  throw MaCh3Exception(__FILE__, __LINE__);
161  }
162  }
163  return FitManager;
164 }
#define MACH3LOG_CRITICAL
Definition: MaCh3Logger.h:38
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:37
#define MACH3LOG_INFO
Definition: MaCh3Logger.h:35
YAML::Node MergeNodes(const YAML::Node &a, const YAML::Node &b)
KS: Recursively merges two YAML nodes.
Definition: YamlHelper.h:435
#define M3OpenConfig(filename)
Macro to simplify calling LoadYaml with file and line info.
Definition: YamlHelper.h:590
Custom exception class used throughout MaCh3.