45 return StatusCode::SUCCESS;
50 const traccc::edm::measurement_collection::const_device& measurements) {
53 for (std::size_t i = 0; i < measurements.size(); ++i) {
54 if (measurements.at(i).dimensions() == 2u) {
60 return {n_pixels, n_strips};
64template <
typename ClusterT,
typename AuxContainerT,
66 std::pair<std::unique_ptr<ContainerT>, std::unique_ptr<AuxContainerT>>
73 auto aux = std::make_unique<AuxContainerT>();
76 cont->push_new(n, [&
pool]() {
return pool.nextElementPtr(); });
77 aux->resize(cont->size());
78 cont->setStore(aux.get());
80 return {std::move(cont), std::move(aux)};
83template <
typename MEAS>
88 std::size_t combinedIndex) {
93 Eigen::Matrix<float, 1, 1> localPosition = Eigen::Matrix<float, 1, 1>::Zero();
94 Eigen::Matrix<float, 1, 1> localCovariance =
95 Eigen::Matrix<float, 1, 1>::Zero();
98 localPosition(0, 0) = meas.local_position()[0];
99 localCovariance(0, 0) = meas.local_variance()[0];
101 localPosition(0, 0) = meas.local_position()[1];
102 localCovariance(0, 0) = meas.local_variance()[1];
107 xaod_scl.
setMeasurement<1>(stripHash, localPosition, localCovariance);
112template <
typename MEAS>
117 std::size_t combinedIndex) {
123 meas.local_position()[1]);
126 Eigen::Matrix<float, 2, 1> localPosition(localPos.x(), localPos.y());
127 Eigen::Matrix<float, 2, 2> localCovariance =
128 Eigen::Matrix<float, 2, 2>::Zero();
129 localCovariance(0, 0) = meas.local_variance()[0];
130 localCovariance(1, 1) = meas.local_variance()[1];
135 xaod_pcl.
setMeasurement<2>(pixHash, localPosition, localCovariance);
136 xaod_pcl.
globalPosition() = Eigen::Matrix<float, 3, 1>(gp.x(), gp.y(), gp.z());
147 auto copy =
m_copy->copy(ctx);
149 traccc::edm::measurement_collection::buffer traccc_measurements_buffer{
150 copy->get_size(*measurements),
m_hostMR->mr()};
151 copy->setup(traccc_measurements_buffer)->ignore();
152 (*copy)(*measurements, traccc_measurements_buffer)->wait();
154 traccc::edm::measurement_collection::const_device traccc_measurements(
155 traccc_measurements_buffer);
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;
166 std::vector<unsigned int> measToPixelSP(traccc_measurements.size(),
167 std::numeric_limits<unsigned int>::max());
177 std::vector<unsigned int> measToStripCl(traccc_measurements.size(),
178 std::numeric_limits<unsigned int>::max());
183 <<
"' and will convert them with associated cells.");
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();
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();
200 traccc_clusters.emplace(*traccc_clusters_buffer);
201 ATH_MSG_DEBUG(
"Copied " << traccc_clusters->size() <<
" clusters.");
203 traccc_cells.emplace(*traccc_cells_buffer);
204 ATH_MSG_DEBUG(
"Copied " << traccc_cells->size() <<
" cells.");
208 <<
"' and will convert them without associated cells.");
212 const auto [n_pixels, n_strips] =
countPixelStrip(traccc_measurements);
215 auto [pixel_cont, pixel_aux] =
217 auto [pixel_spacepoint_cont, pixel_spacepoint_aux] =
219 auto [strip_cont, strip_aux] =
223 auto pixItr = pixel_cont->begin();
224 auto spItr = pixel_spacepoint_cont->begin();
225 auto stripItr = strip_cont->begin();
227 std::size_t pixel_idx = 0;
228 std::size_t strip_idx = 0;
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;
241 if (meas.dimensions() == 2u) {
252 measToPixelSP[i] = pixel_idx;
261 if(design ==
nullptr){
262 ATH_MSG_FATAL(
"Could not retrieve module design for pixel module hash " << Pixel_ModuleHash);
263 return StatusCode::FAILURE;
267 pixel_idx + strip_idx);
270 const auto cluster = traccc_clusters->at(meas.cluster_index());
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();
279 for (
const unsigned int cell_idx : cluster.cell_indices()) {
280 const auto& cell = traccc_cells->at(cell_idx);
282 int const phiIndex = cell.channel0();
283 int const etaIndex = cell.channel1();
285 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
286 etaIndicesMax = std::max(etaIndicesMax, etaIndex);
287 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
288 etaIndicesMin = std::min(etaIndicesMin, etaIndex);
291 m_pixelID->pixel_id(athenaId, phiIndex, etaIndex);
292 rdoList.push_back(hit_id);
295 double const colWidth =
static_cast<double>((etaIndicesMax - etaIndicesMin) + 1);
296 double const rowWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
297 double const etaWidth =
304 float width0 = phiWidth / rowWidth;
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;
311 Eigen::Matrix<float, 2, 1> localPosition(meas.local_position()[0], meas.local_position()[1]);
315 std::sort(rdoList.begin(), rdoList.end());
320 float width_phiRZ =
static_cast<float>(siWidth.
widthPhiRZ()[1]);
328 const float width_phiRZ = xaod_pcl->
widthInEta();
329 float covTerm = width_phiRZ * width_phiRZ * (1/12.0f);
332 if( covTerm < localVarEta )
333 covTerm = localVarEta;
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));
360 pixel_idx + strip_idx);
363 const auto cluster = traccc_clusters->at(meas.cluster_index());
365 std::vector<Identifier> rdoList;
366 rdoList.reserve(cluster.cell_indices().size());
367 int phiIndicesMax = -1;
368 int phiIndicesMin = std::numeric_limits<int>::max();
370 for (
const unsigned int cell_idx : cluster.cell_indices()) {
371 const auto& cell = traccc_cells->at(cell_idx);
376 int const phiIndex = (
m_stripID->barrel_ec(athenaId) != 0)
380 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
381 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
383 m_stripID->strip_id(athenaId,
int(phiIndex));
384 rdoList.push_back(hit_id);
387 std::sort(rdoList.begin(), rdoList.end());
388 const int firstStrip =
m_stripID->strip(rdoList.front());
389 const int lastStrip =
m_stripID->strip(rdoList.back());
400 const int row =
m_stripID->row(rdoList.front());
401 const int firstStrip1D = design->
strip1Dim(firstStrip, row);
402 const int lastStrip1D = design->
strip1Dim(lastStrip, row);
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()));
416 design->
stripPitch() * (lastStrip - firstStrip + 1);
418 double const phiWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
427 measToStripCl[i] = strip_idx;
432 ATH_MSG_DEBUG(
"Converted " << pixel_idx <<
" pixel clusters, " << strip_idx
433 <<
" strip clusters");
435 m_nMeas += traccc_measurements.size();
442 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
446 ATH_CHECK(spacePointHandle.
record(std::move(pixel_spacepoint_cont), std::move(pixel_spacepoint_aux)));
449 ATH_CHECK(measToPixelSPHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToPixelSP))));
452 ATH_CHECK(measToStripClHandle.
record(std::make_unique<std::vector<unsigned int>>(std::move(measToStripCl))));
456 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
460 return StatusCode::SUCCESS;
468 <<
", of which pixel clusters = " <<
m_nPix
469 <<
" and strip clusters = " <<
m_nStrip);
472 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.