File indexing completed on 2025-07-15 08:11:53
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Material/GridSurfaceMaterial.hpp"
0012 #include "Acts/Material/MaterialSlab.hpp"
0013 #include "Acts/Utilities/GridAccessHelpers.hpp"
0014 #include "Acts/Utilities/ProtoAxis.hpp"
0015
0016 #include <memory>
0017 #include <vector>
0018
0019 namespace Acts::GridSurfaceMaterialFactory {
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 template <typename material_accessor_t>
0031 std::unique_ptr<
0032 IGridSurfaceMaterial<typename material_accessor_t::grid_value_type>>
0033 create1D(
0034 const ProtoAxis& pAxis, material_accessor_t&& materialAccessor,
0035 GridAccess::BoundToGridLocal1DimDelegate boundToGridLocal,
0036 GridAccess::GlobalToGridLocal1DimDelegate globalToGridLocal,
0037 const std::vector<typename material_accessor_t::grid_value_type>& payload) {
0038
0039 auto ism = pAxis.getAxis().visit(
0040 [&]<typename AxisType>(const AxisType& axis)
0041 -> std::unique_ptr<IGridSurfaceMaterial<
0042 typename material_accessor_t::grid_value_type>> {
0043 using GridType =
0044 Grid<typename material_accessor_t::grid_value_type, AxisType>;
0045 return std::make_unique<
0046 GridSurfaceMaterialT<GridType, material_accessor_t>>(
0047 GridType(axis), std::forward<material_accessor_t>(materialAccessor),
0048 std::move(boundToGridLocal), std::move(globalToGridLocal));
0049 });
0050
0051 AnyGridView<typename material_accessor_t::grid_value_type> gv =
0052 ism->gridView();
0053 auto indices = gv.numLocalBins();
0054 for (std::size_t i0 = 0; i0 < indices[0]; ++i0) {
0055
0056 gv.atLocalBins({i0 + 1u}) = payload[i0];
0057 }
0058 return ism;
0059 }
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 template <typename material_accessor_t>
0073 std::unique_ptr<
0074 IGridSurfaceMaterial<typename material_accessor_t::grid_value_type>>
0075 create2D(
0076 const ProtoAxis& pAxis0, const ProtoAxis& pAxis1,
0077 material_accessor_t&& materialAccessor,
0078 GridAccess::BoundToGridLocal2DimDelegate boundToGridLocal,
0079 GridAccess::GlobalToGridLocal2DimDelegate globalToGridLocal,
0080 const std::vector<
0081 std::vector<typename material_accessor_t::grid_value_type>>& payload) {
0082
0083 auto ism = pAxis0.getAxis().visit(
0084 [&]<typename AxisTypeA>(const AxisTypeA& axisA)
0085 -> std::unique_ptr<IGridSurfaceMaterial<
0086 typename material_accessor_t::grid_value_type>> {
0087 return pAxis1.getAxis().visit(
0088 [&]<typename AxisTypeB>(const AxisTypeB& axisB)
0089 -> std::unique_ptr<IGridSurfaceMaterial<
0090 typename material_accessor_t::grid_value_type>> {
0091 using GridType =
0092 Grid<typename material_accessor_t::grid_value_type, AxisTypeA,
0093 AxisTypeB>;
0094 return std::make_unique<
0095 GridSurfaceMaterialT<GridType, material_accessor_t>>(
0096 GridType(axisA, axisB),
0097 std::forward<material_accessor_t>(materialAccessor),
0098 std::move(boundToGridLocal), std::move(globalToGridLocal));
0099 });
0100 });
0101
0102
0103 AnyGridView<typename material_accessor_t::grid_value_type> gv =
0104 ism->gridView();
0105 auto indices = gv.numLocalBins();
0106 for (std::size_t i0 = 0; i0 < indices[0]; ++i0) {
0107 for (std::size_t i1 = 0; i1 < indices[1]; ++i1) {
0108
0109 gv.atLocalBins({i0 + 1, i1 + 1}) = payload[i0][i1];
0110 }
0111 }
0112
0113 return ism;
0114 }
0115
0116
0117
0118
0119
0120
0121
0122
0123 std::unique_ptr<IGridSurfaceMaterial<MaterialSlab>> create(
0124 const ProtoAxis& pAxis, GridMaterialAccessor&& materialAccessor,
0125 GridAccess::BoundToGridLocal1DimDelegate boundToGridLocal,
0126 GridAccess::GlobalToGridLocal1DimDelegate globalToGridLocal,
0127 const std::vector<MaterialSlab>& payload);
0128
0129
0130
0131
0132
0133
0134
0135
0136 std::unique_ptr<IGridSurfaceMaterial<IndexedMaterialAccessor::grid_value_type>>
0137 create(const ProtoAxis& pAxis, IndexedMaterialAccessor&& materialAccessor,
0138 GridAccess::BoundToGridLocal1DimDelegate boundToGridLocal,
0139 GridAccess::GlobalToGridLocal1DimDelegate globalToGridLocal,
0140 const std::vector<IndexedMaterialAccessor::grid_value_type>& payload);
0141
0142
0143
0144
0145
0146
0147
0148
0149 std::unique_ptr<
0150 IGridSurfaceMaterial<GloballyIndexedMaterialAccessor::grid_value_type>>
0151 create(const ProtoAxis& pAxis,
0152 GloballyIndexedMaterialAccessor&& materialAccessor,
0153 GridAccess::BoundToGridLocal1DimDelegate boundToGridLocal,
0154 GridAccess::GlobalToGridLocal1DimDelegate globalToGridLocal,
0155 const std::vector<GloballyIndexedMaterialAccessor::grid_value_type>&
0156 payload);
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166 std::unique_ptr<IGridSurfaceMaterial<MaterialSlab>> create(
0167 const ProtoAxis& pAxis0, const ProtoAxis& pAxis1,
0168 GridMaterialAccessor&& materialAccessor,
0169 GridAccess::BoundToGridLocal2DimDelegate boundToGridLocal,
0170 GridAccess::GlobalToGridLocal2DimDelegate globalToGridLocal,
0171 const std::vector<std::vector<MaterialSlab>>& payload);
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 std::unique_ptr<IGridSurfaceMaterial<IndexedMaterialAccessor::grid_value_type>>
0182 create(const ProtoAxis& pAxis0, const ProtoAxis& pAxis1,
0183 IndexedMaterialAccessor&& materialAccessor,
0184 GridAccess::BoundToGridLocal2DimDelegate boundToGridLocal,
0185 GridAccess::GlobalToGridLocal2DimDelegate globalToGridLocal,
0186 const std::vector<std::vector<IndexedMaterialAccessor::grid_value_type>>&
0187 payload);
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 std::unique_ptr<
0198 IGridSurfaceMaterial<GloballyIndexedMaterialAccessor::grid_value_type>>
0199 create(const ProtoAxis& pAxis0, const ProtoAxis& pAxis1,
0200 GloballyIndexedMaterialAccessor&& materialAccessor,
0201 GridAccess::BoundToGridLocal2DimDelegate boundToGridLocal,
0202 GridAccess::GlobalToGridLocal2DimDelegate globalToGridLocal,
0203 const std::vector<
0204 std::vector<GloballyIndexedMaterialAccessor::grid_value_type>>&
0205 payload);
0206 }