11 #include <tracking/trackFindingCDC/geometry/UncertainPerigeeCircle.h>
12 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
14 #include <gtest/gtest.h>
18 using namespace TrackFindingCDC;
20 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian_identity)
22 for (
double curvature : { -1.0, 0.0, 1.0}) {
23 PerigeeCircle circle(curvature, -M_PI / 2, 0.5);
25 PerigeeJacobian moveByZeroJacobian = circle.passiveMoveByJacobian(Vector2D(0.0, 0.0));
26 EXPECT_NEAR(1.0, moveByZeroJacobian(0, 0), 10e-7);
27 EXPECT_NEAR(0.0, moveByZeroJacobian(0, 1), 10e-7);
28 EXPECT_NEAR(0.0, moveByZeroJacobian(0, 2), 10e-7);
30 EXPECT_NEAR(0.0, moveByZeroJacobian(1, 0), 10e-7);
31 EXPECT_NEAR(1.0, moveByZeroJacobian(1, 1), 10e-7);
32 EXPECT_NEAR(0.0, moveByZeroJacobian(1, 2), 10e-7);
34 EXPECT_NEAR(0.0, moveByZeroJacobian(2, 0), 10e-7);
35 EXPECT_NEAR(0.0, moveByZeroJacobian(2, 1), 10e-7);
36 EXPECT_NEAR(1.0, moveByZeroJacobian(2, 2), 10e-7);
40 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian_roundtrip)
42 for (
double curvature : { -1.0, 0.0, 1.0}) {
43 PerigeeCircle circle(curvature, -M_PI / 2, 0.5);
44 Vector2D by(0.1, 1.0);
46 PerigeeJacobian moveByOneJacobian = circle.passiveMoveByJacobian(by);
48 circle.passiveMoveBy(by);
50 PerigeeJacobian moveOneBackJacobian = circle.passiveMoveByJacobian(-by);
52 PerigeeJacobian moveByZeroJacobian = moveByOneJacobian * moveOneBackJacobian;
54 EXPECT_NEAR(1.0, moveByZeroJacobian(0, 0), 10e-7);
55 EXPECT_NEAR(0.0, moveByZeroJacobian(0, 1), 10e-7);
56 EXPECT_NEAR(0.0, moveByZeroJacobian(0, 2), 10e-7);
58 EXPECT_NEAR(0.0, moveByZeroJacobian(1, 0), 10e-7);
59 EXPECT_NEAR(1.0, moveByZeroJacobian(1, 1), 10e-7);
60 EXPECT_NEAR(0.0, moveByZeroJacobian(1, 2), 10e-7);
62 EXPECT_NEAR(0.0, moveByZeroJacobian(2, 0), 10e-7);
63 EXPECT_NEAR(0.0, moveByZeroJacobian(2, 1), 10e-7);
64 EXPECT_NEAR(1.0, moveByZeroJacobian(2, 2), 10e-7);
67 PerigeeJacobian moveByZeroJacobian = moveOneBackJacobian * moveByOneJacobian;
69 EXPECT_NEAR(1.0, moveByZeroJacobian(0, 0), 10e-7);
70 EXPECT_NEAR(0.0, moveByZeroJacobian(0, 1), 10e-7);
71 EXPECT_NEAR(0.0, moveByZeroJacobian(0, 2), 10e-7);
73 EXPECT_NEAR(0.0, moveByZeroJacobian(1, 0), 10e-7);
74 EXPECT_NEAR(1.0, moveByZeroJacobian(1, 1), 10e-7);
75 EXPECT_NEAR(0.0, moveByZeroJacobian(1, 2), 10e-7);
77 EXPECT_NEAR(0.0, moveByZeroJacobian(2, 0), 10e-7);
78 EXPECT_NEAR(0.0, moveByZeroJacobian(2, 1), 10e-7);
79 EXPECT_NEAR(1.0, moveByZeroJacobian(2, 2), 10e-7);
84 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian)
86 PerigeeCircle circle(1.0, -M_PI / 2, 0);
88 PerigeeJacobian moveByOneJacobian = circle.passiveMoveByJacobian(Vector2D(-1.0, 0.0));
89 EXPECT_NEAR(1.0, moveByOneJacobian(0, 0), 10e-7);
90 EXPECT_NEAR(0.0, moveByOneJacobian(0, 1), 10e-7);
91 EXPECT_NEAR(0.0, moveByOneJacobian(0, 2), 10e-7);
93 EXPECT_NEAR(0.0, moveByOneJacobian(1, 0), 10e-7);
94 EXPECT_NEAR(1.0 / 2.0, moveByOneJacobian(1, 1), 10e-7);
95 EXPECT_NEAR(0.0, moveByOneJacobian(1, 2), 10e-7);
97 EXPECT_NEAR(0.0, moveByOneJacobian(2, 0), 10e-7);
98 EXPECT_NEAR(0.0, moveByOneJacobian(2, 1), 10e-7);
99 EXPECT_NEAR(1.0, moveByOneJacobian(2, 2), 10e-7);
101 PerigeeJacobian moveByTwoYJacobian = circle.passiveMoveByJacobian(Vector2D(0.0, -2.0));
104 double deltaParallel = 2;
110 double lambda = 1.0 / (5.0 + 3.0 * sqrt(5.0));
111 double mu = sqrt(5.0) / 10.0;
114 EXPECT_NEAR(1.0, moveByTwoYJacobian(0, 0), 10e-7);
115 EXPECT_NEAR(0.0, moveByTwoYJacobian(0, 1), 10e-7);
116 EXPECT_NEAR(0.0, moveByTwoYJacobian(0, 2), 10e-7);
118 EXPECT_NEAR(2.0 / 5.0, moveByTwoYJacobian(1, 0), 10e-7);
119 EXPECT_NEAR(1.0 / 5.0, moveByTwoYJacobian(1, 1), 10e-7);
120 EXPECT_NEAR(-2.0 / 5.0, moveByTwoYJacobian(1, 2), 10e-7);
122 EXPECT_NEAR(mu * zeta - A * lambda, moveByTwoYJacobian(2, 0), 10e-7);
123 EXPECT_NEAR(2.0 * mu * u * deltaParallel, moveByTwoYJacobian(2, 1), 10e-7);
124 EXPECT_NEAR(2.0 * mu * nu, moveByTwoYJacobian(2, 2), 10e-7);
127 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMovedCovarianceBy)
129 PerigeeCovariance perigeeVariance;
130 perigeeVariance(0, 0) = 1.0;
131 perigeeVariance(0, 1) = 0.0;
132 perigeeVariance(0, 2) = 0.0;
134 perigeeVariance(1, 0) = 0.0;
135 perigeeVariance(1, 1) = 0.0;
136 perigeeVariance(1, 2) = 0.0;
138 perigeeVariance(2, 0) = 0.0;
139 perigeeVariance(2, 1) = 0.0;
140 perigeeVariance(2, 2) = 0.0;
142 UncertainPerigeeCircle circle(1.0, -M_PI / 2, 0.0, PerigeeCovariance(perigeeVariance));
145 PerigeeCovariance noMoveVariance = circle.passiveMovedCovarianceBy(Vector2D(0.0, 0.0));
147 EXPECT_NEAR(1.0, noMoveVariance(0, 0), 10e-7);
148 EXPECT_NEAR(0.0, noMoveVariance(0, 1), 10e-7);
149 EXPECT_NEAR(0.0, noMoveVariance(0, 2), 10e-7);
151 EXPECT_NEAR(0.0, noMoveVariance(1, 0), 10e-7);
152 EXPECT_NEAR(0.0, noMoveVariance(1, 1), 10e-7);
153 EXPECT_NEAR(0.0, noMoveVariance(1, 2), 10e-7);
155 EXPECT_NEAR(0.0, noMoveVariance(2, 0), 10e-7);
156 EXPECT_NEAR(0.0, noMoveVariance(2, 1), 10e-7);
157 EXPECT_NEAR(0.0, noMoveVariance(2, 2), 10e-7);
161 PerigeeCovariance noChangeMoveVariance = circle.passiveMovedCovarianceBy(Vector2D(-1.0, 0.0));
163 EXPECT_NEAR(1.0, noChangeMoveVariance(0, 0), 10e-7);
164 EXPECT_NEAR(0.0, noChangeMoveVariance(0, 1), 10e-7);
165 EXPECT_NEAR(0.0, noChangeMoveVariance(0, 2), 10e-7);
167 EXPECT_NEAR(0.0, noChangeMoveVariance(1, 0), 10e-7);
168 EXPECT_NEAR(0.0, noChangeMoveVariance(1, 1), 10e-7);
169 EXPECT_NEAR(0.0, noChangeMoveVariance(1, 2), 10e-7);
171 EXPECT_NEAR(0.0, noChangeMoveVariance(2, 0), 10e-7);
172 EXPECT_NEAR(0.0, noChangeMoveVariance(2, 1), 10e-7);
173 EXPECT_NEAR(0.0, noChangeMoveVariance(2, 2), 10e-7);
177 PerigeeCovariance transformedVariance = circle.passiveMovedCovarianceBy(Vector2D(2.0, 0.0));
179 EXPECT_NEAR(1.0, transformedVariance(0, 0), 10e-7);
181 EXPECT_NEAR(2.0, transformedVariance(2, 0), 10e-7);
182 EXPECT_NEAR(2.0, transformedVariance(0, 2), 10e-7);
183 EXPECT_NEAR(4.0, transformedVariance(2, 2), 10e-7);
186 EXPECT_NEAR(0.0, transformedVariance(1, 1), 10e-7);
188 EXPECT_NEAR(0.0, transformedVariance(0, 1), 10e-7);
189 EXPECT_NEAR(0.0, transformedVariance(1, 0), 10e-7);
191 EXPECT_NEAR(0.0, transformedVariance(1, 2), 10e-7);
192 EXPECT_NEAR(0.0, transformedVariance(2, 1), 10e-7);
197 PerigeeCovariance transformedVariance = circle.passiveMovedCovarianceBy(Vector2D(2.5, 0.0));
199 EXPECT_NEAR(1, transformedVariance(0, 0), 10e-7);
201 EXPECT_NEAR(2, transformedVariance(2, 0), 10e-7);
202 EXPECT_NEAR(2, transformedVariance(0, 2), 10e-7);
203 EXPECT_NEAR(4, transformedVariance(2, 2), 10e-7);
206 EXPECT_NEAR(0, transformedVariance(1, 1), 10e-7);
208 EXPECT_NEAR(0, transformedVariance(0, 1), 10e-7);
209 EXPECT_NEAR(0, transformedVariance(1, 0), 10e-7);
211 EXPECT_NEAR(0, transformedVariance(1, 2), 10e-7);
212 EXPECT_NEAR(0, transformedVariance(2, 1), 10e-7);
216 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMove)
219 PerigeeCovariance perigeeVariance;
220 perigeeVariance(0, 0) = 1.0;
221 perigeeVariance(0, 1) = 0.3;
222 perigeeVariance(0, 2) = 0.5;
224 perigeeVariance(1, 0) = 0.3;
225 perigeeVariance(1, 1) = 0.7;
226 perigeeVariance(1, 2) = 0.6;
228 perigeeVariance(2, 0) = 0.5;
229 perigeeVariance(2, 1) = 0.6;
230 perigeeVariance(2, 2) = 1;
232 UncertainPerigeeCircle circle(1.0, -M_PI / 4, 1.0, PerigeeCovariance(perigeeVariance));
237 circle.passiveMoveBy(Vector2D(0.0, -1.0));
241 circle.passiveMoveBy(Vector2D(0.0, 1.0));
245 PerigeeCovariance twiceMovedVariance = circle.perigeeCovariance();
247 EXPECT_NEAR(perigeeVariance(0, 0), twiceMovedVariance(0, 0), 10e-7);
248 EXPECT_NEAR(perigeeVariance(0, 1), twiceMovedVariance(0, 1), 10e-7);
249 EXPECT_NEAR(perigeeVariance(0, 2), twiceMovedVariance(0, 2), 10e-7);
251 EXPECT_NEAR(perigeeVariance(1, 0), twiceMovedVariance(1, 0), 10e-7);
252 EXPECT_NEAR(perigeeVariance(1, 1), twiceMovedVariance(1, 1), 10e-7);
253 EXPECT_NEAR(perigeeVariance(1, 2), twiceMovedVariance(1, 2), 10e-7);
255 EXPECT_NEAR(perigeeVariance(2, 0), twiceMovedVariance(2, 0), 10e-7);
256 EXPECT_NEAR(perigeeVariance(2, 1), twiceMovedVariance(2, 1), 10e-7);
257 EXPECT_NEAR(perigeeVariance(2, 2), twiceMovedVariance(2, 2), 10e-7);