Function executing the algorithm.
50{
51 SG::ReadCondHandle<traccc::detector_conditions_description::buffer>
54 if ((*detector_conditions_handle) == nullptr) {
56 return StatusCode::FAILURE;
57 }
58 auto const & detector_conditions = **detector_conditions_handle;
59
60
61
62
63 auto pixel_cont = std::make_unique<xAOD::PixelClusterContainer>(
65 auto strip_cont = std::make_unique<xAOD::StripClusterContainer>(
67
68
69 auto pixel_aux = std::make_unique<xAOD::PixelClusterAuxContainer>();
70 auto strip_aux = std::make_unique<xAOD::StripClusterAuxContainer>();
71
72
73 pixel_cont->setStore(pixel_aux.get());
74 strip_cont->setStore(strip_aux.get());
75
76
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);
83
84
85 if (n_meas == 0) {
86
87 SG::WriteHandle<xAOD::PixelClusterContainer> pixelHandle{
m_outputPixelKey, ctx};
88 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
89
90 SG::WriteHandle<xAOD::StripClusterContainer> stripHandle{
m_outputStripKey, ctx};
91 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
92
93 ATH_MSG_DEBUG(
"Converted 0 pixel clusters, 0 strip clusters");
94 return StatusCode::SUCCESS;
95 }
96
97
98
99 std::unique_ptr<DevicePixelMeasurementContainer::buffer> converted_pixel_meas_device_buffer{nullptr};
100 std::unique_ptr<DeviceStripMeasurementContainer::buffer> converted_strip_meas_device_buffer{nullptr};
101
102
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;
112 }
113
114 DevicePixelMeasurementContainer::device pixel_meas_device{*converted_pixel_meas_device_buffer};
115 DeviceStripMeasurementContainer::device strip_meas_device{*converted_strip_meas_device_buffer};
116
117
118
119
120 DataPool<xAOD::PixelCluster> pixel_pool(ctx, n_pixels);
121 DataPool<xAOD::StripCluster> strip_pool(ctx, n_strips);
122
123
124 pixel_cont->push_new(n_pixels, [&pixel_pool]() {
125 return pixel_pool.nextElementPtr(); });
126 strip_cont->push_new(n_strips, [&strip_pool]() {
127 return strip_pool.nextElementPtr(); });
128
129
130 {
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);
136 (*device_copy)(
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())
140 (*device_copy)(
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())
143 )->ignore();
144 (*device_copy)(
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())
147 )->ignore();
148 (*device_copy)(
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())
153 (*device_copy)(
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())
156 )->wait();
157 }
158 {
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));
171 }
172
173
174 SG::WriteHandle<xAOD::PixelClusterContainer> pixelHandle{
m_outputPixelKey, ctx};
175 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
176
177 SG::WriteHandle<xAOD::StripClusterContainer> stripHandle{
m_outputStripKey, ctx};
178 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
179
180
181 ATH_MSG_DEBUG(
"Converted " << n_pixels <<
" pixel clusters, "
182 << n_strips << " strip clusters");
183
184 m_nMeas += n_pixels + n_strips;
187
188 return StatusCode::SUCCESS;
189}
#define CUDA_ERROR_CHECK(EXP)
Helper macro used for checking cudaError_t type return values.
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
SG::ReadCondHandleKey< traccc::detector_conditions_description::buffer > m_deviceCondKey
ToolHandle< AthDevice::ICopiesTool > m_copiesTool
std::atomic< int > m_nPix
The object counters for debug prints in finalize method {.
ToolHandle< AthCUDA::IStreamTool > m_streamTool
SG::WriteHandleKey< xAOD::PixelClusterContainer > m_outputPixelKey
std::atomic< int > m_nMeas
std::atomic< int > m_nStrip
SG::ReadHandleKey< traccc::edm::measurement_collection::buffer > m_inputMeasKey
ToolHandle< AthDevice::IMemoryResourcesTool > m_mrTool
SG::WriteHandleKey< xAOD::StripClusterContainer > m_outputStripKey
const traccc::detector_buffer * m_detector
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
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)
@ ALWAYS_TRACK_INDICES
Always track indices, regardless of the setting of the ownership policy.
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())