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/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/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..9827dea3c 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); diff --git a/tests/unit_tests/cpu/navigation/navigator.cpp b/tests/unit_tests/cpu/navigation/navigator.cpp index fbec4a447..e196b7e03 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) @@ -325,10 +330,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)}; @@ -351,7 +358,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); @@ -361,14 +368,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 @@ -377,15 +384,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); @@ -431,17 +438,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 @@ -450,7 +458,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