61 DETRAY_VERBOSE_HOST(
"Reading payload object...");
65 using mat_data_t =
typename mat_factory_t::data_type;
66 using mat_id =
typename detector_t::material::id;
70 using mat_registry_t =
71 io::detail::filtered_material_map_registry<detector_t>;
72 static_assert((!types::contains<mat_registry_t, io::detail::unknown_type> &&
73 types::size<mat_registry_t> > 0) ||
74 (types::contains<mat_registry_t, io::detail::unknown_type> &&
75 types::size<mat_registry_t> > 1));
77 DETRAY_VERBOSE_HOST(
"Converting material grids for "
78 << grids_data.grids.size() <<
" volumes");
80 for (
const auto &[vol_idx, mat_grids] : grids_data.grids) {
81 if (!det_builder.has_volume(vol_idx)) {
82 std::stringstream err_stream;
83 err_stream <<
"Volume " << vol_idx <<
": "
84 <<
"Cannot build material map for volume "
85 <<
"(volume not registered in detector builder)";
86 DETRAY_FATAL_HOST(err_stream.str());
87 throw std::invalid_argument(err_stream.str());
90 DETRAY_VERBOSE_HOST(
"Reading material maps in volume: "
91 << det_builder[
static_cast<dindex>(vol_idx)]->name());
95 det_builder.template decorate<material_map_builder<detector_t, dim>>(
96 static_cast<dindex>(vol_idx));
98 DETRAY_VERBOSE_HOST(
"-> Found " << mat_grids.size()
99 <<
" material grids:");
103 std::make_shared<material_map_factory<detector_t, bin_index_type>>();
107 DETRAY_VERBOSE_HOST(
"Reading material map payload #" << idx <<
"...");
109 std::vector<std::size_t> n_bins{};
110 for (
const auto &axis_data : grid_data.axes) {
111 n_bins.push_back(axis_data.bins);
114 DETRAY_VERBOSE_HOST(
"-> Belongs to "
115 << (
dim == 2 ?
"surface" :
"volume") <<
" = "
116 << grid_data.owner_link.link);
120 DETRAY_VERBOSE_HOST(
"-> Type id: " << map_id);
122 DETRAY_VERBOSE_HOST(
"-> Reading axis bins: Dims = " <<
dim);
123 for ([[maybe_unused]]
const auto &[i, count] :
125 DETRAY_VERBOSE_HOST(
"--> Axis " << i <<
": " << count <<
" bins");
128 DETRAY_VERBOSE_HOST(
"-> Reading axis spans:");
129 std::vector<std::vector<scalar_t>> axis_spans = {};
130 for (
const auto &[i, axis_data] :
132 axis_spans.push_back({
static_cast<scalar_t
>(axis_data.edges.front()),
133 static_cast<scalar_t
>(axis_data.edges.back())});
134 DETRAY_VERBOSE_HOST(
"--> Axis " << i <<
" ["
135 << axis_spans.back().at(0) <<
", "
136 << axis_spans.back().at(1) <<
"]");
140 DETRAY_VERBOSE_HOST(
"-> Reading bin content...");
142 std::vector<bin_index_type> loc_bins{};
144 detail::basic_converter::from_payload(grid_data.owner_link)};
145 DETRAY_VERBOSE_HOST(
"--> Found " << grid_data.bins.size() <<
" bins");
146 for (
const auto &bin_data : grid_data.bins) {
147 assert(
dim == bin_data.loc_index.size() &&
148 "Dimension of local bin indices in input file does "
149 "not match material grid dimension");
153 for (
const auto &[i, bin_idx] :
157 loc_bins.push_back(std::move(mbin));
160 for (
const auto &slab_data : bin_data.content) {
166 DETRAY_VERBOSE_HOST(
"Finished reading data for material map #" << idx);
167 DETRAY_DEBUG_HOST(mat_data);
169 DETRAY_VERBOSE_HOST(
"Add material data to factory...");
170 mat_factory->add_material(map_id, std::move(mat_data),
171 std::move(n_bins), std::move(axis_spans),
172 std::move(loc_bins));
176 DETRAY_VERBOSE_HOST(
"Add the material maps to the volume:");
177 vm_builder->add_surfaces(mat_factory);