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