ATLAS Offline Software
Loading...
Searching...
No Matches
TrackingUtilities Namespace Reference

Functions

StatusCode convertInDetToXaodCluster (const InDet::PixelCluster &indetCluster, const InDetDD::SiDetectorElement &element, xAOD::PixelCluster &xaodCluster)
StatusCode convertInDetToXaodCluster (const InDet::SCT_Cluster &indetCluster, const InDetDD::SiDetectorElement &element, xAOD::StripCluster &xaodCluster, bool isITk=true)
StatusCode convertXaodToInDetCluster (const xAOD::PixelCluster &xaodCluster, const InDetDD::SiDetectorElement &element, const PixelID &pixelID, InDet::PixelCluster *&indetCluster)
StatusCode convertXaodToInDetCluster (const xAOD::StripCluster &xaodCluster, const InDetDD::SiDetectorElement &element, const SCT_ID &stripID, InDet::SCT_Cluster *&indetCluster, double shift=0.)
StatusCode convertInDetToXaodCluster (const HGTD_Cluster &indetCluster, const InDetDD::HGTD_DetectorElement &element, xAOD::HGTDCluster &xaodCluster)
StatusCode convertXaodToInDetCluster (const xAOD::HGTDCluster &xaodCluster, const InDetDD::HGTD_DetectorElement &element, ::HGTD_Cluster *&indetCluster)
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)
std::pair< xAOD::MeasVector< 3 >, xAOD::MeasMatrix< 3 > > convertHGTD_LocalPosCov (const HGTD_Cluster &cluster)
std::pair< float, float > computeOmegas (const xAOD::PixelCluster &cluster, const PixelID &pixelID)
StatusCode convertTrkToXaodPixelSpacePoint (const InDet::PixelSpacePoint &trkSpacePoint, xAOD::SpacePoint &xaodSpacePoint)
StatusCode convertTrkToXaodStripSpacePoint (const InDet::SCT_SpacePoint &trkSpacePoint, const Amg::Vector3D &vertex, xAOD::SpacePoint &xaodSpacePoint)

Function Documentation

◆ computeOmegas()

std::pair< float, float > TrackingUtilities::computeOmegas ( const xAOD::PixelCluster & cluster,
const PixelID & pixelID )

Definition at line 9 of file InnerDetector/InDetMeasurementUtilities/src/Helpers.cxx.

11 {
13 rdo_list_cluster = cluster.rdoList();
14 const std::vector<float>& charge_list_cluster = cluster.chargeList();
15
16 if (rdo_list_cluster.size() != charge_list_cluster.size()) {
17 return {-1.f, -1.f};
18 }
19
20 int colmax = std::numeric_limits<int>::min();
21 int rowmax = std::numeric_limits<int>::min();
22 int colmin = std::numeric_limits<int>::max();
23 int rowmin = std::numeric_limits<int>::max();
24
25 float qRowMin = 0.f;
26 float qRowMax = 0.f;
27 float qColMin = 0.f;
28 float qColMax = 0.f;
29
30 for (std::size_t i(0); i<rdo_list_cluster.size(); ++i) {
31 Identifier this_rdo(rdo_list_cluster.at(i));
32 const float this_charge = charge_list_cluster.at(i);
33
34 const int row = pixelID.phi_index(this_rdo);
35 if (row > rowmax) {
36 rowmax = row;
37 qRowMax = this_charge;
38 } else if (row == rowmax) {
39 qRowMax += this_charge;
40 }
41
42 if (row < rowmin) {
43 rowmin = row;
44 qRowMin = this_charge;
45 } else if (row == rowmin) {
46 qRowMin += this_charge;
47 }
48
49 const int col = pixelID.eta_index(this_rdo);
50 if (col > colmax) {
51 colmax = col;
52 qColMax = this_charge;
53 } else if (col == colmax) {
54 qColMax += this_charge;
55 }
56
57 if (col < colmin) {
58 colmin = col;
59 qColMin = this_charge;
60 } else if (col == colmin) {
61 qColMin += this_charge;
62 }
63 } // loop on rdos and charges
64
65 float omegax = -1.f;
66 float omegay = -1.f;
67 if(qRowMin + qRowMax > 0) omegax = qRowMax/(qRowMin + qRowMax);
68 if(qColMin + qColMax > 0) omegay = qColMax/(qColMin + qColMax);
69
70 return std::make_pair(omegax, omegay);
71 }
int eta_index(const Identifier &id) const
Definition PixelID.h:640
int phi_index(const Identifier &id) const
Definition PixelID.h:634
Helper class to provide constant type-safe access to aux data.
SG::ConstAccessor< SG::JaggedVecElt< Identifier::value_type > >::element_type rdoList() const
Returns the list of identifiers of the channels building the cluster.
SG::ConstAccessor< SG::JaggedVecElt< float > >::element_type chargeList() const
Returns the list of charges of the channels building the cluster.
row
Appending html table to final .html summary file.

