Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-17 09:21:37

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 #include "Acts/Propagator/AtlasStepper.hpp"
0010 #include "Acts/Propagator/EigenStepper.hpp"
0011 #include "Acts/Propagator/Navigator.hpp"
0012 #include "Acts/Propagator/Propagator.hpp"
0013 #include "Acts/Propagator/StraightLineStepper.hpp"
0014 #include "Acts/Propagator/SympyStepper.hpp"
0015 #include "Acts/Utilities/Logger.hpp"
0016 #include "ActsPython/Utilities/Helpers.hpp"
0017 #include "ActsPython/Utilities/Macros.hpp"
0018 
0019 #include <memory>
0020 
0021 #include <pybind11/pybind11.h>
0022 #include <pybind11/stl.h>
0023 
0024 namespace py = pybind11;
0025 using namespace pybind11::literals;
0026 
0027 using namespace Acts;
0028 
0029 namespace ActsPython {
0030 
0031 template <typename stepper_t, typename navigator_t>
0032 void addPropagator(py::module_& m, const std::string& prefix) {
0033   using propagator_t = Propagator<stepper_t, navigator_t>;
0034   py::class_<propagator_t>(m, (prefix + "Propagator").c_str())
0035       .def(py::init<>([=](stepper_t stepper, navigator_t navigator,
0036                           Logging::Level level = Logging::Level::INFO) {
0037              return propagator_t{
0038                  std::move(stepper), std::move(navigator),
0039                  getDefaultLogger(prefix + "Propagator", level)};
0040            }),
0041            py::arg("stepper"), py::arg("navigator"),
0042            py::arg("level") = Logging::INFO);
0043 }
0044 
0045 /// @brief Bind propagation related functions to the Python module
0046 /// @param m The Python module to which the functions will be bound
0047 void addPropagation(py::module_& m) {
0048   {
0049     using Config = Navigator::Config;
0050     auto nav =
0051         py::class_<Navigator, std::shared_ptr<Navigator>>(m, "Navigator")
0052             .def(py::init<>([](Config cfg,
0053                                Logging::Level level = Logging::INFO) {
0054                    return Navigator{cfg, getDefaultLogger("Navigator", level)};
0055                  }),
0056                  py::arg("cfg"), py::arg("level") = Logging::INFO);
0057 
0058     auto c = py::class_<Config>(nav, "Config").def(py::init<>());
0059 
0060     ACTS_PYTHON_STRUCT(c, resolveMaterial, resolvePassive, resolveSensitive,
0061                        trackingGeometry);
0062   }
0063 
0064   {
0065     auto stepper = py::class_<AtlasStepper>(m, "AtlasStepper");
0066     stepper.def(py::init<std::shared_ptr<const MagneticFieldProvider>>());
0067     addPropagator<AtlasStepper, Navigator>(m, "Atlas");
0068   }
0069   {
0070     auto stepper = py::class_<EigenStepper<>>(m, "EigenStepper");
0071     stepper.def(py::init<std::shared_ptr<const MagneticFieldProvider>>());
0072     addPropagator<EigenStepper<>, Navigator>(m, "Eigen");
0073   }
0074   {
0075     auto stepper = py::class_<StraightLineStepper>(m, "StraightLineStepper");
0076     stepper.def(py::init<>());
0077     addPropagator<StraightLineStepper, Navigator>(m, "StraightLine");
0078   }
0079   {
0080     auto stepper = py::class_<SympyStepper>(m, "SympyStepper");
0081     stepper.def(py::init<std::shared_ptr<const MagneticFieldProvider>>());
0082     addPropagator<SympyStepper, Navigator>(m, "Sympy");
0083   }
0084 }
0085 
0086 }  // namespace ActsPython