46 return StatusCode::SUCCESS;
51 const traccc::edm::measurement_collection::const_device& measurements) {
54 for (std::size_t i = 0; i < measurements.size(); ++i) {
55 if (measurements.at(i).dimensions() == 2u) {
61 return {n_pixels, n_strips};
65template <
typename ClusterT,
typename AuxContainerT,
67 std::pair<std::unique_ptr<ContainerT>, std::unique_ptr<AuxContainerT>>
74 auto aux = std::make_unique<AuxContainerT>();
77 cont->push_new(n, [&
pool]() {
return pool.nextElementPtr(); });
78 aux->resize(cont->size());
79 cont->setStore(aux.get());
81 return {std::move(cont), std::move(aux)};
84template <
typename MEAS>
89 std::size_t combinedIndex) {
94 Eigen::Matrix<float, 1, 1> localPosition = Eigen::Matrix<float, 1, 1>::Zero();
95 Eigen::Matrix<float, 1, 1> localCovariance =
96 Eigen::Matrix<float, 1, 1>::Zero();
99 localPosition(0, 0) = meas.local_position()[0];
100 localCovariance(0, 0) = meas.local_variance()[0];
102 localPosition(0, 0) = meas.local_position()[1];
103 localCovariance(0, 0) = meas.local_variance()[1];
108 xaod_scl.
setMeasurement<1>(stripHash, localPosition, localCovariance);
113template <
typename MEAS>
118 std::size_t combinedIndex) {
124 meas.local_position()[1]);
127 Eigen::Matrix<float, 2, 1> localPosition(localPos.x(), localPos.y());
128 Eigen::Matrix<float, 2, 2> localCovariance =
129 Eigen::Matrix<float, 2, 2>::Zero();
130 localCovariance(0, 0) = meas.local_variance()[0];
131 localCovariance(1, 1) = meas.local_variance()[1];
136 xaod_pcl.
setMeasurement<2>(pixHash, localPosition, localCovariance);
137 xaod_pcl.
globalPosition() = Eigen::Matrix<float, 3, 1>(gp.x(), gp.y(), gp.z());
148 auto copy =
m_copy->copy(ctx);
150 traccc::edm::measurement_collection::buffer traccc_measurements_buffer{
151 copy->get_size(*measurements),
m_hostMR->mr()};
152 copy->setup(traccc_measurements_buffer)->ignore();
153 (*copy)(*measurements, traccc_measurements_buffer)->wait();
155 traccc::edm::measurement_collection::const_device traccc_measurements(
156 traccc_measurements_buffer);
159 std::optional<traccc::edm::silicon_cluster_collection::buffer> traccc_clusters_buffer;
160 std::optional<traccc::edm::silicon_cell_collection::buffer> traccc_cells_buffer;
161 std::optional<traccc::edm::silicon_cluster_collection::const_device> traccc_clusters;
162 std::optional<traccc::edm::silicon_cell_collection::const_device> traccc_cells;
167 std::vector<unsigned int> measToPixelSP(traccc_measurements.size(),
168 std::numeric_limits<unsigned int>::max());
178 std::vector<unsigned int> measToStripCl(traccc_measurements.size(),
179 std::numeric_limits<unsigned int>::max());
184 <<
"' and will convert them with associated cells.");
193 traccc_clusters_buffer.emplace(copy->get_sizes(*clusters),
m_hostMR->mr());
194 copy->setup(*traccc_clusters_buffer)->wait();
195 (*copy)(*clusters, *traccc_clusters_buffer)->wait();
197 traccc_cells_buffer.emplace(copy->get_size(*cells),
m_hostMR->mr());
198 copy->setup(*traccc_cells_buffer)->wait();
199 (*copy)(*cells, *traccc_cells_buffer)->wait();
201 traccc_clusters.emplace(*traccc_clusters_buffer);
202 ATH_MSG_DEBUG(
"Copied " << traccc_clusters->size() <<
" clusters.");
204 traccc_cells.emplace(*traccc_cells_buffer);
205 ATH_MSG_DEBUG(
"Copied " << traccc_cells->size() <<
" cells.");
209 <<
"' and will convert them without associated cells.");
213 const auto [n_pixels, n_strips] =
countPixelStrip(traccc_measurements);
216 auto [pixel_cont, pixel_aux] =
221 auto [pixel_spacepoint_cont, pixel_spacepoint_aux] =
223 auto [strip_cont, strip_aux] =
227 auto pixItr = pixel_cont->begin();
228 auto spItr = pixel_spacepoint_cont->begin();
229 auto stripItr = strip_cont->begin();
231 std::size_t pixel_idx = 0;
232 std::size_t strip_idx = 0;
234 for (std::size_t i = 0; i < traccc_measurements.size(); ++i) {
235 const auto& meas = traccc_measurements.at(i);
236 const uint64_t detrayId = meas.surface_link().value();
237 auto athenaIdOpt =
m_idMapping->detrayToAthena(detrayId);
238 if (!athenaIdOpt.has_value()) {
239 ATH_MSG_FATAL(
"No Athena module found for detray id " << detrayId <<
" — skipping measurement.");
240 return StatusCode::FAILURE;
245 if (meas.dimensions() == 2u) {
254 measToPixelSP[i] = pixel_idx;
263 if(design ==
nullptr){
264 ATH_MSG_FATAL(
"Could not retrieve module design for pixel module hash " << Pixel_ModuleHash);
265 return StatusCode::FAILURE;
269 pixel_idx + strip_idx);
272 const auto cluster = traccc_clusters->at(meas.cluster_index());
274 std::vector<Identifier> rdoList;
275 rdoList.reserve(cluster.cell_indices().size());
276 int phiIndicesMax = -1;
277 int etaIndicesMax = -1;
278 int phiIndicesMin = std::numeric_limits<int>::max();
279 int etaIndicesMin = std::numeric_limits<int>::max();
281 for (
const unsigned int cell_idx : cluster.cell_indices()) {
282 const auto& cell = traccc_cells->at(cell_idx);
284 int const phiIndex = cell.channel0();
285 int const etaIndex = cell.channel1();
287 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
288 etaIndicesMax = std::max(etaIndicesMax, etaIndex);
289 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
290 etaIndicesMin = std::min(etaIndicesMin, etaIndex);
293 m_pixelID->pixel_id(athenaId, phiIndex, etaIndex);
294 rdoList.push_back(hit_id);
297 double const colWidth =
static_cast<double>((etaIndicesMax - etaIndicesMin) + 1);
298 double const rowWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
299 double const etaWidth =
306 float width0 = phiWidth / rowWidth;
307 float width1 = etaWidth / colWidth;
308 Eigen::Matrix<float, 2, 2> localCovariance =
309 Eigen::Matrix<float, 2, 2>::Zero();
310 localCovariance(0, 0) = width0 * width0 / 12.0f;
311 localCovariance(1, 1) = width1 * width1 / 12.0f;
313 Eigen::Matrix<float, 2, 1> localPosition(meas.local_position()[0], meas.local_position()[1]);
317 std::sort(rdoList.begin(), rdoList.end());
322 float width_phiRZ =
static_cast<float>(siWidth.
widthPhiRZ()[1]);
327 if(writeSpacePoints) {
334 const float width_phiRZ = xaod_pcl->
widthInEta();
335 float covTerm = width_phiRZ * width_phiRZ * (1/12.0f);
338 if( covTerm < localVarEta )
339 covTerm = localVarEta;
344 static_cast<float>(
Tp(0, 2) *
Tp(0, 2) +
Tp(1, 2) *
Tp(1, 2));
345 float const cov_r = 6.f * covTerm *
346 static_cast<float>(
Tp(2, 2) *
Tp(2, 2));
368 pixel_idx + strip_idx);
371 const auto cluster = traccc_clusters->at(meas.cluster_index());
373 std::vector<Identifier> rdoList;
374 rdoList.reserve(cluster.cell_indices().size());
375 int phiIndicesMax = -1;
376 int phiIndicesMin = std::numeric_limits<int>::max();
378 for (
const unsigned int cell_idx : cluster.cell_indices()) {
379 const auto& cell = traccc_cells->at(cell_idx);
384 int const phiIndex = (
m_stripID->barrel_ec(athenaId) != 0)
388 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
389 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
391 m_stripID->strip_id(athenaId,
int(phiIndex));
392 rdoList.push_back(hit_id);
395 std::sort(rdoList.begin(), rdoList.end());
396 const int firstStrip =
m_stripID->strip(rdoList.front());
397 const int lastStrip =
m_stripID->strip(rdoList.back());
408 const int row =
m_stripID->row(rdoList.front());
409 const int firstStrip1D = design->
strip1Dim(firstStrip, row);
410 const int lastStrip1D = design->
strip1Dim(lastStrip, row);
418 (firstStripPos + lastStripPos) * 0.5);
419 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition>
421 const double stripLength(
422 std::abs(ends.first.xEta() - ends.second.xEta()));
424 design->
stripPitch() * (lastStrip - firstStrip + 1);
426 double const phiWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
435 measToStripCl[i] = strip_idx;
440 ATH_MSG_DEBUG(
"Converted " << pixel_idx <<
" pixel clusters, " << strip_idx
441 <<
" strip clusters");
443 m_nMeas += traccc_measurements.size();
450 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
452 if(writeSpacePoints) {
455 ATH_CHECK(spacePointHandle.
record(std::move(pixel_spacepoint_cont), std::move(pixel_spacepoint_aux)));
459 ATH_CHECK(measToPixelSPHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToPixelSP))));
462 ATH_CHECK(measToStripClHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToStripCl))));
466 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
470 return StatusCode::SUCCESS;
478 <<
", of which pixel clusters = " <<
m_nPix
479 <<
" and strip clusters = " <<
m_nStrip);
482 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
const ActsTrk::GeometryIdMapping * m_idMapping
Gaudi::Property< std::string > m_geoIdMappingObjectName
SG::ReadHandleKey< traccc::edm::measurement_collection::buffer > m_inputMeasKey
SG::WriteHandleKey< xAOD::StripClusterContainer > m_outputStripKey
SG::WriteHandleKey< std::vector< unsigned int > > m_outputMeasToStripClKey
virtual StatusCode finalize() override
Function finalizing the algorthm.
Gaudi::Property< bool > m_convertClustersWithCells
Gaudi::Property< std::string > m_idHelperName
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
virtual StatusCode initialize() override
Function initializing the algorithm.
const InDetDD::SCT_DetectorManager * m_stripManager
const InDetDD::PixelDetectorManager * m_pixelManager
std::atomic< int > m_nStrip
virtual StatusCode execute(const EventContext &ctx) const override
Function executing the algorithm.
const ServiceHandle< StoreGateSvc > & detStore() const
a typed memory pool that saves time spent allocation small object.
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements : via Identifier
Class used to describe the design of a module (diode segmentation and readout scheme).
double widthFromRowRange(const int rowMin, const int rowMax) const
Method to calculate phi width from a row range.
double widthFromColumnRange(const int colMin, const int colMax) const
Method to calculate eta width from a column range.
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
virtual const SiDetectorElement * getDetectorElement(const Identifier &id) const override
access to individual elements via Identifier
Base class for the SCT module side design, extended by the Forward and Barrel module design.
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
Identifier for the strip or pixel cell.
Class to hold geometrical description of a silicon detector element.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
Trk::Surface & surface()
Element Surface.
const Amg::Vector2D & widthPhiRZ() const
const Amg::Vector2D & colRow() const
This is an Identifier helper class for the Pixel subdetector.
IdentifierHash wafer_hash(Identifier wafer_id) const
wafer hash from id
This is an Identifier helper class for the SCT subdetector.
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
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 setIdentifierHash(const DetectorIDHashType idHash)
Sets the IdentifierHash of the measurement (corresponds to the detector element IdentifierHash).
void setIdentifier(const DetectorIdentType measId)
Sets the full Identifier of the measurement.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
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
Eigen::Matrix< double, 3, 1 > Vector3D
@ 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())
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.