◆ convertHGTD_LocalPosCov()

std::pair< xAOD::MeasVector< 3 >, xAOD::MeasMatrix< 3 > > TrackingUtilities::convertHGTD_LocalPosCov ( const HGTD_Cluster & cluster)

Definition at line 19 of file ClusterConversionUtilities.cxx.

19 {
20 auto localPos = cluster.localPosition();
21 auto localCov = cluster.localCovariance();
22
23 const float time = cluster.time();
24 const float timeResolution = cluster.timeResolution();
25
26 Eigen::Matrix<float,3,1> localPosition = Eigen::Matrix<float,3,1>::Zero();
27 localPosition(0, 0) = localPos.x();
28 localPosition(1, 0) = localPos.y();
29 localPosition(2, 0) = time;
30
31 Eigen::Matrix<float,3,3> localCovariance = Eigen::Matrix<float,3,3>::Zero();
32 localCovariance(0, 0) = localCov(0, 0);
33 localCovariance(1, 1) = localCov(1, 1);
34 localCovariance(2, 2) = timeResolution * timeResolution;
35
36 return {localPosition, localCovariance};
37 }
virtual float time() const
virtual float timeResolution() const
const Amg::Vector2D & localPosition() const
return the local position reference
const Amg::MatrixX & localCovariance() const
return const ref to the error matrix

◆ convertInDetToXaodCluster() [1/3]

StatusCode TrackingUtilities::convertInDetToXaodCluster ( const HGTD_Cluster & indetCluster,
const InDetDD::HGTD_DetectorElement & element,
xAOD::HGTDCluster & xaodCluster )

Definition at line 39 of file ClusterConversionUtilities.cxx.

42 {
43 IdentifierHash idHash = element.identifyHash();
44
45 const auto [localPosition, localCovariance] = convertHGTD_LocalPosCov(indetCluster);
46
47 const auto& RDOs = indetCluster.rdoList();
48 const auto& ToTs = indetCluster.totList();
49
50 xaodCluster.setMeasurement<3>(idHash, localPosition, localCovariance);
51 xaodCluster.setIdentifier( indetCluster.identify().get_compact() );
52 xaodCluster.setRDOlist(RDOs);
53 xaodCluster.setToTlist(ToTs);
54
55 return StatusCode::SUCCESS;
56 }
virtual const std::vector< int > & totList() const
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
Identifier identify() const
return the identifier
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.
void setToTlist(const std::vector< int > &tots)
Sets the list of ToT of the channels building the cluster.
void setMeasurement(const DetectorIDHashType idHash, MeasVector< N > locPos, MeasMatrix< N > locCov)
Sets IdentifierHash, local position and local covariance of the measurement.
void setIdentifier(const DetectorIdentType measId)
Sets the full Identifier of the measurement.
std::pair< xAOD::MeasVector< 3 >, xAOD::MeasMatrix< 3 > > convertHGTD_LocalPosCov(const HGTD_Cluster &cluster)

◆ convertInDetToXaodCluster() [2/3]

StatusCode TrackingUtilities::convertInDetToXaodCluster ( const InDet::PixelCluster & indetCluster,
const InDetDD::SiDetectorElement & element,
xAOD::PixelCluster & xaodCluster )

Definition at line 72 of file ClusterConversionUtilities.cxx.

