File indexing completed on 2025-08-05 08:10:06
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/Geometry/GeometryContext.hpp"
0010 #include "Acts/MagneticField/MagneticFieldContext.hpp"
0011 #include "Acts/Material/BinnedSurfaceMaterialAccumulater.hpp"
0012 #include "Acts/Material/IMaterialDecorator.hpp"
0013 #include "Acts/Material/IntersectionMaterialAssigner.hpp"
0014 #include "Acts/Material/MaterialMapper.hpp"
0015 #include "Acts/Material/PropagatorMaterialAssigner.hpp"
0016 #include "Acts/Material/SurfaceMaterialMapper.hpp"
0017 #include "Acts/Material/VolumeMaterialMapper.hpp"
0018 #include "Acts/Plugins/Python/Utilities.hpp"
0019 #include "Acts/Utilities/Logger.hpp"
0020 #include "ActsExamples/Framework/ProcessCode.hpp"
0021 #include "ActsExamples/Io/Root/RootMaterialDecorator.hpp"
0022 #include "ActsExamples/MaterialMapping/CoreMaterialMapping.hpp"
0023 #include "ActsExamples/MaterialMapping/MappingMaterialDecorator.hpp"
0024 #include "ActsExamples/MaterialMapping/MaterialMapping.hpp"
0025
0026 #include <array>
0027 #include <map>
0028 #include <memory>
0029 #include <tuple>
0030 #include <utility>
0031 #include <vector>
0032
0033 #include <pybind11/pybind11.h>
0034 #include <pybind11/stl.h>
0035
0036 namespace Acts {
0037 class TrackingGeometry;
0038 }
0039 namespace ActsExamples {
0040 class IAlgorithm;
0041 }
0042
0043 namespace py = pybind11;
0044 using namespace pybind11::literals;
0045
0046 using namespace ActsExamples;
0047
0048 namespace Acts::Python {
0049 void addMaterial(Context& ctx) {
0050 auto [m, mex] = ctx.get("main", "examples");
0051 {
0052 py::class_<Acts::IMaterialDecorator,
0053 std::shared_ptr<Acts::IMaterialDecorator>>(m,
0054 "IMaterialDecorator");
0055 }
0056
0057 {
0058 auto rmd =
0059 py::class_<RootMaterialDecorator, Acts::IMaterialDecorator,
0060 std::shared_ptr<RootMaterialDecorator>>(
0061 mex, "RootMaterialDecorator")
0062 .def(
0063 py::init<RootMaterialDecorator::Config, Acts::Logging::Level>(),
0064 py::arg("config"), py::arg("level"));
0065
0066 using Config = RootMaterialDecorator::Config;
0067 auto c = py::class_<Config>(rmd, "Config").def(py::init<>());
0068
0069 ACTS_PYTHON_STRUCT_BEGIN(c, Config);
0070 ACTS_PYTHON_MEMBER(voltag);
0071 ACTS_PYTHON_MEMBER(boutag);
0072 ACTS_PYTHON_MEMBER(laytag);
0073 ACTS_PYTHON_MEMBER(apptag);
0074 ACTS_PYTHON_MEMBER(sentag);
0075 ACTS_PYTHON_MEMBER(ntag);
0076 ACTS_PYTHON_MEMBER(vtag);
0077 ACTS_PYTHON_MEMBER(otag);
0078 ACTS_PYTHON_MEMBER(mintag);
0079 ACTS_PYTHON_MEMBER(maxtag);
0080 ACTS_PYTHON_MEMBER(ttag);
0081 ACTS_PYTHON_MEMBER(x0tag);
0082 ACTS_PYTHON_MEMBER(l0tag);
0083 ACTS_PYTHON_MEMBER(atag);
0084 ACTS_PYTHON_MEMBER(ztag);
0085 ACTS_PYTHON_MEMBER(rhotag);
0086 ACTS_PYTHON_MEMBER(fileName);
0087 ACTS_PYTHON_STRUCT_END();
0088 }
0089
0090 {
0091 py::class_<MappingMaterialDecorator, Acts::IMaterialDecorator,
0092 std::shared_ptr<MappingMaterialDecorator>>(
0093 m, "MappingMaterialDecorator")
0094 .def(py::init<const Acts::TrackingGeometry&, Acts::Logging::Level, bool,
0095 bool>(),
0096 py::arg("tGeometry"), py::arg("level"),
0097 py::arg("clearSurfaceMaterial") = true,
0098 py::arg("clearVolumeMaterial") = true)
0099 .def("binningMap", &MappingMaterialDecorator::binningMap)
0100 .def("setBinningMap", &MappingMaterialDecorator::setBinningMap);
0101 }
0102
0103 {
0104 using Alg = ActsExamples::MaterialMapping;
0105
0106 auto alg = py::class_<Alg, ActsExamples::IAlgorithm, std::shared_ptr<Alg>>(
0107 mex, "MaterialMapping")
0108 .def(py::init<const Alg::Config&, Acts::Logging::Level>(),
0109 py::arg("config"), py::arg("level"))
0110 .def("scoringParameters", &Alg::scoringParameters)
0111 .def_property_readonly("config", &Alg::config);
0112
0113 auto c = py::class_<Alg::Config>(alg, "Config")
0114 .def(py::init<const Acts::GeometryContext&,
0115 const Acts::MagneticFieldContext&>());
0116
0117 ACTS_PYTHON_STRUCT_BEGIN(c, Alg::Config);
0118 ACTS_PYTHON_MEMBER(inputMaterialTracks);
0119 ACTS_PYTHON_MEMBER(mappingMaterialCollection);
0120 ACTS_PYTHON_MEMBER(materialSurfaceMapper);
0121 ACTS_PYTHON_MEMBER(materialVolumeMapper);
0122 ACTS_PYTHON_MEMBER(materialWriters);
0123 ACTS_PYTHON_MEMBER(trackingGeometry);
0124 ACTS_PYTHON_MEMBER(geoContext);
0125 ACTS_PYTHON_MEMBER(magFieldContext);
0126 ACTS_PYTHON_STRUCT_END();
0127 }
0128
0129 {
0130 auto cls =
0131 py::class_<SurfaceMaterialMapper,
0132 std::shared_ptr<SurfaceMaterialMapper>>(
0133 m, "SurfaceMaterialMapper")
0134 .def(py::init([](const SurfaceMaterialMapper::Config& config,
0135 SurfaceMaterialMapper::StraightLinePropagator prop,
0136 Acts::Logging::Level level) {
0137 return std::make_shared<SurfaceMaterialMapper>(
0138 config, std::move(prop),
0139 getDefaultLogger("SurfaceMaterialMapper", level));
0140 }),
0141 py::arg("config"), py::arg("propagator"), py::arg("level"));
0142
0143 auto c = py::class_<SurfaceMaterialMapper::Config>(cls, "Config")
0144 .def(py::init<>());
0145 ACTS_PYTHON_STRUCT_BEGIN(c, SurfaceMaterialMapper::Config);
0146 ACTS_PYTHON_MEMBER(etaRange);
0147 ACTS_PYTHON_MEMBER(emptyBinCorrection);
0148 ACTS_PYTHON_MEMBER(mapperDebugOutput);
0149 ACTS_PYTHON_MEMBER(computeVariance);
0150 ACTS_PYTHON_STRUCT_END();
0151 }
0152
0153 {
0154 auto cls =
0155 py::class_<VolumeMaterialMapper, std::shared_ptr<VolumeMaterialMapper>>(
0156 m, "VolumeMaterialMapper")
0157 .def(py::init([](const VolumeMaterialMapper::Config& config,
0158 VolumeMaterialMapper::StraightLinePropagator prop,
0159 Acts::Logging::Level level) {
0160 return std::make_shared<VolumeMaterialMapper>(
0161 config, std::move(prop),
0162 getDefaultLogger("VolumeMaterialMapper", level));
0163 }),
0164 py::arg("config"), py::arg("propagator"), py::arg("level"));
0165
0166 auto c = py::class_<VolumeMaterialMapper::Config>(cls, "Config")
0167 .def(py::init<>());
0168 ACTS_PYTHON_STRUCT_BEGIN(c, VolumeMaterialMapper::Config);
0169 ACTS_PYTHON_MEMBER(mappingStep);
0170 ACTS_PYTHON_STRUCT_END();
0171 }
0172
0173 {
0174 py::class_<Acts::IAssignmentFinder,
0175 std::shared_ptr<Acts::IAssignmentFinder>>(m,
0176 "IAssignmentFinder");
0177 }
0178
0179 {
0180 auto isma =
0181 py::class_<Acts::IntersectionMaterialAssigner, Acts::IAssignmentFinder,
0182 std::shared_ptr<Acts::IntersectionMaterialAssigner>>(
0183 m, "IntersectionMaterialAssigner")
0184 .def(py::init([](const Acts::IntersectionMaterialAssigner::Config&
0185 config,
0186 Acts::Logging::Level level) {
0187 return std::make_shared<Acts::IntersectionMaterialAssigner>(
0188 config,
0189 getDefaultLogger("IntersectionMaterialAssigner", level));
0190 }),
0191 py::arg("config"), py::arg("level"))
0192 .def("assignmentCandidates",
0193 &Acts::IntersectionMaterialAssigner::assignmentCandidates);
0194
0195 auto c =
0196 py::class_<Acts::IntersectionMaterialAssigner::Config>(isma, "Config")
0197 .def(py::init<>());
0198 ACTS_PYTHON_STRUCT_BEGIN(c, Acts::IntersectionMaterialAssigner::Config);
0199 ACTS_PYTHON_MEMBER(surfaces);
0200 ACTS_PYTHON_MEMBER(trackingVolumes);
0201 ACTS_PYTHON_MEMBER(detectorVolumes);
0202 ACTS_PYTHON_STRUCT_END();
0203 }
0204
0205 {
0206 py::class_<Acts::ISurfaceMaterialAccumulater,
0207 std::shared_ptr<Acts::ISurfaceMaterialAccumulater>>(
0208 m, "ISurfaceMaterialAccumulater");
0209 }
0210
0211 {
0212 auto bsma =
0213 py::class_<BinnedSurfaceMaterialAccumulater,
0214 ISurfaceMaterialAccumulater,
0215 std::shared_ptr<BinnedSurfaceMaterialAccumulater>>(
0216 m, "BinnedSurfaceMaterialAccumulater")
0217 .def(
0218 py::init(
0219 [](const BinnedSurfaceMaterialAccumulater::Config& config,
0220 Acts::Logging::Level level) {
0221 return std::make_shared<BinnedSurfaceMaterialAccumulater>(
0222 config,
0223 getDefaultLogger("BinnedSurfaceMaterialAccumulater",
0224 level));
0225 }),
0226 py::arg("config"), py::arg("level"))
0227 .def("createState", &BinnedSurfaceMaterialAccumulater::createState)
0228 .def("accumulate", &BinnedSurfaceMaterialAccumulater::accumulate)
0229 .def("finalizeMaterial",
0230 &BinnedSurfaceMaterialAccumulater::finalizeMaterial);
0231
0232 auto c =
0233 py::class_<BinnedSurfaceMaterialAccumulater::Config>(bsma, "Config")
0234 .def(py::init<>());
0235 ACTS_PYTHON_STRUCT_BEGIN(c, BinnedSurfaceMaterialAccumulater::Config);
0236 ACTS_PYTHON_MEMBER(emptyBinCorrection);
0237 ACTS_PYTHON_MEMBER(materialSurfaces);
0238 ACTS_PYTHON_STRUCT_END();
0239 }
0240
0241 {
0242 auto mm = py::class_<MaterialMapper, std::shared_ptr<MaterialMapper>>(
0243 m, "MaterialMapper")
0244 .def(py::init([](const MaterialMapper::Config& config,
0245 Acts::Logging::Level level) {
0246 return std::make_shared<MaterialMapper>(
0247 config, getDefaultLogger("MaterialMapper", level));
0248 }),
0249 py::arg("config"), py::arg("level"));
0250
0251 auto c = py::class_<MaterialMapper::Config>(mm, "Config").def(py::init<>());
0252 ACTS_PYTHON_STRUCT_BEGIN(c, MaterialMapper::Config);
0253 ACTS_PYTHON_MEMBER(assignmentFinder);
0254 ACTS_PYTHON_MEMBER(surfaceMaterialAccumulater);
0255 ACTS_PYTHON_STRUCT_END();
0256 }
0257
0258 {
0259 auto mmca = py::class_<CoreMaterialMapping, IAlgorithm,
0260 std::shared_ptr<CoreMaterialMapping>>(
0261 mex, "CoreMaterialMapping")
0262 .def(py::init<const CoreMaterialMapping::Config&,
0263 Acts::Logging::Level>(),
0264 py::arg("config"), py::arg("level"));
0265
0266 auto c = py::class_<CoreMaterialMapping::Config>(mmca, "Config")
0267 .def(py::init<>());
0268 ACTS_PYTHON_STRUCT_BEGIN(c, CoreMaterialMapping::Config);
0269 ACTS_PYTHON_MEMBER(inputMaterialTracks);
0270 ACTS_PYTHON_MEMBER(mappedMaterialTracks);
0271 ACTS_PYTHON_MEMBER(unmappedMaterialTracks);
0272 ACTS_PYTHON_MEMBER(materialMapper);
0273 ACTS_PYTHON_MEMBER(materiaMaplWriters);
0274 ACTS_PYTHON_STRUCT_END();
0275 }
0276 }
0277
0278 }