10 #include <tracking/trackFindingCDC/numerics/SinEqLine.h>
12 #include <tracking/trackFindingCDC/geometry/Line2D.h>
14 #include <tracking/trackFindingCDC/numerics/CovarianceMatrixUtil.h>
16 #include <tracking/trackFindingCDC/numerics/Median.h>
17 #include <tracking/trackFindingCDC/numerics/WithWeight.h>
18 #include <tracking/trackFindingCDC/numerics/ESign.h>
20 #include <framework/gearbox/Unit.h>
22 #include <gtest/gtest.h>
26 using namespace TrackFindingCDC;
29 TEST(TrackFindingCDCTest, numerics_sign)
31 EXPECT_EQ(ESign::c_Plus, sign(INFINITY));
32 EXPECT_EQ(ESign::c_Plus, sign(2));
33 EXPECT_EQ(ESign::c_Plus, sign(0.0));
34 EXPECT_EQ(ESign::c_Minus, sign(-0.0));
35 EXPECT_EQ(ESign::c_Minus, sign(-2));
36 EXPECT_EQ(ESign::c_Minus, sign(-INFINITY));
37 EXPECT_EQ(ESign::c_Invalid, sign(NAN));
53 TEST(TrackFindingCDCTest, numerics_SinEqLine_isIncreasing)
56 Vector2D lower(0.0, 1.0);
57 Vector2D upper(1.0, 2.0);
64 TEST(TrackFindingCDCTest, numerics_SinEqLine_getIPeriodFromIHalfPeriod)
68 EXPECT_EQ(-1, iPeriod);
72 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeRootInInterval_simple)
76 SinEqLine sinEqLine(0.0, 0.0);
78 double rootX = sinEqLine.computeRootInInterval(M_PI / 2, 3 * M_PI / 2);
79 double rootY = sinEqLine.map(rootX);
81 EXPECT_NEAR(M_PI, rootX, 10e-7);
82 EXPECT_NEAR(0.0, rootY, 10e-7);
88 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeRootInInterval_const)
92 SinEqLine sinEqLine(0.0, 1.0 / 2.0);
94 double rootX = sinEqLine.computeRootInInterval(M_PI / 2, 3 * M_PI / 2);
95 double rootY = sinEqLine.map(rootX);
97 EXPECT_NEAR(150.0 *
Unit::deg, rootX, 10e-7);
98 EXPECT_NEAR(0.0, rootY, 10e-7);
103 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeRootInInterval_complex)
109 line.moveAlongFirst(rootX);
111 SinEqLine sinEqLine(line);
113 double solvedRootX = sinEqLine.computeRootInInterval(M_PI / 2, 3 * M_PI / 2);
114 double solvedRootY = sinEqLine.map(rootX);
116 EXPECT_NEAR(rootX, solvedRootX, 10e-7);
117 EXPECT_NEAR(0.0, solvedRootY, 10e-7);
122 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeRootLargerThanExtemumInHalfPeriod_simple)
129 SinEqLine sinEqLine(line);
131 double solvedRootX = sinEqLine.computeRootLargerThanExtemumInHalfPeriod(-1);
132 double solvedRootY = sinEqLine.map(rootX);
134 EXPECT_NEAR(rootX, solvedRootX, 10e-7);
135 EXPECT_NEAR(0.0, solvedRootY, 10e-7);
140 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeRootLargerThanExtemumInHalfPeriod)
146 line.moveAlongFirst(rootX);
148 SinEqLine sinEqLine(line);
150 double solvedRootX = sinEqLine.computeRootLargerThanExtemumInHalfPeriod(0);
151 double solvedRootY = sinEqLine.map(rootX);
153 EXPECT_NEAR(rootX, solvedRootX, 10e-7);
154 EXPECT_NEAR(0.0, solvedRootY, 10e-7);
159 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeSmallestPositiveRoot)
165 line.moveAlongFirst(rootX);
167 SinEqLine sinEqLine(line);
169 double solvedRootX = sinEqLine.computeSmallestPositiveRoot();
170 double solvedRootY = sinEqLine.map(rootX);
172 EXPECT_NEAR(rootX, solvedRootX, 10e-7);
173 EXPECT_NEAR(0.0, solvedRootY, 10e-7);
179 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeSmallestPositiveRoot_largeSlope)
185 line.moveAlongFirst(rootX);
187 SinEqLine sinEqLine(line);
189 double solvedRootX = sinEqLine.computeSmallestPositiveRoot();
190 double solvedRootY = sinEqLine.map(rootX);
192 EXPECT_NEAR(rootX, solvedRootX, 10e-7);
193 EXPECT_NEAR(0.0, solvedRootY, 10e-7);
199 TEST(TrackFindingCDCTest, numerics_SinEqLine_computeRootForLargeSlope)
204 line.moveAlongFirst(rootX);
206 SinEqLine sinEqLine(line);
208 double solvedRootX = sinEqLine.computeRootForLargeSlope();
209 double solvedRootY = sinEqLine.map(rootX);
211 EXPECT_NEAR(rootX, solvedRootX, 10e-7);
212 EXPECT_NEAR(0.0, solvedRootY, 10e-7);
215 TEST(TrackFindingCDCTest, numerics_median)
217 std::vector<double> fourValues{0.0, 3.0, 5.0, 100};
218 EXPECT_EQ(4.0, median(std::move(fourValues)));
220 std::vector<double> threeValues{0.0, 3.0, 5.0, 100.0, 1000.0};
221 EXPECT_EQ(5.0, median(std::move(threeValues)));
223 std::vector<WithWeight<double>> weightedValues{{0.0, 0.2},
228 EXPECT_EQ(100.0, weightedMedian(std::move(weightedValues)));
231 TEST(TrackFindingCDCTest, covariance_simple_average)
234 const ParameterVector<1> par1{ -1};
235 const CovarianceMatrix<1> cov1{2};
237 const ParameterVector<1> par2{1};
238 const CovarianceMatrix<1> cov2{2};
240 ParameterVector<1> par{};
241 CovarianceMatrix<1> cov{};
244 EXPECT_NEAR(0, par[0], 1E-8);
245 EXPECT_NEAR(1, cov[0], 1E-8);
246 EXPECT_NEAR(1, chi2, 1E-8);
249 TEST(TrackFindingCDCTest, covariance_half_projection_average)
252 const JacobianMatrix<1, 1> ambi1{2};
253 const ParameterVector<1> par1{ -2};
254 const CovarianceMatrix<1> cov1{8};
256 const ParameterVector<1> par2{1};
257 const CovarianceMatrix<1> cov2{2};
259 ParameterVector<1> par{};
260 CovarianceMatrix<1> cov{};
263 EXPECT_NEAR(0, par[0], 1E-8);
264 EXPECT_NEAR(1, cov[0], 1E-8);
265 EXPECT_NEAR(1, chi2, 1E-8);
268 TEST(TrackFindingCDCTest, covariance_kalman_update_average)
272 const JacobianMatrix<1, 1> ambi1{2};
273 const ParameterVector<1> par1{ -2};
274 const CovarianceMatrix<1> cov1{8};
276 ParameterVector<1> par{1};
277 CovarianceMatrix<1> cov{2};
280 EXPECT_NEAR(0, par[0], 1E-8);
281 EXPECT_NEAR(1, cov[0], 1E-8);
282 EXPECT_NEAR(1, chi2, 1E-8);