Belle II Software  release-05-01-25
UncertainPerigeeCircle.test.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost <oliver.frost@desy.de> *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <tracking/trackFindingCDC/geometry/UncertainPerigeeCircle.h>
12 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
13 
14 #include <gtest/gtest.h>
15 
16 
17 using namespace Belle2;
18 using namespace TrackFindingCDC;
19 
20 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian_identity)
21 {
22  for (double curvature : { -1.0, 0.0, 1.0}) {
23  PerigeeCircle circle(curvature, -M_PI / 2, 0.5);
24 
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);
29 
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);
33 
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);
37  }
38 }
39 
40 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian_roundtrip)
41 {
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);
45 
46  PerigeeJacobian moveByOneJacobian = circle.passiveMoveByJacobian(by);
47 
48  circle.passiveMoveBy(by);
49 
50  PerigeeJacobian moveOneBackJacobian = circle.passiveMoveByJacobian(-by);
51  {
52  PerigeeJacobian moveByZeroJacobian = moveByOneJacobian * moveOneBackJacobian;
53 
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);
57 
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);
61 
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);
65  }
66  {
67  PerigeeJacobian moveByZeroJacobian = moveOneBackJacobian * moveByOneJacobian;
68 
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);
72 
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);
76 
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);
80  }
81  }
82 }
83 
84 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMoveByJacobian)
85 {
86  PerigeeCircle circle(1.0, -M_PI / 2, 0);
87 
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);
92 
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);
96 
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);
100 
101  PerigeeJacobian moveByTwoYJacobian = circle.passiveMoveByJacobian(Vector2D(0.0, -2.0));
102 
103  // Hand caluclated intermediate quantities;
104  double deltaParallel = 2;
105  double A = 4;
106  double u = 1;
107 
108  double nu = 1;
109  // double xi = 1.0 / 5.0;
110  double lambda = 1.0 / (5.0 + 3.0 * sqrt(5.0));
111  double mu = sqrt(5.0) / 10.0;
112  double zeta = 4;
113 
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);
117 
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);
121 
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);
125 }
126 
127 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMovedCovarianceBy)
128 {
129  PerigeeCovariance perigeeVariance;
130  perigeeVariance(0, 0) = 1.0;
131  perigeeVariance(0, 1) = 0.0;
132  perigeeVariance(0, 2) = 0.0;
133 
134  perigeeVariance(1, 0) = 0.0;
135  perigeeVariance(1, 1) = 0.0;
136  perigeeVariance(1, 2) = 0.0;
137 
138  perigeeVariance(2, 0) = 0.0;
139  perigeeVariance(2, 1) = 0.0;
140  perigeeVariance(2, 2) = 0.0;
141 
142  UncertainPerigeeCircle circle(1.0, -M_PI / 2, 0.0, PerigeeCovariance(perigeeVariance));
143 
144  {
145  PerigeeCovariance noMoveVariance = circle.passiveMovedCovarianceBy(Vector2D(0.0, 0.0));
146 
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);
150 
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);
154 
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);
158  }
159 
160  {
161  PerigeeCovariance noChangeMoveVariance = circle.passiveMovedCovarianceBy(Vector2D(-1.0, 0.0));
162 
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);
166 
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);
170 
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);
174  }
175 
176  {
177  PerigeeCovariance transformedVariance = circle.passiveMovedCovarianceBy(Vector2D(2.0, 0.0));
178 
179  EXPECT_NEAR(1.0, transformedVariance(0, 0), 10e-7);
180 
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);
184 
185  // Variances in phi should vanish
186  EXPECT_NEAR(0.0, transformedVariance(1, 1), 10e-7);
187 
188  EXPECT_NEAR(0.0, transformedVariance(0, 1), 10e-7);
189  EXPECT_NEAR(0.0, transformedVariance(1, 0), 10e-7);
190 
191  EXPECT_NEAR(0.0, transformedVariance(1, 2), 10e-7);
192  EXPECT_NEAR(0.0, transformedVariance(2, 1), 10e-7);
193  }
194 
195  {
196  // Should be same as before
197  PerigeeCovariance transformedVariance = circle.passiveMovedCovarianceBy(Vector2D(2.5, 0.0));
198 
199  EXPECT_NEAR(1, transformedVariance(0, 0), 10e-7);
200 
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);
204 
205  // Variances in phi should vanish
206  EXPECT_NEAR(0, transformedVariance(1, 1), 10e-7);
207 
208  EXPECT_NEAR(0, transformedVariance(0, 1), 10e-7);
209  EXPECT_NEAR(0, transformedVariance(1, 0), 10e-7);
210 
211  EXPECT_NEAR(0, transformedVariance(1, 2), 10e-7);
212  EXPECT_NEAR(0, transformedVariance(2, 1), 10e-7);
213  }
214 }
215 
216 TEST(TrackFindingCDCTest, geometry_PerigeeCircle_passiveMove)
217 {
218 
219  PerigeeCovariance perigeeVariance;
220  perigeeVariance(0, 0) = 1.0;
221  perigeeVariance(0, 1) = 0.3;
222  perigeeVariance(0, 2) = 0.5;
223 
224  perigeeVariance(1, 0) = 0.3;
225  perigeeVariance(1, 1) = 0.7;
226  perigeeVariance(1, 2) = 0.6;
227 
228  perigeeVariance(2, 0) = 0.5;
229  perigeeVariance(2, 1) = 0.6;
230  perigeeVariance(2, 2) = 1;
231 
232  UncertainPerigeeCircle circle(1.0, -M_PI / 4, 1.0, PerigeeCovariance(perigeeVariance));
233 
234  // circle.perigeeCovariance().Print();
235 
236  // Test if the move commutes
237  circle.passiveMoveBy(Vector2D(0.0, -1.0));
238 
239  // circle.perigeeCovariance().Print();
240 
241  circle.passiveMoveBy(Vector2D(0.0, 1.0));
242 
243  // circle.perigeeCovariance().Print();
244 
245  PerigeeCovariance twiceMovedVariance = circle.perigeeCovariance();
246 
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);
250 
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);
254 
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);
258 }
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Definition: utilityFunctions.cc:18
prepareAsicCrosstalkSimDB.u
u
merged u1 and u2
Definition: prepareAsicCrosstalkSimDB.py:46