ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
homogeneous_material_writer.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s)
12#include "detray/core/concepts.hpp"
13#include "detray/definitions/algebra.hpp"
14#include "detray/geometry/surface.hpp"
15#include "detray/geometry/tracking_volume.hpp"
16#include "detray/io/backend/detail/basic_converter.hpp"
17#include "detray/io/backend/detail/type_info.hpp"
18#include "detray/io/frontend/payloads.hpp"
19#include "detray/material/concepts.hpp"
20#include "detray/material/material_rod.hpp"
21#include "detray/material/material_slab.hpp"
22#include "detray/utils/type_list.hpp"
23
24// System include(s)
25#include <string_view>
26
27namespace detray::io {
28
33 public:
35 static constexpr std::string_view tag = "homogeneous_material";
36
39
45 template <class detector_t>
47 const detector_t& det, const std::string_view det_name) {
49
50 using algebra_t = typename detector_t::algebra_type;
51 using material_id_t = surface_material_payload::mat_type;
52
53 auto count_surface_with_material_type = [&det](material_id_t target_type) {
54 std::size_t count{0u};
55 for (const auto& [sf_idx, sf_desc] :
56 detray::views::enumerate(det.surfaces())) {
57 const auto sf = geometry::surface{det, sf_desc};
58
60 sf.has_material() ? sf.template visit_material<
61 get_material_payload<algebra_t>>(sf_idx)
63 mslp.type == target_type) {
64 count++;
65 }
66 }
67
68 return count;
69 };
70
71 header_data.common = detail::basic_converter::to_payload(det_name, tag);
72
73 const auto& materials = det.material_store();
74
75 header_data.sub_header.emplace();
76 auto& mat_sub_header = header_data.sub_header.value();
78 mat_sub_header.n_slabs =
79 materials.template size<detector_t::material::id::e_material_slab>();
80 mat_sub_header.n_slab_surfaces =
81 count_surface_with_material_type(material_id_t::slab);
82 }
83 mat_sub_header.n_rods = 0u;
85 mat_sub_header.n_rods =
86 materials.template size<detector_t::material::id::e_material_rod>();
87 mat_sub_header.n_rod_surfaces =
88 count_surface_with_material_type(material_id_t::rod);
89 }
90
91 return header_data;
92 }
93
99 template <class detector_t>
101 const detector_t& det, const typename detector_t::name_map& /*unused*/) {
102 payload_type dm_data;
103 dm_data.volumes.reserve(det.volumes().size());
104
105 for (const auto& vol : det.volumes()) {
106 dm_data.volumes.push_back(to_payload(vol, det));
107 }
108
109 return dm_data;
110 }
111
118 template <class detector_t>
120 const typename detector_t::volume_type& vol_desc, const detector_t& det) {
121 using material_type = surface_material_payload::mat_type;
122
124 mv_data.volume_link = detail::basic_converter::to_payload(vol_desc.index());
125
126 // Return early if the stores for homogeneous materials are empty
127 using mat_id = typename detector_t::material::id;
128 using algebra_t = typename detector_t::algebra_type;
129
130 bool contains_rods{true};
131 bool contains_slabs{true};
133 if (det.material_store().template empty<mat_id::e_material_rod>()) {
134 contains_rods = false;
135 }
136 }
138 if (det.material_store().template empty<mat_id::e_material_slab>()) {
139 contains_slabs = false;
140 }
141 }
142 if (!contains_rods && !contains_slabs) {
143 return mv_data;
144 }
145
146 // Find all surfaces that belong to the volume and count them
147 std::size_t sf_idx{0u};
148 std::size_t slab_idx{0u};
149 std::size_t rod_idx{0u};
150 auto vol = tracking_volume{det, vol_desc};
151 for (const auto& sf_desc : vol.surfaces()) {
152 // Convert material slabs and rods
153 const auto sf = geometry::surface{det, sf_desc};
154
155 if (surface_material_payload mslp =
156 sf.has_material()
157 ? sf.template visit_material<get_material_payload<algebra_t>>(
158 sf_idx)
160 mslp.type == material_type::slab) {
161 mslp.index_in_coll = slab_idx++;
162 mv_data.surface_mat.push_back(mslp);
163 } else if (mslp.type == material_type::rod) {
164 mslp.index_in_coll = rod_idx++;
165 mv_data.surface_mat.push_back(mslp);
166 } else { /* material maps are handled by another writer */
167 }
168 ++sf_idx;
169 }
170
171 return mv_data;
172 }
173
178 template <detray::concepts::material_params material_t>
179 static material_param_payload to_payload(const material_t& mat) {
180 material_param_payload mat_data;
181
182 mat_data.params = {mat.X0(),
183 mat.L0(),
184 mat.Ar(),
185 mat.Z(),
186 mat.mass_density(),
187 mat.molar_density(),
188 static_cast<io::scalar>(mat.state())};
189 return mat_data;
190 }
191
198 template <detray::concepts::algebra algebra_t,
200 static surface_material_payload to_payload(const material_t& mat,
201 std::size_t sf_idx) {
203
204 mat_data.type = io::detail::get_id<algebra_t, material_t>();
205 mat_data.surface = detail::basic_converter::to_payload(sf_idx);
206 mat_data.thickness = mat.thickness();
207 mat_data.mat = to_payload(mat.get_material());
208
209 return mat_data;
210 }
211
212 private:
214 template <detray::concepts::algebra algebra_t>
215 struct get_material_payload {
216 template <typename material_group_t, typename index_t>
217 inline auto operator()(const material_group_t& material_group,
218 const index_t& index,
219 [[maybe_unused]] std::size_t sf_index) const {
220 using material_t = typename material_group_t::value_type;
221
225 material_group[index], sf_index);
226 } else {
227 return surface_material_payload{};
228 }
229 }
230 };
231};
232
233} // namespace detray::io
Facade for a detray detector surface.
Definition surface.hpp:36
Homogeneous material writer backend.
Definition homogeneous_material_writer.hpp:32
static material_volume_payload to_payload(const typename detector_t::volume_type &vol_desc, const detector_t &det)
Convert the material description of a volume vol_desc into its io payload.
Definition homogeneous_material_writer.hpp:119
static payload_type to_payload(const detector_t &det, const typename detector_t::name_map &)
Convert the material description of a detector det into its io payload.
Definition homogeneous_material_writer.hpp:100
static material_param_payload to_payload(const material_t &mat)
Convert surface material mat into its io payload.
Definition homogeneous_material_writer.hpp:179
static constexpr std::string_view tag
Tag the writer as "homogeneous_material".
Definition homogeneous_material_writer.hpp:35
static homogeneous_material_header_payload header_to_payload(const detector_t &det, const std::string_view det_name)
Convert the header information into its payload.
Definition homogeneous_material_writer.hpp:46
static surface_material_payload to_payload(const material_t &mat, std::size_t sf_idx)
Convert a homogeneous material surface entry to payload form.
Definition homogeneous_material_writer.hpp:200
detector_homogeneous_material_payload payload_type
Payload type that the reader processes.
Definition homogeneous_material_writer.hpp:38
Facade for a detray detector volume.
Definition tracking_volume.hpp:44
Algebra plugin concept.
Definition concepts.hpp:147
Check for the the presence of material rods in a detector definition.
Definition concepts.hpp:146
Check for the the presence of material slabs in a detector definition.
Definition concepts.hpp:141
Homogeneous material.
Definition concepts.hpp:100
Material parameters with a radius.
Definition concepts.hpp:76
Material parameters with a thickness.
Definition concepts.hpp:48
The following enums are global for all detectors.
Definition concepts.hpp:18
double scalar
Default scalar precision used for serialized geometry payloads.
Definition definitions.hpp:27
header_payload< homogeneous_material_sub_header_payload > homogeneous_material_header_payload
a payload for the homogeneous material file header
Definition payloads.hpp:206
A payload for the homogeneous material description of a detector.
Definition payloads.hpp:257
std::vector< material_volume_payload > volumes
Material payloads grouped by detector volume.
Definition payloads.hpp:259
std::optional< sub_header_payload_t > sub_header
Information that is specific to a tag, i.e. type of detector payload.
Definition payloads.hpp:58
common_header_payload common
Shared version, detector name, tag, and creation date.
Definition payloads.hpp:56
A payload object for a material parametrization.
Definition payloads.hpp:210
std::array< io::scalar, 7u > params
Material parametrization 0: X0 1: L0 2: Ar 3: Z 4: Mass density 5: Molar densitty (unused) 6: materia...
Definition payloads.hpp:219
A payload object for all of the [surface] material contained in a volume.
Definition payloads.hpp:247
single_link_payload volume_link
Volume index the payload belongs to.
Definition payloads.hpp:249
std::vector< surface_material_payload > surface_mat
Material slabs/rods of contained surfaces.
Definition payloads.hpp:253
A payload object for a material slab/rod.
Definition payloads.hpp:223
io::material_id mat_type
Identifier type for homogeneous material representations.
Definition payloads.hpp:225
io::scalar thickness
Thickness of the material slab.
Definition payloads.hpp:235
single_link_payload surface
Index of the surface in the volume the material belongs to.
Definition payloads.hpp:233
material_param_payload mat
Material parameters.
Definition payloads.hpp:237
mat_type type
Either 'slab' or 'rod'.
Definition payloads.hpp:228
Range adaptor that creates an enumerate view, optionally starting at a selected index.
Definition enumerate.hpp:266