File indexing completed on 2025-12-16 09:41:10
0001
0002
0003
0004
0005
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
0026
0027 class RZMapMagneticField : public G4MagneticField
0028 {
0029 public:
0030
0031
0032 using SPConstFieldParams = std::shared_ptr<RZMapFieldParams const>;
0033
0034
0035 public:
0036
0037 inline explicit RZMapMagneticField(SPConstFieldParams field_params);
0038
0039
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
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
0062
0063 void RZMapMagneticField::GetFieldValue(double const pos[3], double* field) const
0064 {
0065
0066 Real3 result = calc_field_(convert_from_geant(pos, clhep_length));
0067 for (auto i = 0; i < 3; ++i)
0068 {
0069
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 }