MaCh3 2.2.1
Reference Guide
Loading...
Searching...
No Matches
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)
 
std::unique_ptr< managerMaCh3ManagerFactory (int argc, char **argv)
 

Function Documentation

◆ MaCh3FitterFactory()

std::unique_ptr< FitterBase > MaCh3FitterFactory ( manager fitMan)

Definition at line 5 of file MaCh3Factory.cpp.

5 {
6// ********************************************
7 std::unique_ptr<FitterBase> MaCh3Fitter = nullptr;
8
9 auto Algorithm = GetFromManager<std::string>(fitMan->raw()["General"]["FittingAlgorithm"], "MCMC");
10
11 if(Algorithm == "MCMC") {
12 MaCh3Fitter = std::make_unique<mcmc>(fitMan);
13 } else if (Algorithm == "PSO") {
14 MaCh3Fitter = std::make_unique<PSO>(fitMan);
15 } else if (Algorithm == "Minuit2") {
16 #ifdef MaCh3_MINUIT2
17 MaCh3Fitter = std::make_unique<MinuitFit>(fitMan);
18 #else
19 MACH3LOG_ERROR("Trying to use Minuit2 however MaCh3 was compiled without Minuit2 support");
20 throw MaCh3Exception(__FILE__ , __LINE__ );
21 #endif
22 } else {
23 MACH3LOG_ERROR("You want to use algorithm {}, I don't recognize it, sry", Algorithm);
24 throw MaCh3Exception(__FILE__ , __LINE__ );
25 }
26 return MaCh3Fitter;
27}
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:25
Custom exception class for MaCh3 errors.
YAML::Node const & raw()
Return config.
Definition: Manager.h:41

◆ MaCh3ManagerFactory()

std::unique_ptr< manager > MaCh3ManagerFactory ( int  argc,
char **  argv 
)
Todo:
KS: May need some recursive magic to reduce amount of hardcoding

Definition at line 30 of file MaCh3Factory.cpp.

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