File indexing completed on 2025-07-14 08:10:42
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Seeding/SeedFinderUtils.hpp"
0012
0013 #include "Acts/Utilities/HashedString.hpp"
0014
0015 namespace Acts {
0016
0017 template <typename external_spacepoint_t, typename callable_t>
0018 inline LinCircle transformCoordinates(Acts::SpacePointMutableData& mutableData,
0019 const external_spacepoint_t& sp,
0020 const external_spacepoint_t& spM,
0021 bool bottom,
0022 callable_t&& extractFunction) {
0023
0024
0025
0026
0027
0028 auto [xM, yM, zM, rM, varianceRM, varianceZM] = extractFunction(spM);
0029 auto [xSP, ySP, zSP, rSP, varianceRSP, varianceZSP] = extractFunction(sp);
0030
0031 float cosPhiM = xM / rM;
0032 float sinPhiM = yM / rM;
0033 float deltaX = xSP - xM;
0034 float deltaY = ySP - yM;
0035 float deltaZ = zSP - zM;
0036 float xNewFrame = deltaX * cosPhiM + deltaY * sinPhiM;
0037 float yNewFrame = deltaY * cosPhiM - deltaX * sinPhiM;
0038 float deltaR2 = (xNewFrame * xNewFrame + yNewFrame * yNewFrame);
0039 float iDeltaR2 = 1. / (deltaX * deltaX + deltaY * deltaY);
0040 float iDeltaR = std::sqrt(iDeltaR2);
0041 int bottomFactor = bottom ? -1 : 1;
0042 float cotTheta = deltaZ * iDeltaR * bottomFactor;
0043
0044
0045
0046
0047
0048 const float U = xNewFrame * iDeltaR2;
0049 const float V = yNewFrame * iDeltaR2;
0050
0051
0052 const float Er = ((varianceZM + varianceZSP) +
0053 (cotTheta * cotTheta) * (varianceRM + varianceRSP)) *
0054 iDeltaR2;
0055
0056 mutableData.setDeltaR(sp.index(), std::sqrt(deltaR2 + (deltaZ * deltaZ)));
0057 return LinCircle(cotTheta, iDeltaR, Er, U, V, xNewFrame, yNewFrame);
0058 }
0059
0060 template <typename external_spacepoint_t>
0061 inline void transformCoordinates(
0062 Acts::SpacePointMutableData& mutableData,
0063 const std::vector<const external_spacepoint_t*>& vec,
0064 const external_spacepoint_t& spM, bool bottom,
0065 std::vector<LinCircle>& linCircleVec) {
0066 const float xM = spM.x();
0067 const float yM = spM.y();
0068 const float zM = spM.z();
0069 const float rM = spM.radius();
0070 const float varianceRM = spM.varianceR();
0071 const float varianceZM = spM.varianceZ();
0072
0073
0074 linCircleVec.resize(vec.size());
0075
0076 float cosPhiM = xM / rM;
0077 float sinPhiM = yM / rM;
0078
0079 int bottomFactor = bottom ? -1 : 1;
0080
0081 for (std::size_t idx(0); idx < vec.size(); ++idx) {
0082 const external_spacepoint_t* sp = vec[idx];
0083
0084 const float xSP = sp->x();
0085 const float ySP = sp->y();
0086 const float zSP = sp->z();
0087 const float varianceRSP = sp->varianceR();
0088 const float varianceZSP = sp->varianceZ();
0089
0090 const float deltaX = xSP - xM;
0091 const float deltaY = ySP - yM;
0092 const float deltaZ = zSP - zM;
0093
0094
0095
0096
0097 const float xNewFrame = deltaX * cosPhiM + deltaY * sinPhiM;
0098 const float yNewFrame = deltaY * cosPhiM - deltaX * sinPhiM;
0099
0100 const float deltaR2 = (xNewFrame * xNewFrame + yNewFrame * yNewFrame);
0101 const float iDeltaR2 = 1. / deltaR2;
0102 const float iDeltaR = std::sqrt(iDeltaR2);
0103
0104
0105 const float cotTheta = deltaZ * iDeltaR * bottomFactor;
0106
0107
0108
0109
0110
0111
0112 const float U = xNewFrame * iDeltaR2;
0113 const float V = yNewFrame * iDeltaR2;
0114
0115 const float Er = ((varianceZM + varianceZSP) +
0116 (cotTheta * cotTheta) * (varianceRM + varianceRSP)) *
0117 iDeltaR2;
0118
0119
0120 linCircleVec[idx].cotTheta = cotTheta;
0121 linCircleVec[idx].iDeltaR = iDeltaR;
0122 linCircleVec[idx].Er = Er;
0123 linCircleVec[idx].U = U;
0124 linCircleVec[idx].V = V;
0125 linCircleVec[idx].x = xNewFrame;
0126 linCircleVec[idx].y = yNewFrame;
0127 mutableData.setDeltaR(sp->index(), std::sqrt(deltaR2 + (deltaZ * deltaZ)));
0128 }
0129 }
0130
0131 template <typename external_spacepoint_t>
0132 inline bool xyzCoordinateCheck(
0133 const Acts::SeedFinderConfig<external_spacepoint_t>& m_config,
0134 const external_spacepoint_t& sp, const double* spacepointPosition,
0135 double* outputCoordinates) {
0136
0137
0138
0139 using namespace Acts::HashedStringLiteral;
0140 const Acts::Vector3& topStripVector = sp.topStripVector();
0141 const Acts::Vector3& bottomStripVector = sp.bottomStripVector();
0142 const Acts::Vector3& stripCenterDistance = sp.stripCenterDistance();
0143
0144 const double xTopStripVector = topStripVector[0];
0145 const double yTopStripVector = topStripVector[1];
0146 const double zTopStripVector = topStripVector[2];
0147 const double xBottomStripVector = bottomStripVector[0];
0148 const double yBottomStripVector = bottomStripVector[1];
0149 const double zBottomStripVector = bottomStripVector[2];
0150
0151
0152 double d1[3] = {yTopStripVector * spacepointPosition[2] -
0153 zTopStripVector * spacepointPosition[1],
0154 zTopStripVector * spacepointPosition[0] -
0155 xTopStripVector * spacepointPosition[2],
0156 xTopStripVector * spacepointPosition[1] -
0157 yTopStripVector * spacepointPosition[0]};
0158
0159
0160 double bd1 = xBottomStripVector * d1[0] + yBottomStripVector * d1[1] +
0161 zBottomStripVector * d1[2];
0162
0163
0164
0165 double s1 = (stripCenterDistance[0] * d1[0] + stripCenterDistance[1] * d1[1] +
0166 stripCenterDistance[2] * d1[2]);
0167 if (std::abs(s1) > std::abs(bd1) * m_config.toleranceParam) {
0168 return false;
0169 }
0170
0171
0172 double d0[3] = {yBottomStripVector * spacepointPosition[2] -
0173 zBottomStripVector * spacepointPosition[1],
0174 zBottomStripVector * spacepointPosition[0] -
0175 xBottomStripVector * spacepointPosition[2],
0176 xBottomStripVector * spacepointPosition[1] -
0177 yBottomStripVector * spacepointPosition[0]};
0178
0179
0180
0181 double s0 = (stripCenterDistance[0] * d0[0] + stripCenterDistance[1] * d0[1] +
0182 stripCenterDistance[2] * d0[2]);
0183 if (std::abs(s0) > std::abs(bd1) * m_config.toleranceParam) {
0184 return false;
0185 }
0186
0187
0188
0189
0190 const Acts::Vector3& topStripCenterPosition = sp.topStripCenterPosition();
0191
0192
0193
0194 s0 = s0 / bd1;
0195 outputCoordinates[0] = topStripCenterPosition[0] + xTopStripVector * s0;
0196 outputCoordinates[1] = topStripCenterPosition[1] + yTopStripVector * s0;
0197 outputCoordinates[2] = topStripCenterPosition[2] + zTopStripVector * s0;
0198 return true;
0199 }
0200 }