Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:11

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 // Project include(s)
0010 #include "detray/navigation/caching_navigator.hpp"
0011 #include "detray/propagator/actors.hpp"
0012 #include "detray/propagator/actors/parameter_updater.hpp"
0013 #include "detray/propagator/rk_stepper.hpp"
0014 #include "detray/tracks/tracks.hpp"
0015 
0016 // Detray benchmark include(s)
0017 #include "detray/benchmarks/cpu/propagation_benchmark.hpp"
0018 #include "detray/benchmarks/types.hpp"
0019 
0020 // Detray test include(s)
0021 #include "detray/test/common/bfield.hpp"
0022 #include "detray/test/common/build_toy_detector.hpp"
0023 #include "detray/test/common/build_wire_chamber.hpp"
0024 #include "detray/test/common/track_generators.hpp"
0025 
0026 // Vecmem include(s)
0027 #include <vecmem/memory/host_memory_resource.hpp>
0028 
0029 // System include(s)
0030 #include <iostream>
0031 #include <string>
0032 
0033 using namespace detray;
0034 
0035 int main(int argc, char** argv) {
0036   using toy_detector_t = detector<benchmarks::toy_metadata>;
0037   using bench_algebra = typename toy_detector_t::algebra_type;
0038   using scalar = dscalar<bench_algebra>;
0039   using vector3 = dvector3D<bench_algebra>;
0040 
0041   using free_track_parameters_t = free_track_parameters<bench_algebra>;
0042   using uniform_gen_t =
0043       detail::random_numbers<scalar, std::uniform_real_distribution<scalar>>;
0044   using track_generator_t =
0045       random_track_generator<free_track_parameters_t, uniform_gen_t>;
0046 
0047   using field_t = bfield::const_field_t<scalar>;
0048   using stepper_t = rk_stepper<typename field_t::view_t, bench_algebra>;
0049   using empty_chain_t = actor_chain<>;
0050   using default_chain = actor_chain<actor::parameter_updater<
0051       bench_algebra, actor::pointwise_material_interactor<bench_algebra>>>;
0052 
0053   vecmem::host_memory_resource host_mr;
0054 
0055   //
0056   // Configuration
0057   //
0058 
0059   // Constant magnetic field
0060   vector3 B{static_cast<scalar>(0.f), static_cast<scalar>(0.f),
0061             2.f * unit<scalar>::T};
0062 
0063   // Configure toy detector
0064   toy_det_config<scalar> toy_cfg{};
0065   toy_cfg.use_material_maps(false).n_brl_layers(4u).n_edc_layers(7u);
0066 
0067   std::clog << toy_cfg << std::endl;
0068 
0069   // Configure wire chamber
0070   wire_chamber_config<scalar> wire_chamber_cfg{};
0071   wire_chamber_cfg.half_z(500.f * unit<scalar>::mm);
0072 
0073   std::clog << wire_chamber_cfg << std::endl;
0074 
0075   // Configure propagation
0076   propagation::config prop_cfg{};
0077   prop_cfg.navigation.search_window = {3u, 3u};
0078   // No scattering in test tracks
0079   prop_cfg.navigation.estimate_scattering_noise = false;
0080 
0081   std::clog << prop_cfg << std::endl;
0082 
0083   // Benchmark config
0084   detray::benchmarks::benchmark_base::configuration bench_cfg{};
0085 
0086   std::vector<int> n_tracks{8 * 8,     16 * 16,   32 * 32,  64 * 64,
0087                             128 * 128, 256 * 256, 512 * 512};
0088 
0089   auto trk_cfg =
0090       detray::benchmarks::get_default_trk_gen_config<track_generator_t>(
0091           n_tracks);
0092 
0093   // Specific configuration for the random track generation
0094   trk_cfg.seed(detail::random_numbers<scalar>::default_seed());
0095 
0096   // Add additional tracks for warmup
0097   bench_cfg.n_warmup(static_cast<int>(
0098       std::ceil(0.1f * static_cast<float>(trk_cfg.n_tracks()))));
0099   bench_cfg.do_warmup(true);
0100 
0101   //
0102   // Prepare data
0103   //
0104   auto track_samples =
0105       detray::benchmarks::generate_track_samples<track_generator_t>(
0106           &host_mr, n_tracks, trk_cfg);
0107 
0108   const auto [toy_det, names] =
0109       build_toy_detector<bench_algebra>(host_mr, toy_cfg);
0110   const auto [wire_chamber, _] =
0111       build_wire_chamber<bench_algebra>(host_mr, wire_chamber_cfg);
0112 
0113   auto bfield = create_const_field<scalar>(B);
0114 
0115   dtuple<> empty_state{};
0116 
0117   actor::parameter_updater_state<bench_algebra> updater_state{prop_cfg};
0118   actor::pointwise_material_interactor<bench_algebra>::state interactor_state{};
0119 
0120   auto actor_states =
0121       detail::make_tuple<dtuple>(updater_state, interactor_state);
0122 
0123   //
0124   // Register benchmarks
0125   //
0126   std::clog << "Propagation Benchmarks\n"
0127             << "----------------------\n\n";
0128 
0129   prop_cfg.stepping.do_covariance_transport = true;
0130   detray::benchmarks::register_benchmark<
0131       detray::benchmarks::host_propagation_bm, stepper_t, default_chain>(
0132       "TOY_DETECTOR_W_COV_TRANSPORT", bench_cfg, prop_cfg, toy_det, bfield,
0133       &actor_states, track_samples, n_tracks);
0134 
0135   prop_cfg.stepping.do_covariance_transport = false;
0136   detray::benchmarks::register_benchmark<
0137       detray::benchmarks::host_propagation_bm, stepper_t, empty_chain_t>(
0138       "TOY_DETECTOR", bench_cfg, prop_cfg, toy_det, bfield, &empty_state,
0139       track_samples, n_tracks);
0140 
0141   prop_cfg.stepping.do_covariance_transport = true;
0142   detray::benchmarks::register_benchmark<
0143       detray::benchmarks::host_propagation_bm, stepper_t, default_chain>(
0144       "WIRE_CHAMBER_W_COV_TRANSPORT", bench_cfg, prop_cfg, wire_chamber, bfield,
0145       &actor_states, track_samples, n_tracks);
0146 
0147   prop_cfg.stepping.do_covariance_transport = false;
0148   detray::benchmarks::register_benchmark<
0149       detray::benchmarks::host_propagation_bm, stepper_t, empty_chain_t>(
0150       "WIRE_CHAMBER", bench_cfg, prop_cfg, wire_chamber, bfield, &empty_state,
0151       track_samples, n_tracks);
0152 
0153   // Run benchmarks
0154   ::benchmark::Initialize(&argc, argv);
0155   ::benchmark::RunSpecifiedBenchmarks();
0156   ::benchmark::Shutdown();
0157 }