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