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/algebra.hpp"
16#include "detray/definitions/detail/qualifiers.hpp"
17#include "detray/definitions/geometry.hpp"
18#include "detray/definitions/indexing.hpp"
19#include "detray/geometry/mask.hpp"
20#include "detray/geometry/shapes/line.hpp"
21#include "detray/utils/axis_rotation.hpp"
22#include "detray/utils/logging.hpp"
23#include "detray/utils/unit_vectors.hpp"
32template <concepts::scalar scalar_t>
96template <concepts::detector detector_t,
typename mask_shape_t = line_square>
98 :
public surface_factory_interface<detector_t> {
99 using algebra_t =
typename detector_t::algebra_type;
112 m_layer_central_rad{m_cfg.inner_layer_radius() + m_cfg.cell_size()} {}
118 m_layer_central_rad};
119 return static_cast<dindex>(
120 std::floor(circumference / 2.f * m_cfg.cell_size()));
146 typename detector_t::surface_lookup_container &surfaces,
147 typename detector_t::transform_container &transforms,
148 typename detector_t::mask_container &masks,
149 typename detector_t::geometry_context ctx = {})
151 DETRAY_VERBOSE_HOST(
"Generate modules for wire chamber layer...");
152 DETRAY_VERBOSE_HOST(
"-> Generate " <<
size() <<
" surfaces");
154 using surface_t =
typename detector_t::surface_type;
155 using nav_link_t =
typename surface_t::navigation_link;
156 using mask_link_t =
typename surface_t::mask_link;
157 using material_link_t =
typename surface_t::material_link;
160 auto volume_idx{volume.index()};
162 const dindex surfaces_offset{
static_cast<dindex>(surfaces.size())};
163 constexpr auto invalid_src_link{detail::invalid_value<std::uint64_t>()};
166 constexpr auto mask_id{
167 types::id<typename detector_t::masks, mask<mask_shape_t, algebra_t>>};
169 const auto mask_volume_link{
static_cast<nav_link_t
>(volume_idx)};
174 const scalar_t delta = 2.f * m_cfg.cell_size() / m_layer_central_rad;
177 const scalar_t x = m_layer_central_rad * math::cos(phi);
178 const scalar_t y = m_layer_central_rad * math::sin(phi);
179 const scalar_t z = 0.f;
181 cell_centers.push_back({x, y, z});
186 for (
const point3_t &cell_center : cell_centers) {
188 mask_link_t mask_link{mask_id, {masks.template
size<mask_id>(), 1u}};
190 material_link_t material_link{surface_t::material_id::e_none,
193 const auto trf_index = transforms.size(ctx);
195 surfaces.push_back({trf_index, mask_link, material_link, volume_idx,
196 surface_id::e_sensitive},
200 masks.template emplace_back<mask_id>(empty_context{}, mask_volume_link,
202 m_cfg.half_length());
205 vector3_t z_axis{0.f, 0.f, 1.f};
206 const vector3_t r_axis = vector::normalize(cell_center);
207 z_axis = axis_rotation<algebra_t>(r_axis, m_cfg.stereo_angle())(z_axis);
208 const vector3_t x_axis =
209 unit_vectors<vector3_t>().make_curvilinear_unit_u(z_axis);
211 transforms.emplace_back(ctx, cell_center, z_axis, x_axis);
214 return {surfaces_offset,
static_cast<dindex>(surfaces.size())};
219 wire_layer_generator_config<scalar_t> m_cfg{};
222 scalar_t m_layer_central_rad{};
Bind transform and mask data together for surface building.
Definition surface_factory_interface.hpp:37
virtual dindex size() const =0
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 wire chamber barrel layer.
Definition wire_layer_generator.hpp:145
auto push_back(std::vector< surface_data< detector_t > > &&) -> void override
Ignore supplied surface data because this factory generates its own.
Definition wire_layer_generator.hpp:132
wire_layer_generator(const wire_layer_generator_config< scalar_t > &cfg)
Build a wire chamber/straw tube layer according to the parameters given in.
Definition wire_layer_generator.hpp:109
void push_back(surface_data< detector_t > &&) override
Add data to the factory.
Definition wire_layer_generator.hpp:128
auto size() const -> dindex override
Definition wire_layer_generator.hpp:116
void clear() override
This is a surface generator, no external surface data needed.
Definition wire_layer_generator.hpp:126
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
vecmem::vector< value_t > dvector
Vector container backed by vecmem.
Definition containers.hpp:34
unsigned int dindex
Default index type.
Definition indexing.hpp:18
constexpr dindex dindex_invalid
Global invalid index definition.
Definition indexing.hpp:21
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
static constexpr scalar_t mm
Native length unit, the millimetre.
Definition units.hpp:27
static constexpr scalar_t mrad
Conversion factor from milliradians to radians.
Definition units.hpp:113
configuration for the wire layer generator
Definition wire_layer_generator.hpp:33
constexpr wire_layer_generator_config & stereo_angle(const scalar_t angle)
Set the stereo angle.
Definition wire_layer_generator.hpp:62
constexpr scalar_t cell_size() const
Return the cell size.
Definition wire_layer_generator.hpp:82
scalar_t m_cell_size
Cell size/radius.
Definition wire_layer_generator.hpp:37
constexpr wire_layer_generator_config & inner_layer_radius(const scalar_t r)
Set the inner layer radius.
Definition wire_layer_generator.hpp:69
constexpr scalar_t stereo_angle() const
Return the stereo angle.
Definition wire_layer_generator.hpp:85
scalar_t m_stereo_angle
Stereo angle between wires.
Definition wire_layer_generator.hpp:39
constexpr scalar_t half_length() const
Getters.
Definition wire_layer_generator.hpp:79
scalar_t m_half_z
Half length of the layer (z).
Definition wire_layer_generator.hpp:35
constexpr wire_layer_generator_config & cell_size(const scalar_t c)
Set the cell size.
Definition wire_layer_generator.hpp:55
constexpr scalar_t inner_layer_radius() const
Return the inner layer radius.
Definition wire_layer_generator.hpp:88
scalar_t m_layer_radius
Layer radius.
Definition wire_layer_generator.hpp:41
constexpr wire_layer_generator_config & half_length(const scalar_t hz)
Setters.
Definition wire_layer_generator.hpp:48