46 MACH3LOG_ERROR(
"Where config.yaml is a valid config file, compatible with the manager class (manager/manager.cpp/h)");
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]);
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.");
68 YAML::Node merged =
MergeNodes(config1, config2);
69 auto FitManager = std::make_unique<manager>(merged);
75 auto FitManager = std::make_unique<manager>(argv[1]);
78 auto SanityOverwrite = [](
const std::string& Name) {
79 if (Name.find(
"Systematics") != std::string::npos ||
80 Name.find(
"Samples") != std::string::npos)
82 MACH3LOG_CRITICAL(
"You are overwriting settings ({}) that are highly likely intended to be committed.", Name);
87 for (
int i = 2; i < argc; ++i)
89 const std::string arg = argv[i];
90 const size_t colonCount = std::count(arg.begin(), arg.end(),
':');
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);
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);
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);
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);
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);
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);
130 MACH3LOG_ERROR(
"Expected format:Section:Key:Key:Value, Section:Key:Value or Section:Value");
#define MACH3LOG_CRITICAL
YAML::Node MergeNodes(YAML::Node a, YAML::Node b)
KS: Recursively merges two YAML nodes.
#define M3OpenConfig(filename)
Macro to simplify calling LoadYaml with file and line info.