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/rectangle2D.hpp"
21#include "detray/utils/logging.hpp"
33template <concepts::scalar scalar_t>
49 std::pair<unsigned int, unsigned int>
m_binning = {16u, 14u};
101 const unsigned int n_z) {
109 const std::pair<unsigned int, const unsigned int> &
binning) {
144template <concepts::detector detector_t,
typename mask_shape_t = rectangle2D>
146 using algebra_t =
typename detector_t::algebra_type;
161 return static_cast<dindex>(m_cfg.binning().first * m_cfg.binning().second);
187 typename detector_t::surface_lookup_container &surfaces,
188 typename detector_t::transform_container &transforms,
189 typename detector_t::mask_container &masks,
190 typename detector_t::geometry_context ctx = {})
192 DETRAY_VERBOSE_HOST(
"Generate silicon tracker barrel modules...");
193 DETRAY_VERBOSE_HOST(
"-> Generate " <<
size() <<
" surfaces");
195 using surface_t =
typename detector_t::surface_type;
196 using nav_link_t =
typename surface_t::navigation_link;
197 using mask_link_t =
typename surface_t::mask_link;
198 using material_link_t =
typename surface_t::material_link;
200 const dindex surfaces_offset{
static_cast<dindex>(surfaces.size())};
201 constexpr auto invalid_src_link{detail::invalid_value<std::uint64_t>()};
204 constexpr auto mask_id{
205 types::id<typename detector_t::masks, mask<mask_shape_t, algebra_t>>};
208 constexpr auto no_material{surface_t::material_id::e_none};
210 auto volume_idx{volume.index()};
212 const auto mask_volume_link{
static_cast<nav_link_t
>(volume_idx)};
215 const unsigned int n_phi_bins{m_cfg.binning().first};
216 const unsigned int n_z_bins{m_cfg.binning().second};
219 std::vector<point3_t> mod_centers;
220 mod_centers.reserve(n_phi_bins * n_z_bins);
224 static_cast<scalar_t
>(n_phi_bins)};
228 const scalar_t z_start{
229 -0.5f *
static_cast<scalar_t
>(n_z_bins - 1u) *
230 (2.f * m_cfg.module_bounds().at(1) - m_cfg.z_overlap())};
231 const scalar_t z_step{(math::fabs(z_start) - z_start) /
232 static_cast<scalar_t
>(n_z_bins - 1)};
235 for (
unsigned int z_bin = 0u; z_bin < n_z_bins; ++z_bin) {
237 const scalar_t mod_z{z_start +
static_cast<scalar_t
>(z_bin) * z_step};
238 const scalar_t mod_r{
239 (z_bin % 2u) != 0u ? m_cfg.radius() - 0.5f * m_cfg.radial_stagger()
240 : m_cfg.radius() + 0.5f * m_cfg.radial_stagger()};
242 for (
unsigned int phiBin = 0u; phiBin < n_phi_bins; ++phiBin) {
244 const scalar_t mod_phi{min_phi +
245 static_cast<scalar_t
>(phiBin) * phi_step};
246 mod_centers.push_back(point3_t{mod_r * math::cos(mod_phi),
247 mod_r * math::sin(mod_phi), mod_z});
252 for (
auto &mod_center : mod_centers) {
254 mask_link_t mask_link = {mask_id, {masks.template
size<mask_id>(), 1u}};
256 const auto trf_index = transforms.size(ctx);
258 surfaces.push_back({trf_index, mask_link, material_link, volume_idx,
259 surface_id::e_sensitive},
264 const scalar_t mod_phi{vector::phi(mod_center)};
266 const scalar_t tilt_phi{m_cfg.tilt_phi()};
267 const vector3_t mod_local_z{math::cos(mod_phi + tilt_phi),
268 math::sin(mod_phi + tilt_phi),
269 static_cast<scalar_t
>(0)};
271 const vector3_t mod_local_x{-math::sin(mod_phi + tilt_phi),
272 math::cos(mod_phi + tilt_phi),
273 static_cast<scalar_t
>(0)};
276 transforms.emplace_back(ctx, mod_center, mod_local_z, mod_local_x);
280 masks.template emplace_back<mask_id>(empty_context{}, m_cfg.module_bounds(),
283 return {surfaces_offset,
static_cast<dindex>(surfaces.size())};
288 barrel_generator_config<scalar_t> m_cfg{};
void clear() override
This is a surface generator, no external surface data needed.
Definition barrel_generator.hpp:167
void push_back(surface_data< detector_t > &&) override
Add data to the factory.
Definition barrel_generator.hpp:169
auto size() const -> dindex override
Definition barrel_generator.hpp:160
barrel_generator(const barrel_generator_config< scalar_t > &cfg)
Build a barrel layer according to the parameters given in.
Definition barrel_generator.hpp:155
auto push_back(std::vector< surface_data< detector_t > > &&) -> void override
Ignore supplied surface data because this factory generates its own.
Definition barrel_generator.hpp:173
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 pixel tracker barrel layer.
Definition barrel_generator.hpp:186
Bind transform and mask data together for surface building.
Definition surface_factory_interface.hpp:37
virtual dindex size() const =0
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
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
configuration for the barrel module generator
Definition barrel_generator.hpp:34
scalar_t m_z_overlap
Module overlap in z.
Definition barrel_generator.hpp:47
constexpr barrel_generator_config & binning(const std::pair< unsigned int, const unsigned int > &binning)
Set the binning.
Definition barrel_generator.hpp:108
constexpr barrel_generator_config & radius(const scalar_t r)
Set the radius.
Definition barrel_generator.hpp:78
constexpr scalar_t half_length() const
Getters.
Definition barrel_generator.hpp:119
constexpr scalar_t radius() const
Return the radius.
Definition barrel_generator.hpp:128
constexpr barrel_generator_config & tilt_phi(const scalar_t tilt)
Set the tilt phi.
Definition barrel_generator.hpp:71
constexpr scalar_t z_overlap() const
Return the z overlap.
Definition barrel_generator.hpp:134
constexpr barrel_generator_config & binning(const unsigned int n_phi, const unsigned int n_z)
Set the binning.
Definition barrel_generator.hpp:100
constexpr scalar_t radial_stagger() const
Return the radial stagger.
Definition barrel_generator.hpp:131
constexpr scalar_t tilt_phi() const
Return the tilt phi.
Definition barrel_generator.hpp:125
scalar_t m_radial_stagger
Radial module stagger.
Definition barrel_generator.hpp:45
const std::vector< scalar_t > & module_bounds() const
Return the module bounds.
Definition barrel_generator.hpp:122
scalar_t m_radius
Layer radius.
Definition barrel_generator.hpp:43
constexpr barrel_generator_config & half_length(const scalar_t hz)
Setters.
Definition barrel_generator.hpp:56
constexpr barrel_generator_config & z_overlap(const scalar_t zo)
Set the z overlap.
Definition barrel_generator.hpp:92
constexpr barrel_generator_config & radial_stagger(const scalar_t r_st)
Set the radial stagger.
Definition barrel_generator.hpp:85
scalar_t m_half_z
Half length of the barrel (z).
Definition barrel_generator.hpp:36
barrel_generator_config & module_bounds(const std::vector< scalar_t > &bnds)
Set the module bounds.
Definition barrel_generator.hpp:63
constexpr const auto & binning() const
Return the binning.
Definition barrel_generator.hpp:137
scalar_t m_tilt_phi
Phi tilt for modules.
Definition barrel_generator.hpp:41
std::pair< unsigned int, unsigned int > m_binning
Number of modules in phi and z.
Definition barrel_generator.hpp:49
std::vector< scalar_t > m_mask_values
Boundary values for the module masks.
Definition barrel_generator.hpp:38
static constexpr scalar_t pi
π
Definition units.hpp:136
static constexpr scalar_t mm
Native length unit, the millimetre.
Definition units.hpp:27