File indexing completed on 2025-11-04 09:23:14
0001
0002
0003
0004
0005
0006
0007
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 }
0053 }
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 }
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
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
0122
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
0137
0138 Identifier,
0139
0140
0141 DetectorElement
0142 };
0143 SensitiveStrategy sensitiveStrategy = SensitiveStrategy::Identifier;
0144
0145
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
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
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 }