12#include "detray/builders/detail/radius_getter.hpp"
13#include "detray/core/concepts.hpp"
14#include "detray/definitions/algebra.hpp"
15#include "detray/definitions/units.hpp"
16#include "detray/geometry/mask.hpp"
17#include "detray/geometry/shapes.hpp"
18#include "detray/geometry/surface.hpp"
19#include "detray/geometry/tracking_volume.hpp"
20#include "detray/utils/concepts.hpp"
26namespace detray::svgtools::utils {
42 DETRAY_HOST
inline auto operator()(
const mask_group_t& mask_group,
44 const transform3_t& transform,
45 const std::size_t = 0)
const {
46 return link_start(mask_group.at(index), transform);
60 DETRAY_HOST
inline auto operator()(
const mask_group_t& mask_group,
61 const idx_range_t& idx_range,
62 const transform3_t& transform,
63 const std::size_t mask_idx)
const {
64 assert(mask_idx < idx_range.size());
65 return link_start(mask_group.at(idx_range.lower() + mask_idx), transform);
70 template <
typename mask_t, concepts::transform3D transform3_t>
71 typename mask_t::point3_type
inline link_start(
72 const mask_t&
mask,
const transform3_t& transform)
const {
77 template <concepts::transform3D transform3_t, concepts::algebra algebra_t>
80 const transform3_t& transform)
const {
83 using point3_t =
typename mask_t::point3_type;
84 using scalar_t =
typename mask_t::scalar_type;
86 const scalar_t r{0.5f *
87 (
mask[shape_t::e_inner_r] +
mask[shape_t::e_outer_r])};
90 return mask_t::to_global_frame(transform, point3_t{r, phi, 0.f});
94 template <concepts::transform3D transform3_t, concepts::algebra algebra_t>
96 const detray::mask<detray::annulus2D, algebra_t>& mask,
97 const transform3_t& transform)
const {
98 using shape_t = detray::annulus2D;
99 using mask_t = detray::mask<shape_t, algebra_t>;
100 using point3_t =
typename mask_t::point3_type;
101 using scalar_t =
typename mask_t::scalar_type;
103 const scalar_t r{(mask[shape_t::e_min_r] + mask[shape_t::e_max_r]) / 2.f};
104 const scalar_t phi{mask[shape_t::e_average_phi]};
106 return mask_t::to_global_frame(transform, point3_t{r, phi, 0.f});
110 template <concepts::transform3D transform3_t, concepts::algebra algebra_t>
112 const detray::mask<concentric_cylinder2D, algebra_t>& mask,
113 const transform3_t& transform)
const {
114 using mask_t = detray::mask<concentric_cylinder2D, algebra_t>;
115 using point3_t =
typename mask_t::point3_type;
116 using scalar_t =
typename mask_t::scalar_type;
118 const scalar_t r{mask[concentric_cylinder2D::e_r]};
121 const scalar_t z{mask.
centroid()[2]};
123 return mask_t::to_global_frame(transform, point3_t{phi, z, r});
127 template <concepts::transform3D transform3_t, concepts::algebra algebra_t>
129 const detray::mask<cylinder2D, algebra_t>& mask,
130 const transform3_t& transform)
const {
131 using mask_t = detray::mask<cylinder2D, algebra_t>;
132 using point3_t =
typename mask_t::point3_type;
133 using scalar_t =
typename mask_t::scalar_type;
135 const scalar_t r{mask[cylinder2D::e_r]};
138 const scalar_t z{mask.
centroid()[2]};
140 return mask_t::to_global_frame(transform, point3_t{r * phi, z, r});
144 template <concepts::transform3D transform3_t, concepts::algebra algebra_t>
146 const detray::mask<detray::cylinder3D, algebra_t>& mask,
147 const transform3_t& transform)
const {
148 using shape_t = detray::cylinder3D;
149 using mask_t = detray::mask<shape_t, algebra_t>;
150 using point3_t =
typename mask_t::point3_type;
151 using scalar_t =
typename mask_t::scalar_type;
153 const scalar_t r{mask[shape_t::e_max_r]};
154 const scalar_t phi{0.5f *
155 (mask[shape_t::e_max_phi] + mask[shape_t::e_max_phi])};
156 const scalar_t z{mask.
centroid()[2]};
158 return mask_t::to_global_frame(transform, point3_t{r, phi, z});
185 const mask_group_t& mask_group,
const index_t& index,
186 const detector_t& detector,
188 const point3_t& surface_point,
const vector3_t& surface_normal,
189 const scalar_t& link_length,
const std::size_t = 0)
const {
190 return link_dir(mask_group.at(index), detector, volume, surface_point,
216 const mask_group_t& mask_group,
const idx_range_t& idx_range,
217 const detector_t& detector,
219 const point3_t& surface_point,
const vector3_t& surface_normal,
220 const scalar_t& link_length,
const std::size_t mask_idx)
const {
221 assert(mask_idx < idx_range.size());
222 return link_dir(mask_group.at(idx_range.lower() + mask_idx), detector,
223 volume, surface_point, surface_normal) *
232 inline vector3_t link_dir(
const mask_t& ,
235 const point3_t& surface_point,
236 const vector3_t& surface_normal)
const {
237 const auto dir = volume.center() - surface_point;
238 const auto dot_prod = vector::dot(dir, surface_normal);
241 assert(dot_prod != 0.f);
243 return math::copysign(1.f, dot_prod) * surface_normal;
249 requires std::is_same_v<shape_t, cylinder2D> ||
250 std::is_same_v<shape_t, concentric_cylinder2D>
251 inline vector3_t link_dir(
253 const detector_t& detector,
256 const vector3_t& surface_normal)
const {
257 for (
const auto& desc : volume.portals()) {
262 .
template visit_mask<detray::detail::outer_radius_getter>()) {
263 if (*r >
mask[shape_t::e_r]) {
264 return surface_normal;
268 return vector3_t{-1.f * surface_normal};
Facade for a detray detector surface.
Definition surface.hpp:36
Mask a region on a surface and link it to a volume.
Definition mask.hpp:46
auto centroid() const
Definition mask.hpp:282
Geometrical shape of a closed ring.
Definition ring2D.hpp:34
Facade for a detray detector volume.
Definition tracking_volume.hpp:44
Check if a type can be used as a detector.
Definition concepts.hpp:47
Index concept to access vector/matrix elements.
Definition concepts.hpp:54
Concept that checks if a type models an interval of some value that can be obtained with 'get'.
Definition concepts.hpp:41
Definition concepts.hpp:77
Scalar concept: Elements of vectors/matrices (can be simd vectors).
Definition concepts.hpp:40
Definition concepts.hpp:65
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_2
π/2
Definition units.hpp:138