File indexing completed on 2026-07-16 08:08:08
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/MagneticField/MagneticFieldProvider.hpp"
0010 #include "ActsExamples/MagneticField/ToroidalField.hpp"
0011 #include "ActsExamples/MagneticField/ToroidalFieldMap.hpp"
0012
0013 #include <memory>
0014 #include <sstream>
0015 #include <stdexcept>
0016
0017 #include <pybind11/pybind11.h>
0018 #include <pybind11/stl.h>
0019
0020 namespace py = pybind11;
0021 using namespace Acts;
0022
0023
0024 Vector3 getField(ToroidalField& self, const Vector3& position,
0025 MagneticFieldProvider::Cache& cache) {
0026 if (Result<Vector3> res = self.getField(position, cache); !res.ok()) {
0027 std::stringstream ss;
0028 ss << "Field lookup failure with error: \"" << res.error() << "\"";
0029 throw std::runtime_error{ss.str()};
0030 } else {
0031 return *res;
0032 }
0033 }
0034
0035 PYBIND11_MODULE(acts_toroidal_field, m) {
0036 m.doc() = "Toroidal Magnetic Field Python bindings";
0037
0038
0039 py::class_<ToroidalField::BarrelConfig>(m, "BarrelConfig")
0040 .def(py::init<>())
0041 .def_readwrite("R_in", &ToroidalField::BarrelConfig::R_in)
0042 .def_readwrite("R_out", &ToroidalField::BarrelConfig::R_out)
0043 .def_readwrite("c", &ToroidalField::BarrelConfig::c)
0044 .def_readwrite("b", &ToroidalField::BarrelConfig::b)
0045 .def_readwrite("I", &ToroidalField::BarrelConfig::I)
0046 .def_readwrite("Nturns", &ToroidalField::BarrelConfig::Nturns);
0047
0048
0049 py::class_<ToroidalField::EctConfig>(m, "EctConfig")
0050 .def(py::init<>())
0051 .def_readwrite("R_in", &ToroidalField::EctConfig::R_in)
0052 .def_readwrite("R_out", &ToroidalField::EctConfig::R_out)
0053 .def_readwrite("c", &ToroidalField::EctConfig::c)
0054 .def_readwrite("b", &ToroidalField::EctConfig::b)
0055 .def_readwrite("I", &ToroidalField::EctConfig::I)
0056 .def_readwrite("Nturns", &ToroidalField::EctConfig::Nturns)
0057 .def_readwrite("gap", &ToroidalField::EctConfig::gap);
0058
0059
0060 py::class_<ToroidalField::LayoutConfig>(m, "LayoutConfig")
0061 .def(py::init<>())
0062 .def_readwrite("theta0", &ToroidalField::LayoutConfig::theta0)
0063 .def_readwrite("thetaStep", &ToroidalField::LayoutConfig::thetaStep)
0064 .def_readwrite("nCoils", &ToroidalField::LayoutConfig::nCoils)
0065 .def_readwrite("nArc", &ToroidalField::LayoutConfig::nArc)
0066 .def_readwrite("nStraight", &ToroidalField::LayoutConfig::nStraight)
0067 .def_readwrite("closeLoop", &ToroidalField::LayoutConfig::closeLoop)
0068 .def_readwrite("eps", &ToroidalField::LayoutConfig::eps);
0069
0070
0071 py::class_<ToroidalField::Config>(m, "Config")
0072 .def(py::init<>())
0073 .def_readwrite("barrel", &ToroidalField::Config::barrel)
0074 .def_readwrite("ect", &ToroidalField::Config::ect)
0075 .def_readwrite("layout", &ToroidalField::Config::layout)
0076 .def_readwrite("barrelSigns", &ToroidalField::Config::barrelSigns)
0077 .def_readwrite("ectSigns", &ToroidalField::Config::ectSigns);
0078
0079
0080 py::class_<ToroidalField, std::shared_ptr<ToroidalField>,
0081 Acts::MagneticFieldProvider>(m, "ToroidalField")
0082 .def(py::init<const ToroidalField::Config&>(), py::arg("config"))
0083 .def("getField", &getField)
0084 .def("makeCache", &ToroidalField::makeCache)
0085 .def("config", &ToroidalField::config,
0086 py::return_value_policy::reference_internal);
0087
0088
0089 m.def("toroidalFieldMapCyl", &Acts::toroidalFieldMapCyl, py::arg("rLim"),
0090 py::arg("phiLim"), py::arg("zLim"), py::arg("nBins"), py::arg("field"),
0091 "Create cylindrical toroidal field map");
0092
0093 m.def("toroidalFieldMapXYZ", &Acts::toroidalFieldMapXYZ, py::arg("xLim"),
0094 py::arg("yLim"), py::arg("zLim"), py::arg("nBins"), py::arg("field"),
0095 "Create Cartesian toroidal field map");
0096 }