75 {
76 IdentifierHash idHash = element.identifyHash();
77
78 const auto [localPosition, localCovariance] = convertPix_LocalPosCov(indetCluster);
79
80 auto globalPos = indetCluster.globalPosition();
81 Eigen::Matrix<float, 3, 1> globalPosition(globalPos.x(), globalPos.y(), globalPos.z());
82
83 const auto& RDOs = indetCluster.rdoList();
84 const auto& ToTs = indetCluster.totList();
85 const auto& charges = indetCluster.chargeList();
86 const auto& width = indetCluster.width();
87
88 xaodCluster.setMeasurement<2>(idHash, localPosition, localCovariance);
89 xaodCluster.setIdentifier( indetCluster.identify().get_compact() );
90 xaodCluster.setRDOlist(RDOs);
91 xaodCluster.globalPosition() = globalPosition;
92 xaodCluster.setToTlist(ToTs);
93 xaodCluster.setChargelist(charges);
94 xaodCluster.setLVL1A(indetCluster.LVL1A());
95 xaodCluster.setChannelsInPhiEta(width.colRow()[0], width.colRow()[1]);
96 xaodCluster.setWidthInEta(static_cast<float>(width.widthPhiRZ()[1]));
97
98 return StatusCode::SUCCESS;
99 }
const double width
const Amg::Vector3D & globalPosition() const
return global position reference
const InDet::SiWidth & width() const
return width class 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.
void setChargelist(const std::vector< float > &charges)
Sets the list of charges of the channels building the cluster.
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.
std::pair< xAOD::MeasVector< 2 >, xAOD::MeasMatrix< 2 > > convertPix_LocalPosCov(const InDet::PixelCluster &cluster)

◆ convertInDetToXaodCluster() [3/3]

StatusCode TrackingUtilities::convertInDetToXaodCluster ( const InDet::SCT_Cluster & indetCluster,
const InDetDD::SiDetectorElement & element,
xAOD::StripCluster & xaodCluster,
bool isITk = true )

Definition at line 124 of file ClusterConversionUtilities.cxx.

128 {
129 IdentifierHash idHash = element.identifyHash();
130
131 const auto [localPosition, localCovariance] = convertSCT_LocalPosCov(indetCluster, isITk);
132
133 auto globalPos = indetCluster.globalPosition();
134 Eigen::Matrix<float, 3, 1> globalPosition(globalPos.x(), globalPos.y(), globalPos.z());
135
136 const auto& RDOs = indetCluster.rdoList();
137 const auto& width = indetCluster.width();
138
139 xaodCluster.setMeasurement<1>(idHash, localPosition, localCovariance);
140 xaodCluster.setIdentifier( indetCluster.identify().get_compact() );
141 xaodCluster.setRDOlist(RDOs);
142 xaodCluster.globalPosition() = globalPosition;
143 xaodCluster.setChannelsInPhi(width.colRow()[0]);
144
145 return StatusCode::SUCCESS;
146 }
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the strip cluster.
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).
std::pair< xAOD::MeasVector< 1 >, xAOD::MeasMatrix< 1 > > convertSCT_LocalPosCov(const InDet::SCT_Cluster &cluster, bool isITk=true)

◆ convertPix_LocalPosCov()

std::pair< xAOD::MeasVector< 2 >, xAOD::MeasMatrix< 2 > > TrackingUtilities::convertPix_LocalPosCov ( const InDet::PixelCluster & cluster)

Definition at line 58 of file ClusterConversionUtilities.cxx.

58 {
59 auto localPos = cluster.localPosition();
60 auto localCov = cluster.localCovariance();
61
62 Eigen::Matrix<float,2,1> localPosition(localPos.x(), localPos.y());
63
64 Eigen::Matrix<float,2,2> localCovariance;
65 localCovariance.setZero();
66 localCovariance(0, 0) = localCov(0, 0);
67 localCovariance(1, 1) = localCov(1, 1);
68
69 return {localPosition, localCovariance};
70 }

◆ convertSCT_LocalPosCov()

std::pair< xAOD::MeasVector< 1 >, xAOD::MeasMatrix< 1 > > TrackingUtilities::convertSCT_LocalPosCov ( const InDet::SCT_Cluster & cluster,
bool isITk = true )

