ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
surface_factory_interface.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// TODO: Remove this when gcc fixes their false positives.
12#if defined(__GNUC__) && !defined(__clang__)
13#pragma GCC diagnostic warning "-Wnull-dereference"
14#endif
15
16// Project include(s).
17#include "detray/core/concepts.hpp"
18#include "detray/definitions/detail/qualifiers.hpp"
19#include "detray/definitions/geometry.hpp"
20#include "detray/definitions/indexing.hpp"
21
22// System include(s)
23#include <memory>
24#include <stdexcept>
25#include <tuple>
26#include <vector>
27
28namespace detray {
29
36template <concepts::detector detector_t>
38 public:
40 using boundary_coll_type = std::vector<typename detector_t::scalar_type>;
42 using navigation_link = typename detector_t::surface_type::navigation_link;
43
53 DETRAY_HOST
55 const surface_id type, const typename detector_t::transform3_type &trf,
56 navigation_link volume_link, const boundary_coll_type &mask_boundaries,
57 const dindex idx = dindex_invalid,
58 const std::uint64_t source = detail::invalid_value<std::uint64_t>())
59 : m_type{type},
60 m_volume_link{std::vector{volume_link}},
61 m_index{idx},
62 m_source{source},
63 m_boundaries{std::vector{mask_boundaries}},
64 m_transform{trf} {}
65
75 DETRAY_HOST
77 const surface_id type, const typename detector_t::transform3_type &trf,
78 std::vector<navigation_link> volume_link,
79 const std::vector<boundary_coll_type> &mask_boundaries,
80 const dindex idx = dindex_invalid,
81 const std::uint64_t source = detail::invalid_value<std::uint64_t>())
82 : m_type{type},
83 m_volume_link{std::move(volume_link)},
84 m_index{idx},
85 m_source{source},
86 m_boundaries{mask_boundaries},
87 m_transform{trf} {}
88
90 DETRAY_HOST
91 auto get_data()
92 -> std::tuple<surface_id &, std::vector<navigation_link> &, dindex &,
93 std::uint64_t &, std::vector<boundary_coll_type> &,
94 typename detector_t::transform3_type &> {
95 return std::tie(m_type, m_volume_link, m_index, m_source, m_boundaries,
96 m_transform);
97 }
98
99 private:
101 surface_id m_type;
103 std::vector<navigation_link> m_volume_link;
106 dindex m_index;
108 std::uint64_t m_source;
110 std::vector<boundary_coll_type> m_boundaries;
112 typename detector_t::transform3_type m_transform;
113};
114
119template <concepts::detector detector_t>
120class surface_factory_interface {
121 public:
123 using navigation_link = typename detector_t::surface_type::navigation_link;
124
125 surface_factory_interface() = default;
126 virtual ~surface_factory_interface() = default;
127
129 DETRAY_HOST
130 virtual dindex size() const = 0;
131
135 DETRAY_HOST
136 virtual void push_back(surface_data<detector_t> &&data) = 0;
137
139 DETRAY_HOST
140 virtual void push_back(std::vector<surface_data<detector_t>> &&data) = 0;
142
144 DETRAY_HOST
145 virtual void clear() = 0;
146
155 DETRAY_HOST
156 virtual auto operator()(
157 typename detector_t::volume_type &volume,
158 typename detector_t::surface_lookup_container &surfaces,
159 typename detector_t::transform_container &transforms,
160 typename detector_t::mask_container &masks,
161 typename detector_t::geometry_context ctx = {}) -> dindex_range = 0;
162
163 protected:
172 template <typename container_t, typename... Args>
174 container_t &cont, const typename container_t::value_type value,
175 const dindex idx, Args &&...args) const {
176 // If no valid position is given, perform push back
177 if (detail::is_invalid_value(idx)) {
178 cont.push_back(value, std::forward<Args>(args)...);
179
180 return static_cast<dindex>(cont.size() - 1u);
181 } else {
182 // Make sure the container size encompasses the new value
183 if (cont.size() < idx + 1) {
184 cont.resize(idx + 1, std::forward<Args>(args)...);
185 }
186
187 cont.at(idx, std::forward<Args>(args)...) = value;
188
189 return idx;
190 }
191 }
192};
193
197template <concepts::detector detector_t>
198class factory_decorator : public surface_factory_interface<detector_t> {
199 public:
202 DETRAY_HOST
204 std::unique_ptr<surface_factory_interface<detector_t>> factory)
205 : m_factory(std::move(factory)) {
206 if (m_factory == nullptr || m_factory.get() == nullptr) {
207 throw std::runtime_error(
208 "Surface factory decorator constructed with invalid base "
209 "factory");
210 }
211 }
212
214 DETRAY_HOST
215 const surface_factory_interface<detector_t> *get_factory() const {
216 return m_factory.get();
217 }
218
222 DETRAY_HOST
223 dindex size() const override { return m_factory->size(); }
224
225 DETRAY_HOST
226 void push_back(surface_data<detector_t> &&data) override {
227 m_factory->push_back(std::move(data));
228 }
229
232 DETRAY_HOST
233 void push_back(std::vector<surface_data<detector_t>> &&data) override {
234 m_factory->push_back(std::move(data));
235 }
236
237 DETRAY_HOST
238 void clear() override { m_factory->clear(); }
239
240 DETRAY_HOST
247 auto operator()(typename detector_t::volume_type &volume,
248 typename detector_t::surface_lookup_container &surfaces,
249 typename detector_t::transform_container &transforms,
250 typename detector_t::mask_container &masks,
251 typename detector_t::geometry_context ctx = {})
252 -> dindex_range override {
253 return (*m_factory)(volume, surfaces, transforms, masks, ctx);
254 }
255
256
257 protected:
259 DETRAY_HOST
260 surface_factory_interface<detector_t> *get_factory() {
261 return m_factory.get();
262 }
263
264 private:
266 std::unique_ptr<surface_factory_interface<detector_t>> m_factory;
267};
268
269} // namespace detray
void clear() override
Clear all data in the factory.
Definition surface_factory_interface.hpp:238
surface_factory_interface< detector_t > * get_factory()
Definition surface_factory_interface.hpp:260
dindex size() const override
Overwrite interface functions using callbacks to the base factory.
Definition surface_factory_interface.hpp:223
void push_back(surface_data< detector_t > &&data) override
Add data to the factory.
Definition surface_factory_interface.hpp:226
const surface_factory_interface< detector_t > * get_factory() const
Definition surface_factory_interface.hpp:215
void push_back(std::vector< surface_data< detector_t > > &&data) override
Forward a batch of surface records to the wrapped factory.
Definition surface_factory_interface.hpp:233
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
Definition surface_factory_interface.hpp:247
factory_decorator(std::unique_ptr< surface_factory_interface< detector_t > > factory)
Wrap a concrete surface factory and forward interface calls to it.
Definition surface_factory_interface.hpp:203
Bind transform and mask data together for surface building.
Definition surface_factory_interface.hpp:37
surface_data(const surface_id type, const typename detector_t::transform3_type &trf, std::vector< navigation_link > volume_link, const std::vector< boundary_coll_type > &mask_boundaries, const dindex idx=dindex_invalid, const std::uint64_t source=detail::invalid_value< std::uint64_t >())
Parametrized constructor.
Definition surface_factory_interface.hpp:76
surface_data(const surface_id type, const typename detector_t::transform3_type &trf, navigation_link volume_link, const boundary_coll_type &mask_boundaries, const dindex idx=dindex_invalid, const std::uint64_t source=detail::invalid_value< std::uint64_t >())
Parametrized constructor - surface with only one mask.
Definition surface_factory_interface.hpp:54
typename detector_t::surface_type::navigation_link navigation_link
Navigation link stored for each mask attached to the surface.
Definition surface_factory_interface.hpp:42
std::vector< typename detector_t::scalar_type > boundary_coll_type
Boundary-value collection type for one mask.
Definition surface_factory_interface.hpp:40
auto get_data() -> std::tuple< surface_id &, std::vector< navigation_link > &, dindex &, std::uint64_t &, std::vector< boundary_coll_type > &, typename detector_t::transform3_type & >
Definition surface_factory_interface.hpp:91
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 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=0
Construct detector components from the data in the factory and add them the containers of a volume bu...
virtual void push_back(std::vector< surface_data< detector_t > > &&data)=0
typename detector_t::surface_type::navigation_link navigation_link
Navigation link type used by surfaces produced by the factory.
Definition surface_factory_interface.hpp:123
virtual void clear()=0
Clear all data in the factory.
virtual void push_back(surface_data< detector_t > &&data)=0
Add data to the factory.
virtual dindex size() const =0
Detray include(s).
Definition array_operators.hpp:18
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