Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:41:10

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file accel/RZMapMagneticField.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include <memory>
0010 #include <CLHEP/Units/SystemOfUnits.h>
0011 #include <G4MagneticField.hh>
0012 
0013 #include "corecel/Macros.hh"
0014 #include "corecel/math/ArrayOperators.hh"
0015 #include "geocel/g4/Convert.hh"
0016 #include "celeritas/Quantities.hh"
0017 #include "celeritas/ext/GeantUnits.hh"
0018 #include "celeritas/field/RZMapField.hh"
0019 #include "celeritas/field/RZMapFieldParams.hh"
0020 
0021 namespace celeritas
0022 {
0023 //---------------------------------------------------------------------------//
0024 /*!
0025  * A user magnetic field equivalent to celeritas::RZMapField.
0026  */
0027 class RZMapMagneticField : public G4MagneticField
0028 {
0029   public:
0030     //!@{
0031     //! \name Type aliases
0032     using SPConstFieldParams = std::shared_ptr<RZMapFieldParams const>;
0033     //!@}
0034 
0035   public:
0036     // Construct with RZMapFieldParams
0037     inline explicit RZMapMagneticField(SPConstFieldParams field_params);
0038 
0039     // Calculate values of the magnetic field vector
0040     inline void
0041     GetFieldValue(double const point[3], double* field) const override;
0042 
0043   private:
0044     SPConstFieldParams params_;
0045     RZMapField calc_field_;
0046 };
0047 
0048 //---------------------------------------------------------------------------//
0049 /*!
0050  * Construct with the Celeritas shared RZMapFieldParams.
0051  */
0052 RZMapMagneticField::RZMapMagneticField(SPConstFieldParams params)
0053     : params_(std::move(params))
0054     , calc_field_(RZMapField{params_->ref<MemSpace::native>()})
0055 {
0056     CELER_EXPECT(params_);
0057 }
0058 
0059 //---------------------------------------------------------------------------//
0060 /*!
0061  * Calculate the magnetic field vector at the given position.
0062  */
0063 void RZMapMagneticField::GetFieldValue(double const pos[3], double* field) const
0064 {
0065     // Calculate the magnetic field value in the native Celeritas unit system
0066     Real3 result = calc_field_(convert_from_geant(pos, clhep_length));
0067     for (auto i = 0; i < 3; ++i)
0068     {
0069         // Return values of the field vector in CLHEP::tesla for Geant4
0070         auto ft = native_value_to<units::FieldTesla>(result[i]);
0071         field[i] = convert_to_geant(ft.value(), CLHEP::tesla);
0072     }
0073 }
0074 
0075 //---------------------------------------------------------------------------//
0076 }  // namespace celeritas