1111#include " detray/core/detail/container_buffers.hpp"
1212#include " detray/core/detail/container_views.hpp"
1313#include " detray/core/detector_metadata.hpp"
14+ #include " detray/definitions/bfield_backends.hpp"
1415#include " detray/definitions/containers.hpp"
1516#include " detray/definitions/qualifiers.hpp"
1617#include " detray/geometry/detail/volume_descriptor.hpp"
2223// Vecmem include(s)
2324#include < vecmem/memory/memory_resource.hpp>
2425
25- // Covfie include(s)
26- #include < covfie/core/field.hpp>
27-
2826// System include(s)
2927#include < algorithm>
3028#include < map>
3432namespace detray {
3533
3634// / @brief Forward declaration of a detector view type
37- template <typename metadata, template <typename > class bfield_t ,
38- typename container_t >
35+ template <typename device_bfield_bknd_t , typename metadata, typename bfield_t >
3936struct detector_view ;
4037
4138// / @brief The detector definition.
@@ -49,7 +46,7 @@ struct detector_view;
4946// / @tparam container_t type collection of the underlying containers
5047// / @tparam source_link the surface source link
5148template <typename metadata_t = default_metadata,
52- template < typename > class bfield_t = covfie::field,
49+ typename bfield_t = covfie::field<bfield:: const_bknd_t > ,
5350 typename container_t = host_container_types>
5451class detector {
5552
@@ -58,8 +55,6 @@ class detector {
5855 detector<metadata_t , bfield_t , container_t >>;
5956
6057 public:
61- using metadata = metadata_t ;
62-
6358 // / Algebra types
6459 // / @TODO: scalar as a template parameter
6560 using scalar_type = scalar;
@@ -68,9 +63,9 @@ class detector {
6863 using vector3 = __plugin::vector3<scalar_type>;
6964 using point2 = __plugin::point2<scalar_type>;
7065
71- using bfield_backend_type = typename metadata:: bfield_backend_t ;
66+ using metadata = metadata_t ;
7267
73- using bfield_type = bfield_t <bfield_backend_type> ;
68+ using bfield_type = bfield_t ;
7469
7570 // / Raw container types
7671 template <typename T, std::size_t N>
@@ -133,18 +128,22 @@ class detector {
133128 using volume_finder =
134129 typename metadata::template volume_finder<container_t >;
135130
131+ // TODO: Remove
132+ template <typename device_bfield_t >
136133 using detector_view_type =
137- detector_view<metadata, covfie::field, host_container_types >;
134+ detector_view<device_bfield_t , metadata, bfield_t >;
138135
136+ // TODO: rename back to 'view_type' etc, once covfie is wrapped in the
137+ // container view/buffer formalism
139138 // / Detector view types
140- using view_type = dmulti_view<
139+ using view_t = dmulti_view<
141140 dvector_view<volume_type>, typename transform_container::view_type,
142141 typename mask_container::view_type,
143142 typename material_container::view_type,
144143 typename surface_container::view_type, dvector_view<surface_type>,
145144 typename volume_finder::view_type>;
146145
147- using const_view_type =
146+ using const_view_t =
148147 dmulti_view<dvector_view<const volume_type>,
149148 typename transform_container::const_view_type,
150149 typename mask_container::const_view_type,
@@ -154,19 +153,25 @@ class detector {
154153 typename volume_finder::const_view_type>;
155154
156155 // / Detector buffer types
157- using buffer_type = dmulti_buffer<
156+ using buffer_t = dmulti_buffer<
158157 dvector_buffer<volume_type>, typename transform_container::buffer_type,
159158 typename mask_container::buffer_type,
160159 typename material_container::buffer_type,
161160 typename surface_container::buffer_type, dvector_buffer<surface_type>,
162161 typename volume_finder::buffer_type>;
163162
164163 detector () = delete ;
164+ // The detector holds a lot of data and should never be copied
165+ detector (const detector &) = delete ;
166+ detector &operator =(const detector &) = delete ;
167+ detector (detector &&) = default ;
165168
166169 // / Allowed costructor
170+ // / @{
171+ // / Default construction
167172 // / @param resource memory resource for the allocation of members
168173 DETRAY_HOST
169- detector (vecmem::memory_resource &resource, bfield_type &&field )
174+ explicit detector (vecmem::memory_resource &resource)
170175 : _volumes(&resource),
171176 _transforms(resource),
172177 _masks(resource),
@@ -175,12 +180,12 @@ class detector {
175180 _surface_lookup(&resource),
176181 _volume_finder(resource),
177182 _resource(&resource),
178- _bfield(field ) {}
183+ _bfield() {}
179184
180- // / Constructor with simplified constant-zero B-field
181- // / @param resource memory resource for the allocation of members
185+ // / @param resource memory resource for the allocation of members and
186+ // / externally provided magnetic field @param field
182187 DETRAY_HOST
183- explicit detector (vecmem::memory_resource &resource)
188+ detector (vecmem::memory_resource &resource, bfield_type &&field )
184189 : _volumes(&resource),
185190 _transforms (resource),
186191 _masks(resource),
@@ -189,8 +194,7 @@ class detector {
189194 _surface_lookup(&resource),
190195 _volume_finder(resource),
191196 _resource(&resource),
192- _bfield(typename bfield_type::backend_t ::configuration_t {0 .f , 0 .f ,
193- 0 .f }) {}
197+ _bfield(std::move(field)) {}
194198
195199 // / Constructor with detector_data
196200 template <typename detector_data_type,
@@ -208,6 +212,7 @@ class detector {
208212 _volume_finder(
209213 detray::detail::get<6 >(det_data._detector_data.m_view)),
210214 _bfield(det_data._bfield_view) {}
215+ // / @}
211216
212217 // / Add a new volume and retrieve a reference to it.
213218 // /
@@ -537,6 +542,12 @@ class detector {
537542 return *std::max_element (n_candidates.begin (), n_candidates.end ());
538543 }
539544
545+ // / @brief Add a bfield to the detector
546+ DETRAY_HOST
547+ void set_bfield (bfield_type &&field) {
548+ _bfield = std::forward<bfield_type>(field);
549+ }
550+
540551 DETRAY_HOST_DEVICE
541552 inline const bfield_type &get_bfield () const { return _bfield; }
542553
@@ -612,12 +623,14 @@ class detector {
612623 bfield_type _bfield;
613624};
614625
615- // / @brief A static inplementation of detector data for device
616- template <typename metadata, template <typename > class bfield_t ,
617- typename container_t >
626+ // / @brief The detector data buffer
627+ // /
628+ // / Contains the buffers for all detector components plus the covfie device
629+ // / field type, which is being copied to device when this type gets constructed
630+ template <typename device_bfield_bknd_t , typename metadata_t , typename bfield_t >
618631struct detector_buffer {
619632
620- using detector_type = detector<metadata , bfield_t , container_t >;
633+ using detector_type = detector<metadata_t , bfield_t , host_container_types >;
621634
622635 // / Automatic buffer creation with the given parameters
623636 detector_buffer (detector_type &det, vecmem::memory_resource &mr,
@@ -639,11 +652,11 @@ struct detector_buffer {
639652 cpy_type, buff_type),
640653 detray::get_buffer(det.volume_search_grid(), mr, cpy,
641654 cpy_type, buff_type)),
642- _bfield_view (det.get_bfield()) {}
655+ _bfield (det.get_bfield()) {}
643656
644657 // / Buffers were created manually
645658 detector_buffer (
646- detector<metadata, bfield_t , container_t > &det,
659+ const detector_type &det,
647660 detail::get_buffer_t <typename detector_type::volume_container>
648661 &&vol_buffer,
649662 typename detector_type::transform_container::buffer_type &&trf_buffer,
@@ -657,41 +670,22 @@ struct detector_buffer {
657670 std::move(msk_buffer), std::move(mat_buffer),
658671 std::move(sf_buffer), std::move(sf_lkp_buffer),
659672 std::move(vgrd_buffer)),
660- _bfield_view (det.get_bfield()) {}
673+ _bfield (det.get_bfield()) {}
661674
662675 // / Buffers for the vecemem types
663- typename detector_type::buffer_type _detector_buffer;
664- // / Covfie field
665- typename detector_type::bfield_type:: view_t _bfield_view ;
676+ typename detector_type::buffer_t _detector_buffer;
677+ // / Covfie device field
678+ covfie::field< device_bfield_bknd_t > _bfield ;
666679};
667680
668- // Deduction guide to construct a detector buffer type more conveniently
669- template <typename metadata, template <typename > class bfield_t ,
670- typename container_t >
671- detector_buffer (
672- detector<metadata, bfield_t , container_t > &,
673- detail::get_buffer_t <typename detector<metadata, bfield_t ,
674- container_t >::volume_container> &&,
675- typename detector<metadata, bfield_t ,
676- container_t >::transform_container::buffer_type &&,
677- typename detector<metadata, bfield_t ,
678- container_t >::mask_container::buffer_type &&,
679- typename detector<metadata, bfield_t ,
680- container_t >::material_container::buffer_type &&,
681- typename detector<metadata, bfield_t ,
682- container_t >::surface_container::buffer_type &&,
683- typename detector<metadata, bfield_t , container_t >::surface_lookup_container
684- &&,
685- typename detector<metadata, bfield_t ,
686- container_t >::volume_finder::buffer_type &&)
687- -> detector_buffer<metadata, bfield_t, container_t>;
688-
689- // / @brief A static inplementation of detector data for device
690- template <typename metadata, template <typename > class bfield_t ,
691- typename container_t >
681+ // / @brief The detector view
682+ // /
683+ // / Contains the views for all detector components, including the device view
684+ // / of the bfield
685+ template <typename device_bfield_bknd_t , typename metadata_t , typename bfield_t >
692686struct detector_view {
693687
694- using detector_type = detector<metadata , bfield_t , container_t >;
688+ using detector_type = detector<metadata_t , bfield_t , host_container_types >;
695689
696690 detector_view (detector_type &det)
697691 : _detector_data(detray::get_data(det.volumes()),
@@ -703,49 +697,48 @@ struct detector_view {
703697 detray::get_data(det.volume_search_grid())),
704698 _bfield_view(det.get_bfield()) {}
705699
706- detector_view (detector_buffer<metadata, bfield_t , container_t > &det_buff)
700+ detector_view (
701+ detector_buffer<device_bfield_bknd_t , metadata_t , bfield_t > &det_buff)
707702 : _detector_data(detray::get_data(det_buff._detector_buffer)),
708- _bfield_view(det_buff._bfield_view ) {}
703+ _bfield_view(det_buff._bfield ) {}
709704
710705 // / Views for the vecmem types
711- typename detector_type::view_type _detector_data;
706+ typename detector_type::view_t _detector_data;
712707 // / Covfie field view
713- typename detector_type::bfield_type:: view_t _bfield_view;
708+ covfie::field_view< device_bfield_bknd_t > _bfield_view;
714709};
715710
716- // / Stand-alone function that @returns the detector data for transfer to
711+ // / Stand-alone function that @returns the detector view for transfer to
717712// / device.
718713// /
719714// / @param detector the detector to be tranferred
720- template <typename metadata, template <typename > class bfield_t ,
721- typename container_t >
722- inline detector_view<metadata, bfield_t , container_t > get_data (
723- detector<metadata, bfield_t , container_t > &det) {
715+ template <typename device_bfield_bknd_t , typename metadata_t , typename bfield_t >
716+ inline detector_view<device_bfield_bknd_t , metadata_t , bfield_t > get_data (
717+ detector<metadata_t , bfield_t , host_container_types> &det) {
724718 return {det};
725719}
726720
727- // / Stand-alone function that @returns the detector data for transfer to
721+ // / Stand-alone function that @returns the detector buffer for transfer to
728722// / device.
729723// /
730- // / @param detector the detector to be tranferred
731- template <typename metadata, template < typename > class bfield_t ,
732- typename container_t >
733- inline detector_buffer<metadata , bfield_t , container_t > get_buffer (
734- detector<metadata, bfield_t , container_t > &det , vecmem::memory_resource &mr ,
735- vecmem::copy &cpy, detray::copy cpy_type = detray::copy::sync,
724+ // / @param detector the detector to be transferred
725+ template <typename device_bfield_bknd_t , typename metadata_t , typename bfield_t >
726+ inline detector_buffer< device_bfield_bknd_t , metadata_t , bfield_t > get_buffer (
727+ detector< metadata_t , bfield_t , host_container_types> &det,
728+ vecmem::memory_resource &mr , vecmem::copy &cpy ,
729+ detray::copy cpy_type = detray::copy::sync,
736730 vecmem::data::buffer_type buff_type =
737731 vecmem::data::buffer_type::fixed_size) {
738732 return {det, mr, cpy, cpy_type, buff_type};
739733}
740734
741- // / Stand-alone function that @returns the detector data for transfer to
735+ // / Stand-alone function that @returns the detector view for transfer to
742736// / device.
743737// /
744- // / @param detector the detector to be tranferred
745- template <typename metadata, template <typename > class bfield_t ,
746- typename container_t >
747- inline detector_view<metadata, bfield_t , container_t > get_data (
748- detector_buffer<metadata, bfield_t , container_t > &det_buff) {
738+ // / @param detector the detector to be transferred
739+ template <typename device_bfield_bknd_t , typename metadata_t , typename bfield_t >
740+ inline detector_view<device_bfield_bknd_t , metadata_t , bfield_t > get_data (
741+ detector_buffer<device_bfield_bknd_t , metadata_t , bfield_t > &det_buff) {
749742 return {det_buff};
750743}
751744
0 commit comments