File indexing completed on 2025-07-12 07:53:38
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/data/test_case.hpp>
0010 #include <boost/test/unit_test.hpp>
0011 #include <boost/test/unit_test_suite.hpp>
0012
0013 #include "Acts/Definitions/TrackParametrization.hpp"
0014 #include "Acts/Definitions/Units.hpp"
0015 #include "Acts/EventData/SourceLink.hpp"
0016 #include "Acts/EventData/TrackStatePropMask.hpp"
0017 #include "Acts/EventData/detail/MultiTrajectoryTestsCommon.hpp"
0018 #include "Acts/Geometry/GeometryContext.hpp"
0019 #include "Acts/Plugins/Podio/PodioTrackStateContainer.hpp"
0020 #include "Acts/Plugins/Podio/PodioUtil.hpp"
0021 #include "Acts/Surfaces/PlaneSurface.hpp"
0022 #include "Acts/Surfaces/RectangleBounds.hpp"
0023 #include "ActsPodioEdm/BoundParametersCollection.h"
0024 #include "ActsPodioEdm/JacobianCollection.h"
0025 #include "ActsPodioEdm/TrackStateCollection.h"
0026
0027 #include <filesystem>
0028
0029 #include <podio/UserDataCollection.h>
0030
0031 namespace {
0032
0033 using namespace Acts;
0034 using namespace Acts::UnitLiterals;
0035 using namespace Acts::detail::Test;
0036 namespace bd = boost::unit_test::data;
0037
0038 std::default_random_engine rng(31415);
0039
0040 class NullHelper : public PodioUtil::ConversionHelper {
0041 public:
0042 std::optional<PodioUtil::Identifier> surfaceToIdentifier(
0043 const Surface& ) const override {
0044 return {};
0045 }
0046 const Surface* identifierToSurface(
0047 PodioUtil::Identifier ) const override {
0048 return nullptr;
0049 }
0050
0051 SourceLink identifierToSourceLink(
0052 PodioUtil::Identifier ) const override {
0053 return SourceLink{0};
0054 }
0055
0056 PodioUtil::Identifier sourceLinkToIdentifier(
0057 const SourceLink& ) override {
0058 return 0;
0059 }
0060 };
0061
0062 struct MapHelper : public NullHelper {
0063 std::optional<PodioUtil::Identifier> surfaceToIdentifier(
0064 const Surface& surface) const override {
0065 for (auto&& [id, srf] : surfaces) {
0066 if (srf == &surface) {
0067 return id;
0068 }
0069 }
0070 return {};
0071 }
0072 const Surface* identifierToSurface(PodioUtil::Identifier id) const override {
0073 auto it = surfaces.find(id);
0074 if (it == surfaces.end()) {
0075 return nullptr;
0076 }
0077
0078 return it->second;
0079 }
0080
0081 PodioUtil::Identifier sourceLinkToIdentifier(const SourceLink& sl) override {
0082 sourceLinks.push_back(sl);
0083 return sourceLinks.size() - 1;
0084 }
0085
0086 SourceLink identifierToSourceLink(PodioUtil::Identifier id) const override {
0087 return sourceLinks.at(id);
0088 }
0089
0090 std::unordered_map<PodioUtil::Identifier, const Surface*> surfaces;
0091 std::vector<SourceLink> sourceLinks;
0092 };
0093
0094 struct Factory {
0095 using trajectory_t = MutablePodioTrackStateContainer;
0096 using const_trajectory_t = ConstPodioTrackStateContainer;
0097
0098 MapHelper m_helper;
0099
0100 MutablePodioTrackStateContainer create() {
0101 return MutablePodioTrackStateContainer{m_helper};
0102 }
0103 };
0104
0105 using CommonTests = MultiTrajectoryTestsCommon<Factory>;
0106
0107 }
0108
0109 BOOST_AUTO_TEST_SUITE(PodioTrackStateContainerTest)
0110
0111 BOOST_AUTO_TEST_CASE(Build) {
0112 CommonTests ct;
0113 ct.testBuild();
0114 }
0115
0116 BOOST_AUTO_TEST_CASE(ConstCorrectness) {
0117
0118 }
0119
0120 BOOST_AUTO_TEST_CASE(Clear) {
0121 CommonTests ct;
0122 ct.testClear();
0123 }
0124
0125 BOOST_AUTO_TEST_CASE(ApplyWithAbort) {
0126 CommonTests ct;
0127 ct.testApplyWithAbort();
0128 }
0129
0130 BOOST_AUTO_TEST_CASE(AddTrackStateWithBitMask) {
0131 CommonTests ct;
0132 ct.testAddTrackStateWithBitMask();
0133 }
0134
0135 BOOST_AUTO_TEST_CASE(AddTrackStateComponents) {
0136 CommonTests ct;
0137 ct.testAddTrackStateComponents();
0138 }
0139
0140
0141 BOOST_AUTO_TEST_CASE(TrackStateProxyCrossTalk) {
0142 CommonTests ct;
0143 ct.testTrackStateProxyCrossTalk(rng);
0144 }
0145
0146 BOOST_AUTO_TEST_CASE(TrackStateReassignment) {
0147 CommonTests ct;
0148 ct.testTrackStateReassignment(rng);
0149 }
0150
0151 BOOST_DATA_TEST_CASE(TrackStateProxyStorage, bd::make({1u, 2u}),
0152 nMeasurements) {
0153 CommonTests ct;
0154 ct.testTrackStateProxyStorage(rng, nMeasurements);
0155 }
0156
0157 BOOST_AUTO_TEST_CASE(TrackStateProxyAllocations) {
0158 CommonTests ct;
0159 ct.testTrackStateProxyAllocations(rng);
0160 }
0161
0162 BOOST_AUTO_TEST_CASE(TrackStateProxyGetMask) {
0163 CommonTests ct;
0164 ct.testTrackStateProxyGetMask();
0165 }
0166
0167 BOOST_AUTO_TEST_CASE(TrackStateProxyCopy) {
0168 CommonTests ct;
0169 ct.testTrackStateProxyCopy(rng);
0170 }
0171
0172 BOOST_AUTO_TEST_CASE(TrackStateCopyDynamicColumns) {
0173 CommonTests ct;
0174 ct.testTrackStateCopyDynamicColumns();
0175 }
0176
0177 BOOST_AUTO_TEST_CASE(TrackStateProxyCopyDiffMTJ) {
0178 CommonTests ct;
0179 ct.testTrackStateProxyCopyDiffMTJ();
0180 }
0181
0182 BOOST_AUTO_TEST_CASE(ProxyAssignment) {
0183 CommonTests ct;
0184 ct.testProxyAssignment();
0185 }
0186
0187 BOOST_AUTO_TEST_CASE(CopyFromConst) {
0188 CommonTests ct;
0189 ct.testCopyFromConst();
0190 }
0191
0192 BOOST_AUTO_TEST_CASE(TrackStateProxyShare) {
0193 CommonTests ct;
0194 ct.testTrackStateProxyShare(rng);
0195 }
0196
0197 BOOST_AUTO_TEST_CASE(MultiTrajectoryExtraColumns) {
0198 CommonTests ct;
0199 ct.testMultiTrajectoryExtraColumns();
0200 }
0201
0202 BOOST_AUTO_TEST_CASE(MultiTrajectoryExtraColumnsRuntime) {
0203 CommonTests ct;
0204 ct.testMultiTrajectoryExtraColumnsRuntime();
0205 }
0206
0207 BOOST_AUTO_TEST_CASE(MultiTrajectoryAllocateCalibratedInit) {
0208 CommonTests ct;
0209 ct.testMultiTrajectoryAllocateCalibratedInit(rng);
0210 }
0211
0212 BOOST_AUTO_TEST_CASE(WriteToPodioFrame) {
0213 using namespace HashedStringLiteral;
0214
0215 MapHelper helper;
0216
0217 auto tmp_path = std::filesystem::temp_directory_path();
0218 auto outfile = tmp_path / "trackstates.root";
0219
0220 BoundVector tv1;
0221 tv1 << 1, 1, 1, 1, 1, 1;
0222
0223 BoundVector tv2 = tv1 * 2;
0224 BoundVector tv3 = tv1 * 3;
0225 BoundVector tv4 = tv1 * 4;
0226
0227 BoundMatrix cov1;
0228 cov1.setOnes();
0229
0230 BoundMatrix cov2 = cov1 * 2;
0231 BoundMatrix cov3 = cov1 * 3;
0232 BoundMatrix cov4 = cov1 * 4;
0233
0234 auto rBounds = std::make_shared<RectangleBounds>(15, 20);
0235 auto trf = Transform3::Identity();
0236 trf.translation().setRandom();
0237 auto free = Acts::Surface::makeShared<PlaneSurface>(trf, rBounds);
0238 auto reg = Acts::Surface::makeShared<PlaneSurface>(trf, rBounds);
0239
0240 helper.surfaces[666] = reg.get();
0241
0242 podio::Frame frame;
0243
0244 MutablePodioTrackStateContainer c{helper};
0245 BOOST_CHECK(!c.hasColumn("int_column"_hash));
0246 BOOST_CHECK(!c.hasColumn("float_column"_hash));
0247 c.addColumn<std::int32_t>("int_column");
0248 c.addColumn<float>("float_column");
0249 BOOST_CHECK(c.hasColumn("int_column"_hash));
0250 BOOST_CHECK(c.hasColumn("float_column"_hash));
0251
0252 {
0253 auto t1 = c.makeTrackState(TrackStatePropMask::Predicted);
0254 t1.predicted() = tv1;
0255 t1.predictedCovariance() = cov1;
0256
0257 t1.setReferenceSurface(free);
0258
0259 auto t2 = c.makeTrackState(TrackStatePropMask::All, t1.index());
0260 t2.predicted() = tv2;
0261 t2.predictedCovariance() = cov2;
0262
0263 t2.filtered() = tv3;
0264 t2.filteredCovariance() = cov3;
0265
0266 t2.smoothed() = tv4;
0267 t2.smoothedCovariance() = cov4;
0268
0269 t2.jacobian() = cov2;
0270
0271 auto t3 = c.makeTrackState();
0272 t3.setReferenceSurface(reg);
0273
0274 t1.component<std::int32_t, "int_column"_hash>() = -11;
0275 t2.component<std::int32_t, "int_column"_hash>() = 42;
0276 t3.component<std::int32_t, "int_column"_hash>() = -98;
0277
0278 t1.component<float, "float_column"_hash>() = -11.2f;
0279 t2.component<float, "float_column"_hash>() = 42.4f;
0280 t3.component<float, "float_column"_hash>() = -98.9f;
0281 }
0282
0283 c.releaseInto(frame, "test");
0284
0285 BOOST_CHECK_EQUAL(frame.get("trackStates_test")->size(), 3);
0286 BOOST_CHECK_EQUAL(frame.get("trackStateParameters_test")->size(), 7);
0287 BOOST_CHECK_EQUAL(frame.get("trackStateJacobians_test")->size(), 2);
0288 BOOST_CHECK_NE(frame.get("trackStates_test_extra__int_column"), nullptr);
0289 BOOST_CHECK_NE(frame.get("trackStates_test_extra__float_column"), nullptr);
0290
0291 ConstPodioTrackStateContainer cc{helper, frame, "test"};
0292
0293 BOOST_CHECK_EQUAL(cc.size(), 3);
0294 BOOST_CHECK(cc.hasColumn("int_column"_hash));
0295 BOOST_CHECK(cc.hasColumn("float_column"_hash));
0296
0297 auto t1 = cc.getTrackState(0);
0298 auto t2 = cc.getTrackState(1);
0299 auto t3 = cc.getTrackState(2);
0300
0301 BOOST_CHECK_EQUAL(t2.previous(), 0);
0302
0303 BOOST_CHECK(t1.hasReferenceSurface());
0304 BOOST_CHECK(!t2.hasReferenceSurface());
0305 BOOST_CHECK(t3.hasReferenceSurface());
0306
0307 Acts::GeometryContext gctx;
0308
0309 const auto& ext = t1.referenceSurface();
0310 BOOST_CHECK_NE(&ext, free.get());
0311 BOOST_CHECK_EQUAL(trf.matrix(), ext.transform(gctx).matrix());
0312 BOOST_CHECK_EQUAL(free->bounds().type(), ext.bounds().type());
0313 BOOST_CHECK_EQUAL(free->type(), ext.type());
0314 const auto* rBounds2 = dynamic_cast<const RectangleBounds*>(&ext.bounds());
0315 BOOST_REQUIRE_NE(rBounds2, nullptr);
0316 BOOST_CHECK_EQUAL(rBounds->halfLengthX(), rBounds2->halfLengthX());
0317 BOOST_CHECK_EQUAL(rBounds->halfLengthY(), rBounds2->halfLengthY());
0318
0319 BOOST_CHECK_EQUAL(t1.predicted(), tv1);
0320 BOOST_CHECK_EQUAL(t1.predictedCovariance(), cov1);
0321
0322 BOOST_CHECK_EQUAL(t2.predicted(), tv2);
0323 BOOST_CHECK_EQUAL(t2.predictedCovariance(), cov2);
0324 BOOST_CHECK_EQUAL(t2.filtered(), tv3);
0325 BOOST_CHECK_EQUAL(t2.filteredCovariance(), cov3);
0326 BOOST_CHECK_EQUAL(t2.smoothed(), tv4);
0327 BOOST_CHECK_EQUAL(t2.smoothedCovariance(), cov4);
0328
0329 BOOST_CHECK_EQUAL(t2.jacobian(), cov2);
0330
0331 BOOST_CHECK_EQUAL(&t3.referenceSurface(), reg.get());
0332
0333 BOOST_CHECK_EQUAL((t1.component<std::int32_t, "int_column"_hash>()), -11);
0334 BOOST_CHECK_EQUAL((t2.component<std::int32_t, "int_column"_hash>()), 42);
0335 BOOST_CHECK_EQUAL((t3.component<std::int32_t, "int_column"_hash>()), -98);
0336
0337 BOOST_CHECK_EQUAL((t1.component<float, "float_column"_hash>()), -11.2f);
0338 BOOST_CHECK_EQUAL((t2.component<float, "float_column"_hash>()), 42.4f);
0339 BOOST_CHECK_EQUAL((t3.component<float, "float_column"_hash>()), -98.9f);
0340 }
0341
0342 BOOST_AUTO_TEST_SUITE_END()