13#include <fmt/ranges.h>
14#include <magic_enum/magic_enum.hpp>
15#include <nlohmann/json.hpp>
16#include <nlohmann/json_fwd.hpp>
20using json = nlohmann::ordered_json;
24 template <
typename EnumType>
25 void set_enum_from_string(EnumType& enum_obj,
const json& json_obj, std::string_view name)
27 auto enum_str = std::string{};
28 json_obj.at(name.data()).get_to(enum_str);
29 auto enum_val = magic_enum::enum_cast<EnumType>(enum_str, magic_enum::case_insensitive);
30 if (enum_val.has_value())
32 enum_obj = enum_val.value();
35 constexpr auto enum_all_names = magic_enum::enum_names<EnumType>();
36 throw R3B::logic_error(fmt::format(
"{:?} cannot be parsed to its enum class! Available options: {}",
38 fmt::join(enum_all_names,
", ")));
64 json_obj.at(
"fPMTThresh").get_to(param.
pmt_thresh);
66 json_obj.at(
"fExperimentalDataIsCorrectedForSaturation")
68 json_obj.at(
"fTimeRes").get_to(param.
time_res);
70 json_obj.at(
"fEnergyGain").get_to(param.
energy_gain);
71 json_obj.at(
"fPedestal").get_to(param.
pedestal);
72 json_obj.at(
"fTimeMax").get_to(param.
max_time);
73 json_obj.at(
"fTimeMin").get_to(param.
min_time);
76 json_obj.at(
"fQdcMin").get_to(param.
min_energy);
85 json_obj = nlohmann::ordered_json{
86 {
"init", option.
init }, {
"step", option.
step }, {
"lower", option.
lower }, {
"upper", option.
upper }
93 json_obj.at(
"init").get_to(option.
init);
94 json_obj.at(
"step").get_to(option.
step);
95 json_obj.at(
"lower").get_to(option.
lower);
96 json_obj.at(
"upper").get_to(option.
upper);
104 json_obj = nlohmann::ordered_json{
105 {
"run-id", option.
run_id },
106 {
"number-of-events", option.
event_num },
110 {
"input", option.
input },
111 {
"output", option.
output },
118 json_obj.at(
"run-id").get_to(option.
run_id);
119 json_obj.at(
"number-of-events").get_to(option.
event_num);
120 json_obj.at(
"enable-mpi").get_to(option.
enable_mpi);
121 json_obj.at(
"log-level").get_to(option.
log_level);
123 json_obj.at(
"input").get_to(option.
input);
124 json_obj.at(
"output").get_to(option.
output);
128 void to_json(nlohmann::ordered_json& json_obj,
const CLIApplication::Options::Input& option)
130 json_obj = nlohmann::ordered_json{
131 {
"working-dir", option.working_dir },
132 {
"data", option.data },
133 {
"tree-data", option.tree_data },
134 {
"first-par", option.par },
139 void from_json(
const nlohmann::ordered_json& json_obj, CLIApplication::Options::Input& option)
141 json_obj.at(
"working-dir").get_to(option.working_dir);
142 json_obj.at(
"data").get_to(option.data);
143 json_obj.at(
"tree-data").get_to(option.tree_data);
144 json_obj.at(
"first-par").get_to(option.par);
148 void to_json(nlohmann::ordered_json& json_obj,
const CLIApplication::Options::Output& option)
150 json_obj = nlohmann::ordered_json{
151 {
"working-dir", option.working_dir },
152 {
"data", option.data },
153 {
"par", option.par },
154 {
"mode", option.mode },
159 void from_json(
const nlohmann::ordered_json& json_obj, CLIApplication::Options::Output& option)
161 json_obj.at(
"working-dir").get_to(option.working_dir);
162 json_obj.at(
"data").get_to(option.data);
163 json_obj.at(
"par").get_to(option.par);
164 json_obj.at(
"mode").get_to(option.mode);
173 {
"enable", option.
enable },
175 {
"paddle", option.
paddle },
182 {
"read", option.
read },
183 {
"write", option.
write },
190 json_obj.at(
"enable").get_to(option.
enable);
191 json_obj.at(
"channel").get_to(option.
channel);
192 json_obj.at(
"paddle").get_to(option.
paddle);
193 json_obj.at(
"par").get_to(option.
tamex_par);
197 json_obj.at(
"read").get_to(option.
read);
198 json_obj.at(
"write").get_to(option.
write);
199 json_obj.at(
"point-filter").get_to(option.
point_filter);
200 set_enum_from_string(option.
pileup_strategy, json_obj,
"pileup-strategy");
204 void to_json(
json& json_obj,
const AnalysisApplication::Options::Tasks::MultiTrain& option)
207 {
"enable", option.enable },
208 {
"use-hit", option.use_hit },
209 {
"weight", option.weight },
210 {
"edep-opt", option.edep_opt },
211 {
"edep-off-opt", option.edep_off_opt },
212 {
"n-cluster-opt", option.n_cluster_opt },
213 {
"n-cluster-off-opt", option.n_cluster_off_opt },
214 {
"read", option.read },
215 {
"write", option.write },
220 void from_json(
const json& json_obj, AnalysisApplication::Options::Tasks::MultiTrain& option)
222 json_obj.at(
"enable").get_to(option.enable);
223 json_obj.at(
"use-hit").get_to(option.use_hit);
224 json_obj.at(
"weight").get_to(option.weight);
225 json_obj.at(
"edep-opt").get_to(option.edep_opt);
226 json_obj.at(
"edep-off-opt").get_to(option.edep_off_opt);
227 json_obj.at(
"n-cluster-opt").get_to(option.n_cluster_opt);
228 json_obj.at(
"n-cluster-off-opt").get_to(option.n_cluster_off_opt);
229 json_obj.at(
"read").get_to(option.read);
230 json_obj.at(
"write").get_to(option.write);
234 void to_json(
json& json_obj,
const AnalysisApplication::Options::Tasks::NeutronRValue& option)
237 {
"enable", option.enable },
238 {
"neutron-energy-MeV", option.neutron_energy_mev },
239 {
"read", option.read },
240 {
"write", option.write },
245 void from_json(
const json& json_obj, AnalysisApplication::Options::Tasks::NeutronRValue& option)
247 json_obj.at(
"enable").get_to(option.enable);
248 json_obj.at(
"neutron-energy-MeV").get_to(option.neutron_energy_mev);
249 json_obj.at(
"read").get_to(option.read);
250 json_obj.at(
"write").get_to(option.write);
254 void to_json(
json& json_obj,
const AnalysisApplication::Options::Tasks::Cal2HitParTask& option)
257 {
"enable", option.enable },
258 {
"min-stat", option.min_stat },
259 {
"mode", magic_enum::enum_name(option.mode) },
260 {
"method", magic_enum::enum_name(option.method) },
261 {
"read", option.read },
262 {
"write", option.write },
267 void from_json(
const json& json_obj, AnalysisApplication::Options::Tasks::Cal2HitParTask& option)
269 json_obj.at(
"enable").get_to(option.enable);
270 json_obj.at(
"min-stat").get_to(option.min_stat);
271 json_obj.at(
"read").get_to(option.read);
272 json_obj.at(
"write").get_to(option.write);
273 set_enum_from_string(option.method, json_obj,
"method");
274 set_enum_from_string(option.mode, json_obj,
"mode");
278 void to_json(
json& json_obj,
const AnalysisApplication::Options::Tasks::Map2CalParTask& option)
281 {
"enable", option.enable },
282 {
"has-trig-enabled", option.has_trig_enabled },
283 {
"error-method", magic_enum::enum_name(option.error_method) },
284 {
"read", option.read },
285 {
"write", option.write },
290 void from_json(
const json& json_obj, AnalysisApplication::Options::Tasks::Map2CalParTask& option)
292 json_obj.at(
"enable").get_to(option.enable);
293 json_obj.at(
"has-trig-enabled").get_to(option.has_trig_enabled);
294 set_enum_from_string(option.error_method, json_obj,
"error-method");
295 json_obj.at(
"read").get_to(option.read);
296 json_obj.at(
"write").get_to(option.write);
300 void to_json(
json& json_obj,
const AnalysisApplication::Options::Tasks::Map2CalTask& option)
303 {
"enable", option.enable },
304 {
"enable-pulse-mode", option.enable_pulse_mode },
305 {
"enable-walk-effect", option.enable_walk_effect },
306 {
"min-stat", option.min_stat },
307 {
"read", option.read },
308 {
"write", option.write },
313 void from_json(
const json& json_obj, AnalysisApplication::Options::Tasks::Map2CalTask& option)
315 json_obj.at(
"enable").get_to(option.enable);
316 json_obj.at(
"enable-pulse-mode").get_to(option.enable_pulse_mode);
317 json_obj.at(
"enable-walk-effect").get_to(option.enable_walk_effect);
318 json_obj.at(
"min-stat").get_to(option.min_stat);
319 json_obj.at(
"read").get_to(option.read);
320 json_obj.at(
"write").get_to(option.write);
324 void to_json(
json& json_obj,
const AnalysisApplication::Options::Tasks::Cal2HitTask& option)
327 {
"enable", option.enable },
328 {
"mode", magic_enum::enum_name(option.mode) },
329 {
"global-time-offset", option.global_time_offset },
330 {
"read", option.read },
331 {
"write", option.write },
336 void from_json(
const json& json_obj, AnalysisApplication::Options::Tasks::Cal2HitTask& option)
338 json_obj.at(
"enable").get_to(option.enable);
339 json_obj.at(
"global-time-offset").get_to(option.global_time_offset);
340 json_obj.at(
"read").get_to(option.read);
341 json_obj.at(
"write").get_to(option.write);
342 set_enum_from_string(option.mode, json_obj,
"mode");
397 json_obj =
json{ {
"general", option.
general }, {
"tasks", option.
tasks } };
403 json_obj.at(
"general").get_to(option.
general);
404 json_obj.at(
"tasks").get_to(option.
tasks);
419 json_obj.at(
"general").get_to(option.
general);
420 json_obj.at(
"simulation").get_to(option.
simulation);
421 json_obj.at(
"detectors").get_to(option.
detectors);
425 void to_json(nlohmann::ordered_json& json_obj,
const SimulationApplication::Options::Simulation& option)
428 {
"event-print-num", option.event_print_num },
429 {
"store-trajectory", option.store_trajectory },
430 {
"material-filename", option.material_filename },
431 {
"engine", option.engine },
432 {
"random-seed", option.random_seed },
433 {
"generator", option.generator },
438 void from_json(
const nlohmann::ordered_json& json_obj, SimulationApplication::Options::Simulation& option)
440 json_obj.at(
"event-print-num").get_to(option.event_print_num);
441 json_obj.at(
"store-trajectory").get_to(option.store_trajectory);
442 json_obj.at(
"material-filename").get_to(option.material_filename);
443 json_obj.at(
"engine").get_to(option.engine);
444 json_obj.at(
"generator").get_to(option.generator);
448 void to_json(nlohmann::ordered_json& json_obj,
const SimulationApplication::Options::Detector& option)
450 json_obj =
json{ {
"cave", option.cave }, {
"neuland", option.neuland } };
454 void from_json(
const nlohmann::ordered_json& json_obj, SimulationApplication::Options::Detector& option)
456 json_obj.at(
"cave").get_to(option.cave);
457 json_obj.at(
"neuland").get_to(option.neuland);
464 void to_json(nlohmann::ordered_json& json_obj,
const SimulationApplication::Options::Detector::Cave& option)
466 json_obj =
json{ {
"enable", option.enable }, {
"name", option.name }, {
"geo-file", option.geo_file } };
470 void from_json(
const nlohmann::ordered_json& json_obj, SimulationApplication::Options::Detector::Cave& option)
472 json_obj.at(
"enable").get_to(option.enable);
473 json_obj.at(
"name").get_to(option.name);
474 json_obj.at(
"geo-file").get_to(option.geo_file);
478 void to_json(nlohmann::ordered_json& json_obj,
const SimulationApplication::Options::Detector::Neuland& option)
480 json_obj =
json{ {
"enable", option.enable },
481 {
"name", option.name },
482 {
"num-of-dp", option.num_of_dp },
483 {
"location", option.location },
484 {
"enable-auto-geo-build", option.enable_auto_geo_build } };
488 void from_json(
const nlohmann::ordered_json& json_obj, SimulationApplication::Options::Detector::Neuland& option)
490 json_obj.at(
"enable").get_to(option.enable);
491 json_obj.at(
"name").get_to(option.name);
492 json_obj.at(
"num-of-dp").get_to(option.num_of_dp);
493 json_obj.at(
"location").get_to(option.location);
494 json_obj.at(
"enable-auto-geo-build").get_to(option.enable_auto_geo_build);
void from_json(const json &json_obj, Params ¶m)
void to_json(json &json_obj, const Params ¶m)
nlohmann::ordered_json json
Simulation of NeuLAND Bar/Paddle.
void from_json(const nlohmann::ordered_json &json_obj, GeneratorFactory::Options &options)
nlohmann::ordered_json json
void to_json(nlohmann::ordered_json &json_obj, const GeneratorFactory::Options &options)
double energy_res_rel
Gaus(e, fEResRel * e) [].
double time_res
time + Gaus(0., fTimeRes) [ns]
double pileup_time_window
[ns]
double energy_gain
Energy gain.
double min_energy
minimal energy of a FQT peak [MeV]
double saturation_coefficient
Saturation coefficient of PMTs.
double pedestal
Energy offset parameter [ns].
bool experimental_data_is_corrected_for_saturation
Flag if saturation effect enabled.
double pileup_distance
[ns]
struct R3B::Neuland::AnalysisApplication::Options::Tasks::Cal2HitTask cal_to_hit_task
struct R3B::Neuland::AnalysisApplication::Options::Tasks::LosProvideTStart los_provide_t_start
struct R3B::Neuland::AnalysisApplication::Options::Tasks::LosMap2CalParTask los_map_to_cal_par_task
struct R3B::Neuland::AnalysisApplication::Options::Tasks::HitMon hit_monitor
struct R3B::Neuland::AnalysisApplication::Options::Tasks::LosMap2CalTask los_map_to_cal_task
struct R3B::Neuland::AnalysisApplication::Options::Tasks::SimCal2Cal sim_cal_to_cal
struct R3B::Neuland::AnalysisApplication::Options::Tasks::Map2CalTask map_to_cal_task
struct R3B::Neuland::AnalysisApplication::Options::Tasks::PrimInteractionFinder prim_inter_finder
struct R3B::Neuland::AnalysisApplication::Options::Tasks::NeutronRValue neutron_r_value
struct R3B::Neuland::AnalysisApplication::Options::Tasks::Map2CalParTask map_to_cal_par_task
struct R3B::Neuland::AnalysisApplication::Options::Tasks::MapDataConverterTask map_data_converter_task
struct R3B::Neuland::AnalysisApplication::Options::Tasks::ClusterFinder cluster_finder
struct R3B::Neuland::AnalysisApplication::Options::Tasks::PrimClusterFinder prim_cluster_finder
struct R3B::Neuland::AnalysisApplication::Options::Tasks::MultiBayes multi_bayes
struct R3B::Neuland::AnalysisApplication::Options::Tasks::MultiBayesTrain multi_bayes_train
struct R3B::Neuland::AnalysisApplication::Options::Tasks::Cal2HitParTask cal_to_hit_par_task
R3B::Neuland::DigiTaskOptions digi
struct R3B::Neuland::AnalysisApplication::Options::Tasks::MultiTrain multi_calorimeter_train
struct R3B::Neuland::AnalysisApplication::Options::Tasks tasks
CLIApplication::Options general
std::string verbose_level
struct R3B::Neuland::CLIApplication::Options::Input input
struct R3B::Neuland::CLIApplication::Options::Output output
Configuration struct for R3B::Neuland::Digitizer used in R3B::Neuland::AnalysisApplication.
std::string channel
Channel name used in the task.
Digitizing::Neuland::Tamex::PeakPileUpStrategy pileup_strategy
bool enable_sim_cal
Flag to enable the simulated cal level data output.
bool enable_hit_par
Flag to enable the usage of cal_to_hit parameter.
std::string read
Input data names required by the digitizer.
bool enable_size_monitor
Flag to enable the checking of hit/signal sizes in histograms.
std::string paddle
Paddle name used in the task.
bool enable
Flag to enable task.
ParticleFilter::Options point_filter
Point level filter options used in the digitizer.
R3B::Digitizing::Neuland::Tamex::Params tamex_par
std::string write
Output data names from the digitizer.
std::string name
Name of the task.
struct R3B::Neuland::SimulationApplication::Options::Simulation simulation
struct R3B::Neuland::SimulationApplication::Options::Detector detectors
CLIApplication::Options general