From ce766350b9163b615363fc94587949a6f30ec90c Mon Sep 17 00:00:00 2001 From: Joana Niermann Date: Mon, 14 Oct 2024 17:47:39 +0200 Subject: [PATCH 1/2] Update the navigation config to the ODD/ITk defaults --- .../detray/navigation/navigation_config.hpp | 4 +- core/include/detray/navigation/navigator.hpp | 16 +++- .../detray/propagator/line_stepper.hpp | 6 +- core/include/detray/propagator/propagator.hpp | 2 +- .../include/detray/test/utils/inspectors.hpp | 2 + .../telescope_detector_navigation.cpp | 2 +- .../cpu/material/material_interaction.cpp | 14 ++- .../cpu/propagator/guided_navigator.cpp | 3 +- .../cpu/propagator/propagator.cpp | 9 +- .../device/cuda/propagator_cuda.cpp | 86 ++++++++++--------- .../cuda/telescope_navigation_validation.cpp | 2 +- tests/unit_tests/cpu/navigation/navigator.cpp | 72 +++++++++------- .../cpu/propagator/covariance_transport.cpp | 4 +- .../cpu/propagator/line_stepper.cpp | 10 ++- .../unit_tests/device/cuda/navigator_cuda.cpp | 16 ++-- .../device/cuda/navigator_cuda_kernel.cu | 15 ++-- .../device/cuda/navigator_cuda_kernel.hpp | 3 +- .../cpu/propagation/navigation_inspection.cpp | 3 +- 18 files changed, 157 insertions(+), 112 deletions(-) diff --git a/core/include/detray/navigation/navigation_config.hpp b/core/include/detray/navigation/navigation_config.hpp index 56f0b839e..19cc5c0bb 100644 --- a/core/include/detray/navigation/navigation_config.hpp +++ b/core/include/detray/navigation/navigation_config.hpp @@ -32,14 +32,14 @@ struct config { /// Minimal tolerance: ~ position uncertainty on surface float min_mask_tolerance{1e-5f * unit::mm}; /// Maximal tolerance: loose tolerance when still far away from surface - float max_mask_tolerance{1.f * unit::mm}; + float max_mask_tolerance{3.f * unit::mm}; /// Scale factor on the path used for the mask tolerance calculation float mask_tolerance_scalor{5e-2f}; /// @} /// Maximal absolute path distance for a track to be considered 'on surface' float path_tolerance{1.f * unit::um}; /// How far behind the track position to look for candidates - float overstep_tolerance{-100.f * unit::um}; + float overstep_tolerance{-300.f * unit::um}; /// Search window size for grid based acceleration structures /// (0, 0): only look at current bin std::array search_window = {0u, 0u}; diff --git a/core/include/detray/navigation/navigator.hpp b/core/include/detray/navigation/navigator.hpp index e0d5e53d9..ded1a4b04 100644 --- a/core/include/detray/navigation/navigator.hpp +++ b/core/include/detray/navigation/navigator.hpp @@ -706,7 +706,8 @@ class navigator { init(propagation, cfg); - // Fresh initialization, reset trust and hearbeat + // Fresh initialization, reset trust and hearbeat even though we are + // on inner portal navigation.m_trust_level = navigation::trust_level::e_full; navigation.m_heartbeat = true; @@ -717,9 +718,16 @@ class navigator { navigation.m_heartbeat &= init(propagation, cfg); // Sanity check: Should never be the case after complete update call - if (navigation.trust_level() != navigation::trust_level::e_full || - navigation.is_exhausted()) { - navigation.abort(); + if (navigation.trust_level() != navigation::trust_level::e_full) { + // Try to save the navigation flow: Look further behind the track + auto loose_cfg{cfg}; + loose_cfg.overstep_tolerance = -10.f * cfg.max_mask_tolerance; + navigation.m_heartbeat &= init(propagation, loose_cfg); + + // Unrecoverable + if (navigation.trust_level() != navigation::trust_level::e_full) { + navigation.abort(); + } } return navigation.m_heartbeat; diff --git a/core/include/detray/propagator/line_stepper.hpp b/core/include/detray/propagator/line_stepper.hpp index 5ce40e295..3fcbd05a7 100644 --- a/core/include/detray/propagator/line_stepper.hpp +++ b/core/include/detray/propagator/line_stepper.hpp @@ -91,7 +91,7 @@ class line_stepper final /// @return returning the heartbeat, indicating if the stepping is alive template DETRAY_HOST_DEVICE bool step(propagation_state_t& propagation, - const stepping::config& cfg = {}) const { + const stepping::config& cfg) const { // Get stepper and navigator states state& stepping = propagation._stepping; auto& navigation = propagation._navigation; @@ -125,7 +125,9 @@ class line_stepper final stepping.advance_track(); // Advance jacobian transport - stepping.advance_jacobian(); + if (cfg.do_covariance_transport) { + stepping.advance_jacobian(); + } // Count the number of steps stepping.count_trials(); diff --git a/core/include/detray/propagator/propagator.hpp b/core/include/detray/propagator/propagator.hpp index f119a74c0..d183fa08d 100644 --- a/core/include/detray/propagator/propagator.hpp +++ b/core/include/detray/propagator/propagator.hpp @@ -52,7 +52,7 @@ struct propagator { /// Construct from a propagator configuration DETRAY_HOST_DEVICE - explicit constexpr propagator(const propagation::config &cfg = {}) + explicit constexpr propagator(const propagation::config &cfg) : m_cfg{cfg} {} /// Propagation that state aggregates a stepping and a navigation state. It diff --git a/tests/include/detray/test/utils/inspectors.hpp b/tests/include/detray/test/utils/inspectors.hpp index a286fff7a..4cb035330 100644 --- a/tests/include/detray/test/utils/inspectors.hpp +++ b/tests/include/detray/test/utils/inspectors.hpp @@ -264,6 +264,8 @@ struct print_inspector { debug_stream << msg << std::endl; debug_stream << "Volume" << tabs << state.volume() << std::endl; + debug_stream << "Overstep tol:\t\t\t" << cfg.overstep_tolerance + << std::endl; debug_stream << "Track pos: [r:" << getter::perp(track_pos) << ", z:" << track_pos[2] << "], dir: [" << track_dir[0] << ", " << track_dir[1] << ", " << track_dir[2] << "]" diff --git a/tests/integration_tests/cpu/detectors/telescope_detector_navigation.cpp b/tests/integration_tests/cpu/detectors/telescope_detector_navigation.cpp index fc792865e..1185a64d6 100644 --- a/tests/integration_tests/cpu/detectors/telescope_detector_navigation.cpp +++ b/tests/integration_tests/cpu/detectors/telescope_detector_navigation.cpp @@ -100,7 +100,7 @@ int main(int argc, char **argv) { cfg_hel_nav.name("telescope_detector_helix_navigation"); cfg_hel_nav.whiteboard(white_board); cfg_hel_nav.propagation().navigation.overstep_tolerance = - -300.f * unit::um; + -100.f * unit::um; detail::register_checks(tel_det, tel_names, cfg_hel_nav); diff --git a/tests/integration_tests/cpu/material/material_interaction.cpp b/tests/integration_tests/cpu/material/material_interaction.cpp index 04f89000b..74a0959ee 100644 --- a/tests/integration_tests/cpu/material/material_interaction.cpp +++ b/tests/integration_tests/cpu/material/material_interaction.cpp @@ -79,7 +79,9 @@ GTEST_TEST(detray_material, telescope_geometry_energy_loss) { using propagator_t = propagator; // Propagator is built from the stepper and navigator - propagator_t p{}; + propagation::config prop_cfg{}; + prop_cfg.navigation.overstep_tolerance = -100.f * unit::um; + propagator_t p{prop_cfg}; constexpr scalar q{-1.f}; constexpr scalar iniP{10.f * unit::GeV}; @@ -193,7 +195,7 @@ GTEST_TEST(detray_material, telescope_geometry_energy_loss) { interactor_state, parameter_resetter_state); // Propagator and its state - alt_propagator_t alt_p{}; + alt_propagator_t alt_p{prop_cfg}; alt_propagator_t::state alt_state(alt_bound_param, det); // Propagate @@ -251,7 +253,9 @@ GTEST_TEST(detray_material, telescope_geometry_scattering_angle) { using propagator_t = propagator; // Propagator is built from the stepper and navigator - propagator_t p{}; + propagation::config prop_cfg{}; + prop_cfg.navigation.overstep_tolerance = -100.f * unit::um; + propagator_t p{prop_cfg}; constexpr scalar q{-1.f}; constexpr scalar iniP{10.f * unit::GeV}; @@ -381,7 +385,9 @@ GTEST_TEST(detray_material, telescope_geometry_volume_material) { using propagator_t = propagator; // Propagator is built from the stepper and navigator - propagator_t p{}; + propagation::config prop_cfg{}; + prop_cfg.navigation.overstep_tolerance = -100.f * unit::um; + propagator_t p{prop_cfg}; propagator_t::state state(bound_param, const_bfield, det); diff --git a/tests/integration_tests/cpu/propagator/guided_navigator.cpp b/tests/integration_tests/cpu/propagator/guided_navigator.cpp index 6bca67458..db72b75a3 100644 --- a/tests/integration_tests/cpu/propagator/guided_navigator.cpp +++ b/tests/integration_tests/cpu/propagator/guided_navigator.cpp @@ -81,7 +81,8 @@ GTEST_TEST(detray_navigation, guided_navigator) { pathlimit_aborter::state pathlimit{200.f * unit::cm}; // Propagator - propagator_t p{}; + propagation::config prop_cfg{}; + propagator_t p{prop_cfg}; propagator_t::state guided_state(track, b_field, telescope_det); // Propagate diff --git a/tests/integration_tests/cpu/propagator/propagator.cpp b/tests/integration_tests/cpu/propagator/propagator.cpp index 9ac31f746..78e903555 100644 --- a/tests/integration_tests/cpu/propagator/propagator.cpp +++ b/tests/integration_tests/cpu/propagator/propagator.cpp @@ -136,7 +136,8 @@ GTEST_TEST(detray_propagator, propagator_line_stepper) { const vector3 mom{1.f, 1.f, 0.f}; free_track_parameters track(pos, 0.f, mom, -1.f); - propagator_t p{}; + propagation::config prop_cfg{}; + propagator_t p{prop_cfg}; propagator_t::state state(track, d); @@ -384,7 +385,7 @@ INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P( detray_propagator_validation2, PropagatorWithRkStepper, ::testing::Values(std::make_tuple(-400.f * unit::um, - 40.f * unit::mm, + std::numeric_limits::max(), vector3{0.f * unit::T, 1.f * unit::T, 1.f * unit::T}))); @@ -392,7 +393,7 @@ INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P( detray_propagator_validation3, PropagatorWithRkStepper, ::testing::Values(std::make_tuple(-400.f * unit::um, - 40.f * unit::mm, + std::numeric_limits::max(), vector3{1.f * unit::T, 0.f * unit::T, 1.f * unit::T}))); @@ -400,7 +401,7 @@ INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P( detray_propagator_validation4, PropagatorWithRkStepper, ::testing::Values(std::make_tuple(-600.f * unit::um, - 35.f * unit::mm, + std::numeric_limits::max(), vector3{1.f * unit::T, 1.f * unit::T, 1.f * unit::T}))); diff --git a/tests/integration_tests/device/cuda/propagator_cuda.cpp b/tests/integration_tests/device/cuda/propagator_cuda.cpp index e2272b102..c282af9d4 100644 --- a/tests/integration_tests/device/cuda/propagator_cuda.cpp +++ b/tests/integration_tests/device/cuda/propagator_cuda.cpp @@ -97,26 +97,29 @@ INSTANTIATE_TEST_SUITE_P( 0.f * unit::T, 2.f * unit::T}))); -INSTANTIATE_TEST_SUITE_P(CudaPropagatorValidation2, CudaPropConstBFieldMng, - ::testing::Values(std::make_tuple( - -400.f * unit::um, 40.f * unit::mm, - vector3_t{0.f * unit::T, - 1.f * unit::T, - 1.f * unit::T}))); - -INSTANTIATE_TEST_SUITE_P(CudaPropagatorValidation3, CudaPropConstBFieldMng, - ::testing::Values(std::make_tuple( - -400.f * unit::um, 40.f * unit::mm, - vector3_t{1.f * unit::T, - 0.f * unit::T, - 1.f * unit::T}))); - -INSTANTIATE_TEST_SUITE_P(CudaPropagatorValidation4, CudaPropConstBFieldMng, - ::testing::Values(std::make_tuple( - -600.f * unit::um, 35.f * unit::mm, - vector3_t{1.f * unit::T, - 1.f * unit::T, - 1.f * unit::T}))); +INSTANTIATE_TEST_SUITE_P( + CudaPropagatorValidation2, CudaPropConstBFieldMng, + ::testing::Values(std::make_tuple(-400.f * unit::um, + std::numeric_limits::max(), + vector3_t{0.f * unit::T, + 1.f * unit::T, + 1.f * unit::T}))); + +INSTANTIATE_TEST_SUITE_P( + CudaPropagatorValidation3, CudaPropConstBFieldMng, + ::testing::Values(std::make_tuple(-400.f * unit::um, + std::numeric_limits::max(), + vector3_t{1.f * unit::T, + 0.f * unit::T, + 1.f * unit::T}))); + +INSTANTIATE_TEST_SUITE_P( + CudaPropagatorValidation4, CudaPropConstBFieldMng, + ::testing::Values(std::make_tuple(-600.f * unit::um, + std::numeric_limits::max(), + vector3_t{1.f * unit::T, + 1.f * unit::T, + 1.f * unit::T}))); INSTANTIATE_TEST_SUITE_P( CudaPropagatorValidation5, CudaPropConstBFieldCpy, @@ -126,26 +129,29 @@ INSTANTIATE_TEST_SUITE_P( 0.f * unit::T, 2.f * unit::T}))); -INSTANTIATE_TEST_SUITE_P(CudaPropagatorValidation6, CudaPropConstBFieldCpy, - ::testing::Values(std::make_tuple( - -400.f * unit::um, 40.f * unit::mm, - vector3_t{0.f * unit::T, - 1.f * unit::T, - 1.f * unit::T}))); - -INSTANTIATE_TEST_SUITE_P(CudaPropagatorValidation7, CudaPropConstBFieldCpy, - ::testing::Values(std::make_tuple( - -400.f * unit::um, 40.f * unit::mm, - vector3_t{1.f * unit::T, - 0.f * unit::T, - 1.f * unit::T}))); - -INSTANTIATE_TEST_SUITE_P(CudaPropagatorValidation8, CudaPropConstBFieldCpy, - ::testing::Values(std::make_tuple( - -600.f * unit::um, 35.f * unit::mm, - vector3_t{1.f * unit::T, - 1.f * unit::T, - 1.f * unit::T}))); +INSTANTIATE_TEST_SUITE_P( + CudaPropagatorValidation6, CudaPropConstBFieldCpy, + ::testing::Values(std::make_tuple(-400.f * unit::um, + std::numeric_limits::max(), + vector3_t{0.f * unit::T, + 1.f * unit::T, + 1.f * unit::T}))); + +INSTANTIATE_TEST_SUITE_P( + CudaPropagatorValidation7, CudaPropConstBFieldCpy, + ::testing::Values(std::make_tuple(-400.f * unit::um, + std::numeric_limits::max(), + vector3_t{1.f * unit::T, + 0.f * unit::T, + 1.f * unit::T}))); + +INSTANTIATE_TEST_SUITE_P( + CudaPropagatorValidation8, CudaPropConstBFieldCpy, + ::testing::Values(std::make_tuple(-600.f * unit::um, + std::numeric_limits::max(), + vector3_t{1.f * unit::T, + 1.f * unit::T, + 1.f * unit::T}))); /// This tests the device propagation in an inhomogenepus magnetic field TEST(CudaPropagatorValidation9, inhomogeneous_bfield_cpy) { diff --git a/tests/integration_tests/device/cuda/telescope_navigation_validation.cpp b/tests/integration_tests/device/cuda/telescope_navigation_validation.cpp index 6f14bbc8b..24cefa04b 100644 --- a/tests/integration_tests/device/cuda/telescope_navigation_validation.cpp +++ b/tests/integration_tests/device/cuda/telescope_navigation_validation.cpp @@ -105,7 +105,7 @@ int main(int argc, char **argv) { cfg_hel_nav.name("telescope_detector_helix_navigation_cuda"); cfg_hel_nav.whiteboard(white_board); cfg_hel_nav.propagation().navigation.overstep_tolerance = - -300.f * unit::um; + -100.f * unit::um; detail::register_checks(tel_det, tel_names, cfg_hel_nav); diff --git a/tests/unit_tests/cpu/navigation/navigator.cpp b/tests/unit_tests/cpu/navigation/navigator.cpp index 12df6bbab..fbdf504b3 100644 --- a/tests/unit_tests/cpu/navigation/navigator.cpp +++ b/tests/unit_tests/cpu/navigation/navigator.cpp @@ -92,17 +92,18 @@ inline void check_volume_switch(state_t &state, dindex vol_id) { template inline void step_and_check(navigator_t &nav, stepper_t &stepper, prop_state_t &propagation, - const navigation::config &cfg, dindex vol_id, + const navigation::config &nav_cfg, + const stepping::config &step_cfg, dindex vol_id, std::size_t n_candidates, dindex current_id, dindex next_id) { auto &navigation = propagation._navigation; // Step onto the surface in volume - stepper.step(propagation); + stepper.step(propagation, step_cfg); navigation.set_high_trust(); // Stepper reduced trust level ASSERT_TRUE(navigation.trust_level() == navigation::trust_level::e_high); - ASSERT_TRUE(nav.update(propagation, cfg)); + ASSERT_TRUE(nav.update(propagation, nav_cfg)); // Trust level is restored ASSERT_EQ(navigation.trust_level(), navigation::trust_level::e_full); // The status is on surface @@ -143,8 +144,10 @@ GTEST_TEST(detray_navigation, navigator_toy_geometry) { stepper_t stepper; navigator_t nav; - navigation::config cfg{}; - cfg.search_window = {3u, 3u}; + navigation::config nav_cfg{}; + nav_cfg.search_window = {3u, 3u}; + + stepping::config step_cfg{}; prop_state propagation{ stepper_t::state{traj}, navigator_t::state(toy_det)}; @@ -167,7 +170,7 @@ GTEST_TEST(detray_navigation, navigator_toy_geometry) { // Initialize navigation // Test that the navigator has a heartbeat - ASSERT_TRUE(nav.init(propagation, cfg)); + ASSERT_TRUE(nav.init(propagation, nav_cfg)); // The status is towards beampipe // Two candidates: beampipe and portal // First candidate is the beampipe @@ -178,14 +181,14 @@ GTEST_TEST(detray_navigation, navigator_toy_geometry) { // Let's make half the step towards the beampipe stepping.template set_constraint(navigation() * 0.5f); - stepper.step(propagation); + stepper.step(propagation, step_cfg); // Navigation policy might reduce trust level to fair trust navigation.set_fair_trust(); // Release user constraint again stepping.template release_step(); ASSERT_TRUE(navigation.trust_level() == trust_level::e_fair); // Re-navigate - ASSERT_TRUE(nav.update(propagation, cfg)); + ASSERT_TRUE(nav.update(propagation, nav_cfg)); // Trust level is restored ASSERT_EQ(navigation.trust_level(), trust_level::e_full); // The status remains: towards surface @@ -194,20 +197,21 @@ GTEST_TEST(detray_navigation, navigator_toy_geometry) { ASSERT_NEAR(navigation(), 9.5f, tol); // Let's immediately update, nothing should change, as there is full trust - ASSERT_TRUE(nav.update(propagation, cfg)); + ASSERT_TRUE(nav.update(propagation, nav_cfg)); check_towards_surface(navigation, 0u, 2u, 0u); ASSERT_NEAR(navigation(), 9.5f, tol); // Now step onto the beampipe (idx 0) - step_and_check(nav, stepper, propagation, cfg, 0u, 1u, 0u, 8u); + step_and_check(nav, stepper, propagation, nav_cfg, step_cfg, 0u, 1u, 0u, + 8u); // New target: Distance to the beampipe volume cylinder portal ASSERT_NEAR(navigation(), 6.f, tol); // Step onto portal 7 in volume 0 - stepper.step(propagation); + stepper.step(propagation, step_cfg); navigation.set_high_trust(); ASSERT_TRUE(navigation.trust_level() == trust_level::e_high); - ASSERT_TRUE(nav.update(propagation, cfg)) + ASSERT_TRUE(nav.update(propagation, nav_cfg)) << navigation.inspector().to_string(); ASSERT_EQ(navigation.trust_level(), trust_level::e_full); ASSERT_EQ(navigation.volume(), 8u); @@ -264,17 +268,18 @@ GTEST_TEST(detray_navigation, navigator_toy_geometry) { // Step through the module surfaces for (std::size_t sf = 1u; sf < sf_seq.size() - 1u; ++sf) { // Count only the currently reachable candidates - step_and_check(nav, stepper, propagation_cpy, cfg, vol_id, - n_candidates - sf, sf_seq[sf], sf_seq[sf + 1u]); + step_and_check(nav, stepper, propagation_cpy, nav_cfg, step_cfg, + vol_id, n_candidates - sf, sf_seq[sf], + sf_seq[sf + 1u]); } // Step onto the portal in volume - stepper.step(propagation_cpy); + stepper.step(propagation_cpy, step_cfg); navigation_cpy.set_high_trust(); // Check agianst last volume if (vol_id == last_vol_id) { - ASSERT_FALSE(nav.update(propagation_cpy, cfg)); + ASSERT_FALSE(nav.update(propagation_cpy, nav_cfg)); // The status is: exited ASSERT_EQ(navigation_cpy.status(), status::e_on_target); // Switch to next volume leads out of the detector world -> exit @@ -283,7 +288,7 @@ GTEST_TEST(detray_navigation, navigator_toy_geometry) { // We know we went out of the detector ASSERT_EQ(navigation_cpy.trust_level(), trust_level::e_full); } else { - ASSERT_TRUE(nav.update(propagation_cpy, cfg)); + ASSERT_TRUE(nav.update(propagation_cpy, nav_cfg)); } // Update the propagation state with current step (test assignment op) @@ -326,10 +331,12 @@ GTEST_TEST(detray_navigation, navigator_wire_chamber) { stepper_t stepper; navigator_t nav; - navigation::config cfg{}; - cfg.mask_tolerance_scalor = 1e-2f; - cfg.path_tolerance = 1.f * unit::um; - cfg.search_window = {3u, 3u}; + navigation::config nav_cfg{}; + nav_cfg.mask_tolerance_scalor = 1e-2f; + nav_cfg.path_tolerance = 1.f * unit::um; + nav_cfg.search_window = {3u, 3u}; + + stepping::config step_cfg{}; prop_state propagation{ stepper_t::state{traj}, navigator_t::state(wire_det)}; @@ -352,7 +359,7 @@ GTEST_TEST(detray_navigation, navigator_wire_chamber) { // Initialize navigation // Test that the navigator has a heartbeat - ASSERT_TRUE(nav.init(propagation, cfg)); + ASSERT_TRUE(nav.init(propagation, nav_cfg)); // The status is towards portal // One candidates: barrel cylinder portal check_towards_surface(navigation, 0u, 1u, 0u); @@ -362,14 +369,14 @@ GTEST_TEST(detray_navigation, navigator_wire_chamber) { // Let's make half the step towards the portal stepping.template set_constraint(navigation() * 0.5f); - stepper.step(propagation); + stepper.step(propagation, step_cfg); // Navigation policy might reduce trust level to fair trust navigation.set_fair_trust(); // Release user constraint again stepping.template release_step(); ASSERT_TRUE(navigation.trust_level() == trust_level::e_fair); // Re-navigate - ASSERT_TRUE(nav.update(propagation, cfg)); + ASSERT_TRUE(nav.update(propagation, nav_cfg)); // Trust level is restored ASSERT_EQ(navigation.trust_level(), trust_level::e_full); // The status remains: towards surface @@ -378,15 +385,15 @@ GTEST_TEST(detray_navigation, navigator_wire_chamber) { ASSERT_NEAR(navigation(), 250.f * unit::mm, tol); // Let's immediately update, nothing should change, as there is full trust - ASSERT_TRUE(nav.update(propagation, cfg)); + ASSERT_TRUE(nav.update(propagation, nav_cfg)); check_towards_surface(navigation, 0u, 1u, 0u); ASSERT_NEAR(navigation(), 250.f * unit::mm, tol); // Step onto portal in volume 0 - stepper.step(propagation); + stepper.step(propagation, step_cfg); navigation.set_high_trust(); ASSERT_TRUE(navigation.trust_level() == trust_level::e_high); - ASSERT_TRUE(nav.update(propagation, cfg)) + ASSERT_TRUE(nav.update(propagation, nav_cfg)) << navigation.inspector().to_string(); ASSERT_EQ(navigation.trust_level(), trust_level::e_full); @@ -432,17 +439,18 @@ GTEST_TEST(detray_navigation, navigator_wire_chamber) { // Step through the module surfaces for (std::size_t sf = 1u; sf < sf_seq.size() - 1u; ++sf) { // Count only the currently reachable candidates - step_and_check(nav, stepper, propagation_cpy, cfg, vol_id, - n_candidates - sf, sf_seq[sf], sf_seq[sf + 1u]); + step_and_check(nav, stepper, propagation_cpy, nav_cfg, step_cfg, + vol_id, n_candidates - sf, sf_seq[sf], + sf_seq[sf + 1u]); } // Step onto the portal in volume - stepper.step(propagation_cpy); + stepper.step(propagation_cpy, step_cfg); navigation_cpy.set_high_trust(); // Check agianst last volume if (vol_id == last_vol_id) { - ASSERT_FALSE(nav.update(propagation_cpy, cfg)); + ASSERT_FALSE(nav.update(propagation_cpy, nav_cfg)); // The status is: exited ASSERT_EQ(navigation_cpy.status(), status::e_on_target); // Switch to next volume leads out of the detector world -> exit @@ -451,7 +459,7 @@ GTEST_TEST(detray_navigation, navigator_wire_chamber) { // We know we went out of the detector ASSERT_EQ(navigation_cpy.trust_level(), trust_level::e_full); } else { - ASSERT_TRUE(nav.update(propagation_cpy, cfg)) + ASSERT_TRUE(nav.update(propagation_cpy, nav_cfg)) << navigation_cpy.inspector().to_string(); } diff --git a/tests/unit_tests/cpu/propagator/covariance_transport.cpp b/tests/unit_tests/cpu/propagator/covariance_transport.cpp index ff174bd2e..16b2ae372 100644 --- a/tests/unit_tests/cpu/propagator/covariance_transport.cpp +++ b/tests/unit_tests/cpu/propagator/covariance_transport.cpp @@ -95,7 +95,9 @@ GTEST_TEST(detray_propagator, covariance_transport) { parameter_transporter::state bound_updater{}; parameter_resetter::state rst{}; - propagator_t p{}; + propagation::config prop_cfg{}; + prop_cfg.navigation.overstep_tolerance = -100.f * unit::um; + propagator_t p{prop_cfg}; propagator_t::state propagation(bound_param0, det); // Run propagator diff --git a/tests/unit_tests/cpu/propagator/line_stepper.cpp b/tests/unit_tests/cpu/propagator/line_stepper.cpp index 463e97beb..4c69de840 100644 --- a/tests/unit_tests/cpu/propagator/line_stepper.cpp +++ b/tests/unit_tests/cpu/propagator/line_stepper.cpp @@ -86,6 +86,8 @@ GTEST_TEST(detray_propagator, line_stepper) { free_track_parameters track(pos, 0.f, mom, -1.f); free_track_parameters c_track(pos, 0.f, mom, -1.f); + stepping::config step_cfg{}; + line_stepper_t l_stepper; cline_stepper_t cl_stepper; @@ -121,10 +123,10 @@ GTEST_TEST(detray_propagator, line_stepper) { 0.5f * unit::mm, tol); // Run a few steps - ASSERT_TRUE(l_stepper.step(propagation)); + ASSERT_TRUE(l_stepper.step(propagation, step_cfg)); // Step constraint to half step size - ASSERT_TRUE(cl_stepper.step(c_propagation)); - ASSERT_TRUE(cl_stepper.step(c_propagation)); + ASSERT_TRUE(cl_stepper.step(c_propagation, step_cfg)); + ASSERT_TRUE(cl_stepper.step(c_propagation, step_cfg)); track = propagation._stepping(); ASSERT_NEAR(track.pos()[0], constant::inv_sqrt2, tol); @@ -136,7 +138,7 @@ GTEST_TEST(detray_propagator, line_stepper) { ASSERT_NEAR(c_track.pos()[1], constant::inv_sqrt2, tol); ASSERT_NEAR(c_track.pos()[2], 0.f, tol); - ASSERT_TRUE(l_stepper.step(propagation)); + ASSERT_TRUE(l_stepper.step(propagation, step_cfg)); track = propagation._stepping(); ASSERT_NEAR(track.pos()[0], constant::sqrt2, tol); diff --git a/tests/unit_tests/device/cuda/navigator_cuda.cpp b/tests/unit_tests/device/cuda/navigator_cuda.cpp index 4fd1cedc4..43b041761 100644 --- a/tests/unit_tests/device/cuda/navigator_cuda.cpp +++ b/tests/unit_tests/device/cuda/navigator_cuda.cpp @@ -33,8 +33,10 @@ TEST(navigator_cuda, navigator) { // Create navigator navigator_host_t nav; - navigation::config cfg{}; - cfg.search_window = {1u, 1u}; + navigation::config nav_cfg{}; + nav_cfg.search_window = {1u, 1u}; + + stepping::config step_cfg{}; // Create the vector of initial track parameters vecmem::vector> tracks_host(&mng_mr); @@ -71,14 +73,14 @@ TEST(navigator_cuda, navigator) { const stepper_t::state& stepping = propagation._stepping; // Start propagation and record volume IDs - bool heartbeat = nav.init(propagation, cfg); + bool heartbeat = nav.init(propagation, nav_cfg); while (heartbeat) { - heartbeat &= stepper.step(propagation); + heartbeat &= stepper.step(propagation, step_cfg); navigation.set_high_trust(); - heartbeat &= nav.update(propagation, cfg); + heartbeat &= nav.update(propagation, nav_cfg); // Record volume volume_records_host[i].push_back(navigation.volume()); @@ -115,8 +117,8 @@ TEST(navigator_cuda, navigator) { auto tracks_data = vecmem::get_data(tracks_device); // Run navigator test - navigator_test(det_data, cfg, tracks_data, volume_records_buffer, - position_records_buffer); + navigator_test(det_data, nav_cfg, step_cfg, tracks_data, + volume_records_buffer, position_records_buffer); // Copy volume record buffer into volume & position records device copy(volume_records_buffer, volume_records_device); diff --git a/tests/unit_tests/device/cuda/navigator_cuda_kernel.cu b/tests/unit_tests/device/cuda/navigator_cuda_kernel.cu index 804c71853..ff1b60bfc 100644 --- a/tests/unit_tests/device/cuda/navigator_cuda_kernel.cu +++ b/tests/unit_tests/device/cuda/navigator_cuda_kernel.cu @@ -13,7 +13,8 @@ namespace detray { __global__ void navigator_test_kernel( - typename detector_host_t::view_type det_data, navigation::config cfg, + typename detector_host_t::view_type det_data, navigation::config nav_cfg, + stepping::config step_cfg, vecmem::data::vector_view> tracks_data, vecmem::data::jagged_vector_view volume_records_data, vecmem::data::jagged_vector_view position_records_data) { @@ -45,14 +46,14 @@ __global__ void navigator_test_kernel( navigation.set_volume(0u); // Start propagation and record volume IDs - bool heartbeat = nav.init(propagation, cfg); + bool heartbeat = nav.init(propagation, nav_cfg); while (heartbeat) { - heartbeat &= stepper.step(propagation); + heartbeat &= stepper.step(propagation, step_cfg); navigation.set_high_trust(); - heartbeat = nav.update(propagation, cfg); + heartbeat = nav.update(propagation, nav_cfg); // Record volume volume_records[gid].push_back(navigation.volume()); @@ -61,7 +62,8 @@ __global__ void navigator_test_kernel( } void navigator_test( - typename detector_host_t::view_type det_data, navigation::config& cfg, + typename detector_host_t::view_type det_data, navigation::config& nav_cfg, + stepping::config& step_cfg, vecmem::data::vector_view>& tracks_data, vecmem::data::jagged_vector_view& volume_records_data, vecmem::data::jagged_vector_view& position_records_data) { @@ -71,7 +73,8 @@ void navigator_test( // run the test kernel navigator_test_kernel<<>>( - det_data, cfg, tracks_data, volume_records_data, position_records_data); + det_data, nav_cfg, step_cfg, tracks_data, volume_records_data, + position_records_data); // cuda error check DETRAY_CUDA_ERROR_CHECK(cudaGetLastError()); diff --git a/tests/unit_tests/device/cuda/navigator_cuda_kernel.hpp b/tests/unit_tests/device/cuda/navigator_cuda_kernel.hpp index 5bddc8be9..1e44e6c90 100644 --- a/tests/unit_tests/device/cuda/navigator_cuda_kernel.hpp +++ b/tests/unit_tests/device/cuda/navigator_cuda_kernel.hpp @@ -55,7 +55,8 @@ namespace detray { /// test function for navigator with single state void navigator_test( - typename detector_host_t::view_type det_data, navigation::config& cfg, + typename detector_host_t::view_type det_data, navigation::config& nav_cfg, + stepping::config& step_cfg, vecmem::data::vector_view>& tracks_data, vecmem::data::jagged_vector_view& volume_records_data, vecmem::data::jagged_vector_view& position_records_data); diff --git a/tutorials/src/cpu/propagation/navigation_inspection.cpp b/tutorials/src/cpu/propagation/navigation_inspection.cpp index 35e82c194..dd63a16fb 100644 --- a/tutorials/src/cpu/propagation/navigation_inspection.cpp +++ b/tutorials/src/cpu/propagation/navigation_inspection.cpp @@ -70,7 +70,8 @@ int main() { typename toy_detector_t::geometry_context gctx{}; // Build the propagator - propagator_t prop{}; + detray::propagation::config prop_cfg{}; + propagator_t prop{prop_cfg}; // Track generation config // Trivial example: Single track escapes through beampipe From 2c2fc94d1849bb8009cb9151daad491126bafe05 Mon Sep 17 00:00:00 2001 From: Joana Niermann Date: Wed, 16 Oct 2024 11:28:09 +0200 Subject: [PATCH 2/2] Fix navigation assertions that failed in conjunction with navigation validation tools --- io/include/detray/io/csv/track_parameters.hpp | 4 +++- .../detray/test/validation/step_tracer.hpp | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/io/include/detray/io/csv/track_parameters.hpp b/io/include/detray/io/csv/track_parameters.hpp index ae600fa4c..af0a57bd9 100644 --- a/io/include/detray/io/csv/track_parameters.hpp +++ b/io/include/detray/io/csv/track_parameters.hpp @@ -134,7 +134,9 @@ inline void write_free_track_params( for (const auto &[charge, track_param] : track_params) { const auto &glob_pos = track_param.pos(); - const auto &p = track_param.mom(charge); + // Momentum may not be retrievable for straight-line tracks + const auto &p{charge != 0.f ? track_param.mom(charge) + : track_param.dir()}; io::csv::free_track_parameters track_param_data{}; track_param_data.track_id = track_idx; diff --git a/tests/include/detray/test/validation/step_tracer.hpp b/tests/include/detray/test/validation/step_tracer.hpp index 2ed72b4ef..55fe0ba99 100644 --- a/tests/include/detray/test/validation/step_tracer.hpp +++ b/tests/include/detray/test/validation/step_tracer.hpp @@ -92,13 +92,21 @@ struct step_tracer : actor { const auto& navigation = prop_state._navigation; const auto& stepping = prop_state._stepping; + const bool is_on_sf{navigation.is_on_module() || + navigation.is_on_portal()}; + // Collect the data whenever requested - if (navigation.is_on_module() || navigation.is_on_portal() || - tracer_state.m_collect_every_step) { + if (is_on_sf || tracer_state.m_collect_every_step) { + + const geometry::barcode bcd{is_on_sf ? navigation.barcode() + : geometry::barcode{}}; - step_data_t sd{stepping.step_size(), stepping.path_length(), - stepping.n_total_trials(), navigation.direction(), - navigation.barcode(), stepping(), + step_data_t sd{stepping.step_size(), + stepping.path_length(), + stepping.n_total_trials(), + navigation.direction(), + bcd, + stepping(), stepping.transport_jacobian()}; tracer_state.m_steps.push_back(std::move(sd));