12#include "detray/builders/cylinder_portal_generator.hpp"
13#include "detray/builders/detector_builder.hpp"
14#include "detray/builders/grid_builder.hpp"
15#include "detray/builders/homogeneous_material_builder.hpp"
16#include "detray/builders/homogeneous_material_generator.hpp"
17#include "detray/core/detector.hpp"
18#include "detray/definitions/algebra.hpp"
19#include "detray/definitions/indexing.hpp"
20#include "detray/definitions/units.hpp"
21#include "detray/detectors/wire_chamber_metadata.hpp"
22#include "detray/geometry/shapes/line.hpp"
23#include "detray/material/predefined_materials.hpp"
24#include "detray/utils/consistency_checker.hpp"
25#include "detray/utils/print_detector.hpp"
28#include "detray/test/common/factories/wire_layer_generator.hpp"
31#include <vecmem/memory/memory_resource.hpp>
36template <concepts::scalar scalar_t,
typename wire_shape_t = line_square>
182 out <<
"\nWire Chamber\n"
183 <<
"----------------------------\n"
184 <<
" No. layers : " << cfg.
n_layers() <<
"\n"
187 <<
" Half length z : " << cfg.
half_z() <<
" [mm]\n";
189 if constexpr (std::same_as<wire_shape_t, line_square>) {
190 out <<
" Shape : wire cell\n";
192 out <<
" Shape : straw tube\n";
195 out <<
" Cell size : " << cfg.
cell_size() <<
" [mm]\n"
196 <<
" Stereo angle : " << cfg.
stereo_angle() <<
" [rad]\n"
198 <<
" Material rad. : " << cfg.
mat_radius() <<
" [mm]\n";
209template <concepts::algebra algebra_t,
typename wire_shape_t>
211 vecmem::memory_resource &resource,
215 using detector_t =
typename builder_t::detector_type;
219 builder_t det_builder;
220 det_builder.set_name(
"wire_chamber");
223 typename detector_t::geometry_context gctx{};
226 using nav_link_t =
typename detector_t::surface_type::navigation_link;
227 constexpr auto leaving_world{detail::invalid_value<nav_link_t>()};
228 const scalar_t inner_rad{cfg.first_layer_inner_radius()};
229 const scalar_t cell_size{cfg.cell_size()};
232 constexpr auto grid_id{
233 detector_t::accel::id::e_surface_concentric_cylinder2D_grid};
234 using cyl_grid_t = types::get<typename detector_t::accel, grid_id>;
235 using loc_bin_idx_t =
typename cyl_grid_t::loc_bin_index;
236 static_assert(cyl_grid_t::dim == 2);
237 using grid_builder_t =
243 bin_range[
static_cast<std::size_t
>(axis::label::e_rphi)] = {0, 100};
244 bin_range[
static_cast<std::size_t
>(axis::label::e_cyl_z)] = {0, 1};
251 constexpr unsigned int bin_capacity{3u};
252 std::vector<std::pair<loc_bin_idx_t, dindex>> capacities{};
254 static_cast<std::size_t
>(bin_range[0][1] * bin_range[1][1]));
259 auto inner_v_builder = det_builder.new_volume(volume_id::e_cylinder);
260 inner_v_builder->add_volume_placement();
261 const dindex inner_vol_idx{inner_v_builder->vol_index()};
262 inner_v_builder->set_name(
"inner_vol_" + std::to_string(inner_vol_idx));
278 auto inner_pt_factory =
279 std::make_shared<cylinder_portal_generator<detector_t>>(inner_pt_cfg);
280 inner_v_builder->add_surfaces(inner_pt_factory, gctx);
287 auto &mat_cfg = cfg.material_config();
290 mat_cfg.portal_material(vac).passive_material(vac);
293 for (
unsigned int i_lay = 0; i_lay < cfg.n_layers(); i_lay++) {
295 auto v_builder = det_builder.new_volume(volume_id::e_cylinder);
297 det_builder.template decorate<homogeneous_material_builder<detector_t>>(
300 const dindex vol_idx{vm_builder->vol_index()};
301 vm_builder->set_name(
"layer_vol_" + std::to_string(vol_idx));
304 vm_builder->add_volume_placement();
307 const scalar_t inner_layer_rad =
308 inner_rad +
static_cast<scalar_t
>(i_lay) * 2.f * cell_size;
309 const scalar_t outer_layer_rad =
310 inner_rad +
static_cast<scalar_t
>(i_lay + 1u) * 2.f * cell_size;
313 auto &layer_cfg = cfg.layer_config();
314 layer_cfg.inner_layer_radius(inner_layer_rad).half_length(cfg.half_z());
316 const scalar_t sign = (i_lay % 2 == 0) ? 1 : -1;
317 layer_cfg.stereo_angle(sign * math::fabs(layer_cfg.stereo_angle()));
322 auto link_north{i_lay == cfg.n_layers() - 1u ? leaving_world
337 std::make_unique<wire_layer_generator<detector_t, wire_shape_t>>(
339 auto wire_mat_factory =
340 std::make_shared<homogeneous_material_generator<detector_t>>(
341 std::move(wire_factory), mat_cfg);
344 auto portal_mat_factory =
345 std::make_shared<cylinder_portal_generator<detector_t>>(
349 vm_builder->add_surfaces(portal_mat_factory);
350 vm_builder->add_surfaces(wire_mat_factory, gctx);
354 det_builder.template decorate<grid_builder_t>(vm_builder);
358 auto bin_indexer2D = axis::detail::get_bin_indexer(
359 bin_range, std::make_integer_sequence<std::size_t, cyl_grid_t::dim>{});
360 for (
const auto [bin_idx0, bin_idx1] : bin_indexer2D) {
362 loc_bin_idx_t loc_bin{
static_cast<unsigned int>(bin_idx0),
363 static_cast<unsigned int>(bin_idx1)};
364 capacities.emplace_back(loc_bin, bin_capacity);
367 vgr_builder->set_type(detector_t::geo_obj_ids::e_sensitive);
368 vgr_builder->init_grid(sf_grid_spans,
369 {
static_cast<std::size_t
>(bin_range[0][1]),
370 static_cast<std::size_t
>(bin_range[1][1])},
375 typename detector_t::name_map
name_map{};
376 auto det = det_builder.build(resource, cfg.builder_options(),
name_map);
378 if (cfg.do_check()) {
379 const bool verbose_check{
false};
380 detray::detail::check_consistency(det, verbose_check,
name_map);
383 DETRAY_DEBUG_HOST(
"\n" << detray::utils::print_detector(det,
name_map));
385 return std::make_pair(std::move(det), std::move(
name_map));
Provides functionality to build a detray detector volume by volume.
Definition detector_builder.hpp:40
Build a grid of a certain shape.
Definition grid_builder.hpp:41
Provides basic functionality to build detector volumes.
Definition volume_builder.hpp:36
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
unsigned int dindex
Default index type.
Definition indexing.hpp:18
auto build_wire_chamber(vecmem::memory_resource &resource, wire_chamber_config< dscalar< algebra_t >, wire_shape_t > &cfg)
Build a wire chamber detector.
Definition build_wire_chamber.hpp:210
Multi-bin-range: contains bin index ranges from multiple axes.
Definition axis.hpp:48
static constexpr scalar_t pi
π
Definition units.hpp:136
configuration for the cylinder portal generator
Definition cylinder_portal_generator.hpp:32
constexpr cylinder_portal_config & link_north(const dindex l)
Set the volume adjacent to the north endcap.
Definition cylinder_portal_generator.hpp:97
constexpr cylinder_portal_config & link_east(const dindex l)
Set the volume adjacent to the outer cylindrical surface.
Definition cylinder_portal_generator.hpp:111
constexpr cylinder_portal_config & fixed_half_length(const scalar_t z)
Set the half-length used when autofitting is disabled.
Definition cylinder_portal_generator.hpp:90
constexpr cylinder_portal_config & fixed_inner_radius(const scalar_t r)
Set the inner radius used when autofitting is disabled.
Definition cylinder_portal_generator.hpp:76
constexpr cylinder_portal_config & build_inner(const bool b)
SettersSet whether to create an inner cylindrical portal.
Definition cylinder_portal_generator.hpp:55
constexpr cylinder_portal_config & do_autofit(const bool b)
Set whether portal bounds are fitted from the contained surfaces.
Definition cylinder_portal_generator.hpp:62
constexpr cylinder_portal_config & link_west(const dindex l)
Set the volume adjacent to the inner cylindrical surface.
Definition cylinder_portal_generator.hpp:118
constexpr cylinder_portal_config & fixed_outer_radius(const scalar_t r)
Set the outer radius used when autofitting is disabled.
Definition cylinder_portal_generator.hpp:83
constexpr cylinder_portal_config & link_south(const dindex l)
Set the volume adjacent to the south endcap.
Definition cylinder_portal_generator.hpp:104
Configuration for the homogeneous material generator.
Definition homogeneous_material_generator.hpp:33
Material composition properties and density data used by interactions.
Definition material.hpp:36
Map volume indices to volume names and vice versa.
Definition name_map.hpp:23
Predefined tungsten material with tabulated bulk properties.
Definition predefined_materials.hpp:183
static constexpr scalar_t um
Length, native unit mm.
Definition units.hpp:25
static constexpr scalar_t mm
Native length unit, the millimetre.
Definition units.hpp:27
Elements Declaration.
Definition predefined_materials.hpp:34
Options for the volume builder classes.
Definition volume_builder_interface.hpp:29
Configuration for building a wire chamber detector.
Definition build_wire_chamber.hpp:37
constexpr auto & material_config()
Return the material config.
Definition build_wire_chamber.hpp:164
constexpr wire_chamber_config & n_layers(const unsigned int n)
Setters.
Definition build_wire_chamber.hpp:63
constexpr scalar_t first_layer_inner_radius() const
Return the first layer inner radius.
Definition build_wire_chamber.hpp:128
scalar_t m_first_layer_inner_rad
The inner radius of the first layer.
Definition build_wire_chamber.hpp:41
constexpr wire_chamber_config & wire_material(const material< scalar_t > &m)
Set the wire material.
Definition build_wire_chamber.hpp:105
bool m_do_check
Do a full detector consistency check after building.
Definition build_wire_chamber.hpp:56
volume_builder_options builder_options()
Return the builder options.
Definition build_wire_chamber.hpp:111
scalar_t m_half_z
Half z of cylinder chamber.
Definition build_wire_chamber.hpp:43
volume_builder_options m_builder_opts
Volume builder configuration.
Definition build_wire_chamber.hpp:53
constexpr const wire_layer_generator_config< scalar_t > & layer_config() const
Return the const wire layer configuration.
Definition build_wire_chamber.hpp:159
wire_layer_generator_config< scalar_t > m_wire_factory_cfg
Config for the wire generation (barrel).
Definition build_wire_chamber.hpp:49
const volume_builder_options & builder_options() const
Return the builder options.
Definition build_wire_chamber.hpp:170
unsigned int m_n_layers
Number of layers.
Definition build_wire_chamber.hpp:39
constexpr wire_chamber_config & cell_size(const scalar_t c)
Set the cell size.
Definition build_wire_chamber.hpp:84
constexpr wire_chamber_config & mat_radius(const scalar_t r)
Set the mat radius.
Definition build_wire_chamber.hpp:98
constexpr wire_chamber_config & stereo_angle(const scalar_t s)
Set the stereo angle.
Definition build_wire_chamber.hpp:91
constexpr scalar_t stereo_angle() const
Return the stereo angle.
Definition build_wire_chamber.hpp:141
constexpr wire_layer_generator_config< scalar_t > & layer_config()
Return the layer config.
Definition build_wire_chamber.hpp:154
scalar_t m_mat_radius
Radius of the material rods.
Definition build_wire_chamber.hpp:45
constexpr const auto & material_config() const
Return the const material configuration.
Definition build_wire_chamber.hpp:167
constexpr wire_chamber_config & half_z(const scalar_t hz)
Set the half z.
Definition build_wire_chamber.hpp:77
constexpr scalar_t cell_size() const
Return the cell size.
Definition build_wire_chamber.hpp:136
constexpr scalar_t mat_radius() const
Return the mat radius.
Definition build_wire_chamber.hpp:146
hom_material_config< scalar_t > m_material_config
Configuration for the homogeneous material generator.
Definition build_wire_chamber.hpp:51
material< scalar_t > m_wire_mat
Type of material for the material rods.
Definition build_wire_chamber.hpp:47
constexpr const material< scalar_t > & wire_material() const
Return the wire material.
Definition build_wire_chamber.hpp:149
constexpr unsigned int n_layers() const
Getters.
Definition build_wire_chamber.hpp:125
constexpr wire_chamber_config & do_check(const bool check)
Set the do check.
Definition build_wire_chamber.hpp:115
constexpr bool do_check() const
Return the do check.
Definition build_wire_chamber.hpp:175
constexpr scalar_t half_z() const
Return the half z.
Definition build_wire_chamber.hpp:133
constexpr wire_chamber_config & first_layer_inner_radius(const scalar_t r)
Set the first layer inner radius.
Definition build_wire_chamber.hpp:70
friend std::ostream & operator<<(std::ostream &out, const wire_chamber_config &cfg)
Print the wire chamber configuration.
Definition build_wire_chamber.hpp:180
configuration for the wire layer generator
Definition wire_layer_generator.hpp:33