Definition at line 101 of file ClusterConversionUtilities.cxx.

101 {
102 const InDetDD::SiDetectorElement& element{*cluster.detectorElement()};
103 auto localPos = cluster.localPosition();
104
105 float localPosition = 0.f, localCovariance = 0.f;
106 if (element.isBarrel() or (not isITk)) {
107 localPosition = localPos.x();
108 localCovariance = element.phiPitch() * element.phiPitch() * one_over_twelve;
109 } else {
110 InDetDD::SiCellId cellId = element.cellIdOfPosition(localPos);
111 const auto* design = dynamic_cast<const InDetDD::StripStereoAnnulusDesign *>(&element.design());
112 if ( design == nullptr ) {
113 THROW_EXCEPTION("Invalid bounds from "<<cluster);
114 }
115 InDetDD::SiLocalPosition localInPolar = design->localPositionOfCellPC(cellId);
116 localPosition = localInPolar.xPhi();
117 localCovariance = design->phiPitchPhi() * design->phiPitchPhi() * one_over_twelve;
118 }
119
120 return std::make_pair(xAOD::MeasVector<1>{localPosition},
121 xAOD::MeasMatrix<1>{localCovariance});
122 }
static constexpr double one_over_twelve
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 xPhi() const
position along phi direction:
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
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...
Eigen::Matrix< float, N, N > MeasMatrix
Eigen::Matrix< float, N, 1 > MeasVector
Abrivation of the Matrix & Covariance definitions.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ convertTrkToXaodPixelSpacePoint()

StatusCode TrackingUtilities::convertTrkToXaodPixelSpacePoint ( const InDet::PixelSpacePoint & trkSpacePoint,
xAOD::SpacePoint & xaodSpacePoint )

Definition at line 12 of file SpacePointConversionUtilities.cxx.

14 {
15 unsigned int idHash = trkSpacePoint.elementIdList().first;
16 const auto& globPos = trkSpacePoint.globalPosition();
17
18 const InDet::SiCluster* c = static_cast<const InDet::SiCluster*>(trkSpacePoint.clusterList().first);
19 const InDetDD::SiDetectorElement *de = c->detectorElement();
20 const Amg::Transform3D &Tp = de->surface().transform();
21
22 float r_3 = static_cast<float>( Tp(0,2) );
23 float r_4 = static_cast<float>( Tp(1,2) );
24 float r_5 = static_cast<float>( Tp(2,2) );
25
26 const Amg::MatrixX& v = c->localCovariance();
27 float f22 = static_cast<float>( v(1,1) );
28 float wid = static_cast<float>( c->width().z() );
29 float cov = wid*wid*.08333;
30 if(cov < f22) cov = f22;
31 float covr = 6 * cov * (r_5*r_5);
32 float covz = 6 * cov * (r_3*r_3 + r_4*r_4);
33
34 xaodSpacePoint.setSpacePoint(idHash,
35 globPos.cast<float>(),
36 covr,
37 covz,
38 {});
39
40 return StatusCode::SUCCESS;
41 }
static Double_t Tp(Double_t *t, Double_t *par)
#define z
Trk::Surface & surface()
Element Surface.
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
virtual const Amg::Vector3D & globalPosition() const override final
Interface method to get the global Position.
const std::pair< IdentifierHash, IdentifierHash > & elementIdList() const
return the pair of Ids of the element by reference
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
void setSpacePoint(DetectorIDHashType idHash, const Eigen::Matrix< float, 3, 1 > &globPos, float cov_r, float cov_z, std::vector< const xAOD::UncalibratedMeasurement * > &&measurementIndexes)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Affine3d Transform3D

◆ convertTrkToXaodStripSpacePoint()

StatusCode TrackingUtilities::convertTrkToXaodStripSpacePoint ( const InDet::SCT_SpacePoint & trkSpacePoint,
const Amg::Vector3D & vertex,
xAOD::SpacePoint & xaodSpacePoint )

Definition at line 43 of file SpacePointConversionUtilities.cxx.

