File indexing completed on 2025-08-06 08:11:19
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/data/test_case.hpp>
0010 #include <boost/test/unit_test.hpp>
0011
0012 #include "Acts/Definitions/Algebra.hpp"
0013 #include "Acts/Definitions/TrackParametrization.hpp"
0014 #include "Acts/EventData/Measurement.hpp"
0015 #include "Acts/EventData/SourceLink.hpp"
0016 #include "Acts/EventData/detail/GenerateParameters.hpp"
0017 #include "Acts/EventData/detail/TestSourceLink.hpp"
0018 #include "Acts/Tests/CommonHelpers/FloatComparisons.hpp"
0019
0020 #include <algorithm>
0021 #include <array>
0022 #include <cmath>
0023 #include <limits>
0024 #include <random>
0025 #include <tuple>
0026 #include <utility>
0027 #include <variant>
0028 #include <vector>
0029
0030 using namespace Acts;
0031 using namespace Acts::detail::Test;
0032 using SourceLink = Acts::detail::Test::TestSourceLink;
0033 namespace bd = boost::unit_test::data;
0034
0035 namespace {
0036 constexpr BoundIndices boundIndices[] = {
0037 eBoundLoc0, eBoundLoc1, eBoundTime, eBoundPhi, eBoundTheta, eBoundQOverP,
0038 };
0039 constexpr FreeIndices freeIndices[] = {
0040 eFreePos0, eFreePos1, eFreePos2, eFreeTime,
0041 eFreeDir0, eFreeDir1, eFreeDir2, eFreeQOverP,
0042 };
0043 const TestSourceLink sourceOrig;
0044 const Acts::SourceLink source{sourceOrig};
0045
0046 std::default_random_engine rng(123);
0047 }
0048
0049
0050
0051
0052
0053 BOOST_AUTO_TEST_SUITE(EventDataMeasurement)
0054
0055 BOOST_DATA_TEST_CASE(FixedBoundOne, bd::make(boundIndices), index) {
0056 auto [params, cov] = generateParametersCovariance<ActsScalar, 1u>(rng);
0057 auto meas = makeMeasurement(source, params, cov, index);
0058
0059 BOOST_CHECK_EQUAL(meas.size(), 1);
0060 for (auto i : boundIndices) {
0061 if (i == index) {
0062 BOOST_CHECK(meas.contains(i));
0063 } else {
0064 BOOST_CHECK(!meas.contains(i));
0065 }
0066 }
0067 BOOST_CHECK_EQUAL(meas.parameters(), params);
0068 BOOST_CHECK_EQUAL(meas.covariance(), cov);
0069 BOOST_CHECK_EQUAL(meas.sourceLink().template get<TestSourceLink>(),
0070 sourceOrig);
0071 }
0072
0073 BOOST_AUTO_TEST_CASE(FixedBoundAll) {
0074 auto [params, cov] = generateBoundParametersCovariance(rng);
0075 auto meas = makeMeasurement(source, params, cov, eBoundLoc0, eBoundLoc1,
0076 eBoundPhi, eBoundTheta, eBoundQOverP, eBoundTime);
0077
0078 BOOST_CHECK_EQUAL(meas.size(), eBoundSize);
0079 for (auto i : boundIndices) {
0080 BOOST_CHECK(meas.contains(i));
0081 }
0082 BOOST_CHECK_EQUAL(meas.parameters(), params);
0083 BOOST_CHECK_EQUAL(meas.covariance(), cov);
0084 BOOST_CHECK_EQUAL(meas.sourceLink().get<TestSourceLink>(), sourceOrig);
0085 }
0086
0087 namespace {
0088
0089
0090
0091
0092 const std::vector<std::tuple<double, double, double>> kPhiDataset = {
0093
0094 {0.5, 0.75, -0.25},
0095
0096 {0.25, 2 * M_PI - 0.25, 0.5},
0097 {2 * M_PI - 0.125, 0.125, -0.25},
0098
0099 {0.25, -0.25, 0.5},
0100
0101 {2 * M_PI - 0.25, 2 * M_PI + 0.25, -0.5},
0102
0103 {-0.25, 0.25, -0.5},
0104
0105 {2 * M_PI + 0.25, 2 * M_PI - 0.25, 0.5},
0106 };
0107 }
0108
0109 BOOST_DATA_TEST_CASE(BoundResidualsPhi, bd::make(kPhiDataset), phiMea, phiRef,
0110 phiRes) {
0111 using MeasurementVector = Acts::ActsVector<1>;
0112 using MeasurementCovariance = Acts::ActsSquareMatrix<1>;
0113
0114
0115 MeasurementVector params = MeasurementVector::Zero();
0116 MeasurementCovariance cov = MeasurementCovariance::Zero();
0117 params[0] = phiMea;
0118 auto measurement = makeMeasurement(source, params, cov, eBoundPhi);
0119
0120 Acts::BoundVector reference = Acts::BoundVector::Zero();
0121 reference[eBoundPhi] = phiRef;
0122
0123
0124 auto res = measurement.residuals(reference);
0125 CHECK_CLOSE_ABS(res[0], phiRes, std::numeric_limits<ActsScalar>::epsilon());
0126 }
0127
0128 BOOST_DATA_TEST_CASE(FixedFreeOne, bd::make(freeIndices), index) {
0129 auto [params, cov] = generateParametersCovariance<ActsScalar, 1u>(rng);
0130 auto meas = makeMeasurement(source, params, cov, index);
0131
0132 BOOST_CHECK_EQUAL(meas.size(), 1);
0133 for (auto i : freeIndices) {
0134 if (i == index) {
0135 BOOST_CHECK(meas.contains(i));
0136 } else {
0137 BOOST_CHECK(!meas.contains(i));
0138 }
0139 }
0140 BOOST_CHECK_EQUAL(meas.parameters(), params);
0141 BOOST_CHECK_EQUAL(meas.covariance(), cov);
0142 BOOST_CHECK_EQUAL(meas.sourceLink().template get<TestSourceLink>(),
0143 sourceOrig);
0144
0145
0146 constexpr auto tol = std::numeric_limits<ActsScalar>::epsilon();
0147 auto [ref, refCov] = generateFreeParametersCovariance(rng);
0148 auto res = meas.residuals(ref);
0149 CHECK_CLOSE_ABS(res[0], params[0] - ref[index], tol);
0150 }
0151
0152 BOOST_AUTO_TEST_CASE(FixedFreeAll) {
0153 auto [params, cov] = generateFreeParametersCovariance(rng);
0154 auto meas =
0155 makeMeasurement(source, params, cov, eFreePos0, eFreePos1, eFreePos2,
0156 eFreeTime, eFreeDir0, eFreeDir1, eFreeDir2, eFreeQOverP);
0157
0158 BOOST_CHECK_EQUAL(meas.size(), eFreeSize);
0159 for (auto i : freeIndices) {
0160 BOOST_CHECK(meas.contains(i));
0161 }
0162 BOOST_CHECK_EQUAL(meas.parameters(), params);
0163 BOOST_CHECK_EQUAL(meas.covariance(), cov);
0164 BOOST_CHECK_EQUAL(meas.sourceLink().get<TestSourceLink>(), sourceOrig);
0165
0166
0167 constexpr auto tol = std::numeric_limits<ActsScalar>::epsilon();
0168 auto [ref, refCov] = generateFreeParametersCovariance(rng);
0169 CHECK_CLOSE_ABS(meas.residuals(ref), params - ref, tol);
0170 }
0171
0172 BOOST_AUTO_TEST_CASE(VariantBound) {
0173
0174 auto [par1, cov1] = generateParametersCovariance<ActsScalar, 1u>(rng);
0175 BoundVariantMeasurement meas =
0176 makeMeasurement(source, par1, cov1, eBoundTheta);
0177 std::visit(
0178 [](const auto& m) {
0179 BOOST_CHECK_EQUAL(m.size(), 1);
0180 BOOST_CHECK(!m.contains(eBoundLoc0));
0181 BOOST_CHECK(!m.contains(eBoundLoc1));
0182 BOOST_CHECK(!m.contains(eBoundTime));
0183 BOOST_CHECK(!m.contains(eBoundPhi));
0184 BOOST_CHECK(m.contains(eBoundTheta));
0185 BOOST_CHECK(!m.contains(eBoundQOverP));
0186 },
0187 meas);
0188
0189
0190 auto [parN, covN] = generateBoundParametersCovariance(rng);
0191 meas = makeMeasurement(source, parN, covN, eBoundLoc0, eBoundLoc1, eBoundPhi,
0192 eBoundTheta, eBoundQOverP, eBoundTime);
0193 std::visit(
0194 [](const auto& m) {
0195 BOOST_CHECK_EQUAL(m.size(), eBoundSize);
0196 BOOST_CHECK(m.contains(eBoundLoc0));
0197 BOOST_CHECK(m.contains(eBoundLoc1));
0198 BOOST_CHECK(m.contains(eBoundTime));
0199 BOOST_CHECK(m.contains(eBoundPhi));
0200 BOOST_CHECK(m.contains(eBoundTheta));
0201 BOOST_CHECK(m.contains(eBoundQOverP));
0202 },
0203 meas);
0204 }
0205
0206 BOOST_AUTO_TEST_CASE(VariantFree) {
0207
0208 auto [par2, cov2] = generateParametersCovariance<ActsScalar, 2u>(rng);
0209 FreeVariantMeasurement meas =
0210 makeMeasurement(source, par2, cov2, eFreePos2, eFreeTime);
0211 std::visit(
0212 [](const auto& m) {
0213 BOOST_CHECK_EQUAL(m.size(), 2);
0214 BOOST_CHECK(!m.contains(eFreePos0));
0215 BOOST_CHECK(!m.contains(eFreePos1));
0216 BOOST_CHECK(m.contains(eFreePos2));
0217 BOOST_CHECK(m.contains(eFreeTime));
0218 BOOST_CHECK(!m.contains(eFreeDir0));
0219 BOOST_CHECK(!m.contains(eFreeDir1));
0220 BOOST_CHECK(!m.contains(eFreeDir2));
0221 BOOST_CHECK(!m.contains(eFreeQOverP));
0222 },
0223 meas);
0224
0225
0226 auto [parN, covN] = generateFreeParametersCovariance(rng);
0227 meas =
0228 makeMeasurement(source, parN, covN, eFreePos0, eFreePos1, eFreePos2,
0229 eFreeTime, eFreeDir0, eFreeDir1, eFreeDir2, eFreeQOverP);
0230 std::visit(
0231 [](const auto& m) {
0232 BOOST_CHECK_EQUAL(m.size(), eFreeSize);
0233 BOOST_CHECK(m.contains(eFreePos0));
0234 BOOST_CHECK(m.contains(eFreePos1));
0235 BOOST_CHECK(m.contains(eFreePos2));
0236 BOOST_CHECK(m.contains(eFreeTime));
0237 BOOST_CHECK(m.contains(eFreeDir0));
0238 BOOST_CHECK(m.contains(eFreeDir1));
0239 BOOST_CHECK(m.contains(eFreeDir2));
0240 BOOST_CHECK(m.contains(eFreeQOverP));
0241 },
0242 meas);
0243 }
0244
0245 BOOST_AUTO_TEST_SUITE_END()