54 if ((*detector_conditions_handle) ==
nullptr) {
56 return StatusCode::FAILURE;
58 auto const & detector_conditions = **detector_conditions_handle;
63 auto pixel_cont = std::make_unique<xAOD::PixelClusterContainer>(
65 auto strip_cont = std::make_unique<xAOD::StripClusterContainer>(
69 auto pixel_aux = std::make_unique<xAOD::PixelClusterAuxContainer>();
70 auto strip_aux = std::make_unique<xAOD::StripClusterAuxContainer>();
73 pixel_cont->setStore(pixel_aux.get());
74 strip_cont->setStore(strip_aux.get());
78 cudaStream_t cuda_stream =
static_cast<cudaStream_t
>(
m_streamTool->stream(ctx));
81 traccc::edm::measurement_collection::const_view::size_type
const n_meas =
82 device_copy->get_size(*traccc_measurements);
88 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
91 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
93 ATH_MSG_DEBUG(
"Converted 0 pixel clusters, 0 strip clusters");
94 return StatusCode::SUCCESS;
99 std::unique_ptr<DevicePixelMeasurementContainer::buffer> converted_pixel_meas_device_buffer{
nullptr};
100 std::unique_ptr<DeviceStripMeasurementContainer::buffer> converted_strip_meas_device_buffer{
nullptr};
103 DevicePixelMeasurementContainer::view::size_type n_pixels = 0;
104 DeviceStripMeasurementContainer::view::size_type n_strips = 0;
106 m_detector->as_view<traccc::itk_detector>(), detector_conditions,
107 n_meas, *traccc_measurements, n_pixels, n_strips,
108 converted_pixel_meas_device_buffer, converted_strip_meas_device_buffer));
109 if (!converted_pixel_meas_device_buffer or !converted_strip_meas_device_buffer)[[
unlikely]]{
111 return StatusCode::FAILURE;
114 DevicePixelMeasurementContainer::device pixel_meas_device{*converted_pixel_meas_device_buffer};
115 DeviceStripMeasurementContainer::device strip_meas_device{*converted_strip_meas_device_buffer};
124 pixel_cont->push_new(n_pixels, [&pixel_pool]() {
126 strip_cont->push_new(n_strips, [&strip_pool]() {
131 auto span_id = s_acc_id.getDataSpan(*pixel_cont);
132 auto span_id_hash = s_acc_id_hash.getDataSpan(*pixel_cont);
133 auto span_local_pos = s_acc_loc_pos_xy.getDataSpan(*pixel_cont);
134 auto span_local_cov = s_acc_loc_cov_xy.getDataSpan(*pixel_cont);
135 auto span_global_pos = s_acc_global_pos.getDataSpan(*pixel_cont);
137 vecmem::data::vector_view<unsigned long>(n_pixels, pixel_meas_device.identifier().data()),
138 vecmem::data::vector_view<unsigned long>(n_pixels, span_id.data())
141 vecmem::data::vector_view<std::array<float, 2>>(n_pixels, pixel_meas_device.local_position().data()),
142 vecmem::data::vector_view<std::array<float, 2>>(n_pixels, span_local_pos.data())
145 vecmem::data::vector_view<std::array<float, 4>>(n_pixels, pixel_meas_device.local_variance().data()),
146 vecmem::data::vector_view<std::array<float, 4>>(n_pixels, span_local_cov.data())
149 vecmem::data::vector_view<xAOD::ArrayFloat3>(n_pixels,
150 reinterpret_cast<xAOD::ArrayFloat3*
>(pixel_meas_device.global_position().data())),
151 vecmem::data::vector_view<xAOD::ArrayFloat3>(n_pixels, span_global_pos.data())
154 vecmem::data::vector_view<unsigned int>(n_pixels, pixel_meas_device.module_id_hash().data()),
155 vecmem::data::vector_view<unsigned int>(n_pixels, span_id_hash.data())
159 auto span_id = s_acc_id.getDataSpan(*strip_cont);
160 auto span_id_hash = s_acc_id_hash.getDataSpan(*strip_cont);
161 auto span_local_pos = s_acc_loc_pos_x.getDataSpan(*strip_cont);
162 auto span_local_cov = s_acc_loc_cov_x.getDataSpan(*strip_cont);
163 CUDA_ERROR_CHECK(cudaMemcpy(span_id.data(), strip_meas_device.identifier().data(),
164 sizeof(
unsigned long) * n_strips, cudaMemcpyDeviceToHost));
165 CUDA_ERROR_CHECK(cudaMemcpy(span_local_pos.data(), strip_meas_device.local_position().data(),
166 sizeof(
float) * n_strips, cudaMemcpyDeviceToHost));
167 CUDA_ERROR_CHECK(cudaMemcpy(span_local_cov.data(), strip_meas_device.local_variance().data(),
168 sizeof(
float) * n_strips, cudaMemcpyDeviceToHost));
169 CUDA_ERROR_CHECK(cudaMemcpy(span_id_hash.data(), strip_meas_device.module_id_hash().data(),
170 sizeof(
unsigned int) * n_strips, cudaMemcpyDeviceToHost));
175 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
178 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
181 ATH_MSG_DEBUG(
"Converted " << n_pixels <<
" pixel clusters, "
182 << n_strips <<
" strip clusters");
184 m_nMeas += n_pixels + n_strips;
188 return StatusCode::SUCCESS;
StatusCode convertMeasurementsOnGPU(cudaStream_t stream, vecmem::memory_resource &mr, vecmem::copy const ©, traccc::itk_detector::view_type const &detector_view, traccc::detector_conditions_description::const_view const &detector_conditions_view, traccc::edm::measurement_collection::const_view::size_type nb_measurements, const traccc::edm::measurement_collection::const_view &input, DevicePixelMeasurementContainer::view::size_type &output_n_pixels, DeviceStripMeasurementContainer::view::size_type &output_n_strips, std::unique_ptr< DevicePixelMeasurementContainer::buffer > &output_pixel_meas, std::unique_ptr< DeviceStripMeasurementContainer::buffer > &output_strip_meas)