14#include <FairLogger.h>
15#include <FairParSet.h>
16#include <FairRtdbRun.h>
20#include <TCollection.h>
33 auto filenames_split(std::string_view namelist, std::string_view delimeter =
";") -> std::vector<std::string>
35 auto filenames = std::vector<std::string>{};
36 auto filename_begin = std::string::size_type{ 0 };
37 for (
auto filename_end = std::string::size_type{ 0 }; filename_end != std::string::npos;
38 filename_begin = filename_end + 1)
40 filename_end = namelist.find(delimeter, filename_begin);
41 auto filename = namelist.substr(filename_begin, filename_end - filename_begin);
42 filenames.emplace_back(filename);
47 void fill_pars(std::vector<FairParSet*>& pars, TDirectory* input)
49 auto* keys = input->GetListOfKeys();
50 for (
auto* key : TRangeDynCast<TKey>(keys))
52 auto* obj = key->ReadObj();
53 if (
auto* dir =
dynamic_cast<TDirectory*
>(obj); dir !=
nullptr)
57 else if (
auto* par =
dynamic_cast<FairParSet*
>(obj); par !=
nullptr)
64 auto get_par_run(TFile* root_file) -> FairRtdbRun*
66 auto* keys = root_file->GetListOfKeys();
67 for (
auto* key : TRangeDynCast<TKey>(keys))
69 if (
auto* par_run =
dynamic_cast<FairRtdbRun*
>(key->ReadObj()); par_run !=
nullptr)
77 auto make_default_par_version(FairParSet* par) -> std::unique_ptr<FairParVersion>
79 auto version = std::make_unique<FairParVersion>(par->GetName());
80 version->setRootVersion(1);
81 version->resetInputVersions();
85 void copy_par_version(FairRtdbRun* output_run, FairRtdbRun* input_run, FairParSet* par)
87 if (input_run !=
nullptr)
89 if (
auto* par_version = input_run->getParVersion(par->GetName()); par_version !=
nullptr)
91 output_run->addParVersion(par_version);
95 output_run->addParVersion(make_default_par_version(par).release());
98 void write_parameters(TFile* output, TFile* input)
100 auto pars = std::vector<FairParSet*>{};
101 fill_pars(pars, input);
103 auto* output_par_run = get_par_run(output);
104 auto* input_par_run = get_par_run(input);
105 if (output_par_run ==
nullptr)
110 for (
auto* par : pars)
112 R3BLOG(info, fmt::format(R
"(parameter "{}" is written to {}.)", par->GetName(), output->GetName()));
113 output->WriteObject<FairParSet>(par, par->GetName(), "overwrite");
114 copy_par_version(output_par_run, input_par_run, par);
117 output->WriteObject<FairRtdbRun>(output_par_run, output_par_run->GetName(),
"overwrite");
120 void merge_into_rootfile(TFile* output,
const std::vector<std::string>& filenames)
122 for (
const auto& filename : filenames)
124 auto inputfile = std::make_unique<TFile>(filename.c_str(),
"READ");
125 write_parameters(output, inputfile.get());
129 void initialize_output_file(TFile* output, std::string_view base)
131 auto base_file = std::make_unique<TFile>(base.data(),
"READ");
132 auto* par_run = get_par_run(base_file.get());
133 if (par_run ==
nullptr)
135 throw R3B::runtime_error(fmt::format(R
"(Base file {} doesn't contain any FairRtdbRun!)", base));
137 output->WriteObject<FairRtdbRun>(par_run, par_run->GetName(), "overwrite");
142auto main(
int argc,
char** argv) ->
int
145 using namespace std::string_literals;
149 auto help = programOptions.create_option<
bool>(
"help,h",
"help message",
false);
150 auto logLevel = programOptions.create_option<std::string>(
"logLevel,v",
"set log level of fairlog",
"info");
151 auto parameter_out = programOptions.create_option<std::string>(
152 "par-out",
"set the path of the parameter file to merge into (only one allowed)");
153 auto parameter_in = programOptions.create_option<std::string>(
154 "par-in",
"set the path of the parameter files to merge from (semicolon seperated)");
155 if (!programOptions.verify(argc, argv))
160 FairLogger::GetLogger()->SetLogScreenLevel(logLevel().c_str());
162 const auto input_files = filenames_split(parameter_in());
163 const auto output_file = parameter_out();
165 if (input_files.empty())
167 R3BLOG(error,
"empty input parameter file!");
170 auto output_rootfile = std::make_unique<TFile>(output_file.c_str(),
"RECREATE");
174 initialize_output_file(output_rootfile.get(), input_files.front());
175 merge_into_rootfile(output_rootfile.get(), input_files);
177 catch (
const std::exception& ex)
179 fmt::print(
"An exception has occurred: {}\n", ex.what());
183 fmt::print(
"An unrecgonised exception has occurred!\n");
#define R3BLOG(severity, x)
auto main(int argc, char **argv) -> int