File indexing completed on 2026-05-27 07:24:26
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/navigation/volume_graph.hpp"
0011 #include "detray/tracks/ray.hpp"
0012 #include "detray/utils/logging.hpp"
0013
0014
0015 #include "detray/test/common/build_toy_detector.hpp"
0016 #include "detray/test/common/track_generators.hpp"
0017 #include "detray/test/utils/hash_tree.hpp"
0018 #include "detray/test/validation/detector_scan_utils.hpp"
0019 #include "detray/test/validation/detector_scanner.hpp"
0020
0021
0022 #include "detray/tutorial/types.hpp"
0023
0024
0025 #include <vecmem/memory/host_memory_resource.hpp>
0026
0027
0028 #include <iostream>
0029
0030
0031 constexpr std::size_t root_hash = 11359580520962287982ul;
0032
0033
0034
0035
0036
0037
0038
0039 int main() {
0040 using algebra_t = detray::tutorial::algebra_t;
0041 using scalar = detray::tutorial::scalar;
0042
0043
0044 using ray_t = detray::detail::ray<algebra_t>;
0045
0046 std::clog << "Ray Scan Tutorial\n=================\n\n";
0047
0048
0049 vecmem::host_memory_resource host_mr;
0050 const auto [det, names] = detray::build_toy_detector<algebra_t>(host_mr);
0051
0052
0053 using detector_t = decltype(det);
0054 const detector_t::geometry_context gctx{};
0055
0056
0057 detray::svgtools::styling::style svg_style =
0058 detray::svgtools::styling::tableau_colorblind::style;
0059
0060
0061 detray::volume_graph graph(det);
0062 const auto &adj_mat = graph.adjacency_matrix();
0063 detray::dvector<detray::dindex> adj_mat_scan(adj_mat.size(), 0);
0064
0065
0066 std::unordered_set<detray::dindex> obj_hashes = {};
0067
0068
0069 detray::dindex start_index{0u};
0070 std::size_t n_rays{0u};
0071
0072
0073 using generator_t =
0074 detray::detail::random_numbers<scalar,
0075 std::uniform_real_distribution<scalar>>;
0076 using ray_generator_t = detray::random_track_generator<ray_t, generator_t>;
0077
0078 ray_generator_t::configuration cfg{};
0079 cfg.n_tracks(10000).p_T(1.f * detray::unit<scalar>::GeV);
0080
0081 ray_generator_t ray_generator{cfg};
0082
0083
0084 DETRAY_INFO_HOST("\nScanning " << det.name(names) << " ("
0085 << ray_generator.size() << " rays) ...\n");
0086
0087 bool success = true;
0088 for (const auto ray : ray_generator) {
0089
0090 const auto intersection_trace =
0091 detray::detector_scanner::run<detray::ray_scan>(gctx, det, ray);
0092
0093 bool check_result = detray::detector_scanner::check_trace<detector_t>(
0094 intersection_trace, start_index, adj_mat_scan, obj_hashes);
0095
0096 if (!check_result) {
0097
0098 using intersection_trace_t = decltype(intersection_trace);
0099
0100 detray::detector_scanner::display_error(
0101 gctx, det, names, "ray_scan_tutorial", ray, intersection_trace,
0102 svg_style, n_rays, ray_generator.size(), intersection_trace_t{});
0103 }
0104 success = success && check_result;
0105
0106 ++n_rays;
0107 }
0108
0109
0110 DETRAY_INFO_HOST("Ray scan: " << (success ? "OK" : "FAILURE"));
0111
0112
0113
0114
0115 auto geo_checker = detray::hash_tree(adj_mat);
0116 const bool check_links = (geo_checker.root() == root_hash);
0117
0118 DETRAY_INFO_HOST("All links reachable: " << (check_links ? "OK" : "FAILURE"));
0119 }