SHiP Field Service
Framework-agnostic C++20 library exposing SHiP magnetic field maps.
Loading...
Searching...
No Matches
FieldMap.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
6// In-memory form of a SHiP field map (format specified in
7// docs/field_map_format.md). This header has no ROOT or covfie dependency:
8// file I/O lives in the MapIO component (SHiP/FieldService/FieldMapIO.h), and
9// evaluation is built from a FieldMap via makeFieldEvaluator().
10
12
13#include <array>
14#include <cstddef>
15#include <cstdint>
16#include <memory>
17#include <string>
18#include <vector>
19
20namespace SHiP {
21
26 std::array<double, 3> min{};
27 std::array<double, 3> max{};
28 std::array<std::uint32_t, 3> n{};
29
31 [[nodiscard]] std::size_t size() const;
33 [[nodiscard]] std::size_t index(std::size_t i, std::size_t j, std::size_t k) const {
34 return (i * n[1] + j) * n[2] + k;
35 }
37 [[nodiscard]] double node(std::size_t axis, std::size_t i) const;
38};
39
45 std::array<bool, 3> mirror{};
46 std::array<std::int8_t, 9> parity{1, 1, 1, 1, 1, 1, 1, 1, 1};
47
48 [[nodiscard]] bool any() const { return mirror[0] || mirror[1] || mirror[2]; }
49
53 [[nodiscard]] static FieldMapSymmetry quadrantDipole();
54};
55
58 std::string source;
59 std::string comment;
60 std::string producer;
61 std::string created_utc;
62};
63
66struct FieldMap {
67 std::string name;
70 std::vector<float> bx;
71 std::vector<float> by;
72 std::vector<float> bz;
74};
75
79void validate(FieldMap const& map);
80
84[[nodiscard]] std::shared_ptr<IFieldEvaluator> makeFieldEvaluator(FieldMap const& map);
85
87struct FieldBox {
88 std::array<double, 3> min{};
89 std::array<double, 3> max{};
90
93 [[nodiscard]] bool contains(double x, double y, double z) const;
94};
95
98[[nodiscard]] FieldBox extent(FieldMap const& map);
99
104[[nodiscard]] std::shared_ptr<IFieldEvaluator> translated(std::shared_ptr<IFieldEvaluator> inner,
105 std::array<double, 3> const& offset);
106
111[[nodiscard]] std::shared_ptr<IFieldEvaluator> zeroOutside(std::shared_ptr<IFieldEvaluator> inner,
112 FieldBox const& box);
113
117[[nodiscard]] std::string resolveFieldMapPath(std::string const& path);
118
119} // namespace SHiP
Definition ActsFieldAdapter.h:25
std::shared_ptr< IFieldEvaluator > zeroOutside(std::shared_ptr< IFieldEvaluator > inner, FieldBox const &box)
Evaluator that returns inner's field inside box, given in inner's frame, and 0 outside it,...
Definition FieldMap.cpp:159
void validate(FieldMap const &map)
Throw std::invalid_argument unless map is well formed: non-empty name, at least two nodes and a posit...
Definition FieldMap.cpp:50
std::string resolveFieldMapPath(std::string const &path)
Canonical path of a map file.
Definition FieldMap.cpp:20
std::shared_ptr< IFieldEvaluator > makeFieldEvaluator(FieldMap const &map)
Build a thread-safe evaluator for map: trilinear interpolation, clamped to the boundary value outside...
Definition CovfieFieldSource.cpp:78
std::shared_ptr< IFieldEvaluator > translated(std::shared_ptr< IFieldEvaluator > inner, std::array< double, 3 > const &offset)
Evaluator for inner placed with its origin at offset (mm): the field at p is inner's field at p - off...
Definition FieldMap.cpp:143
FieldBox extent(FieldMap const &map)
Region map covers in its local frame.
Definition FieldMap.cpp:92
Axis-aligned box, lengths in mm.
Definition FieldMap.h:87
bool contains(double x, double y, double z) const
True if (x, y, z) mm lies inside the box or on its boundary; false if any coordinate is NaN.
Definition FieldMap.cpp:87
std::array< double, 3 > max
Definition FieldMap.h:89
std::array< double, 3 > min
Definition FieldMap.h:88
Equidistant Cartesian grid in the map's local frame.
Definition FieldMap.h:25
std::array< double, 3 > max
Definition FieldMap.h:27
double node(std::size_t axis, std::size_t i) const
Position (mm) of node i on axis axis.
Definition FieldMap.cpp:37
std::array< double, 3 > min
Definition FieldMap.h:26
std::size_t index(std::size_t i, std::size_t j, std::size_t k) const
Flat index of node (i, j, k): x-major, z fastest.
Definition FieldMap.h:33
std::size_t size() const
Number of nodes, n[0] * n[1] * n[2].
Definition FieldMap.cpp:33
std::array< std::uint32_t, 3 > n
Definition FieldMap.h:28
Where a map came from. Informational only; never affects evaluation.
Definition FieldMap.h:57
std::string comment
Free text.
Definition FieldMap.h:59
std::string producer
Writing tool and version.
Definition FieldMap.h:60
std::string created_utc
ISO 8601 timestamp.
Definition FieldMap.h:61
std::string source
Origin file or generator.
Definition FieldMap.h:58
Reflection symmetry.
Definition FieldMap.h:44
std::array< std::int8_t, 9 > parity
Definition FieldMap.h:46
std::array< bool, 3 > mirror
Definition FieldMap.h:45
static FieldMapSymmetry quadrantDipole()
FairShip's quadrant-symmetric dipole (ShipBFieldMap with isSymmetric): mirrored in x and y; Bx flips ...
Definition FieldMap.cpp:42
bool any() const
Definition FieldMap.h:48
One field map: grid, symmetry, and per-node field components in Tesla, stored in FieldMapGrid::index ...
Definition FieldMap.h:66
FieldMapProvenance provenance
Definition FieldMap.h:73
std::vector< float > bz
Definition FieldMap.h:72
FieldMapSymmetry symmetry
Definition FieldMap.h:69
std::string name
Definition FieldMap.h:67
FieldMapGrid grid
Definition FieldMap.h:68
std::vector< float > by
Definition FieldMap.h:71
std::vector< float > bx
Definition FieldMap.h:70