46 {
47 std::pair<unsigned int, unsigned int> idHashes = trkSpacePoint.elementIdList();
48 const auto& globPos = trkSpacePoint.globalPosition();
49
50 const InDet::SiCluster *c0 = static_cast<const InDet::SiCluster *>(trkSpacePoint.clusterList().first);
51 const InDet::SiCluster *c1 = static_cast<const InDet::SiCluster *>(trkSpacePoint.clusterList().second);
52 const InDetDD::SiDetectorElement *d0 = c0->detectorElement();
53 const InDetDD::SiDetectorElement *d1 = c1->detectorElement();
54
55 Amg::Vector2D lc0 = c0->localPosition();
56 Amg::Vector2D lc1 = c1->localPosition();
57
58 std::pair<Amg::Vector3D, Amg::Vector3D> e0 =
59 (d0->endsOfStrip(InDetDD::SiLocalPosition(lc0.y(), lc0.x(), 0.)));
60 std::pair<Amg::Vector3D, Amg::Vector3D> e1 =
61 (d1->endsOfStrip(InDetDD::SiLocalPosition(lc1.y(), lc1.x(), 0.)));
62
63 auto stripCenter_1 = 0.5 * (e0.first + e0.second);
64 auto stripDir_1 = e0.first - e0.second;
65 auto trajDir_1 = 2. * ( stripCenter_1 - vertex);
66
67 auto stripCenter_2 = 0.5 * (e1.first + e1.second);
68 auto stripDir_2 = e1.first - e1.second;
69
70 float topHalfStripLength = 0.5 * stripDir_1.norm();
71 Eigen::Matrix<double, 3, 1> topStripDirection = - stripDir_1 / (2. * topHalfStripLength);
72 Eigen::Matrix<double, 3, 1> topStripCenter = 0.5 * trajDir_1;
73 float bottomHalfStripLength = 0.5 * stripDir_2.norm();
74 Eigen::Matrix<double, 3, 1> bottomStripDirection = - stripDir_2 / (2. * bottomHalfStripLength);
75 Eigen::Matrix<double, 3, 1> stripCenterDistance = stripCenter_1 - stripCenter_2;
76
77 const Amg::MatrixX& v = trkSpacePoint.localCovariance();
78 float f22 = static_cast<float>( v(1,1) );
79
80 float covr = d0->isBarrel() ? .1 : 8.*f22;
81 float covz = d0->isBarrel() ? 8.*f22 : .1;
82
83 xaodSpacePoint.setSpacePoint({idHashes.first, idHashes.second},
84 globPos.cast<float>(),
85 covr,
86 covz,
87 {},
88 topHalfStripLength,
89 bottomHalfStripLength,
90 topStripDirection.cast<float>(),
91 bottomStripDirection.cast<float>(),
92 stripCenterDistance.cast<float>(),
93 topStripCenter.cast<float>());
94
95 return StatusCode::SUCCESS;
96 }
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
Eigen::Matrix< double, 2, 1 > Vector2D

◆ convertXaodToInDetCluster() [1/3]

StatusCode TrackingUtilities::convertXaodToInDetCluster ( const xAOD::HGTDCluster & xaodCluster,
const InDetDD::HGTD_DetectorElement & element,
::HGTD_Cluster *& indetCluster )

Definition at line 365 of file ClusterConversionUtilities.cxx.

