diff --git a/CMakeLists.txt b/CMakeLists.txt index d7d496e60e..e2a06d0c0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,7 +87,11 @@ endif() # In order to generate specializations for our kernels, we need to have both # a working Python interpreter, and a list of supported detectors. find_package (Python COMPONENTS Interpreter REQUIRED) -set(TRACCC_SUPPORTED_DETECTORS "default_detector;telescope_detector;toy_detector") +# The detector types supported by this build of traccc. +set( TRACCC_SUPPORTED_DETECTORS + "default_detector;odd_detector;telescope_detector" + CACHE STRING + "Semicolon-separated list of detector types to support in this build" ) # Set up build profiling for the project. if( CTEST_USE_LAUNCHERS ) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a970dfb48c..17b2ba4a73 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -148,3 +148,17 @@ target_compile_definitions( traccc_core # Set the algebra-plugins plugin to use. message(STATUS "Building with plugin type: " ${TRACCC_ALGEBRA_PLUGINS}) target_compile_definitions(traccc_core PUBLIC ALGEBRA_PLUGINS_INCLUDE_${TRACCC_ALGEBRA_PLUGINS}) + +string(REPLACE ";" ", " TRACCC_DETECTOR_TYPES "${TRACCC_SUPPORTED_DETECTORS}") +message(STATUS "Building with detector types: ${TRACCC_DETECTOR_TYPES}") +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/include/traccc/geometry/detector_type_list.hpp.in" + "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/include/traccc/geometry/detector_type_list.hpp" + @ONLY) + +target_include_directories(traccc_core + PUBLIC $ ) + +install( + DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/include/" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) diff --git a/core/include/traccc/geometry/detector.hpp b/core/include/traccc/geometry/detector.hpp index 8cabc423a8..bd225573a5 100644 --- a/core/include/traccc/geometry/detector.hpp +++ b/core/include/traccc/geometry/detector.hpp @@ -13,6 +13,8 @@ // Detray include(s). #include #include +#include +#include #include #include @@ -75,17 +77,24 @@ concept is_detector_traits = requires { typename T::buffer; }; -/// Default detector (also used for ODD) +/// Default detector (can contain any detector data) using default_detector = detector_traits>; -/// Telescope detector +/// ATLAS Inner Tracker (ITk) detector +using itk_detector = + detector_traits>; + +/// Open Data Detector (ODD) detector +using odd_detector = + detector_traits>; + +/// Detray telescope detector (test detector) using telescope_detector = detector_traits< detray::telescope_metadata>; -/// Toy detector +/// Detray toy detector (test detector) using toy_detector = detector_traits>; -using detector_type_list = std::tuple; } // namespace traccc diff --git a/core/include/traccc/geometry/detector_buffer.hpp b/core/include/traccc/geometry/detector_buffer.hpp index c8873de35e..d01f9a16f3 100644 --- a/core/include/traccc/geometry/detector_buffer.hpp +++ b/core/include/traccc/geometry/detector_buffer.hpp @@ -9,6 +9,7 @@ // Project include(s). #include "traccc/geometry/detector.hpp" +#include "traccc/geometry/detector_type_list.hpp" #include "traccc/geometry/host_detector.hpp" #include "traccc/geometry/move_only_any.hpp" diff --git a/core/include/traccc/geometry/detector_type_list.hpp.in b/core/include/traccc/geometry/detector_type_list.hpp.in new file mode 100644 index 0000000000..da6d0baf77 --- /dev/null +++ b/core/include/traccc/geometry/detector_type_list.hpp.in @@ -0,0 +1,21 @@ +/** TRACCC library, part of the ACTS project (R&D line) + * + * (c) 2024-2025 CERN for the benefit of the ACTS project + * + * Mozilla Public License Version 2.0 + */ + +#pragma once + +// Local include(s). +#include "traccc/geometry/detector.hpp" + +// System include(s). +#include + +namespace traccc { + +/// Detector types supported by the built libraries. +using detector_type_list = std::tuple<@TRACCC_DETECTOR_TYPES@>; + +} // namespace traccc diff --git a/core/include/traccc/geometry/host_detector.hpp b/core/include/traccc/geometry/host_detector.hpp index 737aba0458..08c7b2b845 100644 --- a/core/include/traccc/geometry/host_detector.hpp +++ b/core/include/traccc/geometry/host_detector.hpp @@ -1,6 +1,6 @@ /** TRACCC library, part of the ACTS project (R&D line) * - * (c) 2024 CERN for the benefit of the ACTS project + * (c) 2025 CERN for the benefit of the ACTS project * * Mozilla Public License Version 2.0 */ @@ -9,6 +9,7 @@ // Project include(s). #include "traccc/geometry/detector.hpp" +#include "traccc/geometry/detector_type_list.hpp" #include "traccc/geometry/move_only_any.hpp" // Detray include(s). diff --git a/device/sycl/src/finding/combinatorial_kalman_filter_algorithm.sycl b/device/sycl/src/finding/combinatorial_kalman_filter_algorithm.sycl index 513b91454d..81a9ec5715 100644 --- a/device/sycl/src/finding/combinatorial_kalman_filter_algorithm.sycl +++ b/device/sycl/src/finding/combinatorial_kalman_filter_algorithm.sycl @@ -14,6 +14,7 @@ // Project include(s). #include "traccc/bfield/magnetic_field_types.hpp" +#include "traccc/geometry/detector_type_list.hpp" #include "traccc/utils/detector_buffer_bfield_visitor.hpp" #include "traccc/utils/propagation.hpp" @@ -35,7 +36,7 @@ combinatorial_kalman_filter_algorithm::operator()( // Perform the track finding using the templated implementation. return detector_buffer_magnetic_field_visitor< - detector_type_list, sycl::bfield_type_list>( + traccc::detector_type_list, sycl::bfield_type_list>( detector, field, [&]( const typename detector_t::view& det, const bfield_view_t& bfield) { diff --git a/device/sycl/src/utils/detector_types.hpp b/device/sycl/src/utils/detector_types.hpp index babc4fd073..72f7f5951c 100644 --- a/device/sycl/src/utils/detector_types.hpp +++ b/device/sycl/src/utils/detector_types.hpp @@ -9,6 +9,7 @@ #include "traccc/definitions/primitives.hpp" #include "traccc/geometry/detector.hpp" +#include "traccc/geometry/detector_type_list.hpp" namespace traccc::sycl { @@ -18,20 +19,32 @@ namespace traccc::sycl { */ struct default_detector_kernel_tag {}; struct telescope_detector_kernel_tag {}; +struct odd_detector_kernel_tag {}; +struct itk_detector_kernel_tag {}; template struct detector_tag_selector {}; template <> -struct detector_tag_selector { +struct detector_tag_selector { using type = default_detector_kernel_tag; }; template <> -struct detector_tag_selector { +struct detector_tag_selector { using type = telescope_detector_kernel_tag; }; +template <> +struct detector_tag_selector { + using type = odd_detector_kernel_tag; +}; + +template <> +struct detector_tag_selector { + using type = itk_detector_kernel_tag; +}; + template using detector_tag_selector_t = typename detector_tag_selector::type; @@ -48,7 +61,7 @@ struct detector_tag_existance_validator> { }; static_assert( - detector_tag_existance_validator::value, + detector_tag_existance_validator::value, "Not all detector types registered for SYCL have an accompanying tag"); } // namespace traccc::sycl diff --git a/io/src/read_detector.cpp b/io/src/read_detector.cpp index 842bff2c49..cc6dbbf184 100644 --- a/io/src/read_detector.cpp +++ b/io/src/read_detector.cpp @@ -59,8 +59,11 @@ void read_detector(host_detector& detector, vecmem::memory_resource& mr, // TODO: Update this if (header.detector == "Cylindrical detector from DD4hep blueprint") { - ::read_detector(detector, mr, geometry_file, - material_file, grid_file); + ::read_detector(detector, mr, geometry_file, + material_file, grid_file); + } else if (header.detector == "detray_detector") { + ::read_detector(detector, mr, geometry_file, + material_file, grid_file); } else { // TODO: Warning here ::read_detector(detector, mr, geometry_file, diff --git a/io/src/read_detector_description.cpp b/io/src/read_detector_description.cpp index 4a0b163488..61d3d30982 100644 --- a/io/src/read_detector_description.cpp +++ b/io/src/read_detector_description.cpp @@ -15,6 +15,7 @@ // Detray include(s) #include +#include #include // VecMem include(s). @@ -49,8 +50,8 @@ void read_json_dd_impl(traccc::silicon_detector_description::host& dd, const traccc::digitization_config& digi) requires(traccc::is_detector_traits) { - const traccc::default_detector::host& detector_host = - detector.as(); + const typename detector_traits_t::host& detector_host = + detector.as(); // Iterate over the surfaces of the detector. const typename detector_traits_t::host::surface_lookup_container& surfaces = @@ -118,8 +119,19 @@ void read_json_dd(traccc::silicon_detector_description::host& dd, traccc::host_detector detector; traccc::io::read_detector(detector, mr, geometry_file); - read_json_dd_impl(dd, detector, digi); - // detector_buffer_visitor + // TODO: Implement detector visitor! + // Peek at the header to determine the kind of detector that is needed + const auto header = detray::io::detail::deserialize_json_header( + traccc::io::get_absolute_path(geometry_file)); + + if (header.detector == "Cylindrical detector from DD4hep blueprint") { + read_json_dd_impl(dd, detector, digi); + } else if (header.detector == "detray_detector") { + read_json_dd_impl(dd, detector, digi); + } else { + // TODO: Warning here + read_json_dd_impl(dd, detector, digi); + } } } // namespace