Function executing the algorithm.
141{
142
145
147
148 traccc::edm::measurement_collection::buffer traccc_measurements_buffer{
150 copy->setup(traccc_measurements_buffer)->ignore();
151 (*copy)(*measurements, traccc_measurements_buffer)->wait();
152
153 traccc::edm::measurement_collection::const_device traccc_measurements(
154 traccc_measurements_buffer);
155
156
157 std::optional<traccc::edm::silicon_cluster_collection::buffer> traccc_clusters_buffer;
158 std::optional<traccc::edm::silicon_cell_collection::buffer> traccc_cells_buffer;
159 std::optional<traccc::edm::silicon_cluster_collection::const_device> traccc_clusters;
160 std::optional<traccc::edm::silicon_cell_collection::const_device> traccc_cells;
161
162
163
164
165 std::vector<unsigned int> measToPixelSP(traccc_measurements.size(),
166 std::numeric_limits<unsigned int>::max());
167
168
169
170
171
172
173
174
175
176 std::vector<unsigned int> measToStripCl(traccc_measurements.size(),
177 std::numeric_limits<unsigned int>::max());
182 << "' and will convert them with associated cells.");
183
184 SG::ReadHandle<traccc::edm::silicon_cluster_collection::buffer>
clusters{
187 SG::ReadHandle<traccc::edm::silicon_cell_collection::buffer>
cells{
190
191 traccc_clusters_buffer.emplace(
copy->get_sizes(*clusters),
m_hostMR->mr());
192 copy->setup(*traccc_clusters_buffer)->wait();
193 (*copy)(*
clusters, *traccc_clusters_buffer)->wait();
194
195 traccc_cells_buffer.emplace(
copy->get_size(*cells),
m_hostMR->mr());
196 copy->setup(*traccc_cells_buffer)->wait();
197 (*copy)(*
cells, *traccc_cells_buffer)->wait();
198
199 traccc_clusters.emplace(*traccc_clusters_buffer);
200 ATH_MSG_DEBUG(
"Copied " << traccc_clusters->size() <<
" clusters.");
201
202 traccc_cells.emplace(*traccc_cells_buffer);
203 ATH_MSG_DEBUG(
"Copied " << traccc_cells->size() <<
" cells.");
204 } else {
207 << "' and will convert them without associated cells.");
208 }
209
210
211 const auto [n_pixels, n_strips] =
countPixelStrip(traccc_measurements);
212
213
214 auto [pixel_cont, pixel_aux] =
216 auto [pixel_spacepoint_cont, pixel_spacepoint_aux] =
218 auto [strip_cont, strip_aux] =
220
221
222 auto pixItr = pixel_cont->begin();
223 auto spItr = pixel_spacepoint_cont->begin();
224 auto stripItr = strip_cont->begin();
225
226 std::size_t pixel_idx = 0;
227 std::size_t strip_idx = 0;
228
229 for (std::size_t i = 0;
i < traccc_measurements.size(); ++
i) {
230 const auto& meas = traccc_measurements.at(i);
231 const uint64_t detrayId = meas.surface_link().value();
232 auto athenaIdOpt =
m_idMapping->detrayToAthena(detrayId);
233 if (!athenaIdOpt.has_value()) {
234 ATH_MSG_FATAL(
"No Athena module found for detray id " << detrayId <<
" — skipping measurement.");
235 return StatusCode::FAILURE;
236 }
237 const Identifier athenaId = *athenaIdOpt;
238
239
240 if (meas.dimensions() == 2u) {
243 ++spItr;
244 ++pixItr;
245
246
247
248
249
250
251 measToPixelSP[
i] = pixel_idx;
252
253 const IdentifierHash Pixel_ModuleHash =
255 const InDetDD::SiDetectorElement* pDE =
257 const InDetDD::PixelModuleDesign* design(
258 dynamic_cast<const InDetDD::PixelModuleDesign*>(
260 if(design == nullptr){
261 ATH_MSG_FATAL(
"Could not retrieve module design for pixel module hash " << Pixel_ModuleHash);
262 return StatusCode::FAILURE;
263 }
264
266 pixel_idx + strip_idx);
267
269 const auto cluster = traccc_clusters->at(meas.cluster_index());
270
271 std::vector<Identifier> rdoList;
272 rdoList.reserve(cluster.cell_indices().size());
273 int phiIndicesMax = -1;
274 int etaIndicesMax = -1;
275 int phiIndicesMin = std::numeric_limits<int>::max();
276 int etaIndicesMin = std::numeric_limits<int>::max();
277
278 for (const unsigned int cell_idx : cluster.cell_indices()) {
279 const auto&
cell = traccc_cells->at(cell_idx);
280
282 int const etaIndex =
cell.channel1();
283
284 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
285 etaIndicesMax = std::max(etaIndicesMax, etaIndex);
286 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
287 etaIndicesMin = std::min(etaIndicesMin, etaIndex);
288
289 Identifier const hit_id =
290 m_pixelID->pixel_id(athenaId, phiIndex, etaIndex);
291 rdoList.push_back(hit_id);
292 }
293
294 double const colWidth = static_cast<double>((etaIndicesMax - etaIndicesMin) + 1);
295 double const rowWidth = static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
296 double const etaWidth =
297 design->widthFromColumnRange(etaIndicesMin, etaIndicesMax);
298 double const phiWidth = design->widthFromRowRange(phiIndicesMin, phiIndicesMax);
299
302
304 float width1 = etaWidth / colWidth;
305 Eigen::Matrix<float, 2, 2> localCovariance =
306 Eigen::Matrix<float, 2, 2>::Zero();
307 localCovariance(0, 0) = width0 * width0 / 12.0f;
308 localCovariance(1, 1) = width1 * width1 / 12.0f;
309
310 Eigen::Matrix<float, 2, 1> localPosition(meas.local_position()[0], meas.local_position()[1]);
312 localCovariance);
313
314 std::sort(rdoList.begin(), rdoList.end());
318 siWidth.colRow()[1]);
319 float width_phiRZ = static_cast<float>(siWidth.widthPhiRZ()[1]);
321
322
323 float covTerm = width_phiRZ * width_phiRZ * (1/12.0f);
324 if( covTerm < localCovariance(1, 1) )
325 covTerm = localCovariance(1, 1);
326
327
329 float const cov_z =
330 6.f * covTerm *
331 static_cast<float>(
Tp(0, 2) *
Tp(0, 2) +
Tp(1, 2) *
Tp(1, 2));
332 float const cov_r = 6.f * covTerm *
333 static_cast<float>(
Tp(2, 2) *
Tp(2, 2));
336 {xaod_pcl});
337
338 }
339 ++pixel_idx;
340
341
342 } else {
344 ++stripItr;
345
346
347
348
349 const IdentifierHash Strip_ModuleHash =
351 const InDetDD::SiDetectorElement* pDE =
353
355 pixel_idx + strip_idx);
356
358 const auto cluster = traccc_clusters->at(meas.cluster_index());
359
360 std::vector<Identifier> rdoList;
361 rdoList.reserve(cluster.cell_indices().size());
362 int phiIndicesMax = -1;
363 int phiIndicesMin = std::numeric_limits<int>::max();
364
365 for (const unsigned int cell_idx : cluster.cell_indices()) {
366 const auto&
cell = traccc_cells->at(cell_idx);
367
368
369
370
374
375 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
376 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
377 Identifier const hit_id =
378 m_stripID->strip_id(athenaId,
int(phiIndex));
379 rdoList.push_back(hit_id);
380 }
381
382 std::sort(rdoList.begin(), rdoList.end());
385
386 const InDetDD::SCT_ModuleSideDesign* design;
388 design = (static_cast<const InDetDD::SCT_ModuleSideDesign*>(
390 } else {
391 design = (static_cast<const InDetDD::StripStereoAnnulusDesign*>(
393 }
394
396 const int firstStrip1D = design->
strip1Dim(firstStrip, row);
397 const int lastStrip1D = design->
strip1Dim(lastStrip, row);
398 const InDetDD::SiCellId cell1(firstStrip1D);
399 const InDetDD::SiCellId cell2(lastStrip1D);
400 const InDetDD::SiLocalPosition firstStripPos(
402 const InDetDD::SiLocalPosition lastStripPos(
404 const InDetDD::SiLocalPosition centre(
405 (firstStripPos + lastStripPos) * 0.5);
406 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition>
408 const double stripLength(
409 std::abs(ends.first.xEta() - ends.second.xEta()));
412
413 double const phiWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
416
420
421 }
422 measToStripCl[
i] = strip_idx;
423 ++strip_idx;
424 }
425 }
426
427 ATH_MSG_DEBUG(
"Converted " << pixel_idx <<
" pixel clusters, " << strip_idx
428 << " strip clusters");
429
430 m_nMeas += traccc_measurements.size();
433
434
436 ctx};
437 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
438
440 ctx};
441 ATH_CHECK(spacePointHandle.
record(std::move(pixel_spacepoint_cont), std::move(pixel_spacepoint_aux)));
442
444 ATH_CHECK(measToPixelSPHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToPixelSP))));
445
447 ATH_CHECK(measToStripClHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToStripCl))));
448
450 ctx};
451 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
452
454
455 return StatusCode::SUCCESS;
456}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_FATAL(x,...)
const ActsTrk::GeometryIdMapping * m_idMapping
SG::ReadHandleKey< traccc::edm::measurement_collection::buffer > m_inputMeasKey
SG::WriteHandleKey< xAOD::StripClusterContainer > m_outputStripKey
SG::WriteHandleKey< std::vector< unsigned int > > m_outputMeasToStripClKey
Gaudi::Property< bool > m_convertClustersWithCells
std::atomic< int > m_nMeas
SG::ReadHandleKey< traccc::edm::silicon_cell_collection::buffer > m_inputCellsKey
SG::ReadHandleKey< traccc::edm::silicon_cluster_collection::buffer > m_inputClusterKey
ToolHandle< AthDevice::IMemoryResourceTool > m_hostMR
std::atomic< int > m_nPix
The object counters for debug prints in finalize method {.
const PixelID * m_pixelID
Conversion helpers (to retrieve module design, hash, etc.) {.
SG::WriteHandleKey< std::vector< unsigned int > > m_outputMeasToPixelSPKey
SG::WriteHandleKey< xAOD::PixelClusterContainer > m_outputPixelKey
SG::WriteHandleKey< xAOD::SpacePointContainer > m_outputPixelSpacePointsKey
ToolHandle< AthDevice::ICopyTool > m_copy
const InDetDD::SCT_DetectorManager * m_stripManager
const InDetDD::PixelDetectorManager * m_pixelManager
std::atomic< int > m_nStrip
virtual double stripPitch(const SiLocalPosition &chargePos) const =0
give the strip pitch (dependence on position needed for forward)
virtual int strip1Dim(int strip, int row) const override
only relevant for SCT.
virtual std::pair< SiLocalPosition, SiLocalPosition > endsOfStrip(const SiLocalPosition &position) const override=0
give the ends of strips
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
Trk::Surface & surface()
Element Surface.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
void setChannelsInPhiEta(int channelsInPhi, int channelsInEta)
Sets the dimensions of the cluster in numbers of channels in phi (x) and eta (y) directions.
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the pixel cluster.
void setRDOlist(const std::vector< Identifier > &rdolist)
Sets the list of identifiers of the channels building the cluster.
void setWidthInEta(float widthInEta)
Sets the width of the cluster in eta (y) direction.
void setSpacePoint(DetectorIDHashType idHash, const Eigen::Matrix< float, 3, 1 > &globPos, float cov_r, float cov_z, std::vector< const xAOD::UncalibratedMeasurement * > &&measurementIndexes)
void setRDOlist(const std::vector< Identifier > &rdolist)
Sets the list of identifiers of the channels building the cluster.
void setChannelsInPhi(int channelsInPhi)
Sets the dimensions of the cluster in numbers of channels in phi (x).
void setMeasurement(const DetectorIDHashType idHash, MeasVector< N > locPos, MeasMatrix< N > locCov)
Sets IdentifierHash, local position and local covariance of the measurement.
DetectorIDHashType identifierHash() const
Returns the IdentifierHash of the measurement (corresponds to the detector element IdentifierHash).
void setIdentifier(const DetectorIdentType measId)
Sets the full Identifier of the measurement.
void fillPixelCluster(const MEAS &meas, const Identifier &athenaId, const PixelID *pixelID, const InDetDD::PixelDetectorManager *pixelManager, xAOD::PixelCluster &xaod_pcl, std::size_t combinedIndex)
void fillStripCluster(const MEAS &meas, const Identifier &athenaId, const SCT_ID *stripID, const InDetDD::SCT_DetectorManager *stripManager, xAOD::StripCluster &xaod_scl, std::size_t combinedIndex)
std::pair< std::unique_ptr< ContainerT >, std::unique_ptr< AuxContainerT > > makeOutputContainer(const EventContext &ctx, int n)
std::pair< int, int > countPixelStrip(const traccc::edm::measurement_collection::const_device &measurements)
Count the number of measurements 2D (pixel) vs 1D (strip).
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
row
Appending html table to final .html summary file.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
unsigned int phiIndex(float phi, float binsize)
calculate phi index for a given phi
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.