diff --git a/CMakeLists.txt b/CMakeLists.txt index 109713cf..b065718a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,6 +142,7 @@ add_subdirectory(CIValidations) add_subdirectory(Tutorial) add_subdirectory(SplinesTutorial) add_subdirectory(SamplesTutorial) +add_subdirectory(MaCh3Plugins) # MOVE THIS BLOCK HERE - BEFORE add_subdirectory(python) # After MaCh3 is added/found, determine MaCh3_PREFIX diff --git a/MaCh3Plugins/CMakeLists.txt b/MaCh3Plugins/CMakeLists.txt new file mode 100644 index 00000000..9b2ccd23 --- /dev/null +++ b/MaCh3Plugins/CMakeLists.txt @@ -0,0 +1,19 @@ +add_custom_target(TutorialPlugins) + +foreach(app + MCMCTutorialPlugin + ) + + add_library(${app} SHARED ${app}.cpp) + + target_link_libraries(${app} PRIVATE MaCh3Tutorial::SamplesTutorial MaCh3::All) + target_include_directories(${app} PUBLIC $) + + +# add_executable(${app} ${app}.cpp) +# target_link_libraries(${app} MaCh3Tutorial::ValidationsUtils MaCh3Tutorial::SamplesTutorial) + +# add_dependencies(TutorialApps ${app}) +# install(TARGETS ${app} DESTINATION bin) +endforeach(app) + diff --git a/MaCh3Plugins/MCMCTutorialPlugin.cpp b/MaCh3Plugins/MCMCTutorialPlugin.cpp new file mode 100644 index 00000000..c6662d6c --- /dev/null +++ b/MaCh3Plugins/MCMCTutorialPlugin.cpp @@ -0,0 +1,83 @@ +// MaCh3 includes +#include "cli/api/plugin.hpp" +#include "Fitters/MaCh3Factory.h" +#include "SamplesTutorial/SampleHandlerTutorial.h" +// #include "Mach3Plugins/MCMCTutorialPlugin.hpp" + +namespace M3{ + + class MCMCTutorialPlugin: public IPlugin{ + + public: + virtual ~MCMCTutorialPlugin(){ + if (m_parser) { delete m_parser; } + } + MaCh3ArgumentParser* get_parser(){ + m_parser = new MaCh3ArgumentParser("tutorial", "1.0", argparse::default_arguments::help); + m_parser->add_argument("config") + .help("Config file.") + .metavar("CONFIG") + .required(); + m_parser->add_argument("--MCMCSteps") + .scan<'d', int>() + .help("specify the number of steps."); + m_parser->add_argument("--override") + .append() + .help("specify any config overrides."); + return m_parser; + } + + int run(){ + std::string config = m_parser->get("config"); + + std::vector args = { m_parser->name(), config }; + + if (auto fn = m_parser->present("--MCMCSteps")) { + args.push_back("General:MCMC:NSteps:" + std::to_string(*fn)); + } + + std::vector overrides = m_parser->get>("--override"); + for (const std::string& override_str : overrides) { + args.push_back(override_str); + } + + // Convert to char* array + std::vector argv; + argv.reserve(args.size()); + for (auto& s : args) + argv.push_back(s.data()); + + // Initialise manger responsible for config handling + auto FitManager = MaCh3ManagerFactory(argv.size(), argv.data()); + + // Initialise covariance class reasonable for Systematics + auto xsec = MaCh3CovarianceFactory(FitManager.get(), "Xsec"); + + // Initialise samplePDF + auto SampleConfig = Get>(FitManager->raw()["General"]["TutorialSamples"], __FILE__ , __LINE__); + auto mySamples = MaCh3SampleHandlerFactory(SampleConfig, xsec.get()); + + // Create MCMC Class + std::unique_ptr MaCh3Fitter = MaCh3FitterFactory(FitManager.get()); + // Add covariance to MCM + MaCh3Fitter->AddSystObj(xsec.get()); + for (size_t i = 0; i < SampleConfig.size(); ++i) { + MaCh3Fitter->AddSampleHandler(mySamples[i]); + } + // Run MCMCM + MaCh3Fitter->RunMCMC(); + + for (size_t i = 0; i < SampleConfig.size(); ++i) { + delete mySamples[i]; + } + return 0; + } + + + private: + MaCh3ArgumentParser* m_parser; + }; + +}; + +MACH3_REGISTER_PLUGIN(M3::MCMCTutorialPlugin) diff --git a/cmake/Templates/setup.MaCh3Tutorial.sh.in b/cmake/Templates/setup.MaCh3Tutorial.sh.in index db250e63..23c2e47e 100755 --- a/cmake/Templates/setup.MaCh3Tutorial.sh.in +++ b/cmake/Templates/setup.MaCh3Tutorial.sh.in @@ -107,4 +107,6 @@ else fi fi +export MACH3_PLUGINS=${SETUPDIR}/MaCh3Plugins/libMCMCTutorialPlugin.so + unset SETUPDIR