SHiP Field Service
Framework-agnostic C++20 library exposing SHiP magnetic field maps.
Loading...
Searching...
No Matches
G4MagFieldAdapter.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 CERN for the benefit of the SHiP Collaboration
2//
3// SPDX-License-Identifier: LGPL-3.0-or-later
4#pragma once
5
7
8#include <G4MagneticField.hh>
9
10#include <CLHEP/Units/SystemOfUnits.h>
11#include <memory>
12#include <mp-units/systems/si.h>
13#include <utility>
14
15namespace ship {
16
19class G4MagFieldAdapter final : public G4MagneticField {
20 public:
21 explicit G4MagFieldAdapter(std::shared_ptr<IFieldEvaluator> eval) : eval_{std::move(eval)} {}
22
23 void GetFieldValue(G4double const point[4], G4double* bField) const override {
24 // Geant4 internal length unit is CLHEP::mm; convert to plain mm for the evaluator,
25 // which works in mp-units mm-quantity. Fully qualify the mp-units names because
26 // CLHEP also defines `tesla` and `metre` as globals via Geant4 headers.
27 namespace si = mp_units::si;
28 auto const x = (point[0] / CLHEP::mm) * si::milli<si::metre>;
29 auto const y = (point[1] / CLHEP::mm) * si::milli<si::metre>;
30 auto const z = (point[2] / CLHEP::mm) * si::milli<si::metre>;
31 auto const B = eval_->at(x, y, z);
32 bField[0] = B[0].numerical_value_in(si::tesla) * CLHEP::tesla;
33 bField[1] = B[1].numerical_value_in(si::tesla) * CLHEP::tesla;
34 bField[2] = B[2].numerical_value_in(si::tesla) * CLHEP::tesla;
35 }
36
37 private:
38 std::shared_ptr<IFieldEvaluator> eval_;
39};
40
41} // namespace ship
Thin G4MagneticField wrapping an IFieldEvaluator.
Definition G4MagFieldAdapter.h:19
G4MagFieldAdapter(std::shared_ptr< IFieldEvaluator > eval)
Definition G4MagFieldAdapter.h:21
void GetFieldValue(G4double const point[4], G4double *bField) const override
Definition G4MagFieldAdapter.h:23
Definition CovfieFieldSource.h:12