10#include <tracking/trackFindingCDC/hough/axes/StandardAxes.h>
11#include <tracking/trackFindingCDC/hough/boxes/Box.h>
12#include <tracking/trackFindingCDC/topology/ILayer.h>
19 namespace TrackFindingCDC {
42 ILayer iCLayer = -1)
const
44 const std::array<DiscretePhi0, 2>& phi0Vec = houghBox.getBounds<
DiscretePhi0>();
45 const std::array<DiscreteCurvWithArcLength2DCache, 2>& curv =
47 const std::array<ContinuousTanL, 2>& tanL = houghBox.getBounds<
ContinuousTanL>();
49 float r2 = x * x + y * y;
51 std::array<float, 2> xRot;
52 xRot[0] = x * phi0Vec[0]->x() + y * phi0Vec[0]->y();
53 xRot[1] = x * phi0Vec[1]->x() + y * phi0Vec[1]->y();
55 std::array<float, 2> yRotPlusL;
56 yRotPlusL[0] = -x * phi0Vec[0]->y() + y * phi0Vec[0]->x() + l;
57 yRotPlusL[1] = -x * phi0Vec[1]->y() + y * phi0Vec[1]->x() + l;
63 std::array<float, 2> dydzRot;
64 dydzRot[0] = -dxdz * phi0Vec[0]->y() + dydz * phi0Vec[0]->x();
65 dydzRot[1] = -dxdz * phi0Vec[1]->y() + dydz * phi0Vec[1]->x();
68 if (onlyPositiveArm) {
70 if ((xRot[0] < 0) and (xRot[1] < 0))
return ESign::c_Invalid;
74 std::array<float, 2> s;
75 s[0] = curv[0]->getArcLength2D(iCLayer, (xRot[0] < 0) and (xRot[1] < 0));
76 s[1] = curv[1]->getArcLength2D(iCLayer, (xRot[0] < 0) and (xRot[1] < 0));
78 std::array<float, 2> r2TimesHalfCurv;
80 r2TimesHalfCurv[0] = r2 * (
static_cast<float>(*(curv[0])) / 2.0);
81 r2TimesHalfCurv[1] = r2 * (
static_cast<float>(*(curv[1])) / 2.0);
91 std::array<float, 4> z;
92 z[0b00] = s[0] *
static_cast<float>(tanL[0]);
93 z[0b01] = s[1] *
static_cast<float>(tanL[0]);
94 z[0b10] = s[0] *
static_cast<float>(tanL[1]);
95 z[0b11] = s[1] *
static_cast<float>(tanL[1]);
98 std::array<float, 8> dist;
99 dist[0b000] = r2TimesHalfCurv[0] - yRotPlusL[0] - dydzRot[0] * z[0b00];
100 dist[0b001] = r2TimesHalfCurv[0] - yRotPlusL[1] - dydzRot[1] * z[0b00];
101 dist[0b010] = r2TimesHalfCurv[1] - yRotPlusL[0] - dydzRot[0] * z[0b01];
102 dist[0b011] = r2TimesHalfCurv[1] - yRotPlusL[1] - dydzRot[1] * z[0b01];
104 dist[0b100] = r2TimesHalfCurv[0] - yRotPlusL[0] - dydzRot[0] * z[0b10];
105 dist[0b101] = r2TimesHalfCurv[0] - yRotPlusL[1] - dydzRot[1] * z[0b10];
106 dist[0b110] = r2TimesHalfCurv[1] - yRotPlusL[0] - dydzRot[0] * z[0b11];
107 dist[0b111] = r2TimesHalfCurv[1] - yRotPlusL[1] - dydzRot[1] * z[0b11];
The base class for all boxes.
Type to have values not based on discrete positions from an array.
Representation for a discrete position in an array of discrete positions.
Checker if a position is contained in a family of curves over phi0 and tan lambda.
ESign getDistanceSign(const HoughBox &houghBox, float x, float y, float l, float dxdz, float dydz, ILayer iCLayer=-1) const
Function that gives the sign of the distance from an observed drift circle to the sweeped object.
float m_curlCurv
Curler curvature - set to value greater zero to activate one arm exclusive finding.
InPhi0CurvTanLBox(float curlCurv)
Create a new box with the given curler curvature.
ESign
Enumeration for the distinct sign values of floating point variables.
static ESign common(ESign n1, ESign n2)
Check if two values have a common sign.
Abstract base class for different kinds of events.