File indexing completed on 2025-10-18 08:22:39
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Navigation/NavigationStream.hpp"
0012 #include "Acts/Surfaces/CylinderSurface.hpp"
0013 #include "Acts/Surfaces/PlaneSurface.hpp"
0014 #include "Acts/Surfaces/RectangleBounds.hpp"
0015 #include "Acts/Utilities/Intersection.hpp"
0016 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0017
0018 using namespace Acts;
0019
0020 namespace ActsTests {
0021
0022
0023 std::vector<std::shared_ptr<Surface>> createPlaneSurfaces() {
0024 auto rectangle = std::make_shared<RectangleBounds>(10., 10.);
0025
0026
0027 Transform3 aTransform = Transform3::Identity();
0028 aTransform.pretranslate(Vector3(0., 0., -20.));
0029 auto surfaceA = Surface::makeShared<PlaneSurface>(aTransform, rectangle);
0030
0031
0032
0033 Transform3 bTransform = Transform3::Identity();
0034 bTransform.pretranslate(Vector3(50., 50., 100.));
0035 auto surfaceB = Surface::makeShared<PlaneSurface>(bTransform, rectangle);
0036
0037 Transform3 cTransform = Transform3::Identity();
0038 cTransform.pretranslate(Vector3(0., 0., 200.));
0039 auto surfaceC = Surface::makeShared<PlaneSurface>(cTransform, rectangle);
0040
0041 Transform3 dTransform = Transform3::Identity();
0042 dTransform.pretranslate(Vector3(0., 0., 400.));
0043 auto surfaceD = Surface::makeShared<PlaneSurface>(dTransform, rectangle);
0044
0045
0046 return {surfaceC, surfaceA, surfaceD, surfaceB};
0047 }
0048
0049
0050 std::vector<std::shared_ptr<Surface>> createCylinders() {
0051
0052
0053 Transform3 aTransform = Transform3::Identity();
0054 auto surfaceA = Surface::makeShared<CylinderSurface>(aTransform, 10., 20);
0055
0056
0057
0058 Transform3 bTransform = Transform3::Identity();
0059 bTransform.pretranslate(Vector3(20., 20., 0.));
0060 auto surfaceB = Surface::makeShared<CylinderSurface>(bTransform, 2., 10);
0061
0062
0063
0064 Transform3 cTransform = Transform3::Identity();
0065 auto surfaceC = Surface::makeShared<CylinderSurface>(cTransform, 40., 20);
0066
0067
0068
0069
0070 Transform3 dTransform = Transform3::Identity();
0071 dTransform.pretranslate(Vector3(0., 0., 10.));
0072 auto surfaceD = Surface::makeShared<CylinderSurface>(dTransform, 50., 5.);
0073
0074
0075 return {surfaceC, surfaceB, surfaceA, surfaceD};
0076 }
0077
0078 auto gContext = GeometryContext();
0079
0080 BOOST_AUTO_TEST_SUITE(Navigation)
0081
0082 BOOST_AUTO_TEST_CASE(NavigationStream_InitializePlanes) {
0083
0084 auto surfaces = createPlaneSurfaces();
0085
0086 NavigationStream nStreamTemplate;
0087 for (const auto& surface : surfaces) {
0088 nStreamTemplate.addSurfaceCandidate(*surface, BoundaryTolerance::None());
0089 }
0090 BOOST_CHECK_EQUAL(nStreamTemplate.remainingCandidates(), 4u);
0091
0092
0093
0094
0095 NavigationStream nStream = nStreamTemplate;
0096 BOOST_CHECK(nStream.initialize(gContext,
0097 {Vector3(0., 0., -30.), Vector3(0., 0., 1.)},
0098 BoundaryTolerance::Infinite()));
0099
0100 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 4u);
0101 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0102 surfaces.at(1u).get());
0103
0104
0105
0106
0107 nStream = nStreamTemplate;
0108 BOOST_CHECK(nStream.initialize(gContext,
0109 {Vector3(0., 0., 0.), Vector3(0., 0., 1.)},
0110 BoundaryTolerance::Infinite()));
0111 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 3u);
0112 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0113 surfaces.at(3u).get());
0114
0115
0116
0117
0118 nStream = nStreamTemplate;
0119 BOOST_CHECK(nStream.initialize(gContext,
0120 {Vector3(0., 0., -100.), Vector3(0., 0., 1.)},
0121 BoundaryTolerance::None()));
0122 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 3u);
0123
0124
0125
0126 nStream = nStreamTemplate;
0127 BOOST_CHECK(!nStream.initialize(gContext,
0128 {Vector3(0., 0., 0.), Vector3(1., 0., 0.)},
0129 BoundaryTolerance::Infinite()));
0130 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 0u);
0131 BOOST_CHECK_THROW(nStream.currentCandidate(), std::out_of_range);
0132
0133
0134 nStream = nStreamTemplate;
0135 nStreamTemplate.addSurfaceCandidate(*surfaces.at(0),
0136 BoundaryTolerance::None());
0137
0138 BOOST_CHECK_EQUAL(nStreamTemplate.remainingCandidates(), 5u);
0139
0140 BOOST_CHECK(nStream.initialize(gContext,
0141 {Vector3(0., 0., -100.), Vector3(0., 0., 1.)},
0142 BoundaryTolerance::Infinite()));
0143 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 4u);
0144 }
0145
0146 BOOST_AUTO_TEST_CASE(NavigationStream_UpdatePlanes) {
0147
0148 auto surfaces = createPlaneSurfaces();
0149
0150
0151
0152 NavigationStream nStreamTemplate;
0153 for (const auto& surface : surfaces) {
0154 nStreamTemplate.addSurfaceCandidate(*surface, BoundaryTolerance::None());
0155 }
0156 BOOST_CHECK_EQUAL(nStreamTemplate.remainingCandidates(), 4u);
0157
0158
0159
0160
0161 NavigationStream::QueryPoint qPoint = {Vector3(0., 0., -30.),
0162 Vector3(0., 0., 1.)};
0163
0164 NavigationStream nStream = nStreamTemplate;
0165 BOOST_CHECK(
0166 nStream.initialize(gContext, qPoint, BoundaryTolerance::Infinite()));
0167 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 4u);
0168 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0169 surfaces.at(1u).get());
0170 CHECK_CLOSE_ABS(nStream.currentCandidate().pathLength(), 10.,
0171 std::numeric_limits<double>::epsilon());
0172
0173
0174 qPoint.position = Vector3(0., 0., -22.);
0175 BOOST_CHECK(nStream.update(gContext, qPoint));
0176
0177 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0178 surfaces.at(1u).get());
0179 CHECK_CLOSE_ABS(nStream.currentCandidate().pathLength(), 2.,
0180 std::numeric_limits<double>::epsilon());
0181
0182
0183 qPoint.position = Vector3(0., 0., -19.5);
0184 BOOST_CHECK(nStream.update(gContext, qPoint));
0185
0186 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0187 surfaces.at(1u).get());
0188 CHECK_CLOSE_ABS(nStream.currentCandidate().pathLength(), -0.5,
0189 std::numeric_limits<double>::epsilon());
0190
0191
0192 qPoint.position = Vector3(0., 0., -20.);
0193 BOOST_CHECK(nStream.update(gContext, qPoint));
0194
0195
0196 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0197 surfaces.at(1u).get());
0198 CHECK_CLOSE_ABS(
0199 nStream.currentCandidate().pathLength(), s_onSurfaceTolerance,
0200 std::numeric_limits<double>::epsilon() + s_onSurfaceTolerance);
0201 BOOST_CHECK_EQUAL(nStream.currentCandidate().status(),
0202 IntersectionStatus::onSurface);
0203
0204 BOOST_CHECK(nStream.switchToNextCandidate());
0205
0206 BOOST_CHECK_EQUAL(&nStream.currentCandidate().surface(),
0207 surfaces.at(3u).get());
0208
0209 CHECK_CLOSE_ABS(nStream.currentCandidate().pathLength(), 130.,
0210 std::numeric_limits<double>::epsilon());
0211
0212
0213
0214 BOOST_CHECK(nStream.update(gContext, qPoint));
0215 CHECK_CLOSE_ABS(nStream.currentCandidate().pathLength(), 220.,
0216 std::numeric_limits<double>::epsilon());
0217
0218 qPoint.direction = Vector3(0., 1., 1.).normalized();
0219
0220 BOOST_CHECK(!nStream.update(gContext, qPoint));
0221 }
0222
0223 BOOST_AUTO_TEST_CASE(NavigationStream_InitializeCylinders) {
0224
0225 auto surfaces = createCylinders();
0226
0227
0228 NavigationStream nStreamTemplate;
0229 for (const auto& surface : surfaces) {
0230 const Surface* pointer = surface.get();
0231 nStreamTemplate.addSurfaceCandidates({&pointer, 1},
0232 BoundaryTolerance::None());
0233 }
0234 BOOST_CHECK_EQUAL(nStreamTemplate.remainingCandidates(), 4u);
0235
0236
0237
0238
0239 NavigationStream nStream = nStreamTemplate;
0240 BOOST_CHECK(nStream.initialize(
0241 gContext, {Vector3(0., 0., 0.), Vector3(1., 1., 0.).normalized()},
0242 BoundaryTolerance::Infinite()));
0243
0244
0245
0246 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 4u);
0247
0248 BOOST_CHECK_EQUAL(&nStream.candidates().at(0u).surface(),
0249 surfaces.at(2).get());
0250 BOOST_CHECK_EQUAL(&nStream.candidates().at(1u).surface(),
0251 surfaces.at(1).get());
0252 BOOST_CHECK_EQUAL(&nStream.candidates().at(2u).surface(),
0253 surfaces.at(0).get());
0254
0255
0256
0257
0258 nStream = nStreamTemplate;
0259 BOOST_CHECK(nStream.initialize(gContext,
0260 {Vector3(0., 0., 0.), Vector3(1., 0., 0.)},
0261 BoundaryTolerance::Infinite()));
0262
0263 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 3u);
0264
0265
0266
0267 nStream = nStreamTemplate;
0268 BOOST_CHECK(nStream.initialize(gContext,
0269 {Vector3(0., 0., 0.), Vector3(1., 0., 0.)},
0270 BoundaryTolerance::None()));
0271
0272 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 2u);
0273
0274
0275
0276
0277 nStream = nStreamTemplate;
0278 BOOST_CHECK(!nStream.initialize(gContext,
0279 {Vector3(0., 0., 0.), Vector3(0., 0., 1.)},
0280 BoundaryTolerance::None()));
0281
0282 BOOST_CHECK_EQUAL(nStream.remainingCandidates(), 0u);
0283 BOOST_CHECK_THROW(nStream.currentCandidate(), std::out_of_range);
0284 }
0285
0286 BOOST_AUTO_TEST_SUITE_END()
0287
0288 }