File indexing completed on 2024-09-27 07:03:01
0001
0002
0003
0004 #include "DD4hepBField.h"
0005
0006 #include <Acts/Definitions/Algebra.hpp>
0007 #include <Acts/Definitions/Units.hpp>
0008 #include <DD4hep/Fields.h>
0009 #include <DD4hep/Objects.h>
0010 #include <Evaluator/DD4hepUnits.h>
0011 #include <Math/GenVector/Cartesian3D.h>
0012 #include <Math/GenVector/DisplacementVector3D.h>
0013 #include <Eigen/Core>
0014 #include <limits>
0015
0016 namespace eicrecon::BField {
0017
0018 Acts::Result<Acts::Vector3> DD4hepBField::getField(const Acts::Vector3& position,
0019 Acts::MagneticFieldProvider::Cache& ) const
0020 {
0021 dd4hep::Position pos(
0022 position[0] * (dd4hep::mm / Acts::UnitConstants::mm),
0023 position[1] * (dd4hep::mm / Acts::UnitConstants::mm),
0024 position[2] * (dd4hep::mm / Acts::UnitConstants::mm));
0025
0026 auto fieldObj = m_det->field();
0027 auto field = fieldObj.magneticField(pos) * (Acts::UnitConstants::T / dd4hep::tesla);
0028
0029
0030 if (field.x() * field.y() * field.z() == 0) {
0031 static dd4hep::Direction epsilon{
0032 std::numeric_limits<double>::epsilon(),
0033 std::numeric_limits<double>::epsilon(),
0034 std::numeric_limits<double>::epsilon()
0035 };
0036 field += epsilon;
0037 }
0038
0039 return Acts::Result<Acts::Vector3>::success({field.x(), field.y(), field.z()});
0040 }
0041
0042 Acts::Result<Acts::Vector3> DD4hepBField::getFieldGradient(const Acts::Vector3& position,
0043 Acts::ActsMatrix<3, 3>& ,
0044 Acts::MagneticFieldProvider::Cache& cache) const
0045 {
0046 return this->getField(position, cache);
0047 }
0048
0049 }