Belle II Software  release-08-01-10
UncertainPerigeeCircle.test.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <tracking/trackFindingCDC/geometry/UncertainPerigeeCircle.h>
10 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
11 
12 #include <gtest/gtest.h>
13 
14 
15 using namespace Belle2;
16 using namespace TrackFindingCDC;
17 
18 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian_identity)
19 {
20  for (double curvature : { -1.0, 0.0, 1.0}) {
21  PerigeeCircle circle(curvature, -M_PI / 2, 0.5);
22 
23  PerigeeJacobian moveByZeroJacobian = circle.passiveMoveByJacobian(Vector2D(0.0, 0.0));
24  EXPECT_NEAR(1.0, moveByZeroJacobian(0, 0), 10e-7);
25  EXPECT_NEAR(0.0, moveByZeroJacobian(0, 1), 10e-7);
26  EXPECT_NEAR(0.0, moveByZeroJacobian(0, 2), 10e-7);
27 
28  EXPECT_NEAR(0.0, moveByZeroJacobian(1, 0), 10e-7);
29  EXPECT_NEAR(1.0, moveByZeroJacobian(1, 1), 10e-7);
30  EXPECT_NEAR(0.0, moveByZeroJacobian(1, 2), 10e-7);
31 
32  EXPECT_NEAR(0.0, moveByZeroJacobian(2, 0), 10e-7);
33  EXPECT_NEAR(0.0, moveByZeroJacobian(2, 1), 10e-7);
34  EXPECT_NEAR(1.0, moveByZeroJacobian(2, 2), 10e-7);
35  }
36 }
37 
38 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian_roundtrip)
39 {
40  for (double curvature : { -1.0, 0.0, 1.0}) {
41  PerigeeCircle circle(curvature, -M_PI / 2, 0.5);
42  Vector2D by(0.1, 1.0);
43 
44  PerigeeJacobian moveByOneJacobian = circle.passiveMoveByJacobian(by);
45 
46  circle.passiveMoveBy(by);
47 
48  PerigeeJacobian moveOneBackJacobian = circle.passiveMoveByJacobian(-by);
49  {
50  PerigeeJacobian moveByZeroJacobian = moveByOneJacobian * moveOneBackJacobian;
51 
52  EXPECT_NEAR(1.0, moveByZeroJacobian(0, 0), 10e-7);
53  EXPECT_NEAR(0.0, moveByZeroJacobian(0, 1), 10e-7);
54  EXPECT_NEAR(0.0, moveByZeroJacobian(0, 2), 10e-7);
55 
56  EXPECT_NEAR(0.0, moveByZeroJacobian(1, 0), 10e-7);
57  EXPECT_NEAR(1.0, moveByZeroJacobian(1, 1), 10e-7);
58  EXPECT_NEAR(0.0, moveByZeroJacobian(1, 2), 10e-7);
59 
60  EXPECT_NEAR(0.0, moveByZeroJacobian(2, 0), 10e-7);
61  EXPECT_NEAR(0.0, moveByZeroJacobian(2, 1), 10e-7);
62  EXPECT_NEAR(1.0, moveByZeroJacobian(2, 2), 10e-7);
63  }
64  {
65  PerigeeJacobian moveByZeroJacobian = moveOneBackJacobian * moveByOneJacobian;
66 
67  EXPECT_NEAR(1.0, moveByZeroJacobian(0, 0), 10e-7);
68  EXPECT_NEAR(0.0, moveByZeroJacobian(0, 1), 10e-7);
69  EXPECT_NEAR(0.0, moveByZeroJacobian(0, 2), 10e-7);
70 
71  EXPECT_NEAR(0.0, moveByZeroJacobian(1, 0), 10e-7);
72  EXPECT_NEAR(1.0, moveByZeroJacobian(1, 1), 10e-7);
73  EXPECT_NEAR(0.0, moveByZeroJacobian(1, 2), 10e-7);
74 
75  EXPECT_NEAR(0.0, moveByZeroJacobian(2, 0), 10e-7);
76  EXPECT_NEAR(0.0, moveByZeroJacobian(2, 1), 10e-7);
77  EXPECT_NEAR(1.0, moveByZeroJacobian(2, 2), 10e-7);
78  }
79  }
80 }
81 
82 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian)
83 {
84  PerigeeCircle circle(1.0, -M_PI / 2, 0);
85 
86  PerigeeJacobian moveByOneJacobian = circle.passiveMoveByJacobian(Vector2D(-1.0, 0.0));
87  EXPECT_NEAR(1.0, moveByOneJacobian(0, 0), 10e-7);
88  EXPECT_NEAR(0.0, moveByOneJacobian(0, 1), 10e-7);
89  EXPECT_NEAR(0.0, moveByOneJacobian(0, 2), 10e-7);
90 
91  EXPECT_NEAR(0.0, moveByOneJacobian(1, 0), 10e-7);
92  EXPECT_NEAR(1.0 / 2.0, moveByOneJacobian(1, 1), 10e-7);
93  EXPECT_NEAR(0.0, moveByOneJacobian(1, 2), 10e-7);
94 
95  EXPECT_NEAR(0.0, moveByOneJacobian(2, 0), 10e-7);
96  EXPECT_NEAR(0.0, moveByOneJacobian(2, 1), 10e-7);
97  EXPECT_NEAR(1.0, moveByOneJacobian(2, 2), 10e-7);
98 
99  PerigeeJacobian moveByTwoYJacobian = circle.passiveMoveByJacobian(Vector2D(0.0, -2.0));
100 
101  // Hand caluclated intermediate quantities;
102  double deltaParallel = 2;
103  double A = 4;
104  double u = 1;
105 
106  double nu = 1;
107  // double xi = 1.0 / 5.0;
108  double lambda = 1.0 / (5.0 + 3.0 * sqrt(5.0));
109  double mu = sqrt(5.0) / 10.0;
110  double zeta = 4;
111 
112  EXPECT_NEAR(1.0, moveByTwoYJacobian(0, 0), 10e-7);
113  EXPECT_NEAR(0.0, moveByTwoYJacobian(0, 1), 10e-7);
114  EXPECT_NEAR(0.0, moveByTwoYJacobian(0, 2), 10e-7);
115 
116  EXPECT_NEAR(2.0 / 5.0, moveByTwoYJacobian(1, 0), 10e-7);
117  EXPECT_NEAR(1.0 / 5.0, moveByTwoYJacobian(1, 1), 10e-7);
118  EXPECT_NEAR(-2.0 / 5.0, moveByTwoYJacobian(1, 2), 10e-7);
119 
120  EXPECT_NEAR(mu * zeta - A * lambda, moveByTwoYJacobian(2, 0), 10e-7);
121  EXPECT_NEAR(2.0 * mu * u * deltaParallel, moveByTwoYJacobian(2, 1), 10e-7);
122  EXPECT_NEAR(2.0 * mu * nu, moveByTwoYJacobian(2, 2), 10e-7);
123 }
124 
125 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMovedCovarianceBy)
126 {
127  PerigeeCovariance perigeeVariance;
128  perigeeVariance(0, 0) = 1.0;
129  perigeeVariance(0, 1) = 0.0;
130  perigeeVariance(0, 2) = 0.0;
131 
132  perigeeVariance(1, 0) = 0.0;
133  perigeeVariance(1, 1) = 0.0;
134  perigeeVariance(1, 2) = 0.0;
135 
136  perigeeVariance(2, 0) = 0.0;
137  perigeeVariance(2, 1) = 0.0;
138  perigeeVariance(2, 2) = 0.0;
139 
140  UncertainPerigeeCircle circle(1.0, -M_PI / 2, 0.0, PerigeeCovariance(perigeeVariance));
141 
142  {
143  PerigeeCovariance noMoveVariance = circle.passiveMovedCovarianceBy(Vector2D(0.0, 0.0));
144 
145  EXPECT_NEAR(1.0, noMoveVariance(0, 0), 10e-7);
146  EXPECT_NEAR(0.0, noMoveVariance(0, 1), 10e-7);
147  EXPECT_NEAR(0.0, noMoveVariance(0, 2), 10e-7);
148 
149  EXPECT_NEAR(0.0, noMoveVariance(1, 0), 10e-7);
150  EXPECT_NEAR(0.0, noMoveVariance(1, 1), 10e-7);
151  EXPECT_NEAR(0.0, noMoveVariance(1, 2), 10e-7);
152 
153  EXPECT_NEAR(0.0, noMoveVariance(2, 0), 10e-7);
154  EXPECT_NEAR(0.0, noMoveVariance(2, 1), 10e-7);
155  EXPECT_NEAR(0.0, noMoveVariance(2, 2), 10e-7);
156  }
157 
158  {
159  PerigeeCovariance noChangeMoveVariance = circle.passiveMovedCovarianceBy(Vector2D(-1.0, 0.0));
160 
161  EXPECT_NEAR(1.0, noChangeMoveVariance(0, 0), 10e-7);
162  EXPECT_NEAR(0.0, noChangeMoveVariance(0, 1), 10e-7);
163  EXPECT_NEAR(0.0, noChangeMoveVariance(0, 2), 10e-7);
164 
165  EXPECT_NEAR(0.0, noChangeMoveVariance(1, 0), 10e-7);
166  EXPECT_NEAR(0.0, noChangeMoveVariance(1, 1), 10e-7);
167  EXPECT_NEAR(0.0, noChangeMoveVariance(1, 2), 10e-7);
168 
169  EXPECT_NEAR(0.0, noChangeMoveVariance(2, 0), 10e-7);
170  EXPECT_NEAR(0.0, noChangeMoveVariance(2, 1), 10e-7);
171  EXPECT_NEAR(0.0, noChangeMoveVariance(2, 2), 10e-7);
172  }
173 
174  {
175  PerigeeCovariance transformedVariance = circle.passiveMovedCovarianceBy(Vector2D(2.0, 0.0));
176 
177  EXPECT_NEAR(1.0, transformedVariance(0, 0), 10e-7);
178 
179  EXPECT_NEAR(2.0, transformedVariance(2, 0), 10e-7);
180  EXPECT_NEAR(2.0, transformedVariance(0, 2), 10e-7);
181  EXPECT_NEAR(4.0, transformedVariance(2, 2), 10e-7);
182 
183  // Variances in phi should vanish
184  EXPECT_NEAR(0.0, transformedVariance(1, 1), 10e-7);
185 
186  EXPECT_NEAR(0.0, transformedVariance(0, 1), 10e-7);
187  EXPECT_NEAR(0.0, transformedVariance(1, 0), 10e-7);
188 
189  EXPECT_NEAR(0.0, transformedVariance(1, 2), 10e-7);
190  EXPECT_NEAR(0.0, transformedVariance(2, 1), 10e-7);
191  }
192 
193  {
194  // Should be same as before
195  PerigeeCovariance transformedVariance = circle.passiveMovedCovarianceBy(Vector2D(2.5, 0.0));
196 
197  EXPECT_NEAR(1, transformedVariance(0, 0), 10e-7);
198 
199  EXPECT_NEAR(2, transformedVariance(2, 0), 10e-7);
200  EXPECT_NEAR(2, transformedVariance(0, 2), 10e-7);
201  EXPECT_NEAR(4, transformedVariance(2, 2), 10e-7);
202 
203  // Variances in phi should vanish
204  EXPECT_NEAR(0, transformedVariance(1, 1), 10e-7);
205 
206  EXPECT_NEAR(0, transformedVariance(0, 1), 10e-7);
207  EXPECT_NEAR(0, transformedVariance(1, 0), 10e-7);
208 
209  EXPECT_NEAR(0, transformedVariance(1, 2), 10e-7);
210  EXPECT_NEAR(0, transformedVariance(2, 1), 10e-7);
211  }
212 }
213 
214 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMove)
215 {
216 
217  PerigeeCovariance perigeeVariance;
218  perigeeVariance(0, 0) = 1.0;
219  perigeeVariance(0, 1) = 0.3;
220  perigeeVariance(0, 2) = 0.5;
221 
222  perigeeVariance(1, 0) = 0.3;
223  perigeeVariance(1, 1) = 0.7;
224  perigeeVariance(1, 2) = 0.6;
225 
226  perigeeVariance(2, 0) = 0.5;
227  perigeeVariance(2, 1) = 0.6;
228  perigeeVariance(2, 2) = 1;
229 
230  UncertainPerigeeCircle circle(1.0, -M_PI / 4, 1.0, PerigeeCovariance(perigeeVariance));
231 
232  // circle.perigeeCovariance().Print();
233 
234  // Test if the move commutes
235  circle.passiveMoveBy(Vector2D(0.0, -1.0));
236 
237  // circle.perigeeCovariance().Print();
238 
239  circle.passiveMoveBy(Vector2D(0.0, 1.0));
240 
241  // circle.perigeeCovariance().Print();
242 
243  PerigeeCovariance twiceMovedVariance = circle.perigeeCovariance();
244 
245  EXPECT_NEAR(perigeeVariance(0, 0), twiceMovedVariance(0, 0), 10e-7);
246  EXPECT_NEAR(perigeeVariance(0, 1), twiceMovedVariance(0, 1), 10e-7);
247  EXPECT_NEAR(perigeeVariance(0, 2), twiceMovedVariance(0, 2), 10e-7);
248 
249  EXPECT_NEAR(perigeeVariance(1, 0), twiceMovedVariance(1, 0), 10e-7);
250  EXPECT_NEAR(perigeeVariance(1, 1), twiceMovedVariance(1, 1), 10e-7);
251  EXPECT_NEAR(perigeeVariance(1, 2), twiceMovedVariance(1, 2), 10e-7);
252 
253  EXPECT_NEAR(perigeeVariance(2, 0), twiceMovedVariance(2, 0), 10e-7);
254  EXPECT_NEAR(perigeeVariance(2, 1), twiceMovedVariance(2, 1), 10e-7);
255  EXPECT_NEAR(perigeeVariance(2, 2), twiceMovedVariance(2, 2), 10e-7);
256 }
Extension of the generalized circle also caching the perigee coordinates.
Definition: PerigeeCircle.h:36
A matrix implementation to be used as an interface typ through out the track finder.
Definition: PlainMatrix.h:40
Adds an uncertainty matrix to the circle in perigee parameterisation.
A two dimensional vector which is equipped with functions for correct handeling of orientation relat...
Definition: Vector2D.h:35
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.