13 #include "GaudiKernel/MsgStream.h"
21 , m_referencePoint(nullptr)
22 , m_rotSymmetryAxis(nullptr)
28 , m_bounds(csf.m_bounds)
29 , m_referencePoint(nullptr)
30 , m_rotSymmetryAxis(nullptr)
37 , m_bounds(csf.m_bounds)
38 , m_referencePoint(nullptr)
39 , m_rotSymmetryAxis(nullptr)
48 , m_referencePoint(nullptr)
49 , m_rotSymmetryAxis(nullptr)
60 , m_referencePoint(nullptr)
61 , m_rotSymmetryAxis(nullptr)
66 std::shared_ptr<const Trk::ConeBounds> cbounds)
68 , m_bounds(std::move(cbounds))
69 , m_referencePoint(nullptr)
70 , m_rotSymmetryAxis(nullptr)
78 , m_referencePoint(nullptr)
79 , m_rotSymmetryAxis(nullptr)
88 m_referencePoint.store(
nullptr);
89 m_rotSymmetryAxis.store(
nullptr);
98 double l1,
double l2,
double phi,
double theta,
double qop,
100 return std::make_unique<ParametersT<5, Charged, ConeSurface>>(
109 return std::make_unique<ParametersT<5, Charged, ConeSurface>>(
117 double l1,
double l2,
double phi,
double theta,
double qop,
119 return std::make_unique<ParametersT<5, Neutral, ConeSurface>>(
129 return std::make_unique<ParametersT<5, Neutral, ConeSurface>>(
137 if (!m_referencePoint) {
143 m_referencePoint.set(std::make_unique<Amg::Vector3D>(
transform() * gp));
145 return (*m_referencePoint);
161 if (!m_rotSymmetryAxis) {
163 m_rotSymmetryAxis.set(std::make_unique<Amg::Vector3D>(
zAxis));
165 return (*m_rotSymmetryAxis);
179 mFrame.col(0) = measX;
180 mFrame.col(1) = measY;
181 mFrame.col(2) = measDepth;
193 double r = locpos[
Trk::locZ] * bounds().tanAlpha();
203 Amg::Vector3D loc3Dframe(inverseTransformMultHelper(glopos));
204 double r = loc3Dframe.z() * bounds().tanAlpha();
205 locpos =
Amg::Vector2D(
r * atan2(loc3Dframe.y(), loc3Dframe.x()), loc3Dframe.z());
209 double inttol = 0.01;
210 return ((loc3Dframe.perp() -
r) <= inttol);
224 double tan2Alpha = bounds().tanAlpha() * bounds().tanAlpha();
225 double A = tdir.x() * tdir.x() + tdir.y() * tdir.y() - tan2Alpha * tdir.z() * tdir.z();
226 double B = 2 * (tdir.x() * tpos1.x() + tdir.y() * tpos1.y() - tan2Alpha *
dir.z() * tpos1.z());
227 double C = tpos1.x() * tpos1.x() + tpos1.y() * tpos1.y() - tan2Alpha * tpos1.z() * tpos1.z();
249 if (
t1 *
t2 > 0. || !forceDir) {
283 return straightLineDistanceEstimate(
pos,
dir,
false);
296 double posLength = sqrt(dPos.dot(dPos));
298 return {1, 0.,
true, 0.};
299 double posProj = dPos.dot(
N);
300 double posProjAngle = acos(posProj / posLength);
301 double currDist = posLength *
sin(posProjAngle -
atan(bounds().tanAlpha()));
303 if (std::abs(currDist) < tol)
304 return {1, currDist,
true, 0.};
311 double tan2Alpha = bounds().tanAlpha() * bounds().tanAlpha();
312 double A = locFrameDir.x() * locFrameDir.x() + locFrameDir.y() * locFrameDir.y() -
313 tan2Alpha * locFrameDir.z() * locFrameDir.z();
314 double B = 2 * (locFrameDir.x() * locFramePos.x() + locFrameDir.y() * locFramePos.y() -
315 tan2Alpha * locFrameDir.z() * locFramePos.z());
316 double C = locFramePos.x() * locFramePos.x() + locFramePos.y() * locFramePos.y() -
317 tan2Alpha * locFramePos.z() * locFramePos.z();
325 std::optional<Amg::Vector2D>
p = std::nullopt;
326 if (std::abs(solns.
first) < std::abs(solns.
second)){
333 d2bound = bounds().minDistance(*
p);
339 double totDist = d2bound > 0. ? sqrt(d2bound * d2bound + currDist * currDist) : currDist;
343 return {0, totDist,
true, 0., 0.};
346 return {1, totDist,
true, solns.
first};
349 if (std::abs(solns.
first) < std::abs(solns.
second)){
350 return {2, totDist,
true, solns.
first, solns.
second};
352 return {2, totDist,
true, solns.
second, solns.
first};
355 return {0, totDist,
true, 0., 0.};
364 bool applyTransform = !(
transform().isApprox(Amg::Transform3D::Identity()));
366 double phi = posLocal.phi();
367 double sgn = posLocal.z() > 0. ? -1. : +1.;
372 double cAlpha = normalC.dot(
mom.unit());
373 return (cAlpha != 0.) ? std::abs(1. / cAlpha) : 1.;