Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-09-27 07:03:01

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2016-2018 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 http://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 #include <Acts/Definitions/Algebra.hpp>
0012 #include <Acts/MagneticField/MagneticFieldContext.hpp>
0013 #include <Acts/MagneticField/MagneticFieldProvider.hpp>
0014 #include <Acts/Utilities/Result.hpp>
0015 #include <DD4hep/Detector.h>
0016 #include <gsl/pointers>
0017 #include <memory>
0018 #include <variant>
0019 
0020 
0021 
0022 
0023 namespace eicrecon::BField {
0024 
0025   ///// The Context to be handed around
0026   //struct ScalableBFieldContext {
0027   //  double scalor = 1.;
0028   //};
0029 
0030   /** Use the dd4hep magnetic field in acts.
0031    *
0032    * \ingroup magnets
0033    * \ingroup magsvc
0034    */
0035   class DD4hepBField final : public Acts::MagneticFieldProvider {
0036   public:
0037       gsl::not_null<const dd4hep::Detector*> m_det;
0038 
0039   public:
0040     struct Cache {
0041       Cache(const Acts::MagneticFieldContext& /*mcfg*/) { }
0042     };
0043 
0044     Acts::MagneticFieldProvider::Cache makeCache(const Acts::MagneticFieldContext& mctx) const override
0045     {
0046 #if Acts_VERSION_MAJOR >= 32
0047       return Acts::MagneticFieldProvider::Cache(std::in_place_type<Cache>, mctx);
0048 #else
0049       return Acts::MagneticFieldProvider::Cache::make<Cache>(mctx);
0050 #endif
0051     }
0052 
0053     /** construct constant magnetic field from field vector.
0054     *
0055     * @param [in] DD4hep detector instance
0056     */
0057     explicit DD4hepBField(gsl::not_null<const dd4hep::Detector*> det) : m_det(det) {}
0058 
0059     /**  retrieve magnetic field value.
0060      *
0061      *  @param [in] position global position
0062      *  @param [in] cache Cache object (is ignored)
0063      *  @return magnetic field vector
0064      *
0065      *  @note The @p position is ignored and only kept as argument to provide
0066      *        a consistent interface with other magnetic field services.
0067      */
0068     Acts::Result<Acts::Vector3> getField(const Acts::Vector3& position, Acts::MagneticFieldProvider::Cache& cache) const override;
0069 
0070     /** @brief retrieve magnetic field value & its gradient
0071      *
0072      * @param [in]  position   global position
0073      * @param [out] derivative gradient of magnetic field vector as (3x3)
0074      * matrix
0075      * @param [in] cache Cache object (is ignored)
0076      * @return magnetic field vector
0077      *
0078      * @note The @p position is ignored and only kept as argument to provide
0079      *       a consistent interface with other magnetic field services.
0080      * @note currently the derivative is not calculated
0081      * @todo return derivative
0082      */
0083     Acts::Result<Acts::Vector3> getFieldGradient(const Acts::Vector3& position, Acts::ActsMatrix<3, 3>& /*derivative*/,
0084                                                  Acts::MagneticFieldProvider::Cache& cache) const override;
0085   };
0086 
0087   using BFieldVariant = std::variant<std::shared_ptr<const DD4hepBField>>;
0088 
0089 
0090 
0091 } // namespace eicrecon::BField