41 return StatusCode::SUCCESS;
46 const traccc::edm::measurement_collection::const_device& measurements) {
49 for (std::size_t i = 0; i < measurements.size(); ++i) {
50 if (measurements.at(i).dimensions() == 2u) {
56 return {n_pixels, n_strips};
60template <
typename ClusterT,
typename AuxContainerT,
62 std::pair<std::unique_ptr<ContainerT>, std::unique_ptr<AuxContainerT>>
69 auto aux = std::make_unique<AuxContainerT>();
72 cont->push_new(n, [&
pool]() {
return pool.nextElementPtr(); });
73 aux->resize(cont->size());
74 cont->setStore(aux.get());
76 return {std::move(cont), std::move(aux)};
79template <
typename MEAS>
84 std::size_t combinedIndex) {
89 Eigen::Matrix<float, 1, 1> localPosition = Eigen::Matrix<float, 1, 1>::Zero();
90 Eigen::Matrix<float, 1, 1> localCovariance =
91 Eigen::Matrix<float, 1, 1>::Zero();
94 localPosition(0, 0) = meas.local_position()[0];
95 localCovariance(0, 0) = meas.local_variance()[0];
97 localPosition(0, 0) = meas.local_position()[1];
98 localCovariance(0, 0) = meas.local_variance()[1];
103 xaod_scl.
setMeasurement<1>(stripHash, localPosition, localCovariance);
108template <
typename MEAS>
113 std::size_t combinedIndex) {
119 meas.local_position()[1]);
122 Eigen::Matrix<float, 2, 1> localPosition(localPos.x(), localPos.y());
123 Eigen::Matrix<float, 2, 2> localCovariance =
124 Eigen::Matrix<float, 2, 2>::Zero();
125 localCovariance(0, 0) = meas.local_variance()[0];
126 localCovariance(1, 1) = meas.local_variance()[1];
131 xaod_pcl.
setMeasurement<2>(pixHash, localPosition, localCovariance);
132 xaod_pcl.
globalPosition() = Eigen::Matrix<float, 3, 1>(gp.x(), gp.y(), gp.z());
143 auto copy =
m_copy->copy(ctx);
145 traccc::edm::measurement_collection::buffer traccc_measurements_buffer{
146 copy->get_size(*measurements),
m_hostMR->mr()};
147 copy->setup(traccc_measurements_buffer)->ignore();
148 (*copy)(*measurements, traccc_measurements_buffer)->wait();
150 traccc::edm::measurement_collection::const_device traccc_measurements(
151 traccc_measurements_buffer);
154 std::optional<traccc::edm::silicon_cluster_collection::buffer> traccc_clusters_buffer;
155 std::optional<traccc::edm::silicon_cell_collection::buffer> traccc_cells_buffer;
156 std::optional<traccc::edm::silicon_cluster_collection::const_device> traccc_clusters;
157 std::optional<traccc::edm::silicon_cell_collection::const_device> traccc_cells;
163 <<
"' and will convert them with associated cells.");
172 traccc_clusters_buffer.emplace(copy->get_sizes(*clusters),
m_hostMR->mr());
173 copy->setup(*traccc_clusters_buffer)->wait();
174 (*copy)(*clusters, *traccc_clusters_buffer)->wait();
176 traccc_cells_buffer.emplace(copy->get_size(*cells),
m_hostMR->mr());
177 copy->setup(*traccc_cells_buffer)->wait();
178 (*copy)(*cells, *traccc_cells_buffer)->wait();
180 traccc_clusters.emplace(*traccc_clusters_buffer);
181 ATH_MSG_DEBUG(
"Copied " << traccc_clusters->size() <<
" clusters.");
183 traccc_cells.emplace(*traccc_cells_buffer);
184 ATH_MSG_DEBUG(
"Copied " << traccc_cells->size() <<
" cells.");
188 <<
"' and will convert them without associated cells.");
192 const auto [n_pixels, n_strips] =
countPixelStrip(traccc_measurements);
195 auto [pixel_cont, pixel_aux] =
197 auto [strip_cont, strip_aux] =
201 auto pixItr = pixel_cont->begin();
202 auto stripItr = strip_cont->begin();
204 std::size_t pixel_idx = 0;
205 std::size_t strip_idx = 0;
207 for (std::size_t i = 0; i < traccc_measurements.size(); ++i) {
208 const auto& meas = traccc_measurements.at(i);
209 const uint64_t detrayId = meas.surface_link().value();
213 if (meas.dimensions() == 2u) {
232 if(design ==
nullptr){
233 ATH_MSG_FATAL(
"Could not retrieve module design for pixel module hash " << Pixel_ModuleHash);
234 return StatusCode::FAILURE;
238 pixel_idx + strip_idx);
241 const auto cluster = traccc_clusters->at(meas.cluster_index());
243 std::vector<Identifier> rdoList;
244 rdoList.reserve(cluster.cell_indices().size());
245 int phiIndicesMax = -1;
246 int etaIndicesMax = -1;
247 int phiIndicesMin = std::numeric_limits<int>::max();
248 int etaIndicesMin = std::numeric_limits<int>::max();
250 for (
const unsigned int cell_idx : cluster.cell_indices()) {
251 const auto& cell = traccc_cells->at(cell_idx);
253 int const phiIndex = cell.channel0();
254 int const etaIndex = cell.channel1();
256 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
257 etaIndicesMax = std::max(etaIndicesMax, etaIndex);
258 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
259 etaIndicesMin = std::min(etaIndicesMin, etaIndex);
262 m_pixelID->pixel_id(athenaId, phiIndex, etaIndex);
263 rdoList.push_back(hit_id);
266 double const colWidth =
static_cast<double>((etaIndicesMax - etaIndicesMin) + 1);
267 double const rowWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
268 double const etaWidth =
275 float width0 = phiWidth / rowWidth;
276 float width1 = etaWidth / colWidth;
277 Eigen::Matrix<float, 2, 2> localCovariance =
278 Eigen::Matrix<float, 2, 2>::Zero();
279 localCovariance(0, 0) = width0 * width0 / 12.0f;
280 localCovariance(1, 1) = width1 * width1 / 12.0f;
282 Eigen::Matrix<float, 2, 1> localPosition(meas.local_position()[0], meas.local_position()[1]);
286 std::sort(rdoList.begin(), rdoList.end());
291 float width_phiRZ =
static_cast<float>(siWidth.
widthPhiRZ()[1]);
312 pixel_idx + strip_idx);
315 const auto cluster = traccc_clusters->at(meas.cluster_index());
317 std::vector<Identifier> rdoList;
318 rdoList.reserve(cluster.cell_indices().size());
319 int phiIndicesMax = -1;
320 int phiIndicesMin = std::numeric_limits<int>::max();
322 for (
const unsigned int cell_idx : cluster.cell_indices()) {
323 const auto& cell = traccc_cells->at(cell_idx);
328 int const phiIndex = (
m_stripID->barrel_ec(athenaId) != 0)
332 phiIndicesMax = std::max(phiIndicesMax, phiIndex);
333 phiIndicesMin = std::min(phiIndicesMin, phiIndex);
335 m_stripID->strip_id(athenaId,
int(phiIndex));
336 rdoList.push_back(hit_id);
339 std::sort(rdoList.begin(), rdoList.end());
340 const int firstStrip =
m_stripID->strip(rdoList.front());
341 const int lastStrip =
m_stripID->strip(rdoList.back());
352 const int row =
m_stripID->row(rdoList.front());
353 const int firstStrip1D = design->
strip1Dim(firstStrip, row);
354 const int lastStrip1D = design->
strip1Dim(lastStrip, row);
362 (firstStripPos + lastStripPos) * 0.5);
363 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition>
365 const double stripLength(
366 std::abs(ends.first.xEta() - ends.second.xEta()));
368 design->
stripPitch() * (lastStrip - firstStrip + 1);
370 double const phiWidth =
static_cast<double>((phiIndicesMax - phiIndicesMin) + 1);
383 ATH_MSG_DEBUG(
"Converted " << pixel_idx <<
" pixel clusters, " << strip_idx
384 <<
" strip clusters");
386 m_nMeas += traccc_measurements.size();
393 ATH_CHECK(pixelHandle.
record(std::move(pixel_cont), std::move(pixel_aux)));
397 ATH_CHECK(stripHandle.
record(std::move(strip_cont), std::move(strip_aux)));
399 return StatusCode::SUCCESS;
407 <<
", of which pixel clusters = " <<
m_nPix
408 <<
" and strip clusters = " <<
m_nStrip);
411 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
SG::ReadHandleKey< traccc::edm::measurement_collection::buffer > m_inputMeasKey
SG::WriteHandleKey< xAOD::StripClusterContainer > m_outputStripKey
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
ServiceHandle< ActsTrk::IDeviceDetectorDescriptionProviderSvc > m_detDescSvc
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.) {.
const std::unordered_map< uint64_t, Identifier > * m_detrayToAthena
The athena <-> detray identifier map.
SG::WriteHandleKey< xAOD::PixelClusterContainer > m_outputPixelKey
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.
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.
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 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.
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::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.