ATLAS Offline Software
Loading...
Searching...
No Matches
TriangleBounds.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6// TriangleBounds.cxx, (c) ATLAS Detector Software
8
9// Trk
11// Gaudi
12#include "GaudiKernel/MsgStream.h"
13// STD
14#include <iomanip>
15#include <iostream>
17
18// default constructor
22
23// rectangle constructor - float constructor
24Trk::TriangleBounds::TriangleBounds(const std::vector<std::pair<float, float>>& vertices)
26{
27 size_t ib = 0;
28 for (const std::pair<float, float>& p : vertices) {
29 m_boundValues[2 * ib] = p.first;
30 m_boundValues[2 * ib + 1] = p.second;
31 if (ib == 2)
32 break;
33 ++ib;
34 }
35}
36
37 // Inline Eigen in dbg builds.
39// rectangle constructor - double constructor
40Trk::TriangleBounds::TriangleBounds(const std::vector<std::pair<double, double>>& vertices)
42{
43 size_t ib = 0;
44 for (const std::pair<double, double>& p : vertices) {
45 m_boundValues[2 * ib] = p.first;
46 m_boundValues[2 * ib + 1] = p.second;
47 if (ib == 2)
48 break;
49 ++ib;
50 }
51}
52
53// constructor from three points
64
65bool
67{
68 // check the type first not to compare apples with oranges
69 const Trk::TriangleBounds* tribo = dynamic_cast<const Trk::TriangleBounds*>(&sbo);
70 if (!tribo)
71 return false;
72 return (m_boundValues == tribo->m_boundValues);
73}
74
75bool
77 double tol1,
78 double tol2) const
79{
80 std::pair<double, double> locB(m_boundValues[TriangleBounds::bv_x2] -
84 std::pair<double, double> locT(
87 std::pair<double, double> locV(
90
91 // special case :: third vertex ?
92 if (locT.first * locT.first + locT.second * locT.second < tol1 * tol1)
93 return true;
94
95 // special case : lies on base ?
96 double db = locB.first * locV.second - locB.second * locV.first;
97 if (std::abs(db) < tol1) {
98 double a =
99 (locB.first != 0) ? -locV.first / locB.first : -locV.second / locB.second;
100 return a > -tol2 && a - 1. < tol2;
101 }
102
103 double dn = locB.first * locT.second - locB.second * locT.first;
104
105 if (std::abs(dn) > std::abs(tol1)) {
106 double t = (locB.first * locV.second - locB.second * locV.first) / dn;
107 if (t > 0.)
108 return false;
109
110 double a = (locB.first != 0.)
111 ? (t * locT.first - locV.first) / locB.first
112 : (t * locT.second - locV.second) / locB.second;
113 if (a < -tol2 || a - 1. > tol2)
114 return false;
115 } else {
116 return false;
117 }
118 return true;
119}
120
121bool
123 const BoundaryCheck& bchk) const
124{
125 if (bchk.bcType == 0)
127 locpo, bchk.toleranceLoc1, bchk.toleranceLoc2);
128
129 // a fast FALSE
130 double fabsR = std::sqrt(locpo[Trk::locX] * locpo[Trk::locX] +
131 locpo[Trk::locY] * locpo[Trk::locY]);
132 double max_ell = bchk.lCovariance(0, 0) > bchk.lCovariance(1, 1)
133 ? bchk.lCovariance(0, 0)
134 : bchk.lCovariance(1, 1);
135 double limit = bchk.nSigmas * std::sqrt(max_ell);
136 double r_max = TriangleBounds::r();
137 if (fabsR > (r_max + limit))
138 return false;
139
140 // compute KDOP and axes for surface polygon
141 std::vector<KDOP> elementKDOP(3);
142 std::vector<Amg::Vector2D> elementP(3);
143 float theta =
144 (bchk.lCovariance(1, 0) != 0 &&
145 (bchk.lCovariance(1, 1) - bchk.lCovariance(0, 0)) != 0)
146 ? .5 * bchk.FastArcTan(2 * bchk.lCovariance(1, 0) /
147 (bchk.lCovariance(1, 1) - bchk.lCovariance(0, 0)))
148 : 0.;
149 sincosCache scResult = bchk.FastSinCos(theta);
150 AmgMatrix(2, 2) rotMatrix;
151 rotMatrix << scResult.cosC, scResult.sinC, -scResult.sinC, scResult.cosC;
152 AmgMatrix(2, 2) normal;
153 // cppcheck-suppress constStatement
154 normal << 0, -1, 1, 0;
155 // ellipse is always at (0,0), surface is moved to ellipse position and then
156 // rotated
160 elementP[0] = (rotMatrix * (p - locpo));
163 elementP[1] = (rotMatrix * (p - locpo));
166 elementP[2] = (rotMatrix * (p - locpo));
167 std::vector<Amg::Vector2D> axis = { normal * (elementP[1] - elementP[0]),
168 normal * (elementP[2] - elementP[1]),
169 normal * (elementP[2] - elementP[0]) };
170 bchk.ComputeKDOP(elementP, axis, elementKDOP);
171 // compute KDOP for error ellipse
172 std::vector<KDOP> errelipseKDOP(3);
173 bchk.ComputeKDOP(bchk.EllipseToPoly(3), axis, errelipseKDOP);
174 // check if KDOPs overlap and return result
175 return bchk.TestKDOPKDOP(elementKDOP, errelipseKDOP);
176}
177
178double
180{
181 const int Np = 3;
182
183 double X[3] = { m_boundValues[TriangleBounds::bv_x1],
186 double Y[3] = { m_boundValues[TriangleBounds::bv_y1],
189
190 double dm = 1.e+20;
191 double Ao = 0.;
192 bool in = true;
193
194 for (int i = 0; i != Np; ++i) {
195
196 int j = (i == Np-1 ? 0 : i+1);
197
198 double x = X[i] - pos[0];
199 double y = Y[i] - pos[1];
200 double dx = X[j] - X[i];
201 double dy = Y[j] - Y[i];
202 double A = x * dy - y * dx;
203 double S = -(x * dx + y * dy);
204
205 if (S <= 0.) {
206 double d = x * x + y * y;
207 if (d < dm)
208 dm = d;
209 } else {
210 double a = dx * dx + dy * dy;
211 if (S <= a) {
212 double d = (A * A) / a;
213 if (d < dm)
214 dm = d;
215 }
216 }
217 if (i && in && Ao * A < 0.)
218 in = false;
219 Ao = A;
220 }
221 if (in){
222 return -sqrt(dm);
223 }
224 return sqrt(dm);
225}
226
227// ostream operator overload
228MsgStream&
229Trk::TriangleBounds::dump(MsgStream& sl) const
230{
231 sl << std::setiosflags(std::ios::fixed);
232 sl << std::setprecision(7);
233 sl << "Trk::TriangleBounds: generating vertices (X, Y) " << '\n';
234 sl << "(" << m_boundValues[TriangleBounds::bv_x1] << " , " << m_boundValues[TriangleBounds::bv_y1] << ") " << '\n';
235 sl << "(" << m_boundValues[TriangleBounds::bv_x2] << " , " << m_boundValues[TriangleBounds::bv_y2] << ") " << '\n';
237 sl << std::setprecision(-1);
238 return sl;
239}
240
241std::ostream&
242Trk::TriangleBounds::dump(std::ostream& sl) const
243{
244 sl << std::setiosflags(std::ios::fixed);
245 sl << std::setprecision(7);
246 sl << "Trk::TriangleBounds: generating vertices (X, Y)";
247 sl << "(" << m_boundValues[TriangleBounds::bv_x1] << " , " << m_boundValues[TriangleBounds::bv_y1] << ") " << '\n';
248 sl << "(" << m_boundValues[TriangleBounds::bv_x2] << " , " << m_boundValues[TriangleBounds::bv_y2] << ") " << '\n';
250 sl << std::setprecision(-1);
251 return sl;
252}
#define AmgMatrix(rows, cols)
static Double_t a
The BoundaryCheck class allows to steer the way surface boundaries are used for inside/outside checks...
int nSigmas
allowed sigmas for chi2 boundary check
BoundaryCheckType bcType
std::vector< Amg::Vector2D > EllipseToPoly(int resolution=3) const
bool TestKDOPKDOP(const std::vector< KDOP > &a, const std::vector< KDOP > &b) const
void ComputeKDOP(const std::vector< Amg::Vector2D > &v, const std::vector< Amg::Vector2D > &KDOPAxes, std::vector< KDOP > &kdop) const
Each Bounds has a method inside, which checks if a LocalPosition is inside the bounds.
double toleranceLoc2
absolute tolerance in local 2 coordinate
double FastArcTan(double x) const
sincosCache FastSinCos(double x) const
double toleranceLoc1
absolute tolerance in local 1 coordinate
Abstract base class for surface bounds to be specified.
Bounds for a triangular, planar surface.
TriangleBounds()
Default Constructor - needed for persistency.
virtual double r() const override final
This method returns the maximal extension on the local plane, i.e.
virtual bool operator==(const SurfaceBounds &sbo) const override
Equality operator.
virtual bool inside(const Amg::Vector2D &locpo, double tol1=0., double tol2=0.) const override final
This method checks if the provided local coordinates are inside the surface bounds.
virtual MsgStream & dump(MsgStream &sl) const override
Output Method for MsgStream.
std::vector< TDD_real_t > m_boundValues
std::vector< std::pair< TDD_real_t, TDD_real_t > > vertices() const
This method returns the coordinates of vertices.
virtual double minDistance(const Amg::Vector2D &pos) const override final
Minimal distance to boundary ( > 0 if outside and <=0 if inside)
#define ATH_FLATTEN
Eigen::Matrix< double, 2, 1 > Vector2D
@ locY
local cartesian
Definition ParamDefs.h:38
@ x
Definition ParamDefs.h:55
@ locX
Definition ParamDefs.h:37
@ theta
Definition ParamDefs.h:66
@ y
Definition ParamDefs.h:56
hold the test vectors and ease the comparison