Function executing the algorithm.
142{
143
146
148
149 traccc::edm::measurement_collection::buffer traccc_measurements_buffer{
151 copy->setup(traccc_measurements_buffer)->ignore();
152 (*copy)(*measurements, traccc_measurements_buffer)->wait();
153
154 traccc::edm::measurement_collection::const_device traccc_measurements(
155 traccc_measurements_buffer);
156
157
158 std::optional<traccc::edm::silicon_cluster_collection::buffer> traccc_clusters_buffer;
159 std::optional<traccc::edm::silicon_cell_collection::buffer> traccc_cells_buffer;
160 std::optional<traccc::edm::silicon_cluster_collection::const_device> traccc_clusters;
161 std::optional<traccc::edm::silicon_cell_collection::const_device> traccc_cells;
162
163
164
165
166 std::vector<unsigned int> measToPixelSP(traccc_measurements.size(),
167 std::numeric_limits<unsigned int>::max());
168
169
170
171
172
173
174
175
176
177 std::vector<unsigned int> measToStripCl(traccc_measurements.size(),
178 std::numeric_limits<unsigned int>::max());
183 << "' and will convert them with associated cells.");
184
185 SG::ReadHandle<traccc::edm::silicon_cluster_collection::buffer>
clusters{
188 SG::ReadHandle<traccc::edm::silicon_cell_collection::buffer>
cells{
191
192 traccc_clusters_buffer.emplace(
copy->get_sizes(*clusters),
m_hostMR->mr());
193 copy->setup(*traccc_clusters_buffer)->wait();
194 (*copy)(*
clusters, *traccc_clusters_buffer)->wait();
195
196 traccc_cells_buffer.emplace(
copy->get_size(*cells),
m_hostMR->mr());
197 copy->setup(*traccc_cells_buffer)->wait();
198 (*copy)(*
cells, *traccc_cells_buffer)->wait();
199
200 traccc_clusters.emplace(*traccc_clusters_buffer);
201 ATH_MSG_DEBUG(
"Copied " << traccc_clusters->size() <<
" clusters.");
202
203 traccc_cells.emplace(*traccc_cells_buffer);
204 ATH_MSG_DEBUG(
"Copied " << traccc_cells->size() <<
" cells.");
205 } else {
208 << "' and will convert them without associated cells.");
209 }
210
211
212 const auto [n_pixels, n_strips] =
countPixelStrip(traccc_measurements);
213
214
215 auto [pixel_cont, pixel_aux] =
217 auto [pixel_spacepoint_cont, pixel_spacepoint_aux] =
219 auto [strip_cont, strip_aux] =
221
222
223 auto pixItr = pixel_cont->begin();
224 auto spItr = pixel_spacepoint_cont->begin();
225 auto stripItr = strip_cont->begin();
226
227 std::size_t pixel_idx = 0;
228 std::size_t strip_idx = 0;
229
230 for (std::size_t i = 0;
i < traccc_measurements.size(); ++
i) {
231 const auto& meas = traccc_measurements.at(i);
232 const uint64_t detrayId = meas.surface_link().value();
233 auto athenaIdOpt =
m_idMapping->detrayToAthena(detrayId);
234 if (!athenaIdOpt.has_value()) {
235 ATH_MSG_FATAL(
"No Athena module found for detray id " << detrayId <<
" — skipping measurement.");
236 return StatusCode::FAILURE;
237 }
238 const Identifier athenaId = *athenaIdOpt;
239
240
241 if (meas.dimensions() == 2u) {
244 ++spItr;
245 ++pixItr;
246
247
248
249
250
251
252 measToPixelSP[
i] = pixel_idx;
253
254 const IdentifierHash Pixel_ModuleHash =
256 const InDetDD::SiDetectorElement* pDE =
258 const InDetDD::PixelModuleDesign* design(
259 dynamic_cast<const InDetDD::PixelModuleDesign*>(
261 if(design == nullptr){
262 ATH_MSG_FATAL(
"Could not retrieve module design for pixel module hash " << Pixel_ModuleHash);
263 return StatusCode::FAILURE;
264 }
265
267 pixel_idx + strip_idx);
268
270 const auto cluster = traccc_clusters->at(meas.cluster_index());
271
272 std::vector<Identifier> rdoList;
273 rdoList.reserve(cluster.cell_indices().size());
274 int phiIndicesMax = -1;
275 int etaIndicesMax = -1;
276 int phiIndicesMin = std::numeric_limits<int>::max();
277 int etaIndicesMin = std::numeric_limits<int>::max();
278
279 for (const unsigned int cell_idx : cluster.cell_indices()) {
280 const auto&
cell = traccc_cells->at(cell_idx);
281
284
285 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
286 etaIndicesMax = std::max(etaIndicesMax, etaIndex);
287 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
288 etaIndicesMin = std::min(etaIndicesMin, etaIndex);
289
290 Identifier const hit_id =
291 m_pixelID->pixel_id(athenaId, phiIndex, etaIndex);
292 rdoList.push_back(hit_id);
293 }
294
295 double const colWidth = static_cast<double>((etaIndicesMax - etaIndicesMin) + 1);
296 double const rowWidth = static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
297 double const etaWidth =
298 design->widthFromColumnRange(etaIndicesMin, etaIndicesMax);
299 double const phiWidth = design->widthFromRowRange(phiIndicesMin, phiIndicesMax);
300
303
305 float width1 = etaWidth / colWidth;
306 Eigen::Matrix<float, 2, 2> localCovariance =
307 Eigen::Matrix<float, 2, 2>::Zero();
308 localCovariance(0, 0) = width0 * width0 / 12.0f;
309 localCovariance(1, 1) = width1 * width1 / 12.0f;
310
311 Eigen::Matrix<float, 2, 1> localPosition(meas.local_position()[0], meas.local_position()[1]);
313 localCovariance);
314
315 std::sort(rdoList.begin(), rdoList.end());
319 siWidth.colRow()[1]);
320 float width_phiRZ = static_cast<float>(siWidth.widthPhiRZ()[1]);
322
323 }
324
325
326
327
328 const float width_phiRZ = xaod_pcl->
widthInEta();
329 float covTerm = width_phiRZ * width_phiRZ * (1/12.0f);
330
332 if( covTerm < localVarEta )
333 covTerm = localVarEta;
334
336 float const cov_z =
337 6.f * covTerm *
338 static_cast<float>(
Tp(0, 2) *
Tp(0, 2) +
Tp(1, 2) *
Tp(1, 2));
339 float const cov_r = 6.f * covTerm *
340 static_cast<float>(
Tp(2, 2) *
Tp(2, 2));
343 {xaod_pcl});
344 ++pixel_idx;
345
346
347 } else {
349 ++stripItr;
350
351
352
353
354 const IdentifierHash Strip_ModuleHash =
356 const InDetDD::SiDetectorElement* pDE =
358
360 pixel_idx + strip_idx);
361
363 const auto cluster = traccc_clusters->at(meas.cluster_index());
364
365 std::vector<Identifier> rdoList;
366 rdoList.reserve(cluster.cell_indices().size());
367 int phiIndicesMax = -1;
368 int phiIndicesMin = std::numeric_limits<int>::max();
369
370 for (const unsigned int cell_idx : cluster.cell_indices()) {
371 const auto&
cell = traccc_cells->at(cell_idx);
372
373
374
375
379
380 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
381 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
382 Identifier const hit_id =
383 m_stripID->strip_id(athenaId,
int(phiIndex));
384 rdoList.push_back(hit_id);
385 }
386
387 std::sort(rdoList.begin(), rdoList.end());
390
391 const InDetDD::SCT_ModuleSideDesign* design;
393 design = (static_cast<const InDetDD::SCT_ModuleSideDesign*>(
395 } else {
396 design = (static_cast<const InDetDD::StripStereoAnnulusDesign*>(
398 }
399
401 const int firstStrip1D = design->
strip1Dim(firstStrip, row);
402 const int lastStrip1D = design->
strip1Dim(lastStrip, row);
403 const InDetDD::SiCellId cell1(firstStrip1D);
404 const InDetDD::SiCellId cell2(lastStrip1D);
405 const InDetDD::SiLocalPosition firstStripPos(
407 const InDetDD::SiLocalPosition lastStripPos(
409 const InDetDD::SiLocalPosition centre(
410 (firstStripPos + lastStripPos) * 0.5);
411 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition>
413 const double stripLength(
414 std::abs(ends.first.xEta() - ends.second.xEta()));
417
418 double const phiWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
421
425
426 }
427 measToStripCl[
i] = strip_idx;
428 ++strip_idx;
429 }
430 }
431
432 ATH_MSG_DEBUG(
"Converted " << pixel_idx <<
" pixel clusters, " << strip_idx
433 << " strip clusters");
434
435 m_nMeas += traccc_measurements.size();
438
439
441 ctx};
442 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
443
445 ctx};
446 ATH_CHECK(spacePointHandle.
record(std::move(pixel_spacepoint_cont), std::move(pixel_spacepoint_aux)));
447
449 ATH_CHECK(measToPixelSPHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToPixelSP))));
450
452 ATH_CHECK(measToStripClHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToStripCl))));
453
455 ctx};
456 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
457
459
460 return StatusCode::SUCCESS;
461}
#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.
float widthInEta() const
Returns the width of the cluster in phi (x) and eta (y) directions, respectively.
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.
ConstMatrixMap< N > localCovariance() const
Returns the 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
uint16_t etaIndex(double eta, bool &inRange)
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.