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/geometry.hpp"
17#include "detray/definitions/indexing.hpp"
18#include "detray/geometry/mask.hpp"
19#include "detray/geometry/shapes/rectangle2D.hpp"
20#include "detray/tracks/ray.hpp"
21#include "detray/utils/axis_rotation.hpp"
22#include "detray/utils/logging.hpp"
23#include "detray/utils/unit_vectors.hpp"
35 typename trajectory_t =
38 using algebra_t =
typename detector_t::algebra_type;
52 std::vector<scalar_t> positions,
56 m_positions{std::move(positions)},
57 m_boundaries{boundaries} {}
66 scalar_t length, std::size_t n_surfaces,
69 : m_traj{traj}, m_positions{}, m_boundaries{boundaries} {
71 scalar_t dist{n_surfaces > 1u
72 ? length /
static_cast<scalar_t
>(n_surfaces - 1u)
74 for (std::size_t i = 0u; i < n_surfaces; ++i) {
75 m_positions.push_back(pos);
83 return static_cast<dindex>(m_positions.size());
114 typename detector_t::surface_lookup_container &surfaces,
115 typename detector_t::transform_container &transforms,
116 typename detector_t::mask_container &masks,
117 typename detector_t::geometry_context ctx = {})
119 DETRAY_VERBOSE_HOST(
"Generate telescope modules...");
120 DETRAY_VERBOSE_HOST(
"-> Generate " <<
size() <<
" surfaces");
122 using surface_t =
typename detector_t::surface_type;
123 using nav_link_t =
typename surface_t::navigation_link;
124 using mask_link_t =
typename surface_t::mask_link;
125 using material_link_t =
typename surface_t::material_link;
127 const dindex surfaces_offset{
static_cast<dindex>(surfaces.size())};
128 constexpr auto invalid_src_link{detail::invalid_value<std::uint64_t>()};
131 constexpr auto mask_id{
132 types::id<typename detector_t::masks, mask<mask_shape_t, algebra_t>>};
135 constexpr auto no_material{surface_t::material_id::e_none};
137 auto volume_idx{volume.index()};
140 const auto mod_placements = module_positions(m_traj, m_positions);
143 for (
const auto &mod_placement : mod_placements) {
144 auto mask_volume_link{
static_cast<nav_link_t
>(volume_idx)};
147 mask_link_t mask_link{mask_id, masks.template
size<mask_id>()};
150 const auto trf_index = transforms.size(ctx);
151 surfaces.push_back({trf_index, mask_link, material_link, volume_idx,
152 surface_id::e_sensitive},
156 masks.template emplace_back<mask_id>(empty_context{}, m_boundaries,
161 vector3_t m_local_z = vector::normalize(mod_placement.dir);
163 if constexpr (std::is_same_v<mask_shape_t, detray::line_square> ||
164 std::is_same_v<mask_shape_t, detray::line_circular>) {
168 unit_vectors<vector3_t>().make_curvilinear_unit_u(m_local_z);
169 axis_rotation<algebra_t> axis_rot(curvi_u,
171 m_local_z = axis_rot(m_local_z);
176 unit_vectors<vector3_t>().make_curvilinear_unit_u(m_local_z);
179 transforms.emplace_back(ctx, mod_placement.pos, m_local_z, m_local_x);
182 return {surfaces_offset,
static_cast<dindex>(surfaces.size())};
187 struct module_placement {
201 inline std::vector<module_placement> module_positions(
202 const trajectory_t &traj,
const std::vector<scalar_t> &steps)
const {
204 std::vector<module_placement> placements;
205 placements.reserve(steps.size());
207 for (
const auto s : steps) {
208 placements.push_back({traj.pos(s), traj.dir(s)});
217 std::vector<scalar_t> m_positions;
describes a straight-line trajectory
Definition ray.hpp:22
Geometrical shape of a rectangle2D.
Definition rectangle2D.hpp:30
Bind transform and mask data together for surface building.
Definition surface_factory_interface.hpp:37
virtual dindex size() const =0
auto size() const -> dindex override
Definition telescope_generator.hpp:82
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
Create a surface telescope.
Definition telescope_generator.hpp:113
void clear() override
Clear the positions and boundaries of the surfaces.
Definition telescope_generator.hpp:88
auto push_back(std::vector< surface_data< detector_t > > &&) -> void override
Ignore supplied surface data because this factory generates its own.
Definition telescope_generator.hpp:100
telescope_generator(std::vector< scalar_t > positions, const darray< scalar_t, mask_shape_t::boundaries::e_size > &boundaries, trajectory_t traj)
Build a surface at every position along the pilot track with the given extent.
Definition telescope_generator.hpp:51
telescope_generator(scalar_t length, std::size_t n_surfaces, darray< scalar_t, mask_shape_t::boundaries::e_size > boundaries, trajectory_t traj)
Infer the sensitive surface placement from the telescope.
Definition telescope_generator.hpp:65
void push_back(surface_data< detector_t > &&) override
This is a surface generator, no external surface data needed.
Definition telescope_generator.hpp:96
Check if a type can be used as a detector.
Definition concepts.hpp:47
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
std::array< value_t, kDIM > darray
Fixed-size array container.
Definition containers.hpp:30
get_vector3D_t< A, T > dvector3D
Three-dimensional vector type for algebra A and value type T.
Definition algebra.hpp:80
get_transform3D_t< A, T > dtransform3D
Three-dimensional transform type for algebra A and value type T.
Definition algebra.hpp:84
get_point3D_t< A, T > dpoint3D
Three-dimensional point type for algebra A and value type T.
Definition algebra.hpp:72
static constexpr scalar_t pi
π
Definition units.hpp:136