20 const std::array<double, eSize>&
values) noexcept(
false)
25 Eigen::Translation<double, 2>(
Vector2D(0, -
get(eAveragePhi)));
46 double m = std::tan(
phi);
48 double x1 = (O_x + O_y * m -
49 std::sqrt(-std::pow(O_x, 2) * std::pow(m, 2) +
50 2 * O_x * O_y * m - std::pow(O_y, 2) +
51 std::pow(m, 2) * std::pow(r, 2) + std::pow(r, 2))) /
53 double x2 = (O_x + O_y * m +
54 std::sqrt(-std::pow(O_x, 2) * std::pow(m, 2) +
55 2 * O_x * O_y * m - std::pow(O_y, 2) +
56 std::pow(m, 2) * std::pow(r, 2) + std::pow(r, 2))) /
70 circIx(m_moduleOrigin[eBoundLoc0], m_moduleOrigin[eBoundLoc1],
get(eMinR),
73 circIx(m_moduleOrigin[eBoundLoc0], m_moduleOrigin[eBoundLoc1],
get(eMaxR),
76 circIx(m_moduleOrigin[eBoundLoc0], m_moduleOrigin[eBoundLoc1],
get(eMinR),
102 unsigned int lseg)
const {
104 std::vector<Acts::Vector2D> rvertices;
111 std::vector<double> phisInner =
113 std::vector<double> phisOuter =
117 for (
unsigned int iseg = 0; iseg < phisInner.size() - 1; ++iseg) {
118 int addon = (iseg == phisInner.size() - 2) ? 1 : 0;
119 detail::VerticesHelper::createSegment<Vector2D, Transform2D>(
120 rvertices, {
get(eMinR),
get(eMinR)}, phisInner[iseg],
121 phisInner[iseg + 1], lseg, addon);
124 for (
unsigned int iseg = 0; iseg < phisOuter.size() - 1; ++iseg) {
125 int addon = (iseg == phisOuter.size() - 2) ? 1 : 0;
126 detail::VerticesHelper::createSegment<Vector2D, Transform2D>(
127 rvertices, {
get(eMaxR),
get(eMaxR)}, phisOuter[iseg],
128 phisOuter[iseg + 1], lseg, addon);
135 double tolPhi)
const {
142 if (phiLoc < (
get(eMinPhiRel) - tolPhi) ||
143 phiLoc > (
get(eMaxPhiRel) + tolPhi)) {
154 if (r_mod2 <
get(eMinR) *
get(eMinR) || r_mod2 >
get(eMaxR) *
get(eMaxR)) {
163 if (r_mod < (
get(eMinR) - tolR) || r_mod > (
get(eMaxR) + tolR)) {
173 if (bcheck.
type() == BoundaryCheck::Type::eAbsolute) {
179 if (inside(lposition, 0., 0.)) {
191 double dphi = m_phiAvg;
252 double cosDPhiPhiStrip =
std::cos(dphi - phi_strip);
253 double sinDPhiPhiStrip = std::sin(dphi - phi_strip);
255 double A = O_x * O_x + 2 * O_x * r_strip * cosDPhiPhiStrip + O_y * O_y -
256 2 * O_y * r_strip * sinDPhiPhiStrip + r_strip * r_strip;
257 double sqrtA = std::sqrt(A);
259 double B = cosDPhiPhiStrip;
260 double C = -sinDPhiPhiStrip;
261 Eigen::Matrix<double, 2, 2> jacobianStripPCToModulePC;
262 jacobianStripPCToModulePC(0, 0) = (B * O_x + C * O_y + r_strip) / sqrtA;
263 jacobianStripPCToModulePC(0, 1) =
264 r_strip * (B * O_y + O_x * sinDPhiPhiStrip) / sqrtA;
265 jacobianStripPCToModulePC(1, 0) = -(B * O_y - C * O_x) / A;
266 jacobianStripPCToModulePC(1, 1) =
267 r_strip * (B * O_x + C * O_y + r_strip) / A;
272 auto covModulePC = jacobianStripPCToModulePC * covStripPC *
273 jacobianStripPCToModulePC.transpose();
276 auto weightStripPC = covStripPC.inverse();
277 auto weightModulePC = covModulePC.inverse();
288 locpo_rotated, weightStripPC);
289 currentDist = squaredNorm(locpo_rotated - currentClosest, weightStripPC);
290 minDist = currentDist;
293 locpo_rotated, weightStripPC);
294 currentDist = squaredNorm(locpo_rotated - currentClosest, weightStripPC);
295 if (currentDist < minDist) {
296 minDist = currentDist;
302 locpo_rotated[eBoundLoc0] *
std::cos(locpo_rotated[eBoundLoc1]),
303 locpo_rotated[eBoundLoc0] * std::sin(locpo_rotated[eBoundLoc1]));
304 Vector2D locpoModulePC = stripXYToModulePC(locpoStripXY);
310 locpoModulePC, weightModulePC);
311 currentDist = squaredNorm(locpoModulePC - currentClosest, weightModulePC);
312 if (currentDist < minDist) {
313 minDist = currentDist;
317 locpoModulePC, weightModulePC);
318 currentDist = squaredNorm(locpoModulePC - currentClosest, weightModulePC);
319 if (currentDist < minDist) {
320 minDist = currentDist;
338 const Eigen::Matrix<double, 2, 2>& weight)
const {
342 auto f = (
n.transpose() * weight *
n).
value();
344 auto u = ((p - a).transpose() * weight *
n).
value() / f;
350 const Vector2D&
v,
const Eigen::Matrix<double, 2, 2>& weight)
const {
351 return (v.transpose() * weight *
v).
value();
355 return Eigen::Rotation2D<double>(m_phiAvg) * m_moduleOrigin;
360 sl << std::setiosflags(std::ios::fixed);
361 sl << std::setprecision(7);
362 sl <<
"Acts::AnnulusBounds: (innerRadius, outerRadius, minPhi, maxPhi) = ";
363 sl <<
"(" <<
get(eMinR) <<
", " <<
get(eMaxR) <<
", " <<
phiMin() <<
", "
364 << phiMax() <<
")" <<
'\n';
369 sl << std::setprecision(-1);