Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-07-16 08:08:08

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/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 /// @brief Get the value of a field, throwing an exception if the result is invalid.
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   // BarrelConfig
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   // EctConfig
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   // LayoutConfig
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   // Main Config
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   // ToroidalField class
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   // ToroidalFieldMap functions
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 }