forked from sPHENIX-Collaboration/acts
/
FreeParametersTests.cpp
147 lines (121 loc) · 4.97 KB
/
FreeParametersTests.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// This file is part of the Acts project.
//
// Copyright (C) 2019 CERN for the benefit of the Acts project
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#include <boost/test/unit_test.hpp>
#include "Acts/EventData/NeutralParameters.hpp"
#include "Acts/EventData/TrackParameters.hpp"
#include "Acts/Geometry/GeometryContext.hpp"
#include "Acts/Tests/CommonHelpers/FloatComparisons.hpp"
#include "Acts/Utilities/Definitions.hpp"
namespace Acts {
namespace Test {
/// @brief Unit test for free parameters
///
BOOST_AUTO_TEST_CASE(free_initialization) {
Vector3D pos(0., 1., 2.);
double t = 3.;
Vector3D dir(4., 5., 6.);
double qop = 7.;
FreeVector params;
params << pos.x(), pos.y(), pos.z(), t, dir.x(), dir.y(), dir.z(), qop;
std::optional<FreeSymMatrix> cov = std::nullopt;
// Test if the object can be created w/o covariance
FreeParameters fpwoCov(cov, params);
BOOST_TEST(!fpwoCov.covariance().has_value());
CHECK_CLOSE_ABS(fpwoCov.parameters(), params, 1e-6);
// Test if the object can be create with covariance
*cov << 1., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0., 0., 0., 0.,
0., 3., 0., 0., 0., 0., 0., 0., 0., 0., 4., 0., 0., 0., 0., 0., 0., 0.,
0., 5., 0., 0., 0., 0., 0., 0., 0., 0., 6., 0., 0., 0., 0., 0., 0., 0.,
0., 7., 0., 0., 0., 0., 0., 0., 0., 0., 8.;
std::optional<FreeSymMatrix> covCpy = *cov;
FreeParameters fp(covCpy, params);
CHECK_CLOSE_COVARIANCE(*fp.covariance(), *cov, 1e-6);
CHECK_CLOSE_ABS(fp.parameters(), params, 1e-6);
// Test == comparison
BOOST_TEST(fp == fp);
BOOST_TEST(fp != fpwoCov);
FreeParameters fpCopyConstr(fp);
BOOST_TEST(fpCopyConstr == fp);
covCpy = *cov;
FreeParameters fpMoveConstr(FreeParameters(covCpy, params));
BOOST_TEST(fpMoveConstr == fp);
// Test copy assignment
FreeParameters fpCopyAssignment = fp;
BOOST_TEST(fpCopyAssignment == fp);
// Test move assignment
covCpy = *cov;
FreeParameters fpMoveAssignment = FreeParameters(covCpy, params);
BOOST_TEST(fpMoveAssignment == fp);
/// Repeat constructing and assignment with neutral parameters
// Test if the object can be created w/o covariance
NeutralFreeParameters nfpwoCov(std::nullopt, params);
BOOST_TEST(!nfpwoCov.covariance().has_value());
CHECK_CLOSE_ABS(nfpwoCov.parameters(), params, 1e-6);
covCpy = *cov;
NeutralFreeParameters nfp(covCpy, params);
CHECK_CLOSE_COVARIANCE(*nfp.covariance(), *cov, 1e-6);
CHECK_CLOSE_ABS(nfp.parameters(), params, 1e-6);
NeutralFreeParameters nfpCopyConstr(nfp);
BOOST_TEST(nfpCopyConstr == nfp);
covCpy = *cov;
NeutralFreeParameters nfpMoveConstr(NeutralFreeParameters(covCpy, params));
BOOST_TEST(nfpMoveConstr == nfp);
// Test copy assignment
NeutralFreeParameters nfpCopyAssignment = nfp;
BOOST_TEST(nfpCopyAssignment == nfp);
// Test move assignment
covCpy = *cov;
NeutralFreeParameters nfpMoveAssignment =
NeutralFreeParameters(covCpy, params);
BOOST_TEST(nfpMoveAssignment == nfp);
/// Test getters/setters
// Test getter of single elements
CHECK_CLOSE_ABS(fp.get<0>(), pos.x(), 1e-6);
CHECK_CLOSE_ABS(fp.get<1>(), pos.y(), 1e-6);
CHECK_CLOSE_ABS(fp.get<2>(), pos.z(), 1e-6);
CHECK_CLOSE_ABS(fp.get<3>(), t, 1e-6);
CHECK_CLOSE_ABS(fp.get<4>(), dir.x(), 1e-6);
CHECK_CLOSE_ABS(fp.get<5>(), dir.y(), 1e-6);
CHECK_CLOSE_ABS(fp.get<6>(), dir.z(), 1e-6);
CHECK_CLOSE_ABS(fp.get<7>(), qop, 1e-6);
// Test getter of uncertainties
CHECK_CLOSE_ABS(fp.uncertainty<0>(), std::sqrt((*cov)(0, 0)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<1>(), std::sqrt((*cov)(1, 1)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<2>(), std::sqrt((*cov)(2, 2)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<3>(), std::sqrt((*cov)(3, 3)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<4>(), std::sqrt((*cov)(4, 4)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<5>(), std::sqrt((*cov)(5, 5)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<6>(), std::sqrt((*cov)(6, 6)), 1e-6);
CHECK_CLOSE_ABS(fp.uncertainty<7>(), std::sqrt((*cov)(7, 7)), 1e-6);
// Test getter of parts of the parameters by their meaning
CHECK_CLOSE_ABS(fp.position(), pos, 1e-6);
CHECK_CLOSE_ABS(fp.momentum(), dir / qop, 1e-6);
CHECK_CLOSE_ABS(fp.charge(), +1., 1e-6);
BOOST_TEST(nfp.charge() == 0.);
CHECK_CLOSE_ABS(fp.time(), t, 1e-6);
// Test setters
GeometryContext dummy;
fp.set<0>(dummy, 8.);
fp.set<1>(dummy, 9.);
fp.set<2>(dummy, 10.);
fp.set<3>(dummy, 11.);
fp.set<4>(dummy, 12.);
fp.set<5>(dummy, 13.);
fp.set<6>(dummy, 14.);
fp.set<7>(dummy, 15.);
CHECK_CLOSE_ABS(fp.get<0>(), 8., 1e-6);
CHECK_CLOSE_ABS(fp.get<1>(), 9., 1e-6);
CHECK_CLOSE_ABS(fp.get<2>(), 10., 1e-6);
CHECK_CLOSE_ABS(fp.get<3>(), 11., 1e-6);
CHECK_CLOSE_ABS(fp.get<4>(), 12., 1e-6);
CHECK_CLOSE_ABS(fp.get<5>(), 13., 1e-6);
CHECK_CLOSE_ABS(fp.get<6>(), 14., 1e-6);
CHECK_CLOSE_ABS(fp.get<7>(), 15., 1e-6);
}
} // namespace Test
} // namespace Acts