File indexing completed on 2023-10-25 09:40:07
0001 #include "DataFormats/TrackerRecHit2D/interface/VectorHit.h"
0002 #include "Geometry/CommonDetUnit/interface/StackGeomDet.h"
0003 #include "CLHEP/Units/PhysicalConstants.h"
0004
0005 VectorHit::VectorHit(const GeomDet& idet,
0006 const LocalPoint& posLower,
0007 const LocalVector& dir,
0008 const AlgebraicSymMatrix44& covMatrix,
0009 const float chi2,
0010 OmniClusterRef const& lower,
0011 OmniClusterRef const& upper,
0012 const float curvature,
0013 const float curvatureError,
0014 const float phi)
0015 : BaseTrackerRecHit(idet, trackerHitRTTI::vector),
0016 thePosition(posLower),
0017 theDirection(dir),
0018 theCovMatrix(covMatrix),
0019 theChi2(chi2),
0020 theLowerCluster(lower),
0021 theUpperCluster(upper),
0022 theCurvature(curvature),
0023 theCurvatureError(curvatureError),
0024 thePhi(phi) {}
0025
0026 VectorHit::VectorHit(const GeomDet& idet,
0027 const VectorHit2D& vh2Dzx,
0028 const VectorHit2D& vh2Dzy,
0029 OmniClusterRef const& lower,
0030 OmniClusterRef const& upper,
0031 const float curvature,
0032 const float curvatureError,
0033 const float phi)
0034 : BaseTrackerRecHit(idet, trackerHitRTTI::vector),
0035 thePosition(LocalPoint(vh2Dzx.localPosition().x(), vh2Dzy.localPosition().x(), 0.)),
0036 theDirection(LocalVector(vh2Dzx.localDirection().x(), vh2Dzy.localDirection().x(), 1.)),
0037 theLowerCluster(lower),
0038 theUpperCluster(upper),
0039 theCurvature(curvature),
0040 theCurvatureError(curvatureError),
0041 thePhi(phi) {
0042
0043 const AlgebraicSymMatrix22& covMatZX = vh2Dzx.covMatrix();
0044 const AlgebraicSymMatrix22& covMatZY = vh2Dzy.covMatrix();
0045
0046 theCovMatrix = AlgebraicSymMatrix44();
0047
0048 theCovMatrix[0][0] = covMatZX[0][0];
0049 theCovMatrix[1][1] = covMatZY[0][0];
0050 theCovMatrix[2][2] = covMatZX[1][1];
0051 theCovMatrix[3][3] = covMatZY[1][1];
0052 theCovMatrix[0][2] = covMatZX[0][1];
0053 theCovMatrix[1][3] = covMatZY[0][1];
0054
0055 theChi2 = vh2Dzx.chi2() + vh2Dzy.chi2();
0056 }
0057
0058 bool VectorHit::sharesInput(const TrackingRecHit* other, SharedInputType what) const {
0059 if (what == all && (geographicalId() != other->geographicalId()))
0060 return false;
0061
0062 if (!sameDetModule(*other))
0063 return false;
0064
0065 if (trackerHitRTTI::isVector(*other)) {
0066 const VectorHit* otherVh = static_cast<const VectorHit*>(other);
0067 return sharesClusters(*otherVh, what);
0068 }
0069
0070 if (what == all)
0071 return false;
0072
0073
0074 auto const& otherClus = reinterpret_cast<const BaseTrackerRecHit*>(other)->firstClusterRef();
0075 return (otherClus == lowerClusterRef()) || (otherClus == upperClusterRef());
0076 }
0077
0078 bool VectorHit::sharesClusters(VectorHit const& other, SharedInputType what) const {
0079 bool lower = this->lowerClusterRef() == other.lowerClusterRef();
0080 bool upper = this->upperClusterRef() == other.upperClusterRef();
0081
0082 return (what == TrackingRecHit::all) ? (lower && upper) : (upper || lower);
0083 }
0084
0085 void VectorHit::getKfComponents4D(KfComponentsHolder& holder) const {
0086 AlgebraicVector4& pars = holder.params<theDimension>();
0087 pars[0] = theDirection.x();
0088 pars[1] = theDirection.y();
0089 pars[2] = thePosition.x();
0090 pars[3] = thePosition.y();
0091
0092 holder.errors<theDimension>() = theCovMatrix;
0093
0094 ProjectMatrix<double, 5, theDimension>& pf = holder.projFunc<theDimension>();
0095 for (int i = 0; i < 4; ++i)
0096 pf.index[i] = i + 1;
0097
0098 holder.measuredParams<theDimension>() = AlgebraicVector4(&holder.tsosLocalParameters().At(1), theDimension);
0099 holder.measuredErrors<theDimension>() = holder.tsosLocalErrors().Sub<AlgebraicSymMatrix44>(1, 1);
0100 }
0101
0102 Global3DPoint VectorHit::lowerGlobalPos() const {
0103 const StackGeomDet* stackDet = static_cast<const StackGeomDet*>(det());
0104 const PixelGeomDetUnit* geomDetLower = static_cast<const PixelGeomDetUnit*>(stackDet->lowerDet());
0105 return phase2clusterGlobalPos(geomDetLower, lowerCluster());
0106 }
0107
0108 Global3DPoint VectorHit::upperGlobalPos() const {
0109 const StackGeomDet* stackDet = static_cast<const StackGeomDet*>(det());
0110 const PixelGeomDetUnit* geomDetUpper = static_cast<const PixelGeomDetUnit*>(stackDet->upperDet());
0111 return phase2clusterGlobalPos(geomDetUpper, upperCluster());
0112 }
0113
0114 Global3DPoint VectorHit::phase2clusterGlobalPos(const PixelGeomDetUnit* geomDet, ClusterRef cluster) {
0115 const PixelTopology* topo = &geomDet->specificTopology();
0116 float ix = cluster->center();
0117 float iy = cluster->column() + 0.5f;
0118 LocalPoint lp(topo->localX(ix), topo->localY(iy), 0);
0119 Global3DPoint gp = geomDet->surface().toGlobal(lp);
0120 return gp;
0121 }
0122
0123 GlobalError VectorHit::lowerGlobalPosErr() const {
0124 const StackGeomDet* stackDet = static_cast<const StackGeomDet*>(det());
0125 const PixelGeomDetUnit* geomDetLower = static_cast<const PixelGeomDetUnit*>(stackDet->lowerDet());
0126 return phase2clusterGlobalPosErr(geomDetLower);
0127 }
0128
0129 GlobalError VectorHit::upperGlobalPosErr() const {
0130 const StackGeomDet* stackDet = static_cast<const StackGeomDet*>(det());
0131 const PixelGeomDetUnit* geomDetUpper = static_cast<const PixelGeomDetUnit*>(stackDet->upperDet());
0132 return phase2clusterGlobalPosErr(geomDetUpper);
0133 }
0134
0135 GlobalError VectorHit::phase2clusterGlobalPosErr(const PixelGeomDetUnit* geomDet) {
0136 const PixelTopology* topo = &geomDet->specificTopology();
0137 float pitchX = topo->pitch().first;
0138 float pitchY = topo->pitch().second;
0139 constexpr float invTwelve = 1. / 12;
0140 LocalError le(pow(pitchX, 2) * invTwelve, 0, pow(pitchY, 2) * invTwelve);
0141 GlobalError ge(ErrorFrameTransformer().transform(le, geomDet->surface()));
0142 return ge;
0143 }
0144
0145 Global3DVector VectorHit::globalDirectionVH() const {
0146 Local3DVector theLocalDelta =
0147 LocalVector(theDirection.x() * theDirection.z(), theDirection.y() * theDirection.z(), theDirection.z());
0148 Global3DVector g = det()->surface().toGlobal(theLocalDelta);
0149 return g;
0150 }
0151
0152 Global3DVector VectorHit::globalDirection() const { return (det()->surface().toGlobal(localDirection())); }
0153
0154 float VectorHit::theta() const { return globalDirection().theta(); }
0155
0156 float VectorHit::transverseMomentum(float magField) const {
0157 return magField * (CLHEP::c_light * 1e-5F) / theCurvature;
0158
0159
0160 }
0161 float VectorHit::momentum(float magField) const { return transverseMomentum(magField) / (1. * sin(theta())); }
0162
0163 LocalError VectorHit::localPositionError() const {
0164 return LocalError(theCovMatrix[2][2], theCovMatrix[2][3], theCovMatrix[3][3]);
0165 }
0166
0167 LocalError VectorHit::localDirectionError() const {
0168 return LocalError(theCovMatrix[0][0], theCovMatrix[0][1], theCovMatrix[1][1]);
0169 }
0170
0171 const AlgebraicSymMatrix44& VectorHit::covMatrix() const { return theCovMatrix; }
0172
0173 std::ostream& operator<<(std::ostream& os, const VectorHit& vh) {
0174 os << " VectorHit create in the DetId#: " << vh.geographicalId() << "\n"
0175 << " Vectorhit local position : " << vh.localPosition() << "\n"
0176 << " Vectorhit local direction : " << vh.localDirection() << "\n"
0177 << " Vectorhit global direction : " << vh.globalDirection() << "\n"
0178 << " Lower cluster global position : " << vh.lowerGlobalPos() << "\n"
0179 << " Upper cluster global position : " << vh.upperGlobalPos();
0180
0181 return os;
0182 }
0183
0184
0185 std::vector<const TrackingRecHit*> VectorHit::recHits() const { return {}; }
0186
0187
0188 std::vector<TrackingRecHit*> VectorHit::recHits() { return {}; }