diff --git a/algo/ca/core/tracking/CaTrackFit.cxx b/algo/ca/core/tracking/CaTrackFit.cxx index 0dd1d646a6d0a50eda32a7b8a45f781aa11303b4..30d54421ddb5b13e4898aed61c753f362a7cf014 100644 --- a/algo/ca/core/tracking/CaTrackFit.cxx +++ b/algo/ca/core/tracking/CaTrackFit.cxx @@ -40,13 +40,16 @@ namespace cbm::algo::ca // correction to HCH is needed for the case when sigma2 is so small // with respect to HCH that it disappears due to the roundoff error // - DataT wi = doProtect ? (fMaskF / (m.Du2() + DataT(1.0000001) * HCH)) : (fMaskF / (m.Du2() + HCH)); - DataT zetawi = fMaskF * zeta / (kf::utils::iif(maskDoFilter, m.Du2(), DataT(0.)) + HCH); + DataT w = m.Du2() + (doProtect ? (DataT(1.0000001) * HCH) : HCH); + DataT wi = kf::utils::iif(fMask, DataT(1.) / w, DataT(0.)); + + DataT zetawi = zeta / (kf::utils::iif(maskDoFilter, m.Du2(), DataT(0.)) + HCH); + zetawi = kf::utils::iif(fMask, zetawi, DataT(0.)); wi = kf::utils::iif(m.Du2() > DataT(0.), wi, DataT(0.)); fTr.ChiSq() += m.Ndf() * zeta * zeta * wi; - fTr.Ndf() += m.Ndf() * fMaskF; + fTr.Ndf() += kf::utils::iif(fMask, m.Ndf(), DataT(0.)); K1 = F1 * wi; K2 = F2 * wi; @@ -115,21 +118,21 @@ namespace cbm::algo::ca DataT HCH = fTr.C55(); - DataT w = kf::utils::iif(timeInfo, fMaskF, DataT(0.)); + DataTmask mask = fMask && timeInfo; // when dt0 is much smaller than current time error, // set track time exactly to the measurement value without filtering // it helps to keep the initial time errors reasonably small // the calculations in the covariance matrix are not affected - const DataTmask maskDoFilter = (HCH < dt2 * 16.f); + const DataTmask maskDoFilter = mask && (HCH < dt2 * 16.f); - DataT wi = w / (dt2 + DataT(1.0000001) * HCH); - DataT zeta = fTr.Time() - t; - DataT zetawi = w * zeta / (kf::utils::iif(maskDoFilter, dt2, DataT(0.)) + HCH); + DataT wi = kf::utils::iif(mask, DataT(1.) / (dt2 + DataT(1.0000001) * HCH), DataT(0.)); + DataT zeta = kf::utils::iif(mask, fTr.Time() - t, DataT(0.)); + DataT zetawi = kf::utils::iif(mask, zeta / (kf::utils::iif(maskDoFilter, dt2, DataT(0.)) + HCH), DataT(0.)); fTr.ChiSqTime() += kf::utils::iif(maskDoFilter, zeta * zeta * wi, DataT(0.)); - fTr.NdfTime() += w; + fTr.NdfTime() += kf::utils::iif(mask, DataT(1.), DataT(0.)); DataT K1 = F1 * wi; DataT K2 = F2 * wi; @@ -461,10 +464,10 @@ namespace cbm::algo::ca HCH = F4 * h - F6; - DataT wi = fMaskF / HCH; - DataT zetawi = fMaskF * zeta / HCH; - fTr.ChiSqTime() += zeta * zeta * wi; - fTr.NdfTime() += fMaskF; + DataT wi = kf::utils::iif(fMask, DataT(1.) / HCH, DataT(0.)); + DataT zetawi = kf::utils::iif(fMask, zeta / HCH, DataT(0.)); + fTr.ChiSqTime() += kf::utils::iif(fMask, zeta * zeta * wi, DataT(0.)); + fTr.NdfTime() += kf::utils::iif(fMask, DataT(1.), DataT(0.)); K1 = F1 * wi; K2 = F2 * wi; @@ -544,10 +547,10 @@ namespace cbm::algo::ca HCH = F6; - DataT wi = fMaskF / HCH; - DataT zetawi = fMaskF * zeta / HCH; - fTr.ChiSqTime() += zeta * zeta * wi; - fTr.NdfTime() += fMaskF; + DataT wi = kf::utils::iif(fMask, DataT(1.) / HCH, DataT(0.)); + DataT zetawi = kf::utils::iif(fMask, zeta / HCH, DataT(0.)); + fTr.ChiSqTime() += kf::utils::iif(fMask, zeta * zeta * wi, DataT(0.)); + fTr.NdfTime() += kf::utils::iif(fMask, DataT(1.), DataT(0.)); K1 = F1 * wi; K2 = F2 * wi; @@ -621,7 +624,8 @@ namespace cbm::algo::ca } else { DataT sgn = kf::utils::iif(fTr.GetZ() < z_out, DataT(1.), DataT(-1.)); - while (!kf::utils::isFull(fMaskF * kf::utils::fabs(z_out - fTr.GetZ()) <= DataT(1.e-6))) { + while ( + !kf::utils::isFull(kf::utils::iif(fMask, kf::utils::fabs(z_out - fTr.GetZ()), DataT(0.)) <= DataT(1.e-6))) { DataT zNew = fTr.GetZ() + sgn * fMaxExtraplationStep; // max. 50 cm step zNew = kf::utils::iif(sgn * (z_out - zNew) <= DataT(0.), z_out, zNew); ExtrapolateStep(zNew, F); @@ -1007,9 +1011,9 @@ namespace cbm::algo::ca //DataT a = ( (kONE+mass2*qp0*qp0t)*radThick*s0*s0 ); DataT a = ((t + fMass2 * qp0 * qp0t) * radThick * s0 * s0); - fTr.C22() += fMaskF * txtx1 * a; - fTr.C32() += fMaskF * tx * ty * a; - fTr.C33() += fMaskF * (kONE + tyty); + fTr.C22() += kf::utils::iif(fMask, txtx1 * a, DataT(0.)); + fTr.C32() += kf::utils::iif(fMask, tx * ty * a, DataT(0.)); + fTr.C33() += kf::utils::iif(fMask, (kONE + tyty) * a, DataT(0.)); } template<typename DataT> @@ -1038,18 +1042,18 @@ namespace cbm::algo::ca DataT T23 = (thickness * thickness) / DataT(3.0); DataT T2 = thickness / DataT(2.0); - fTr.C00() += fMaskF * txtx1 * a * T23; - fTr.C10() += fMaskF * tx * ty * a * T23; - fTr.C20() += fMaskF * txtx1 * a * D * T2; - fTr.C30() += fMaskF * tx * ty * a * D * T2; + fTr.C00() += kf::utils::iif(fMask, txtx1 * a * T23, DataT(0.)); + fTr.C10() += kf::utils::iif(fMask, tx * ty * a * T23, DataT(0.)); + fTr.C20() += kf::utils::iif(fMask, txtx1 * a * D * T2, DataT(0.)); + fTr.C30() += kf::utils::iif(fMask, tx * ty * a * D * T2, DataT(0.)); - fTr.C11() += fMaskF * (kONE + tyty) * a * T23; - fTr.C21() += fMaskF * tx * ty * a * D * T2; - fTr.C31() += fMaskF * (kONE + tyty) * a * D * T2; + fTr.C11() += kf::utils::iif(fMask, (kONE + tyty) * a * T23, DataT(0.)); + fTr.C21() += kf::utils::iif(fMask, tx * ty * a * D * T2, DataT(0.)); + fTr.C31() += kf::utils::iif(fMask, (kONE + tyty) * a * D * T2, DataT(0.)); - fTr.C22() += fMaskF * txtx1 * a; - fTr.C32() += fMaskF * tx * ty * a; - fTr.C33() += fMaskF * (kONE + tyty) * a; + fTr.C22() += kf::utils::iif(fMask, txtx1 * a, DataT(0.)); + fTr.C32() += kf::utils::iif(fMask, tx * ty * a, DataT(0.)); + fTr.C33() += kf::utils::iif(fMask, (kONE + tyty) * a, DataT(0.)); } diff --git a/algo/ca/core/tracking/CaTrackFit.h b/algo/ca/core/tracking/CaTrackFit.h index 0fcc50cc35bbc1b5208dfc861454164828ac6b27..3aea397d7ffbea2a56f9ab8bf7346899eb3d4c21 100644 --- a/algo/ca/core/tracking/CaTrackFit.h +++ b/algo/ca/core/tracking/CaTrackFit.h @@ -54,16 +54,7 @@ namespace cbm::algo::ca SetTrack(t); } - void SetMask(const DataTmask& m) - { - fMask = m; - if constexpr (std::is_same<DataT, fvec>::value) { - fMaskF = iif(m, fvec::One(), fvec::Zero()); - } - else { - fMaskF = (m ? 1. : 0.); - } - } + void SetMask(const DataTmask& m) { fMask = m; } template<typename T> void SetTrack(const TrackParamBase<T>& t) @@ -253,7 +244,6 @@ namespace cbm::algo::ca /// Data members DataTmask fMask{true}; ///< mask of active elements in simd vectors - DataT fMaskF{1.}; ///< floating point representation of fMask TrackParamBase<DataT> fTr{}; ///< track parameters DataT fQp0{0.};