Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-09-28 07:02:58

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 Whitney Armstrong, Wouter Deconinck
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& /*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     // FIXME Acts doesn't seem to like exact zero components
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>& /*derivative*/,
0044                                                              Acts::MagneticFieldProvider::Cache& cache) const
0045   {
0046     return this->getField(position, cache);
0047   }
0048 
0049 } // namespace eicrecon::BField