367 {
368
369 const auto& locPos = xaodCluster.localPosition<3>();
370 Amg::Vector2D localPosition(locPos(0,0), locPos(1,0));
371 float time = xAOD::HGTDCluster::time(locPos);
372
373 InDetDD::SiLocalPosition centroid(localPosition);
374 const Identifier id = element.identifierOfPosition(centroid);
375
376 xAOD::ConstMatrixMap<3> local_covariance(xaodCluster.localCovariance<3>());
377 auto errorMatrix = Amg::MatrixX(2,2);
378 errorMatrix.setIdentity();
379 errorMatrix.fillSymmetric(0, 0, local_covariance(0, 0));
380 errorMatrix.fillSymmetric(1, 1, local_covariance(1, 1));
381 float time_resolution = std::sqrt(xAOD::HGTDCluster::timeCovariance(local_covariance));
382
383 double etaWidth = 1.3;
384 double phiWidth = 1.3;
385 int channelsPhi = 1;
386 int channelsEta = 1;
387 InDet::SiWidth width( Amg::Vector2D(channelsPhi, channelsEta), Amg::Vector2D(phiWidth, etaWidth) );
388 std::vector<Identifier> rdo_list;
389 rdo_list.reserve(xaodCluster.rdoList().size());
390 for (const Identifier::value_type rdo_id_value : xaodCluster.rdoList()) {
391 rdo_list.emplace_back(rdo_id_value);
392 }
393
394 indetCluster = new ::HGTD_Cluster(id,
395 localPosition,
396 std::move(rdo_list),
397 width,
398 &element,
399 std::move(errorMatrix),
400 time,
401 time_resolution,
402 std::vector<int>(xaodCluster.totList()));
403
404 return StatusCode::SUCCESS;
405 }
Identifier identifierOfPosition(const Amg::Vector2D &localPos) const
Full identifier of the cell for a given position: assumes a raw local position (no Lorentz shift).
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.
ConstMatrixMap< N > localCovariance() const
Returns the local covariance of the measurement.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
Eigen::Map< const MeasMatrix< N > > ConstMatrixMap

◆ convertXaodToInDetCluster() [2/3]

StatusCode TrackingUtilities::convertXaodToInDetCluster ( const xAOD::PixelCluster & xaodCluster,
const InDetDD::SiDetectorElement & element,
const PixelID & pixelID,
InDet::PixelCluster *& indetCluster )

Definition at line 148 of file ClusterConversionUtilities.cxx.

152 {
153 const InDetDD::PixelModuleDesign* design(dynamic_cast<const InDetDD::PixelModuleDesign*>(&element.design()));
154 if (design == nullptr) {
155 return StatusCode::FAILURE;
156 }
157
158 const auto& locPos = xaodCluster.localPosition<2>();
159 Amg::Vector2D localPosition(locPos(0,0), locPos(1,0));
160
161 InDetDD::SiLocalPosition centroid(localPosition);
162 const Identifier id = element.identifierOfPosition(centroid);
163
164 const auto& globalPos = xaodCluster.globalPosition();
165 Amg::Vector3D globalPosition(globalPos(0, 0), globalPos(1, 0), globalPos(2, 0));
166
167 auto errorMatrix = Amg::MatrixX(2,2);
168 errorMatrix.setIdentity();
169 errorMatrix.fillSymmetric(0, 0, xaodCluster.localCovariance<2>()(0, 0));
170 errorMatrix.fillSymmetric(1, 1, xaodCluster.localCovariance<2>()(1, 1));
171
172 int colmax = std::numeric_limits<int>::min();
173 int rowmax = std::numeric_limits<int>::min();
174 int colmin = std::numeric_limits<int>::max();
175 int rowmin = std::numeric_limits<int>::max();
176
177 float qRowMin = 0.f;
178 float qRowMax = 0.f;
179 float qColMin = 0.f;
180 float qColMax = 0.f;
181
183 rdo_list_cluster = xaodCluster.rdoList();
185 charge_list_cluster = xaodCluster.chargeList();
186 std::vector<Identifier> rdo_list_new;
187
188 if (rdo_list_cluster.size() == charge_list_cluster.size()) {
189 rdo_list_new.reserve(rdo_list_cluster.size());
190 for (std::size_t i(0); i<rdo_list_cluster.size(); ++i) {
191 Identifier this_rdo(rdo_list_cluster[i]);
192 rdo_list_new.push_back(this_rdo);
193 const float this_charge=charge_list_cluster[i];
194 const int row = pixelID.phi_index(this_rdo);
195 if (row > rowmax) {
196 rowmax = row;
197 qRowMax = this_charge;
198 } else if (row == rowmax) {
199 qRowMax += this_charge;
200 }
201
202 if (row < rowmin) {
203 rowmin = row;
204 qRowMin = this_charge;
205 } else if (row == rowmin) {
206 qRowMin += this_charge;
207 }
208
209 const int col = pixelID.eta_index(this_rdo);
210 if (col > colmax) {
211 colmax = col;
212 qColMax = this_charge;
213 } else if (col == colmax) {
214 qColMax += this_charge;
215 }
216
217 if (col < colmin) {
218 colmin = col;
219 qColMin = this_charge;
220 } else if (col == colmin) {
221 qColMin += this_charge;
222 }
223
224 }//loop on rdo list
225 } // check that rdo list has the same size of charge list
226
227 // Compute omega for charge interpolation correction (if required)
228 // Two pixels may have charge=0 (very rarely, hopefully)
229 float omegax = -1.f;
230 float omegay = -1.f;
231 if(qRowMin + qRowMax > 0) omegax = qRowMax/(qRowMin + qRowMax);
232 if(qColMin + qColMax > 0) omegay = qColMax/(qColMin + qColMax);
233
234 double etaWidth = design->widthFromColumnRange(colmin, colmax);
235 double phiWidth = design->widthFromRowRange(rowmin, rowmax);
236 InDet::SiWidth width( Amg::Vector2D(xaodCluster.channelsInPhi(), xaodCluster.channelsInEta()),
237 Amg::Vector2D(phiWidth,etaWidth) );
238 auto tot_list = xaodCluster.totList();
239 indetCluster = new InDet::PixelCluster(id,
240 localPosition,
241 globalPosition,
242 std::move(rdo_list_new),
243 xaodCluster.lvl1a(),
244 std::vector<int>(tot_list.begin(), tot_list.end()),
245 std::vector<float>(charge_list_cluster.begin(),charge_list_cluster.end()),
246 width,
247 &element,
248 std::move(errorMatrix),
249 omegax,
250 omegay,
251 false, 0, 0);
252
253 return StatusCode::SUCCESS;
254 }
Class used to describe the design of a module (diode segmentation and readout scheme).
int channelsInPhi() const
Returns the dimensions of the cluster in numbers of channels in phi (x) and eta (y) directions,...
int lvl1a() const
Return the LVL1 accept.
SG::ConstAccessor< SG::JaggedVecElt< int > >::element_type totList() const
Returns the list of ToT of the channels building the cluster.
int channelsInEta() const
Eigen::Matrix< double, 3, 1 > Vector3D

