15#include "GeoModelKernel/throwExcept.h"
29 const float time = cluster.
time();
32 Eigen::Matrix<float,3,1> localPosition = Eigen::Matrix<float,3,1>::Zero();
33 localPosition(0, 0) = localPos.x();
34 localPosition(1, 0) = localPos.y();
35 localPosition(2, 0) = time;
37 Eigen::Matrix<float,3,3> localCovariance = Eigen::Matrix<float,3,3>::Zero();
38 localCovariance(0, 0) = localCov(0, 0);
39 localCovariance(1, 1) = localCov(1, 1);
40 localCovariance(2, 2) = timeResolution * timeResolution;
42 return {localPosition, localCovariance};
53 const auto& RDOs = indetCluster.
rdoList();
54 const auto& ToTs = indetCluster.
totList();
56 xaodCluster.
setMeasurement<3>(idHash, localPosition, localCovariance);
61 return StatusCode::SUCCESS;
69 Eigen::Matrix<float,2,2> localCovariance;
70 localCovariance.setZero();
71 localCovariance(0, 0) = localCov(0, 0);
72 localCovariance(1, 1) = localCov(1, 1);
75 return {localPosition, localCovariance};
88 const auto& RDOs = indetCluster.
rdoList();
89 const auto& ToTs = indetCluster.
totList();
90 const auto& charges = indetCluster.
chargeList();
93 xaodCluster.
setMeasurement<2>(idHash, localPosition, localCovariance);
104 return StatusCode::SUCCESS;
111 float localPosition = 0.f, localCovariance = 0.f;
112 if (element.
isBarrel() or (not isITk)) {
113 localPosition = localPos.x();
118 if ( design ==
nullptr ) {
122 localPosition = localInPolar.
xPhi();
123 localCovariance = design->phiPitchPhi() * design->phiPitchPhi() *
one_over_twelve;
140 Eigen::Matrix<float, 3, 1> globalPosition(globalPos.x(), globalPos.y(), globalPos.z());
142 const auto& RDOs = indetCluster.
rdoList();
145 xaodCluster.
setMeasurement<1>(idHash, localPosition, localCovariance);
151 return StatusCode::SUCCESS;
167 std::unique_ptr<InDet::PixelCluster>
182 errorMatrix.setIdentity();
183 errorMatrix.fillSymmetric(0, 0, xaodCluster.
localCovariance<2>()(0, 0));
184 errorMatrix.fillSymmetric(1, 1, xaodCluster.
localCovariance<2>()(1, 1));
186 int colmax = std::numeric_limits<int>::min();
187 int rowmax = std::numeric_limits<int>::min();
188 int colmin = std::numeric_limits<int>::max();
189 int rowmin = std::numeric_limits<int>::max();
197 rdo_list_cluster = xaodCluster.
rdoList();
199 charge_list_cluster = xaodCluster.
chargeList();
200 std::vector<Identifier> rdo_list_new;
202 auto tot_list = xaodCluster.
totList();
204 rdo_list_new.reserve(rdo_list_cluster.size());
206 if (rdo_list_cluster.size() == charge_list_cluster.size()) {
207 for (std::size_t i(0); i<rdo_list_cluster.size(); ++i) {
209 rdo_list_new.push_back(this_rdo);
210 const float this_charge=charge_list_cluster[i];
211 const int row = pixelID.
phi_index(this_rdo);
214 qRowMax = this_charge;
215 }
else if (row == rowmax) {
216 qRowMax += this_charge;
220 qRowMin = this_charge;
221 }
else if (row == rowmin) {
222 qRowMin += this_charge;
225 const int col = pixelID.
eta_index(this_rdo);
228 qColMax = this_charge;
229 }
else if (col == colmax) {
230 qColMax += this_charge;
235 qColMin = this_charge;
236 }
else if (col == colmin) {
237 qColMin += this_charge;
243 std::ranges::transform(rdo_list_cluster, std::back_inserter(rdo_list_new),
244 [](
const Identifier::value_type& rdo) {
return Identifier{rdo}; });
250 if(qRowMin + qRowMax > 0) omegax = qRowMax/(qRowMin + qRowMax);
251 if(qColMin + qColMax > 0) omegay = qColMax/(qColMin + qColMax);
257 return std::make_unique<InDet::PixelCluster>(
id,
260 std::move(rdo_list_new),
262 std::vector<int>(tot_list.begin(), tot_list.end()),
263 std::vector<float>(charge_list_cluster.begin(),charge_list_cluster.end()),
266 std::move(errorMatrix),
272 std::unique_ptr<InDet::SCT_Cluster>
275 const SCT_ID& stripID,
double shift)
280 const auto designShape = design->
shape();
284 rdo_list_cluster = xaodCluster.
rdoList();
289 double pos_x = localPos(0, 0);
293 int firstStrip = stripID.
strip(firstStripId);
294 int stripRow = stripID.
row(firstStripId);
297 pos_x = clusterPosition.
xPhi() + shift;
298 pos_y = clusterPosition.xEta();
306 const auto& firstStrip = stripID.
strip(
Identifier(rdo_list_cluster.front()));
307 const auto& lastStrip = stripID.
strip(
Identifier(rdo_list_cluster.back()));
308 const auto& row = stripID.
row(
Identifier(rdo_list_cluster.front()));
309 const int firstStrip1D = design->
strip1Dim (firstStrip, row );
310 const int lastStrip1D = design->
strip1Dim( lastStrip, row );
316 const double clusterWidth = design->
stripPitch() * ( lastStrip - firstStrip + 1 );
318 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition> ends( design->
endsOfStrip(centre) );
319 const double stripLength( std::abs(ends.first.xEta() - ends.second.xEta()) );
324 const double col_x =
width.colRow().x();
325 const double col_y =
width.colRow().y();
327 double scale_factor = 1.;
330 else if ( col_x == 2 )
334 errorMatrix.setIdentity();
346 double sn2 = sn * sn;
347 double cs2 = 1. - sn2;
349 double v0 = errorMatrix(0,0) * w * w;
350 double v1 = errorMatrix(1,1);
351 errorMatrix.fillSymmetric( 0, 0, cs2 * v0 + sn2 * v1 );
352 errorMatrix.fillSymmetric( 0, 1, sn * std::sqrt(cs2) * (v0 - v1) );
353 errorMatrix.fillSymmetric( 1, 1, sn2 * v0 + cs2 * v1 );
355 std::vector<Identifier> rdo_list_new;
356 for(Identifier::value_type rdo_id_value : rdo_list_cluster) {
357 rdo_list_new.emplace_back(rdo_id_value);
360 return std::make_unique<InDet::SCT_Cluster>(
id,
362 std::move(rdo_list_new),
365 std::move(errorMatrix));
368 std::unique_ptr<::HGTD_Cluster>
379 errorMatrix.setIdentity();
380 errorMatrix.fillSymmetric(0, 0, local_covariance(0, 0));
381 errorMatrix.fillSymmetric(1, 1, local_covariance(1, 1));
384 double etaWidth = 1.3;
385 double phiWidth = 1.3;
389 std::vector<Identifier> rdo_list;
390 rdo_list.reserve(xaodCluster.
rdoList().size());
391 for (
const Identifier::value_type rdo_id_value : xaodCluster.
rdoList()) {
392 rdo_list.emplace_back(rdo_id_value);
395 return std::make_unique<::HGTD_Cluster>(
id,
400 std::move(errorMatrix),
403 std::vector<int>(xaodCluster.
totList()));
static constexpr double one_over_twelve
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration.
This is an Identifier helper class for the Pixel subdetector.
This is an Identifier helper class for the SCT subdetector.
const std::vector< int > & totList() const
float timeResolution() const
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
virtual DetectorShape shape() const
Shape of element.
Class to hold geometrical description of an HGTD detector element.
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.
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 SiLocalPosition localPositionOfCluster(const SiCellId &cellId, int cluserSize) const =0
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):
double phiPitch() const
Pitch (inline methods).
double sinStereoLocal(const Amg::Vector2D &localPos) const
Angle of strip in local frame with respect to the etaAxis.
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
double xPhi() const
position along phi direction:
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
Identifier identifierOfPosition(const Amg::Vector2D &localPos) const
Full identifier of the cell for a given position: assumes a raw local position (no Lorentz shift).
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
const std::vector< int > & totList() const
const std::vector< float > & chargeList() const
const Amg::Vector3D & globalPosition() const
return global position reference
const InDet::SiWidth & width() const
return width class reference
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...
This is an Identifier helper class for the Pixel subdetector.
int eta_index(const Identifier &id) const
int phi_index(const Identifier &id) const
This is an Identifier helper class for the SCT subdetector.
int row(const Identifier &id) const
int strip(const Identifier &id) const
Helper class to provide constant type-safe access to aux data.
const Amg::Vector2D & localPosition() const
return the local position reference
Identifier identify() const
return the identifier
const Amg::MatrixX & localCovariance() const
return const ref to the error matrix
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
void setRDOlist(std::vector< Identifier::value_type > &&rdoList)
Sets the list of identifiers of the channels building the cluster.
float timeCovariance() const
Return the covariance of the measured time in ns squared.
SG::ConstAccessor< SG::JaggedVecElt< int > >::element_type totList() const
Returns the list of Time Over Threshold of the channels building the cluster.
float time() const
Return the measured time in ns.
SG::ConstAccessor< SG::JaggedVecElt< Identifier::value_type > >::element_type rdoList() const
Returns the list of identifiers of the channels building the cluster.
void setToTlist(const std::vector< int > &tots)
Sets the list of ToT of the channels building the cluster.
SG::ConstAccessor< SG::JaggedVecElt< Identifier::value_type > >::element_type rdoList() const
Returns the list of identifiers of the channels building the cluster.
void setTotalCharge(float totalCharge)
Sets the total charge.
void setChannelsInPhiEta(int channelsInPhi, int channelsInEta)
Sets the dimensions of the cluster in numbers of channels in phi (x) and eta (y) directions.
int channelsInPhi() const
Returns 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.
SG::ConstAccessor< SG::JaggedVecElt< float > >::element_type chargeList() const
Returns the list of charges of the channels building the cluster.
int lvl1a() const
Return the LVL1 accept.
void setChargelist(const std::vector< float > &charges)
Sets the list of charges of the channels building the cluster.
SG::ConstAccessor< SG::JaggedVecElt< int > >::element_type totList() const
Returns the list of ToT of the channels building the cluster.
int channelsInEta() const
void setToTlist(const std::vector< int > &tots)
Sets the list of ToT of the channels building the cluster.
void setLVL1A(int lvl1a)
Sets the LVL1 accept.
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.
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the strip cluster.
SG::ConstAccessor< SG::JaggedVecElt< Identifier::value_type > >::element_type rdoList() const
Returns the list of identifiers of the channels building the cluster.
void setRDOlist(const std::vector< Identifier > &rdolist)
Sets the list of identifiers of the channels building the cluster.
int channelsInPhi() const
Returns the dimensions of the cluster in numbers of channels in phi (x), respectively.
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.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
void setIdentifier(const DetectorIdentType measId)
Sets the full Identifier of the measurement.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
std::pair< xAOD::MeasVector< 1 >, xAOD::MeasMatrix< 1 > > convertSCT_LocalPosCov(const InDet::SCT_Cluster &cluster, bool isITk=true)
std::pair< xAOD::MeasVector< 2 >, xAOD::MeasMatrix< 2 > > convertPix_LocalPosCov(const InDet::PixelCluster &cluster)
const InDetDD::PixelModuleDesign * pixelModuleDesign(const InDetDD::SiDetectorElement &element)
Resolve the readout design of a pixel/strip detector element.
StatusCode convertInDetToXaodCluster(const InDet::PixelCluster &indetCluster, const InDetDD::SiDetectorElement &element, xAOD::PixelCluster &xaodCluster)
const InDetDD::SCT_ModuleSideDesign * stripModuleSideDesign(const InDetDD::SiDetectorElement &element)
std::pair< xAOD::MeasVector< 3 >, xAOD::MeasMatrix< 3 > > convertHGTD_LocalPosCov(const HGTD_Cluster &cluster)
std::unique_ptr< InDet::PixelCluster > convertXaodToInDetCluster(const xAOD::PixelCluster &xaodCluster, const InDetDD::SiDetectorElement &element, const InDetDD::PixelModuleDesign &design, const PixelID &pixelID)
float computeTotalCharge(const SG::AuxElement &cluster)
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
Eigen::Matrix< float, N, N > MeasMatrix
Eigen::Map< const MeasMatrix< N > > ConstMatrixMap
Eigen::Matrix< float, N, 1 > MeasVector
Abrivation of the Matrix & Covariance definitions.
MeasVector< N > toStorage(const AmgVector(N)&amgVec)
Converts the double precision of the AmgVector into the floating point storage precision of the MeasV...
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
HGTDCluster_v1 HGTDCluster
Define the version of the pixel cluster class.
#define THROW_EXCEPTION(MESSAGE)