File indexing completed on 2026-05-27 07:24:24
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "detray/definitions/detail/cuda_definitions.hpp"
0010 #include "detray/geometry/tracking_surface.hpp"
0011
0012
0013 #include "detector_cuda_kernel.hpp"
0014
0015 namespace detray {
0016
0017
0018 __global__ void detector_test_kernel(
0019 typename detector_host_t::view_type det_data,
0020 vecmem::data::vector_view<det_volume_t> volumes_data,
0021 vecmem::data::vector_view<det_surface_t> surfaces_data,
0022 vecmem::data::vector_view<transform_t> transforms_data,
0023 vecmem::data::vector_view<rectangle_t> rectangles_data,
0024 vecmem::data::vector_view<disc_t> discs_data,
0025 vecmem::data::vector_view<cylinder_t> cylinders_data) {
0026
0027 detector_device_t det_device(det_data);
0028
0029
0030 vecmem::device_vector<det_volume_t> volumes_device(volumes_data);
0031 vecmem::device_vector<det_surface_t> surfaces_device(surfaces_data);
0032 vecmem::device_vector<transform_t> transforms_device(transforms_data);
0033 vecmem::device_vector<rectangle_t> rectangles_device(rectangles_data);
0034 vecmem::device_vector<disc_t> discs_device(discs_data);
0035 vecmem::device_vector<cylinder_t> cylinders_device(cylinders_data);
0036
0037
0038 for (unsigned int i = 0u; i < det_device.volumes().size(); i++) {
0039 volumes_device[i] = det_device.volumes()[i];
0040 }
0041
0042
0043 for (unsigned int i = 0u; i < det_device.surfaces().size(); i++) {
0044 surfaces_device[i] = det_device.surfaces()[i];
0045 }
0046
0047
0048 auto& trfs = det_device.transform_store();
0049 auto ctx = typename detector_host_t::geometry_context{};
0050 for (unsigned int i = 0u; i < trfs.size(ctx); i++) {
0051 transforms_device[i] = trfs.at(i, ctx);
0052 }
0053
0054
0055 auto& masks = det_device.mask_store();
0056 auto& rectangles =
0057 masks.template get<detector_host_t::masks::id::e_rectangle2D>();
0058 for (unsigned int i = 0u; i < rectangles.size(); i++) {
0059 rectangles_device[i] = rectangles[i];
0060 }
0061
0062 auto& discs = masks.template get<detector_host_t::masks::id::e_ring2D>();
0063 for (unsigned int i = 0u; i < discs.size(); i++) {
0064 discs_device[i] = discs[i];
0065 }
0066
0067 auto& cylinders =
0068 masks.template get<detector_host_t::masks::id::e_concentric_cylinder2D>();
0069 for (unsigned int i = 0u; i < cylinders.size(); i++) {
0070 cylinders_device[i] = cylinders[i];
0071 }
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 }
0087
0088
0089 void detector_test(typename detector_host_t::view_type det_data,
0090 vecmem::data::vector_view<det_volume_t> volumes_data,
0091 vecmem::data::vector_view<det_surface_t> surfaces_data,
0092 vecmem::data::vector_view<transform_t> transforms_data,
0093 vecmem::data::vector_view<rectangle_t> rectangles_data,
0094 vecmem::data::vector_view<disc_t> discs_data,
0095 vecmem::data::vector_view<cylinder_t> cylinders_data) {
0096 constexpr int block_dim = 1u;
0097 constexpr int thread_dim = 1u;
0098
0099
0100 detector_test_kernel<<<block_dim, thread_dim>>>(
0101 det_data, volumes_data, surfaces_data, transforms_data, rectangles_data,
0102 discs_data, cylinders_data);
0103
0104
0105 DETRAY_CUDA_ERROR_CHECK(cudaGetLastError());
0106 DETRAY_CUDA_ERROR_CHECK(cudaDeviceSynchronize());
0107 }
0108
0109
0110
0111 __global__ void detector_alignment_test_kernel(
0112 typename detector_host_t::view_type det_data_static,
0113 typename detector_host_t::view_type det_data_aligned,
0114 vecmem::data::vector_view<transform_t> surfacexf_data_static,
0115 vecmem::data::vector_view<transform_t> surfacexf_data_aligned) {
0116 auto ctx = typename detector_host_t::geometry_context{};
0117
0118
0119 detector_device_t det_device_static(det_data_static);
0120 detector_device_t det_device_aligned(det_data_aligned);
0121
0122
0123 vecmem::device_vector<transform_t> surfacexf_device_static(
0124 surfacexf_data_static);
0125 vecmem::device_vector<transform_t> surfacexf_device_aligned(
0126 surfacexf_data_aligned);
0127
0128
0129 for (unsigned int i = 0u; i < det_device_static.surfaces().size(); i++) {
0130 const auto sf =
0131 tracking_surface{det_device_static, det_device_static.surfaces()[i]};
0132 surfacexf_device_static[i] = sf.transform(ctx);
0133 }
0134
0135 for (unsigned int i = 0u; i < det_device_aligned.surfaces().size(); i++) {
0136 const auto sf =
0137 tracking_surface{det_device_aligned, det_device_aligned.surfaces()[i]};
0138 surfacexf_device_aligned[i] = sf.transform(ctx);
0139 }
0140 }
0141
0142
0143 void detector_alignment_test(
0144 typename detector_host_t::view_type det_data_static,
0145 typename detector_host_t::view_type det_data_aligned,
0146 vecmem::data::vector_view<transform_t> surfacexf_data_static,
0147 vecmem::data::vector_view<transform_t> surfacexf_data_aligned) {
0148 constexpr int block_dim = 1u;
0149 constexpr int thread_dim = 1u;
0150
0151
0152 detector_alignment_test_kernel<<<block_dim, thread_dim>>>(
0153 det_data_static, det_data_aligned, surfacexf_data_static,
0154 surfacexf_data_aligned);
0155
0156
0157 DETRAY_CUDA_ERROR_CHECK(cudaGetLastError());
0158 DETRAY_CUDA_ERROR_CHECK(cudaDeviceSynchronize());
0159 }
0160
0161 }