12#include "detray/builders/surface_factory_interface.hpp"
13#include "detray/core/concepts.hpp"
14#include "detray/core/detail/data_context.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
16#include "detray/definitions/indexing.hpp"
17#include "detray/geometry/mask.hpp"
18#include "detray/geometry/shapes/unmasked.hpp"
19#include "detray/material/material_rod.hpp"
20#include "detray/material/material_slab.hpp"
21#include "detray/utils/logging.hpp"
22#include "detray/utils/ranges.hpp"
23#include "detray/utils/type_registry.hpp"
42template <concepts::detector detector_t,
typename mask_shape_t>
44 using algebra_t =
typename detector_t::algebra_type;
45 using volume_link_t =
typename detector_t::surface_type::navigation_link;
51 using volume_link_collection = std::vector<std::vector<volume_link_t>>;
71 return static_cast<dindex>(m_bounds.size());
81 -> const std::vector<std::vector<std::vector<scalar_t>>> & {
88 -> const std::vector<typename detector_t::transform3_type> & {
100 auto [type, vlinks, index, source,
bounds, trf] =
101 std::move(sf_data).get_data();
103 assert(
bounds.front().size() == mask_shape_t::boundaries::e_size);
105 m_types.push_back(type);
106 m_volume_links.push_back(std::move(vlinks));
107 m_indices.push_back(index);
108 m_sources.push_back(source);
109 m_bounds.push_back(std::move(
bounds));
110 m_transforms.push_back(trf);
119 m_volume_links.reserve(n_surfaces);
120 m_indices.reserve(n_surfaces);
121 m_sources.reserve(n_surfaces);
122 m_bounds.reserve(n_surfaces);
123 m_transforms.reserve(n_surfaces);
135 m_volume_links.clear();
139 m_transforms.clear();
152 auto operator()([[maybe_unused]]
typename detector_t::volume_type &volume,
154 typename detector_t::surface_lookup_container &surfaces,
156 typename detector_t::transform_container &
transforms,
157 [[maybe_unused]]
typename detector_t::mask_container &masks,
159 typename detector_t::geometry_context ctx = {})
161 DETRAY_VERBOSE_HOST(
"Add geometric surfaces...");
164 const auto surfaces_offset{
static_cast<dindex>(surfaces.size())};
166 DETRAY_VERBOSE_HOST(
"-> Adding " <<
size() <<
" surfaces");
170 return {surfaces_offset, surfaces_offset};
173 using mask_t = mask<mask_shape_t, algebra_t, volume_link_t>;
175 if constexpr (!types::contains<typename detector_t::masks, mask_t>) {
176 std::stringstream err_str{};
177 err_str <<
"Could not find mask type '" << mask_shape_t::name
180 DETRAY_FATAL_HOST(err_str.str());
181 throw std::invalid_argument(err_str.str());
183 using surface_t =
typename detector_t::surface_type;
184 using mask_link_t =
typename surface_t::mask_link;
185 using material_link_t =
typename surface_t::material_link;
187 constexpr auto mask_id{types::id<typename detector_t::masks, mask_t>};
190 constexpr auto no_material{surface_t::material_id::e_none};
192 for (
const auto [idx, bounds_per_mask] :
193 detray::views::enumerate(m_bounds)) {
196 const dindex sf_idx{detail::is_invalid_value(m_indices[idx])
207 auto v_links_per_mask = m_volume_links[idx];
208 assert(v_links_per_mask.size() == bounds_per_mask.size());
209 std::size_t n_masks = bounds_per_mask.size();
210 if constexpr (std::is_same_v<mask_shape_t,
211 unmasked<mask_shape_t::dim>>) {
212 masks.template emplace_back<mask_id>(
213 empty_context{}, v_links_per_mask.front(),
214 detail::invalid_value<scalar_t>());
216 for (std::size_t i = 0u; i < n_masks; ++i) {
217 masks.template emplace_back<mask_id>(
218 empty_context{}, bounds_per_mask[i], v_links_per_mask[i]);
224 mask_link_t mask_link{};
225 mask_link.set_id(mask_id);
228 if constexpr (concepts::index<typename mask_link_t::index_type>) {
229 mask_link.set_index(mask_idx);
231 mask_link.set_index({mask_idx,
static_cast<dindex>(n_masks)});
238 {surface_t{trf_idx, mask_link, material_link,
239 volume.index(), m_types[idx]},
245 return {surfaces_offset,
static_cast<dindex>(surfaces.size())};
253 assert(m_bounds.size() == m_types.size());
254 assert(m_bounds.size() == m_volume_links.size());
255 assert(m_bounds.size() == m_indices.size());
256 assert(m_bounds.size() == m_sources.size());
257 assert(m_bounds.size() == m_transforms.size());
261 std::vector<surface_id> m_types{};
263 volume_link_collection m_volume_links{};
266 std::vector<dindex> m_indices{};
268 std::vector<std::uint64_t> m_sources{};
270 std::vector<std::vector<std::vector<scalar_t>>> m_bounds{};
272 std::vector<typename detector_t::transform3_type> m_transforms{};
Bind transform and mask data together for surface building.
Definition surface_factory_interface.hpp:37
dindex insert_in_container(container_t &cont, const typename container_t::value_type value, const dindex idx, Args &&...args) const
Insert a value in a container at a specific index.
Definition surface_factory_interface.hpp:173
virtual dindex size() const =0
auto clear() -> void override
Clear old data.
Definition surface_factory.hpp:133
std::vector< surface_data_t > sf_data_collection
Definition surface_factory.hpp:61
auto operator()(typename detector_t::volume_type &volume, typename detector_t::surface_lookup_container &surfaces, typename detector_t::transform_container &transforms, typename detector_t::mask_container &masks, typename detector_t::geometry_context ctx={}) -> dindex_range override
Generate the surfaces and add them to given data collections.
Definition surface_factory.hpp:152
auto size() const -> dindex override
Definition surface_factory.hpp:69
surface_data< detector_t > surface_data_t
Definition surface_factory.hpp:59
auto bounds() const -> const std::vector< std::vector< std::vector< scalar_t > > > &
Definition surface_factory.hpp:80
surface_factory()=default
Empty factory.
auto types() const -> const std::vector< surface_id > &
Definition surface_factory.hpp:76
detector_t detector_type
Definition surface_factory.hpp:55
auto push_back(sf_data_collection &&surface_data) -> void override
Add all necessary components to the factory from bundled surface data in.
Definition surface_factory.hpp:116
void push_back(surface_data_t &&sf_data) override
Add all necessary components to the factory for a single surface.
Definition surface_factory.hpp:99
const auto & volume_links() const
Definition surface_factory.hpp:94
auto transforms() const -> const std::vector< typename detector_t::transform3_type > &
Definition surface_factory.hpp:87
Detray include(s).
Definition array_operators.hpp:18
get_scalar_t< A, T > dscalar
Scalar type for algebra A and value type T.
Definition algebra.hpp:64
detail::index_range< dindex > dindex_range
Index ranges and sequences.
Definition indexing.hpp:24
unsigned int dindex
Default index type.
Definition indexing.hpp:18
constexpr dindex dindex_invalid
Global invalid index definition.
Definition indexing.hpp:21
surface_id
surface type, resolved during navigation.
Definition geometry.hpp:41