◆ convertXaodToInDetCluster() [3/3]

StatusCode TrackingUtilities::convertXaodToInDetCluster ( const xAOD::StripCluster & xaodCluster,
const InDetDD::SiDetectorElement & element,
const SCT_ID & stripID,
InDet::SCT_Cluster *& indetCluster,
double shift = 0. )

Definition at line 256 of file ClusterConversionUtilities.cxx.

261 {
262 bool isBarrel = element.isBarrel();
263 const InDetDD::SCT_ModuleSideDesign* design = nullptr;
264 if (not isBarrel) {
265 design = dynamic_cast<const InDetDD::StripStereoAnnulusDesign*>(&element.design());
266 } else {
267 design = dynamic_cast<const InDetDD::SCT_ModuleSideDesign*>(&element.design());
268 }
269
270 if (design == nullptr) {
271 return StatusCode::FAILURE;
272 }
273
274 const auto designShape = design->shape();
275
276
278 rdo_list_cluster = xaodCluster.rdoList();
279 Identifier id(rdo_list_cluster.front());
280
281 const auto& localPos = xaodCluster.localPosition<1>();
282
283 double pos_x = localPos(0, 0);
284 double pos_y = 0;
285 if (not isBarrel) {
286 const Identifier firstStripId(id);
287 int firstStrip = stripID.strip(firstStripId);
288 int stripRow = stripID.row(firstStripId);
289 int clusterSizeInStrips = xaodCluster.channelsInPhi();
290 auto clusterPosition = design->localPositionOfCluster(design->strip1Dim(firstStrip, stripRow), clusterSizeInStrips);
291 pos_x = clusterPosition.xPhi() + shift;
292 pos_y = clusterPosition.xEta();
293 }
294
295 Amg::Vector2D locpos = Amg::Vector2D( pos_x, pos_y );
296
297 // Most of the following is taken from what is done in ClusterMakerTool
298 // Need to make this computation instead of using the local pos
299 // with local pos instead some differences w.r.t. reference are observed
300 const auto& firstStrip = stripID.strip(Identifier(rdo_list_cluster.front()));
301 const auto& lastStrip = stripID.strip(Identifier(rdo_list_cluster.back()));
302 const auto& row = stripID.row(Identifier(rdo_list_cluster.front()));
303 const int firstStrip1D = design->strip1Dim (firstStrip, row );
304 const int lastStrip1D = design->strip1Dim( lastStrip, row );
305 const InDetDD::SiCellId cell1(firstStrip1D);
306 const InDetDD::SiCellId cell2(lastStrip1D);
307 const InDetDD::SiLocalPosition firstStripPos( element.rawLocalPositionOfCell(cell1 ));
308 const InDetDD::SiLocalPosition lastStripPos( element.rawLocalPositionOfCell(cell2) );
309 const InDetDD::SiLocalPosition centre( (firstStripPos+lastStripPos) * 0.5 );
310 const double clusterWidth = design->stripPitch() * ( lastStrip - firstStrip + 1 );
311
312 const std::pair<InDetDD::SiLocalPosition, InDetDD::SiLocalPosition> ends( design->endsOfStrip(centre) );
313 const double stripLength( std::abs(ends.first.xEta() - ends.second.xEta()) );
314
315 InDet::SiWidth width( Amg::Vector2D(xaodCluster.channelsInPhi(), 1),
316 Amg::Vector2D(clusterWidth, stripLength) );
317
318 const double col_x = width.colRow().x();
319 const double col_y = width.colRow().y();
320
321 double scale_factor = 1.;
322 if ( col_x == 1 )
323 scale_factor = 1.05;
324 else if ( col_x == 2 )
325 scale_factor = 0.27;
326
327 auto errorMatrix = Amg::MatrixX(2,2);
328 errorMatrix.setIdentity();
329 errorMatrix.fillSymmetric(0, 0, scale_factor * scale_factor * width.phiR() * width.phiR() * one_over_twelve);
330 errorMatrix.fillSymmetric(1, 1, width.z() * width.z() / col_y / col_y * one_over_twelve);
331
332 if( designShape == InDetDD::Trapezoid or
333 designShape == InDetDD::Annulus) {
334 // rotation for endcap SCT
335
336 // The following is being computed with the local position,
337 // without considering the lorentz shift
338 // So we remove it from the local position
339 Amg::Vector2D local(pos_x - shift, pos_y);
340 double sn = element.sinStereoLocal(local);
341 double sn2 = sn * sn;
342 double cs2 = 1. - sn2;
343 double w = element.phiPitch(local) / element.phiPitch();
344 double v0 = errorMatrix(0,0) * w * w;
345 double v1 = errorMatrix(1,1);
346 errorMatrix.fillSymmetric( 0, 0, cs2 * v0 + sn2 * v1 );
347 errorMatrix.fillSymmetric( 0, 1, sn * std::sqrt(cs2) * (v0 - v1) );
348 errorMatrix.fillSymmetric( 1, 1, sn2 * v0 + cs2 * v1 );
349 }
350 std::vector<Identifier> rdo_list_new;
351 for(Identifier::value_type rdo_id_value : rdo_list_cluster) {
352 rdo_list_new.emplace_back(rdo_id_value);
353 }
354
355 indetCluster = new InDet::SCT_Cluster(id,
356 locpos,
357 std::move(rdo_list_new),
358 width,
359 &element,
360 std::move(errorMatrix));
361
362 return StatusCode::SUCCESS;
363 }
virtual DetectorShape shape() const
Shape of element.
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
double sinStereoLocal(const Amg::Vector2D &localPos) const
Angle of strip in local frame with respect to the etaAxis.
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
int row(const Identifier &id) const
Definition SCT_ID.h:711
int strip(const Identifier &id) const
Definition SCT_ID.h:717
SG::ConstAccessor< SG::JaggedVecElt< Identifier::value_type > >::element_type rdoList() const
Returns 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.
SG::ConstAccessor< T, ALLOC > ConstAccessor
Definition AuxElement.h:570
virtual void shift(size_t pos, ptrdiff_t offs) override
Shift the elements of the container.