12#include "detray/core/concepts.hpp"
13#include "detray/io/backend/geometry_reader.hpp"
14#include "detray/io/backend/homogeneous_material_reader.hpp"
15#include "detray/io/backend/material_map_reader.hpp"
16#include "detray/io/backend/surface_grid_reader.hpp"
17#include "detray/io/frontend/detail/detector_components_reader.hpp"
18#include "detray/io/frontend/payloads.hpp"
19#include "detray/io/json/json_converter.hpp"
20#include "detray/io/utils/io_metadata.hpp"
21#include "detray/utils/logging.hpp"
30namespace detray::io::detail {
33inline common_header_payload deserialize_json_header(
34 const std::string& file_name) {
36 io::file_handle file{file_name, std::ios_base::in | std::ios_base::binary};
37 nlohmann::json in_json;
41 header_payload<>
h = in_json[
"header"];
44 const common_header_payload& header =
h.common;
46 if (header.tag < io::detail::minimal_io_version) {
47 DETRAY_WARN_HOST(
"File was generated with a different detray version");
62template <std::
size_t CAP, std::
size_t DIM,
class detector_t>
63inline void add_json_readers(
64 io::detail::detector_components_reader<detector_t>& reader,
65 const std::vector<std::string>& files)
noexcept(
false) {
66 for (
const std::filesystem::path file_name : files) {
67 if (file_name.empty()) {
68 DETRAY_WARN_HOST(
"Empty file name. Component will not be built");
73 if (file_name.extension() !=
".json") {
78 auto header = deserialize_json_header(file_name);
80 if (header.tag ==
"geometry") {
81 reader.set_detector_name(header.detector);
83 using json_geometry_reader = json_converter<detector_t, geometry_reader>;
85 reader.template add_geometry_reader<json_geometry_reader>(
86 static_cast<std::string
>(file_name));
88 }
else if (header.tag ==
"homogeneous_material") {
89 if constexpr (detray::concepts::has_homogeneous_material<detector_t>) {
90 using json_hom_material_reader =
91 json_converter<detector_t, homogeneous_material_reader>;
93 reader.template add<json_hom_material_reader>(file_name);
95 print_type_warning<detector_t>(header.tag);
97 }
else if (header.tag ==
"material_maps") {
98 if constexpr (detray::concepts::has_material_maps<detector_t>) {
99 using json_material_map_reader = json_converter<
101 material_map_reader<std::integral_constant<std::size_t, DIM>>>;
103 reader.template add<json_material_map_reader>(file_name);
105 print_type_warning<detector_t>(header.tag);
107 }
else if (header.tag ==
"surface_grids") {
108 if constexpr (detray::concepts::has_surface_grids<detector_t>) {
109 using json_surface_grid_reader = json_converter<
111 surface_grid_reader<
typename detector_t::surface_type,
112 std::integral_constant<std::size_t, CAP>,
113 std::integral_constant<std::size_t, DIM>>>;
115 reader.template add<json_surface_grid_reader>(file_name);
117 print_type_warning<detector_t>(header.tag);
120 throw std::invalid_argument(
"Unsupported file tag '" + header.tag +
121 "' in input file: " + file_name.string());
constexpr double h
Hour - 3600 seconds.
Definition Units.hpp:134