Skip to content

Commit a6408da

Browse files
niermann999stephenswatguilhermeAlmeida1
committed
Add arbitrary bfield types (defined in a dedicated header) to the detector with comprehensive
testing both for host and device. Since the covfie field types for host and device are a bit different, the detector and the detector_view had to be templated on the field/backend type, so that in the detector view and buffer classes the correct covfie constructors are called, which move the data to device. Because this needs a special interface for now, the detector has its own versions of the get_data and get_buffer functions. To make sure the detector with all the data it contains now is not copied, the copy constructor and copy-assignment operator were deleted and some downsteam adjustments for this were made in the io and simulation packages. In order to manage the multiplicity of test cases (const bfield/inhomogeneous bfield) the stepper and propagation unittests were adapted and new ones for the inhomogeneous bfield were added (note: these can't compare against a helix anymore, since the tracks are no longer helical!). The device propagation unittests involved a huge amount of duplicate code between the CUDA and SYCL implementations which was moved into a common propagator test header (mostly the CPU code and the comparison of the results between host and device). The sycl code that could not be unified contains the sycl queue wrapper. The toy detector has a new config struct now, which makes it easier to build different bfield types. In many cases, the default values of this config are used and new values only set explicitely where they diverge from the default. The file handle saw some fixes, too. Mainly for the counting of open files and the correct handling of empty file names. A generic bfield reader has been added with a concrete reader implementation for covfie, which can now be used to read the bfield files into the detector along the detray json data files. The covfie version was bumped to 0.8.0 In order to make the CI pass, the ODD bfield file was uploaded to the traccc data repository and is downloaded with the same script in detray now as is used in traccc Co-authored-by: Stephen Nicholas Swatman <stephen.nicholas.swatman@cern.ch> Co-authored-by: Guilherme Almeida <g.almeida@cern.ch>
1 parent 8761df6 commit a6408da

88 files changed

Lines changed: 1939 additions & 1065 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/builds.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,18 @@ jobs:
7070
run:
7171
shell: bash
7272

73+
# Set the path to the test data files
74+
env:
75+
DETRAY_DATA_DIRECTORY: ${{ github.workspace }}/data/
76+
DETRAY_BFIELD_FILE: ${{ github.workspace }}/data/odd-bfield_v0_8_0.cvf
77+
7378
# The build/test steps to execute.
7479
steps:
7580
# Use a standard checkout of the code.
7681
- uses: actions/checkout@v2
82+
# Get the data files for the tests
83+
- name: Download data files
84+
run: data/detray_data_get_files.sh
7785
# Run the CMake configuration.
7886
- name: Configure
7987
run: |
@@ -137,4 +145,3 @@ jobs:
137145
run: |
138146
source ${GITHUB_WORKSPACE}/.github/ci_setup.sh ${{ matrix.PLATFORM.NAME }}
139147
cmake --build build
140-

.gitlab-ci.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ build_cuda:
88
stage: build
99
image: ghcr.io/acts-project/ubuntu2004_cuda:v30
1010
artifacts:
11-
paths:
11+
paths:
1212
- build
1313
script:
1414
- git clone $CLONE_URL src
@@ -26,12 +26,18 @@ build_cuda:
2626

2727

2828
test_cuda:
29+
variables:
30+
DETRAY_DATA_DIRECTORY: src/data/
31+
DETRAY_BFIELD_FILE: $CI_PROJECT_DIR/src/data/odd-bfield_v0_8_0.cvf
2932
stage: test
3033
tags: [docker-gpu-nvidia]
3134
image: ghcr.io/acts-project/ubuntu2004_cuda:v30
32-
needs:
35+
needs:
3336
- build_cuda
3437
script:
38+
- git clone $CLONE_URL src
39+
- git -C src checkout $HEAD_SHA
40+
- src/data/detray_data_get_files.sh
3541
- cd build
3642
- nvidia-smi
3743
- ctest --output-on-failure -R ".*cuda.*"
@@ -43,7 +49,7 @@ build_sycl:
4349
stage: build
4450
image: "ghcr.io/acts-project/ubuntu2004_oneapi:v30"
4551
artifacts:
46-
paths:
52+
paths:
4753
- build
4854
script:
4955
- git clone $CLONE_URL src
@@ -66,7 +72,7 @@ test_sycl:
6672
stage: test
6773
tags: [docker-gpu-nvidia]
6874
image: "ghcr.io/acts-project/ubuntu2004_oneapi:v30"
69-
needs:
75+
needs:
7076
- build_sycl
7177
script:
7278
- git clone $CLONE_URL src
@@ -75,4 +81,4 @@ test_sycl:
7581
- cd build
7682
- nvidia-smi
7783
- ctest --output-on-failure -R ".*sycl.*"
78-
- find bin -type f -name "*sycl" -not -name "*text*" -exec {} \;
84+
- find bin -type f -name "*sycl" -not -name "*text*" -exec {} \;

core/include/detray/core/detector.hpp

Lines changed: 71 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
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"
@@ -22,9 +23,6 @@
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>
@@ -34,8 +32,7 @@
3432
namespace 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>
3936
struct 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
5148
template <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>
5451
class 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>
618631
struct 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>
692686
struct 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

Comments
 (0)