19#include <boost/serialization/access.hpp>
20#include <boost/serialization/split_free.hpp>
36 template<
typename T, EFieldMode FldMode>
46 template<
typename, EFieldMode>
75 for (
const auto& slice : other.fvFieldSliceZ) {
76 fvFieldSliceZ.emplace_back(utils::simd::Cast<I, T>(slice));
137 std::string
ToString(
int indentLevel,
int verbose)
const;
156 template<
typename, EFieldMode>
184 for (
const auto& slice : other.fvFieldSlices) {
185 fvFieldSlices.emplace_back(FieldSlice<T>(slice));
244 std::string
ToString(
int indentLevel,
int verbose)
const;
256 friend class boost::serialization::access;
257 template<
class Archive>
275 friend class boost::serialization::access;
278 template<EFieldMode Mode>
318 template<
EFieldMode FieldMode,
typename... Args>
330 return kf::visit([&other](
const auto& c) {
return Field(other,
Tag<std::decay_t<
decltype(c)>
::Mode()>{}); },
337 template<EFieldMode FieldMode>
340 return std::get_if<ConcreteField_t<FieldMode>>(&
fFieldVariant);
347 return kf::visit([](
const auto& c) {
return std::decay_t<
decltype(c)>
::Mode(); },
fFieldVariant);
357 return kf::visit([sliceId,
x,
y](
const auto& c) ->
FieldValue<T> {
return c.GetFieldValue(sliceId,
x,
y); },
367 return kf::visit([sliceId, &tp](
const auto& c) ->
FieldValue<T> {
return c.GetFieldValueForLine(sliceId, tp); },
397 return FieldRegion<T>(held->GetFieldType(), held->GetFieldFunction());
416 kf::visit([iLayer](
auto&& c) ->
void { c.RemoveSlice(iLayer); },
fFieldVariant);
422 std::string
ToString(
int indentLevel,
int verbose)
const;
448 template<
typename I, EFieldMode FieldMode>
459 template<
class Archive>
460 void load(Archive& ar,
const unsigned int )
464 fFieldVariant.template emplace<Interpolated_t>(std::move(field));
469 template<
class Archive>
470 void save(Archive& ar,
const unsigned int )
const
477 throw std::logic_error(
"Attempt to serialize a kf::Field object with fFieldMode == EFieldMode::Original");
482 template<
class Archive>
485 boost::serialization::split_member(ar, *
this, version);
583 if (std::any_of(
fTarget.begin(),
fTarget.end(), [](
double x) { return !utils::IsFinite(x); })) {
584 throw std::logic_error(
"FieldBuilder::MakeField: target is undefined");
587 throw std::logic_error(
"FieldBuilder::MakeField: no slice references were provided");
590 throw std::logic_error(
"FieldBuilder::CreateField: no field function is provided");
596 std::vector<T> fieldSlices;
599 fieldSlices.emplace_back(ref.fRefZ);
610 fieldSlices.emplace_back(
fFieldFn, ref.fHalfSizeX, ref.fHalfSizeY, ref.fRefZ);
613 std::array<FieldValue<T>, 3> fld;
617 for (
auto& fldNode : fld) {
std::string ToString(CbmCutId id)
Convert CbmCutId to a string representation.
Common constant definitions for the Kalman Filter library.
Magnetic flux density interpolation along the track vs. z-coordinate (header)
A class for a magnetic field approximation on a transverse plane (source)
Optimized implementation of std::visit.
Data members of the Field class (primary template)
Field< T > MakeField(EFieldMode fldMode) const
Create field.
std::set< SliceRef > fSliceReferences
Set of slice references.
double fTargetStep
Step between nodal points for the primary vertex field estimation.
EFieldType GetFieldType() const
Gets field type.
void ResetSliceReferences()
Resets slicer references.
std::array< double, 3 > fTarget
Target position.
void AddSliceReference(double halfSizeX, double halfSizeY, double refZ)
Adds a slice reference.
void SetFieldFunction(const FieldFn_t &fieldFn, EFieldType fldType)
Sets magnetic field function.
FieldFn_t fFieldFn
Field function (x, y, z) [cm] -> (Bx, By, Bz) [kG].
void SetTarget(double x, double y, double z)
Sets target.
FieldBuilder & operator=(const FieldBuilder &)=default
Copy assignment operator.
~FieldBuilder()=default
Destructor.
void Reset()
Resets the instance.
EFieldType fFieldType
Field type.
const FieldFn_t & GetFieldFunction() const
Gets field function.
FieldBuilder()=default
Default constructor.
void SetStep(double step=2.5)
Sets a step for the primary vertex field region estimation.
FieldBuilder(const FieldBuilder &)=default
Copy constructor.
Magnetic field region, corresponding to a hit triplet.
Magnetic flux density vector.
Magnetic field manager class.
void load(Archive &ar, const unsigned int)
Serialization load method.
FieldValue< T > GetFieldValue(int sliceId, T x, T y) const
Creates field value object.
void serialize(Archive &ar, const unsigned int version)
Serialization method.
typename detail::ConcreteField< T, Mode > ConcreteField_t
static constexpr Field Create(Args... args)
Creates a field (compile-time mode selection)
void RemoveSlice(int iLayer)
Removes a field slice.
const FieldRegion< T > & GetPrimVertexField() const
Gets field region near primary vertex.
static Field CopyConvert(const Field< I > &other)
Creates a converted copy of the field with a different floating point type.
const FieldValue< T > GetFieldValueForLine(int sliceId, const TrackParam< T > &tp) const
Creates field value for the intersection with a straight track.
Field()=default
Default constructor.
const ConcreteField_t< FieldMode > * GetConcrete() const
Gets a pointer to the concrete field instance.
FieldVariant_t fFieldVariant
Concrete field implementation.
EFieldMode GetFieldMode() const
Gets stored mode of the field.
Field(const Field< I > &other, Tag< FieldMode >)
Constructor from a field of another type.
~Field()=default
Destructor.
Field(const Field &)=default
Copy constructor for the same class.
Field(SlicesContainer_t &fieldSlices, FieldRegion< T > &vtxField, EFieldType fieldType, Tag< EFieldMode::Interpolated >)
Constructor for interpolated field.
ConcreteField_t< EFieldMode::Original > Original_t
ConcreteField_t< EFieldMode::Interpolated > Interpolated_t
typename std::variant< Interpolated_t, Original_t > FieldVariant_t
Field(FieldFn_t fieldFn, std::vector< T > &fieldSliceZ, FieldRegion< T > &vtxField, EFieldType fieldType, Tag< EFieldMode::Original >)
Constructor for original field.
EFieldType GetFieldType() const
Gets field type.
Field & operator=(Field &&other)=default
Move assignment operator.
Field & operator=(const Field &other)=default
Copy assignment operator.
void save(Archive &ar, const unsigned int) const
Serialization save method.
typename Interpolated_t::SlicesContainer_t SlicesContainer_t
Field(Field &&)=default
Move constructor.
FieldRegion< T > GetFieldRegion(const FieldValue< T > &b0, const FieldValue< T > &b1, const FieldValue< T > &b2) const
Creates field region object from nodes.
static FieldValue< T > GetFieldValue(const FieldFn_t &fieldFn, T x, T y, T z)
Creates a field value object in a spactial point of a generic floating-point type.
T GetTy() const
Gets slope along y-axis.
T GetZ() const
Gets z position [cm].
T GetTx() const
Gets slope along x-axis.
T GetY() const
Gets y position [cm].
T GetX() const
Gets x position [cm].
TrackParam classes of different types.
const FieldValue< T > GetFieldValueForLine(int sliceID, const TrackParam< T > &tp) const
Creates field value for the intersection with a straight track.
const auto & GetFieldSlice(int sliceID) const
Gets field slice.
int GetNofFieldSlices() const
Gets number of field slices in the instance.
const FieldRegion< T > & GetPrimVertexField() const
Gets field region near primary vertex.
ConcreteField(const ConcreteField &)=default
Default copy constructor for the same type.
void serialize(Archive &ar, const unsigned int)
FieldRegion< T > fPrimVertexField
Field region near primary vertex (constant field is assumed)
static constexpr EFieldMode Mode()
Returns the mode of the field.
friend class ConcreteField
ConcreteField()=default
Default constructor.
SlicesContainer_t fvFieldSlices
Array of field slices on different layers.
ConcreteField & operator=(const ConcreteField &)=default
Copy assignment operator.
ConcreteField(const ConcreteField< I, EFieldMode::Interpolated > &other)
Copy constructor.
std::string ToString(int indentLevel, int verbose) const
String representation of the class.
FieldValue< T > GetFieldValue(int sliceID, T x, T y) const
Creates field value object.
ConcreteField & operator=(ConcreteField &&)=default
Move assignment operator.
EFieldType GetFieldType() const
Gets field type.
ConcreteField(ConcreteField &&)=default
Move constructor.
void RemoveSlice(int iLayer)
Removes a field slice.
std::vector< FieldSlice< T > > SlicesContainer_t
EFieldType fFieldType
Field type.
ConcreteField(SlicesContainer_t &fieldSlices, FieldRegion< T > &vtxField, EFieldType type)
Constructor from parameters.
std::string ToString(int indentLevel, int verbose) const
String representation of the class.
int GetNofFieldSlices() const
Gets number of field slices in the instance.
FieldRegion< T > fPrimVertexField
Field region near primary vertex (constant field is assumed)
ConcreteField(FieldFn_t fieldFn, std::vector< T > &fieldSliceZ, FieldRegion< T > &vtxField, EFieldType type)
Constructor from parameters.
friend class ConcreteField
void RemoveSlice(int iLayer)
Removes a field slice.
const FieldValue< T > GetFieldValueForLine(int sliceId, const TrackParam< T > &tp) const
Creates field value for the intersection with a straight track.
ConcreteField(ConcreteField &&)=default
Move constructor.
ConcreteField(const ConcreteField< I, EFieldMode::Original > &other)
Copy constructor (generic with type conversion)
FieldFn_t fFieldFn
Field function: (x,y,z) [cm] -> (Bx,By,Bz) [kG].
std::vector< T > fvFieldSliceZ
z-positions of field slices to emulate EFeildType::Interpolated
ConcreteField & operator=(const ConcreteField &)=default
Copy assignment operator.
ConcreteField(const ConcreteField &)=default
Default copy constructor for the same type.
static constexpr EFieldMode Mode()
Returns the mode of the field.
FieldValue< T > GetFieldValue(int sliceId, T x, T y) const
Creates field value object.
EFieldType fFieldType
Field type.
const FieldRegion< T > & GetPrimVertexField() const
Gets field region near primary vertex.
ConcreteField & operator=(ConcreteField &&)=default
Move assignment operator.
ConcreteField()=default
Default constructor.
EFieldType GetFieldType() const
Gets field type.
const FieldFn_t & GetFieldFunction() const
Gets field function.
Data members of the Field class (primary template)
constexpr auto ZeroFieldFn
Zero magnetic field function.
constexpr T2 Undef
Undefined values.
EFieldMode
Enumiration for the magnetic field representation variants in the track fitting algorithm.
@ Original
Original magnetic field function.
@ Interpolated
Interpolated magnetic field.
EFieldType
Magnetic field type in different setup regions.
@ Normal
Field near the tracker subsystem.
std::function< std::tuple< double, double, double >(double, double, double)> FieldFn_t
Magnetic field function type Signature: tuple<Bx, By, Bz>(x, y, z);.
double fHalfSizeY
Half-size of the slice in y-direction [cm].
bool operator<(const SliceRef &r) const
Comparision operator.
SliceRef(double halfX, double halfY, double refZ)
Constructor.
double fRefZ
Reference z-position of the slice [cm].
double fHalfSizeX
Half-size of the slice in x-direction [cm].
A generic tag for tag dispatching.