diff --git a/algo/ca/core/pars/CaField.cxx b/algo/ca/core/pars/CaField.cxx index c5bddcc6c1542aec6c0df77939ac54574d8f6f2f..abd749d612f434afb6b7e5ed14c8ec8597a8960c 100644 --- a/algo/ca/core/pars/CaField.cxx +++ b/algo/ca/core/pars/CaField.cxx @@ -17,13 +17,16 @@ using namespace cbm::algo::ca; // template<typename DataT> bool FieldRegion<DataT>::fgForceUseOfOriginalField = false; + template<typename DataT> std::function<std::tuple<double, double, double>(double x, double y, double z)> - FieldRegion<DataT>::fgOdiginalField([](double, double, double) { + FieldRegion<DataT>::fgOriginalField([](double, double, double) { assert(false && "ca::FieldRegion: The original field is not set, use cbm::ca::tools::SetCbmField()"); return std::tuple(kfdefs::Undef<double>, kfdefs::Undef<double>, kfdefs::Undef<double>); }); +template<typename DataT> +bool FieldRegion<DataT>::fgIsZeroOriginalField = false; //---------------------------------------------------------------------------------------------------------------------- // diff --git a/algo/ca/core/pars/CaField.h b/algo/ca/core/pars/CaField.h index dedb95fe0a6d3fe064bf2da67ac3df14308a6082..e518aa0cdd9b579876f75c98947a7f64281ce373 100644 --- a/algo/ca/core/pars/CaField.h +++ b/algo/ca/core/pars/CaField.h @@ -220,7 +220,13 @@ namespace cbm::algo::ca FieldValue<DataT> Get(const DataT& x, const DataT& y, const DataT& z) const; /// Is the field region empty? - bool IsZeroField() const { return fIsZeroField; } + bool IsZeroField() const + { + if (fgForceUseOfOriginalField || fUseOriginalField) { + return fgIsZeroOriginalField; + } + return fIsZeroField; + } /// Interpolates the magnetic field by three nodal points and sets the result to this FieldRegion object /// The result is a quadratic interpolation of the field as a function of z @@ -278,9 +284,11 @@ namespace cbm::algo::ca static void ForceUseOfOriginalField(bool v = true) { fgForceUseOfOriginalField = v; } /// Set the original field - static void SetOriginalField(std::function<std::tuple<double, double, double>(double x, double y, double z)> f) + static void SetOriginalField(std::function<std::tuple<double, double, double>(double x, double y, double z)> f, + bool isZeroField) { - fgOdiginalField = f; + fgOriginalField = f; + fgIsZeroOriginalField = isZeroField; } /// \brief Copies all/one entries from the other class @@ -295,7 +303,8 @@ namespace cbm::algo::ca public: static bool fgForceUseOfOriginalField; - static std::function<std::tuple<double, double, double>(double x, double y, double z)> fgOdiginalField; + static std::function<std::tuple<double, double, double>(double x, double y, double z)> fgOriginalField; + static bool fgIsZeroOriginalField; // TODO: Probably it's better to have arrays instead of separate fvec values? (S.Zharko) // Bx(z) = cx0 + cx1*(z-z0) + cx2*(z-z0)^2 @@ -368,7 +377,7 @@ namespace cbm::algo::ca } // CopyBase - /// \brief Explicit instantiation declarations for FieldRegion class with specific template types to ensure proper fgOdiginalField definition + /// \brief Explicit instantiation declarations for FieldRegion class with specific template types to ensure proper fgOriginalField definition extern template class FieldRegion<fvec>; extern template class FieldRegion<float>; extern template class FieldRegion<double>; diff --git a/reco/L1/catools/CaToolsField.h b/reco/L1/catools/CaToolsField.h index 43fd3fda012a12e6b639632c10950726225523c8..e747cc908fbee7f187572f126ca69dc69515769b 100644 --- a/reco/L1/catools/CaToolsField.h +++ b/reco/L1/catools/CaToolsField.h @@ -37,7 +37,12 @@ namespace cbm::ca::tools return std::tuple(0., 0., 0.); } }; - ca::FieldRegion<ca::fvec>::SetOriginalField(fld); + if (FairRunAna::Instance()->GetField()) { + ca::FieldRegion<ca::fvec>::SetOriginalField(fld, false); + } + else { + ca::FieldRegion<ca::fvec>::SetOriginalField(fld, true); + } } } // namespace cbm::ca::tools