R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
neuland_cli.cxx
Go to the documentation of this file.
1#include "R3BException.h"
3#include "R3BNeulandAppOptionJson.h" // NOLINT
6#include "R3BNeulandSimApp.h"
7#include <CLI/CLI.hpp>
8#include <cstddef>
9#include <cstdlib>
10#include <exception>
11#include <fairlogger/Logger.h>
12#include <fmt/core.h>
13#include <memory>
14#ifdef HAS_MPI
15#include <mpi.h>
16#endif
17
18auto main(int argc, char** argv) -> int
19{
20 auto is_failed = false;
21 auto num_proc = 0;
22 auto num_rank = 0;
23
24#ifdef HAS_MPI
25 MPI_Init(&argc, &argv);
26 MPI_Comm_size(MPI_COMM_WORLD, &num_proc);
27 MPI_Comm_rank(MPI_COMM_WORLD, &num_rank);
28#endif
29
30 auto app = std::unique_ptr<R3B::Neuland::CLIAbstract>{};
31 try
32 {
33 auto program_options = CLI::App{ "Neuland command line interface" };
34
35 auto instantiate_app = [&app, &program_options](std::size_t)
36 {
37 if (program_options.got_subcommand("sim"))
38 {
39 app = std::make_unique<R3B::Neuland::SimulationApplication>();
40 app->setup_options(*program_options.get_subcommand("sim"));
41 return;
42 }
43 if (program_options.got_subcommand("ana"))
44 {
45 app = std::make_unique<R3B::Neuland::AnalysisApplication>();
46 app->setup_options(*program_options.get_subcommand("ana"));
47 return;
48 }
49 if (program_options.got_subcommand("basepar"))
50 {
51 app = std::make_unique<R3B::Neuland::BaseParCreator>();
52 app->setup_options(*program_options.get_subcommand("basepar"));
53 return;
54 }
55 };
56
57 program_options.require_subcommand(1, 1);
58 program_options.add_subcommand("sim", "Run simulation application.")->preparse_callback(instantiate_app);
59 program_options.add_subcommand("ana", "Run analysis application.")->preparse_callback(instantiate_app);
60 program_options.add_subcommand("basepar", "Create a base parameter for an experiment.")
61 ->preparse_callback(instantiate_app);
62
63 CLI11_PARSE(program_options, argc, argv);
64
65 if (app == nullptr)
66 {
67 throw R3B::runtime_error("Application is not instantiated!");
68 }
69
70 app->post_parse();
71
72 if (app->has_print_default_options())
73 {
74 app->print_options();
75 return EXIT_SUCCESS;
76 }
77 if (app->has_dump())
78 {
79 app->dump_options();
80 return EXIT_SUCCESS;
81 }
82
83 app->set_rank_num(num_rank);
84 app->set_num_of_procs(num_proc);
85 app->init();
86 app->run();
87 }
88 catch (const std::exception& ex)
89 {
90 fmt::println("");
91 LOGP(error, "Exception ocurred: \n\n{}\n", ex.what());
92
93 if (app == nullptr)
94 {
95 return EXIT_FAILURE;
96 }
97
98 is_failed = true;
99 app->set_fail(is_failed);
100 }
101
102#ifdef HAS_MPI
103 MPI_Finalize();
104#endif
105
106 if (is_failed)
107 {
108 return EXIT_FAILURE;
109 }
110 return EXIT_SUCCESS;
111}
auto main(int argc, char **argv) -> int