ATLAS Offline Software
Loading...
Searching...
No Matches
PhaseIIRDOtoTracccCellConverterAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
7#include <cstdint>
8#include <optional>
9
10namespace ActsTrk {
11
13
15{
16 ATH_MSG_DEBUG("Initializing");
17
18 ATH_CHECK(m_common.initialize());
19
20 ATH_CHECK(m_ph2PixelRDOKey.initialize());
21 ATH_CHECK(m_ph2StripRDOKey.initialize());
22
23 return StatusCode::SUCCESS;
24}
25
26StatusCode PhaseIIRDOtoTracccCellConverterAlg::execute(const EventContext& ctx) const
27{
28 using size_type = traccc::edm::silicon_cell_collection::buffer::size_type;
29 using PixelRawDataContainerProxy = PhaseII::PixelRawDataTypeTraits<>::RawDataContainerProxy;
31 using StripRawDataContainerProxy = PhaseII::StripRawDataTypeTraits<>::RawDataContainerProxy;
33
34 // ---- 0. Init
35 auto ph2PixelRDOHandle = SG::makeHandle(m_ph2PixelRDOKey, ctx);
36 ATH_CHECK(ph2PixelRDOHandle.isValid());
37 auto ph2StripRDOHandle = SG::makeHandle(m_ph2StripRDOKey, ctx);
38 ATH_CHECK(ph2StripRDOHandle.isValid());
39
40 // ---- 1. Count Pixel and Strip hits: creating the traccc SoA requires
41 // knowing their size upon creation.
42
43 size_type nPix = 0, nStrip = 0;
44
45 // Pixels
46 auto pixel_rdo_container_collection_proxy = PhaseII::makeRawDataCollectionProxy(*ph2PixelRDOHandle);
47 for (PixelRawDataContainerProxy module_rdo_container_proxy : pixel_rdo_container_collection_proxy) {
48 if (!module_rdo_container_proxy.empty()) {
49 nPix += module_rdo_container_proxy.size();
50 }
51 }
52
53 // Strips
54 auto strip_rdo_container_collection_proxy = PhaseII::makeRawDataCollectionProxy(*ph2StripRDOHandle);
55
56 for (StripRawDataContainerProxy module_rdo_container_proxy : strip_rdo_container_collection_proxy) {
57 if (!module_rdo_container_proxy.empty()) {
58 for (StripRawDataProxy strip_rdo: module_rdo_container_proxy) {
59 if (!m_common.passTiming(strip_rdo.getTimeBin())) {
60 ATH_MSG_DEBUG("Strip failed timing check");
61 continue;
62 }
63 nStrip += strip_rdo.getGroupSize();
64 }
65 }
66 }
67
68 size_type const nCells = nPix + nStrip;
69
70 // ---- 2. Create the output cell buffer
71 auto host_copy = m_common.m_copiesTool->hostCopy(ctx);
72 traccc::edm::silicon_cell_collection::buffer traccc_cells_host_buffer{
73 nCells, m_common.m_hostMR->mr()};
74 host_copy->setup(traccc_cells_host_buffer)->wait();
75
76 if (nCells == 0) {
77 ATH_MSG_DEBUG("no input hits — writing empty cell collection");
78 ATH_CHECK(m_common.copyToGpuAndRecordToSG(ctx, traccc_cells_host_buffer));
79 return StatusCode::SUCCESS;
80 }
81
82 // Create a device collection around the buffer.
83 traccc::edm::silicon_cell_collection::device cells{traccc_cells_host_buffer};
84
85 // ---- 3. Convert RDOs to traccc cells
86 // The traccc buffers are not default initialized: all members must be set.
87
88 size_type cell_index = 0;
89 detray_id_type current_geometry_id = detray::geometry::identifier{}.value();
90 unsigned int current_det_cond_idx = -1;
91
92 // Convert Pixel RDOs
93 for (PixelRawDataContainerProxy module_rdo_container_proxy : pixel_rdo_container_collection_proxy) {
94 if (module_rdo_container_proxy.empty()) {
95 continue;
96 }
97 IdentifierHash const module_id_hash(module_rdo_container_proxy.identifyHash());
98 Identifier const module_id = m_common.m_pixelID->wafer_id(module_id_hash);
99 std::optional<detray_id_type> const detray_geometry_id_opt = m_common.m_geoIdMapping->athenaToDetray(module_id);
100 if (!detray_geometry_id_opt.has_value()) {
101 ATH_MSG_FATAL("No detray id found for Athena identifier " << module_id);
102 return StatusCode::FAILURE;
103 }
104 const detray_id_type detray_geometry_id{detray_geometry_id_opt.value()};
105 if (detray_geometry_id != current_geometry_id) {
106 current_geometry_id = detray_geometry_id;
107 std::optional<unsigned int> det_cond_idx_opt =
108 m_common.m_geoIdMapping->detrayToDetDescIndex(current_geometry_id);
109 if (!det_cond_idx_opt.has_value()) {
110 ATH_MSG_FATAL("No detector conditions index found for detray identifier " << current_geometry_id);
111 return StatusCode::FAILURE;
112 }
113 current_det_cond_idx = det_cond_idx_opt.value();
114 }
115
116 for (PixelRawDataProxy pixel_rdo: module_rdo_container_proxy) {
117 float activation = 1.;
118 if (m_common.m_UsePixelToTForCellActivation) {
119 activation = static_cast<float>(pixel_rdo.getToT());
120 if (activation == 0.) {
121 ATH_MSG_ERROR("input data error: RDO must not have ToT=0; RDO index: "
122 << cell_index);
123 }
124 }
125
126 traccc::edm::silicon_cell cell = cells.at(cell_index++);
127 cell.channel0() = static_cast<uint32_t>(pixel_rdo.coordinates()[0]);
128 cell.channel1() = static_cast<uint32_t>(pixel_rdo.coordinates()[1]);
129 cell.module_index() = current_det_cond_idx;
130 cell.activation() = activation;
131 cell.time() = 0;
132 }
133 }
134
135 // Convert Strip RDOs
136 for (StripRawDataContainerProxy module_rdo_container_proxy : strip_rdo_container_collection_proxy) {
137 if (module_rdo_container_proxy.empty()) {
138 continue;
139 }
140 IdentifierHash const module_id_hash(module_rdo_container_proxy.identifyHash());
141 Identifier const module_id = m_common.m_stripID->wafer_id(module_id_hash);
142 std::optional<detray_id_type> const detray_geometry_id_opt = m_common.m_geoIdMapping->athenaToDetray(module_id);
143 if (!detray_geometry_id_opt.has_value()) {
144 ATH_MSG_FATAL("No detray id found for Athena identifier " << module_id);
145 return StatusCode::FAILURE;
146 }
147 const detray_id_type detray_geometry_id{detray_geometry_id_opt.value()};
148 if (detray_geometry_id != current_geometry_id) {
149 current_geometry_id = detray_geometry_id;
150 std::optional<unsigned int> det_cond_idx_opt =
151 m_common.m_geoIdMapping->detrayToDetDescIndex(current_geometry_id);
152 if (!det_cond_idx_opt.has_value()) {
153 ATH_MSG_FATAL("No detector conditions index found for detray identifier " << current_geometry_id);
154 return StatusCode::FAILURE;
155 }
156 current_det_cond_idx = det_cond_idx_opt.value();
157 }
158
159 for (StripRawDataProxy strip_rdo: module_rdo_container_proxy) {
160 if (!m_common.passTiming(strip_rdo.getTimeBin())) {
161 ATH_MSG_DEBUG("Strip failed timing check");
162 continue;
163 }
164
165 if (m_common.m_stripID->barrel_ec(module_id) == 0) {
166 for (int i = 0; i < strip_rdo.getGroupSize(); ++i) {
167 traccc::edm::silicon_cell cell = cells.at(cell_index++);
168 cell.channel0() = static_cast<uint32_t>(strip_rdo.coordinates()[0] + i);
169 cell.channel1() = 0;
170 cell.module_index() = current_det_cond_idx;
171 cell.activation() = 1.;
172 cell.time() = 0;
173 }
174 } else {
175 for (int i = 0; i < strip_rdo.getGroupSize(); ++i) {
176 traccc::edm::silicon_cell cell = cells.at(cell_index++);
177 cell.channel0() = 0;
178 cell.channel1() = static_cast<uint32_t>(strip_rdo.coordinates()[0] + i);
179 cell.module_index() = current_det_cond_idx;
180 cell.activation() = 1.;
181 cell.time() = 0;
182 }
183 }
184 }
185 }
186
187 if (m_common.m_CPUCellSorting) {
188 // ---- 4. Sort cells
189 traccc::edm::silicon_cell_collection::buffer sorted_cells_host_buffer =
190 m_common.sortCells(*host_copy, cells);
191
192 // ---- 5. Copy host -> device buffer and write to StoreGate ---------------
193 ATH_CHECK(m_common.copyToGpuAndRecordToSG(ctx, sorted_cells_host_buffer));
194 } else {
195 // In this case the GPU clusterization algorithm must be configured to sort
196 // the cells.
197
198 // ---- 4/5. Copy host -> device buffer and write to StoreGate ---------------
199 ATH_CHECK(m_common.copyToGpuAndRecordToSG(ctx, traccc_cells_host_buffer));
200 }
201
202 // ---- 6. Accounting
203 m_common.m_nPix += nPix;
204 m_common.m_nStrip += nStrip;
205 m_common.m_nCells += nCells;
206
207 ATH_MSG_DEBUG("Wrote " << nCells << " cells to '"
208 << m_common.m_tracccCellsKey.key() << "'");
209 return StatusCode::SUCCESS;
210}
211
213{
214 ATH_MSG_DEBUG("Finalizing.");
215
216 ATH_CHECK(m_common.finalize());
217
218 return StatusCode::SUCCESS;
219}
220
221} // namespace ActsTrk
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_FATAL(x,...)
Handle class for reading from StoreGate.
virtual StatusCode execute(const EventContext &ctx) const override
SG::ReadHandleKey< PhaseIIStripRawDataContainer > m_ph2StripRDOKey
SG::ReadHandleKey< PhaseIIPixelRawDataContainer > m_ph2PixelRDOKey
This is a "hash" representation of an Identifier.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
GeometryIdMapping::detray_id_type detray_id_type
auto makeRawDataCollectionProxy(const T_RawDataContainerCollection &collection)
Create the top level container proxy for an RDO container collection (read only).
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
typename RawData::details::traits< ContainerNonConst >::template RawDataProxy< accessPolicy > RawDataProxy
PhaseII::RawDataContainerProxy< typename Utils::ContainerAccessHelper< T_RawDataContainer, accessPolicy >::ContainerType, RawDataProxy > RawDataContainerProxy