CbmRoot
Loading...
Searching...
No Matches
KfField.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Sergei Zharko [committer] */
4
9
10#include "KfField.h"
11
12#include <mutex>
13#include <sstream>
14#include <tuple>
15
20
21// ---------------------------------------------------------------------------------------------------------------------
22//
23template<typename T>
24std::string FieldBase<T, EFieldMode::Intrpl>::ToString(int indentLevel, int verbose) const
25{
26 constexpr char IndentChar = '\t';
27 std::stringstream msg;
28 std::string indent(indentLevel, IndentChar);
29 msg << indent << "Field slices:";
30 for (int iSlice = 0; iSlice < GetNofFieldSlices(); ++iSlice) {
31 const auto& fldSlice = fvFieldSlices[iSlice];
32 msg << '\n' << indent << iSlice << ") " << fldSlice.ToString(0, verbose);
33 }
34 return msg.str();
35}
36
37// ---------------------------------------------------------------------------------------------------------------------
38//
39template<typename T>
40std::string FieldBase<T, EFieldMode::Orig>::ToString(int indentLevel, int /*verbose*/) const
41{
42 constexpr char IndentChar = '\t';
43 std::stringstream msg;
44 std::string indent(indentLevel, IndentChar);
45 msg << indent << "Original field function";
46 msg << indent << "Field slice z-positions: ";
47 for (int iSlice = 0; iSlice < GetNofFieldSlices(); ++iSlice) {
48 msg << "\n " << indent << iSlice << ") " << fvFieldSliceZ[iSlice];
49 }
50 return msg.str();
51}
52
53// ---------------------------------------------------------------------------------------------------------------------
54//
55template<typename T>
56void Field<T>::RemoveSlice(int iLayer)
57{
58 if (fFieldMode == EFieldMode::Orig) {
59 foFldOrig->RemoveSlice(iLayer);
60 }
61 else if (fFieldMode == EFieldMode::Intrpl) {
62 foFldIntrpl->RemoveSlice(iLayer);
63 }
64}
65
66// ---------------------------------------------------------------------------------------------------------------------
67//
68template<typename T>
69std::string Field<T>::ToString(int indentLevel, int verbose) const
70{
71 constexpr char IndentChar = '\t';
72 std::stringstream msg;
73 std::string indent(indentLevel, IndentChar);
74 msg << indent << "Field near primary vertex:\n" << this->fPrimVertexField.ToString(indentLevel + 1, verbose) << '\n';
75 msg << indent << "Field type: " << static_cast<int>(this->fFieldType) << '\n';
76 msg << indent << "Field mode: " << static_cast<int>(this->fFieldMode) << '\n';
77 if (fFieldMode == EFieldMode::Orig) {
78 msg << foFldOrig->ToString(indentLevel, verbose);
79 }
80 else if (fFieldMode == EFieldMode::Intrpl) {
81 msg << foFldIntrpl->ToString(indentLevel, verbose);
82 }
83 return msg.str();
84}
85
86namespace cbm::algo::kf
87{
88 template class Field<float>;
89 template class Field<double>;
90 template class Field<fvec>;
91} // namespace cbm::algo::kf
92
93
94// ---------------------------------------------------------------------------------------------------------------------
95//
96void FieldFactory::AddSliceReference(double halfSizeX, double halfSizeY, double zRef)
97{
98 if (!fSliceReferences.emplace(halfSizeX, halfSizeY, zRef).second) {
99 std::stringstream msg;
100 msg << "FieldFactory::AddReference: attempt of adding another slice reference with zRef = " << zRef
101 << "(halfSizeX = " << halfSizeX << ", halfSizeY = " << halfSizeY << ").\nThe next slice references were "
102 << "added:";
103 for (const auto& el : fSliceReferences) {
104 msg << "\n\t- halfSizeX = " << el.fHalfSizeX << ", halfSizeY = " << el.fHalfSizeY << ", zRef = " << el.fRefZ;
105 }
106 throw std::logic_error(msg.str());
107 }
108}
109
Magnetic field representation in KF (header)
A helper class to instantiate a Field object.
Definition KfField.h:328
void AddSliceReference(double halfSizeX, double halfSizeY, double refZ)
Adds a slice reference.
Definition KfField.cxx:96
std::set< SliceRef > fSliceReferences
Set of slice references.
Definition KfField.h:404
Magnetic field manager class.
Definition KfField.h:188
std::string ToString(int indentLevel, int verbose) const
String representation of the class.
Definition KfField.cxx:69
void RemoveSlice(int iLayer)
Removes a field slice.
Definition KfField.cxx:56
Data members of the Field class (primary template)
Definition KfField.h:32
EFieldMode
Enumiration for the magnetic field representation variants in the track fitting algorithm.
Definition KfDefs.h:27
@ Intrpl
Interpolated magnetic field.
@ Orig
Original magnetic field function.