Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-04 09:23:14

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 #pragma once
0010 
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Material/BinnedSurfaceMaterial.hpp"
0013 #include "Acts/Material/GridSurfaceMaterial.hpp"
0014 #include "Acts/Material/HomogeneousSurfaceMaterial.hpp"
0015 #include "Acts/Material/ProtoSurfaceMaterial.hpp"
0016 #include "Acts/Navigation/CylinderNavigationPolicy.hpp"
0017 #include "Acts/Navigation/INavigationPolicy.hpp"
0018 #include "Acts/Navigation/MultiLayerNavigationPolicy.hpp"
0019 #include "Acts/Navigation/MultiNavigationPolicy.hpp"
0020 #include "Acts/Navigation/SurfaceArrayNavigationPolicy.hpp"
0021 #include "Acts/Navigation/TryAllNavigationPolicy.hpp"
0022 #include "Acts/Utilities/Logger.hpp"
0023 #include "Acts/Utilities/TypeDispatcher.hpp"
0024 
0025 #include <map>
0026 #include <memory>
0027 
0028 namespace detray {
0029 
0030 using dindex = unsigned int;
0031 
0032 namespace io {
0033 
0034 struct detector_payload;
0035 struct transform_payload;
0036 struct mask_payload;
0037 struct surface_payload;
0038 struct volume_payload;
0039 struct material_slab_payload;
0040 struct material_volume_payload;
0041 struct detector_homogeneous_material_payload;
0042 
0043 template <typename, typename>
0044 struct grid_payload;
0045 enum class material_id : unsigned int;
0046 
0047 template <typename, typename>
0048 struct detector_grids_payload;
0049 
0050 enum class accel_id : unsigned int;
0051 
0052 }  // namespace io
0053 }  // namespace detray
0054 
0055 namespace Acts {
0056 class GeometryContext;
0057 class TrackingGeometry;
0058 class SurfaceBounds;
0059 class Surface;
0060 class Portal;
0061 class TrackingVolume;
0062 class PortalLinkBase;
0063 class MaterialSlab;
0064 class ISurfaceMaterial;
0065 }  // namespace Acts
0066 
0067 namespace ActsPlugins {
0068 
0069 class DetrayPayloadConverter {
0070  public:
0071   using DetraySurfaceMaterial =
0072       std::variant<detray::io::grid_payload<detray::io::material_slab_payload,
0073                                             detray::io::material_id>,
0074                    detray::io::material_slab_payload>;
0075 
0076   using DetraySurfaceGrid =
0077       detray::io::grid_payload<std::size_t, detray::io::accel_id>;
0078 
0079   /// Function type for looking up surface indices in detray conversion
0080   using SurfaceLookupFunction =
0081       std::function<std::size_t(const Acts::Surface*)>;
0082 
0083   static std::optional<DetraySurfaceMaterial> convertHomogeneousSurfaceMaterial(
0084       const Acts::HomogeneousSurfaceMaterial& material);
0085 
0086   static std::optional<DetraySurfaceMaterial> convertGridSurfaceMaterial(
0087       const Acts::IGridSurfaceMaterialBase& material);
0088 
0089   static std::optional<DetraySurfaceMaterial> convertBinnedSurfaceMaterial(
0090       const Acts::BinnedSurfaceMaterial& material);
0091 
0092   static std::optional<DetraySurfaceMaterial>
0093   convertProtoSurfaceMaterialBinUtility(
0094       const Acts::ProtoSurfaceMaterialT<Acts::BinUtility>& material);
0095 
0096   static std::optional<DetraySurfaceMaterial>
0097   convertProtoSurfaceMaterialProtoAxes(
0098       const Acts::ProtoSurfaceMaterialT<std::vector<Acts::DirectedProtoAxis>>&
0099           material);
0100 
0101   static std::optional<DetraySurfaceGrid> convertSurfaceArray(
0102       const Acts::SurfaceArrayNavigationPolicy& policy,
0103       const Acts::GeometryContext& gctx,
0104       const SurfaceLookupFunction& surfaceLookup, const Acts::Logger& logger);
0105 
0106   static std::optional<DetraySurfaceGrid> convertTryAllNavigationPolicy(
0107       const Acts::TryAllNavigationPolicy& policy,
0108       const Acts::GeometryContext& gctx,
0109       const SurfaceLookupFunction& surfaceLookup, const Acts::Logger& logger);
0110 
0111   static std::optional<DetraySurfaceGrid> convertCylinderNavigationPolicy(
0112       const Acts::CylinderNavigationPolicy& policy,
0113       const Acts::GeometryContext& gctx,
0114       const SurfaceLookupFunction& surfaceLookup, const Acts::Logger& logger);
0115 
0116   static std::optional<DetraySurfaceGrid> convertMultiLayerNavigationPolicy(
0117       const Acts::Experimental::MultiLayerNavigationPolicy& policy,
0118       const Acts::GeometryContext& gctx,
0119       const SurfaceLookupFunction& surfaceLookup, const Acts::Logger& logger);
0120 
0121   // This is a noop, the payload converter will actually traverse the children
0122   // via `visit`.
0123   static std::optional<DetraySurfaceGrid> convertMultiNavigationPolicy(
0124       const Acts::MultiNavigationPolicy& policy,
0125       const Acts::GeometryContext& gctx,
0126       const SurfaceLookupFunction& surfaceLookup, const Acts::Logger& logger);
0127 
0128   struct Config {
0129     Config() = default;
0130 
0131     Config(const Config&) = default;
0132     Config(Config&&) = default;
0133     Config& operator=(const Config&) = default;
0134     Config& operator=(Config&&) = default;
0135     enum class SensitiveStrategy {
0136       /// Checks if the sensitive component of the surface is set to check if
0137       /// it's a sensitive surface
0138       Identifier,
0139       /// Check if the surface is a sensitive surface by checking for an
0140       /// associated detector element
0141       DetectorElement
0142     };
0143     SensitiveStrategy sensitiveStrategy = SensitiveStrategy::Identifier;
0144 
0145     /// Detray MUST have beampipe volume at index 0
0146     const Acts::TrackingVolume* beampipeVolume = nullptr;
0147 
0148     Acts::TypeDispatcher<Acts::INavigationPolicy,
0149                          std::optional<DetraySurfaceGrid>(
0150                              const Acts::GeometryContext& gctx,
0151                              const SurfaceLookupFunction& surfaceLookup,
0152                              const Acts::Logger& logger)>
0153         convertNavigationPolicy{
0154             convertSurfaceArray, convertTryAllNavigationPolicy,
0155             convertCylinderNavigationPolicy, convertMultiLayerNavigationPolicy,
0156             convertMultiNavigationPolicy};
0157 
0158     Acts::TypeDispatcher<Acts::ISurfaceMaterial,
0159                          std::optional<DetraySurfaceMaterial>()>
0160         convertSurfaceMaterial{
0161             convertHomogeneousSurfaceMaterial, convertBinnedSurfaceMaterial,
0162             convertGridSurfaceMaterial, convertProtoSurfaceMaterialProtoAxes,
0163             convertProtoSurfaceMaterialBinUtility};
0164   };
0165 
0166   /// @param forPortal detray special cases the local parametrization for portals for performance reasons
0167   static detray::io::mask_payload convertMask(const Acts::SurfaceBounds& bounds,
0168                                               bool forPortal);
0169 
0170   detray::io::surface_payload convertSurface(const Acts::GeometryContext& gctx,
0171                                              const Acts::Surface& surface,
0172                                              bool portal = false) const;
0173 
0174   detray::io::volume_payload convertVolume(
0175       const Acts::TrackingVolume& volume) const;
0176 
0177   struct Payloads {
0178     // Unique pointers used to be able to forward declare the type
0179     std::unique_ptr<detray::io::detector_payload> detector;
0180 
0181     std::unique_ptr<detray::io::detector_homogeneous_material_payload>
0182         homogeneousMaterial;
0183 
0184     std::unique_ptr<detray::io::detector_grids_payload<
0185         detray::io::material_slab_payload, detray::io::material_id>>
0186         materialGrids;
0187 
0188     std::unique_ptr<
0189         detray::io::detector_grids_payload<std::size_t, detray::io::accel_id>>
0190         surfaceGrids;
0191 
0192     std::map<detray::dindex, std::string> names;
0193   };
0194 
0195   Payloads convertTrackingGeometry(
0196       const Acts::GeometryContext& gctx,
0197       const Acts::TrackingGeometry& geometry) const;
0198 
0199   explicit DetrayPayloadConverter(
0200       const Config& config,
0201       std::unique_ptr<const Acts::Logger> logger = Acts::getDefaultLogger(
0202           "DetrayPayloadConverter", Acts::Logging::INFO));
0203 
0204   std::pair<std::vector<detray::io::grid_payload<
0205                 detray::io::material_slab_payload, detray::io::material_id>>,
0206             detray::io::material_volume_payload>
0207   convertMaterial(const Acts::TrackingVolume& volume,
0208 
0209                   const std::unordered_map<const Acts::Surface*, std::size_t>&
0210                       surfaceIndices,
0211                   detray::io::volume_payload& volPayload) const;
0212 
0213  private:
0214   void handlePortalLink(
0215       const Acts::GeometryContext& gctx, const Acts::TrackingVolume& volume,
0216       detray::io::volume_payload& volPayload,
0217       const std ::function<std::size_t(const Acts::TrackingVolume*)>&
0218           volumeLookup,
0219       std::unordered_map<const Acts::Surface*, std::size_t>& surfaceIndices,
0220       const Acts::PortalLinkBase& link) const;
0221 
0222   void makeEndOfWorld(
0223       const Acts::GeometryContext& gctx, detray::io::volume_payload& volPayload,
0224       std::unordered_map<const Acts::Surface*, std::size_t>& surfaceIndices,
0225       const Acts::Surface& surface) const;
0226 
0227   void handlePortal(
0228       const Acts::GeometryContext& gctx, const Acts::TrackingVolume& volume,
0229       detray::io::volume_payload& volPayload,
0230       const std::function<std::size_t(const Acts::TrackingVolume*)>&
0231           volumeLookup,
0232       std::unordered_map<const Acts::Surface*, std::size_t>& surfaceIndices,
0233       const Acts::Portal& portal) const;
0234 
0235   Config m_cfg;
0236 
0237   const Acts::Logger& logger() const { return *m_logger; }
0238   std::unique_ptr<const Acts::Logger> m_logger;
0239 };
0240 
0241 class DetrayUnsupportedMaterialException : public std::runtime_error {
0242  public:
0243   explicit DetrayUnsupportedMaterialException(std::string_view name);
0244 };
0245 
0246 }  // namespace ActsPlugins