PandaRoot
PndFtsMath.h
Go to the documentation of this file.
1 //
2 // Created by Bartosz Sobol on 12.07.2020.
3 //
4 
5 #pragma once
6 
7 #include <cmath>
8 
9 #include "PndFtsStraw.h"
10 #include "PndFtsHelpers.h"
11 
13 
14 inline float LineValue(const Line &line, const float arg) noexcept
15 {
16  return arg * line.fSlope + line.fIntercept;
17 }
18 
19 inline float CircleValue(const Circle &circle, const float arg) noexcept
20 {
21  const float val = std::sqrt(circle.fRadius * circle.fRadius - arg * arg);
22  return circle.fOrigin.fX > 0 ? circle.fOrigin.fX - val : circle.fOrigin.fX + val;
23 }
24 
25 inline Line PointsToLine(float abscissa1, float ordinate1, float abscissa2, float ordinate2) noexcept
26 {
27  // INFO ordinate = slope * abscissa + intercept // no need to handle zero denominator case
28  const float slope = (ordinate1 - ordinate2) / (abscissa1 - abscissa2);
29  const float intercept = ordinate1 - abscissa1 * slope;
30  return {slope, intercept};
31 }
32 
33 inline Line PointsToLine(const Point2D &point1, const Point2D &point2) noexcept
34 {
35  // INFO ordinate = slope * abscissa + intercept // no need to handle zero denominator case
36  return PointsToLine(point1.fAbscissa, point1.fOrdinate, point2.fAbscissa, point2.fOrdinate);
37 }
38 
39 inline Line XZStrawsToLine(const PndFtsStraw &straw1, const PndFtsStraw &straw2) noexcept
40 {
41  // INFO x = slope * z + intercept // no need to handle zero denominator case
42  return PointsToLine(straw1.fZ, straw1.fX, straw2.fZ, straw2.fX);
43 }
44 
45 inline Line XZPointsToLine(const XZPoint &point1, const XZPoint &point2) noexcept
46 {
47  // INFO x = slope * z + intercept // no need to handle zero denominator case
48  return PointsToLine(point1.fZ, point1.fX, point2.fZ, point2.fX);
49 }
50 
51 inline Line YZPointsToLine(const YZVirtualHit &point1, const YZVirtualHit &point2) noexcept
52 {
53  // INFO y = slope * z + intercept // no need to handle zero denominator case
54  return PointsToLine(point1.fZ, point1.fY, point2.fZ, point2.fY);
55 }
56 
57 inline float PointLineDistance(const Point2D &point, const Line &line) noexcept
58 {
59  // INFO y = slope * z + intercept
60  return std::fabs(point.fOrdinate - line.fSlope * point.fAbscissa - line.fIntercept) / std::sqrt(line.fSlope * line.fSlope + 1);
61 }
62 
63 inline float StrawXZLineDistance(const PndFtsStraw &straw, const Line &line) noexcept
64 {
65  // INFO x = slope * z + intercept
66  return std::fabs(straw.fX - line.fSlope * straw.fZ - line.fIntercept) / std::sqrt(line.fSlope * line.fSlope + 1);
67 }
68 
69 inline float LineYZPointDistance(const YZVirtualHit &point, const Line &line) noexcept
70 {
71  // INFO y = slope * z + intercept
72  return std::fabs(point.fY - line.fSlope * point.fZ - line.fIntercept) / std::sqrt(line.fSlope * line.fSlope + 1);
73 }
74 
75 inline XZPoint TangencyPoint(const float r, const XZPoint &s, const XZPoint &p, const float sign) noexcept
76 {
77  // INFO based on https://mathworld.wolfram.com/CircleTangentLine.html
78  const float distSq = (p.fZ - s.fZ) * (p.fZ - s.fZ) + (p.fX - s.fX) * (p.fX - s.fX);
79  const float distMinusRsq = std::sqrt(distSq - r * r);
80  const float x = s.fX + r * (r * (p.fX - s.fX) - sign * (p.fZ - s.fZ) * distMinusRsq) / distSq;
81  const float z = s.fZ + r * (r * (p.fZ - s.fZ) + sign * (p.fX - s.fX) * distMinusRsq) / distSq;
82  return {x, z};
83 }
84 
85 inline Circle LineStrawCircle(const Line &xzLine, const float zTangency, const PndFtsStraw &straw, const float isochrone = 0.) noexcept
86 {
87  // INFO Constructs circle tangent to straw and xz_line in point with Z = z_tangency
88  const float xTangency = LineValue(xzLine, zTangency);
89 
90  const Line tanOriLine{-1 / xzLine.fSlope, xTangency + zTangency / xzLine.fSlope};
91  const Line tanStrawLine = PointsToLine(zTangency, xTangency, straw.fZ, straw.fX + isochrone);
92 
93  const XZPoint tanStrawMid{0.5f * (xTangency + straw.fX + isochrone), 0.5f * (zTangency + straw.fZ)};
94 
95  const Line midOriLine{-1 / tanStrawLine.fSlope, tanStrawMid.fX + tanStrawMid.fZ / tanStrawLine.fSlope};
96 
97  const float originZ = (midOriLine.fIntercept - tanOriLine.fIntercept) / (tanOriLine.fSlope - midOriLine.fSlope);
98  const float originX = LineValue(midOriLine, originZ);
99 
100  const XZPoint origin{originX, originZ};
101  const float radius = std::sqrt(std::pow(zTangency - origin.fZ, 2.f) + std::pow(xTangency - origin.fX, 2.f));
102 
103  return {radius, origin};
104 }
105 
106 inline float StrawCircleDistance(const PndFtsStraw &straw, const Circle &circle) noexcept
107 {
108  const float strawOriDistSq = std::pow(straw.fX - circle.fOrigin.fX, 2.f) + std::pow(straw.fZ - circle.fOrigin.fZ, 2.f);
109  const float strawOriDist = std::sqrt(strawOriDistSq);
110 
111  return std::abs(circle.fRadius - strawOriDist);
112 }
113 
114 inline float XZCircleXCoord(const Circle &circle, const float zCoord) noexcept
115 {
116  const double radiusSq = std::pow(circle.fRadius, 2);
117  const double zDistSq = std::pow(zCoord - circle.fOrigin.fZ, 2);
118  return static_cast<float>(std::sqrt(std::abs(radiusSq - zDistSq)));
119 }
120 
121 } // namespace PndFtsTrackFinder::PndFtsMath
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:28
float StrawCircleDistance(const PndFtsStraw &straw, const Circle &circle) noexcept
Definition: PndFtsMath.h:106
Circle LineStrawCircle(const Line &xzLine, const float zTangency, const PndFtsStraw &straw, const float isochrone=0.) noexcept
Definition: PndFtsMath.h:85
float StrawXZLineDistance(const PndFtsStraw &straw, const Line &line) noexcept
Definition: PndFtsMath.h:63
float LineYZPointDistance(const YZVirtualHit &point, const Line &line) noexcept
Definition: PndFtsMath.h:69
Line PointsToLine(float abscissa1, float ordinate1, float abscissa2, float ordinate2) noexcept
Definition: PndFtsMath.h:25
float XZCircleXCoord(const Circle &circle, const float zCoord) noexcept
Definition: PndFtsMath.h:114
float PointLineDistance(const Point2D &point, const Line &line) noexcept
Definition: PndFtsMath.h:57
Line XZStrawsToLine(const PndFtsStraw &straw1, const PndFtsStraw &straw2) noexcept
Definition: PndFtsMath.h:39
float LineValue(const Line &line, const float arg) noexcept
Definition: PndFtsMath.h:14
XZPoint TangencyPoint(const float r, const XZPoint &s, const XZPoint &p, const float sign) noexcept
Definition: PndFtsMath.h:75
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:46
float CircleValue(const Circle &circle, const float arg) noexcept
Definition: PndFtsMath.h:19
Line YZPointsToLine(const YZVirtualHit &point1, const YZVirtualHit &point2) noexcept
Definition: PndFtsMath.h:51
float f
Definition: P4_F32vec4.h:20
int sign(T val)
Definition: PndCADef.h:49
float fZ
Coordinates of the straw in PANDA&#39;s coordinate system.
Definition: PndFtsStraw.h:21
Line XZPointsToLine(const XZPoint &point1, const XZPoint &point2) noexcept
Definition: PndFtsMath.h:45