diff --git a/algo/ca/TrackingChain.cxx b/algo/ca/TrackingChain.cxx index e9f8ab396a3e3f6fa966128d663bab569399564b..451d9cd177c68396d1cf9810e05b139580dd6397 100644 --- a/algo/ca/TrackingChain.cxx +++ b/algo/ca/TrackingChain.cxx @@ -55,21 +55,25 @@ void TrackingChain::Init() TrackingChain::Return_t TrackingChain::Run(Input_t recoResults) { //xpu::scoped_timer t_("CA"); // TODO: pass timings to monitoring for throughput? - ca::TrackingMonitorData monitorData; + fCaMonitorData.Reset(); + fCaMonitorData.StartTimer(ca::ETimer::Tracking); // ----- Init input data --------------------------------------------------------------------------------------------- + fCaMonitorData.StartTimer(ca::ETimer::PrepareInput); this->PrepareInput(recoResults); + fCaMonitorData.StopTimer(ca::ETimer::PrepareInput); // ----- Run reconstruction ------------------------------------------------------------------------------------------ - fCaFramework.SetMonitorData(monitorData); + fCaFramework.SetMonitorData(fCaMonitorData); fCaFramework.fTrackFinder.FindTracks(); - monitorData = fCaFramework.GetMonitorData(); - L_(info) << "Timeslice contains " << monitorData.GetCounterValue(ca::ECounter::RecoTrack) << " tracks"; + fCaMonitorData = fCaFramework.GetMonitorData(); + L_(info) << "Timeslice contains " << fCaMonitorData.GetCounterValue(ca::ECounter::RecoTrack) << " tracks"; // ----- Init output data -------------------------------------------------------------------------------------------- // FIXME: SZh 22.10.2023: Provide a class for the tracking output data (tracks, hit indices and monitor) - fCaMonitor.AddMonitorData(monitorData); - return std::make_pair(std::move(fCaFramework.fRecoTracks), monitorData); + fCaMonitor.AddMonitorData(fCaMonitorData); + fCaMonitorData.StopTimer(ca::ETimer::Tracking); + return std::make_pair(std::move(fCaFramework.fRecoTracks), fCaMonitorData); } // --------------------------------------------------------------------------------------------------------------------- @@ -97,9 +101,12 @@ void TrackingChain::PrepareInput(Input_t recoResults) template<EDetectorID DetID> void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hits) { - using Hit_t = ca::HitTypes_t::at<DetID>; - constexpr bool IsSTS = (DetID == EDetectorID::Sts); - constexpr bool IsTOF = (DetID == EDetectorID::Tof); + using Hit_t = ca::HitTypes_t::at<DetID>; + constexpr bool IsMvd = (DetID == EDetectorID::Mvd); + constexpr bool IsSts = (DetID == EDetectorID::Sts); + constexpr bool IsMuch = (DetID == EDetectorID::Much); + constexpr bool IsTrd = (DetID == EDetectorID::Trd); + constexpr bool IsTof = (DetID == EDetectorID::Tof); xpu::t_add_bytes(hits.NElements() * sizeof(Hit_t)); // Assumes call from Run, for existence of timer! @@ -112,8 +119,8 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi int iStLocal = -1; // FIXME: This definition of the station index works only for STS, and there is no any guaranty, that it will // work for other mCBM setups. - if constexpr (IsSTS) { iStLocal = (extHitAddress >> 4) & 0xF; } - if constexpr (IsTOF) { iStLocal = tof::Config::GetTofTrackingStation(extHitAddress); } + if constexpr (IsSts) { iStLocal = (extHitAddress >> 4) & 0xF; } + if constexpr (IsTof) { iStLocal = tof::Config::GetTofTrackingStation(extHitAddress); } int iStActive = (iStLocal != -1) ? fCaFramework.GetParameters().GetStationIndexActive(iStLocal, DetID) : -1; size_t iOffset = hits.Offsets()[iPartition]; @@ -124,7 +131,7 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi int iHitExt = iOffset + iPartHit; // ---- Fill ca::Hit ca::Hit caHit; - if constexpr (IsSTS) { + if constexpr (IsSts) { caHit.SetFrontKey(firstHitKey + hit.fFrontClusterId); caHit.SetBackKey(firstHitKey + hit.fBackClusterId); } @@ -138,7 +145,7 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi caHit.SetT(hit.Time()); caHit.SetDx2(hit.Dx() * hit.Dx()); caHit.SetDy2(hit.Dy() * hit.Dy()); - if constexpr (IsSTS) caHit.SetDxy(hit.fDxy); + if constexpr (IsSts) caHit.SetDxy(hit.fDxy); caHit.SetDt2(hit.TimeError() * hit.TimeError()); /// FIXME: Define ranges from the hit, when will be available caHit.SetRangeX(3.5 * hit.Dx()); @@ -146,10 +153,19 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi caHit.SetRangeT(3.5 * hit.TimeError()); caHit.SetStation(iStActive); caHit.SetId(fCaDataManager.GetNofHits()); - fCaDataManager.PushBackHit(caHit, dataStream); + if (caHit.Check()) { + fCaDataManager.PushBackHit(caHit, dataStream); + if (fNofHitKeys <= caHit.FrontKey()) { fNofHitKeys = caHit.FrontKey() + 1; } + if (fNofHitKeys <= caHit.BackKey()) { fNofHitKeys = caHit.BackKey() + 1; } + } + else { + if constexpr (IsMvd) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedMvdHit); } + if constexpr (IsSts) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedStsHit); } + if constexpr (IsMuch) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedMuchHit); } + if constexpr (IsTrd) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedTrdHit); } + if constexpr (IsTof) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedTofHit); } + } // ---- Update number of hit keys - if (fNofHitKeys <= caHit.FrontKey()) { fNofHitKeys = caHit.FrontKey() + 1; } - if (fNofHitKeys <= caHit.BackKey()) { fNofHitKeys = caHit.BackKey() + 1; } } // iPartHit } // iPartition } diff --git a/algo/ca/TrackingChain.h b/algo/ca/TrackingChain.h index 22f8a4a7db4bdd06c9992e0da8bcac32cb73a818..29301e005fb743d7f0edac848aaab28c3e99edaf 100644 --- a/algo/ca/TrackingChain.h +++ b/algo/ca/TrackingChain.h @@ -73,10 +73,10 @@ namespace cbm::algo // ************************* // ** Framework variables - ca::TrackingMonitor fCaMonitor {}; ///< CA internal monitor (debug purposes) - ca::Framework fCaFramework {}; ///< CA framework instance - ca::DataManager fCaDataManager {}; ///< CA data manager - + ca::TrackingMonitor fCaMonitor {}; ///< CA internal monitor (debug purposes) + ca::TrackingMonitorData fCaMonitorData {}; ///< CA monitor data object + ca::Framework fCaFramework {}; ///< CA framework instance + ca::DataManager fCaDataManager {}; ///< CA data manager // ************************ // ** Auxilary variables diff --git a/algo/ca/core/data/CaHit.h b/algo/ca/core/data/CaHit.h index 6a090f3c05ed5bade8d0c022a96ba9ad4d71d80b..1544c57fb1f676679cd5fa9e43599d69d7100070 100644 --- a/algo/ca/core/data/CaHit.h +++ b/algo/ca/core/data/CaHit.h @@ -29,6 +29,11 @@ namespace cbm::algo::ca /// Default constructor Hit() = default; + /// \brief Checks, if the hit is defined + /// \return true Hit is defined + /// \return false Hit is undefined and will be skipped + bool Check() const; + ///----------------------------------------------------------------------------- /// setters @@ -182,4 +187,20 @@ namespace cbm::algo::ca } }; + // ------------------------------------------------------------------------------------------------------------------- + // + inline bool Hit::Check() const + { + bool res = true; + res &= std::isfinite(fX); + res &= std::isfinite(fY); + res &= std::isfinite(fZ); + res &= std::isfinite(fT); + res &= std::isfinite(fDx2); + res &= std::isfinite(fDy2); + res &= std::isfinite(fDxy); + res &= std::isfinite(fDt2); + return res; + } + } // namespace cbm::algo::ca diff --git a/algo/ca/core/tracking/CaTrackFinder.cxx b/algo/ca/core/tracking/CaTrackFinder.cxx index fac6e0986958c1d3d1847473835d712ab6c93ddd..37f0c51a79aeba28627eb03f0952da9aa16cfcc2 100644 --- a/algo/ca/core/tracking/CaTrackFinder.cxx +++ b/algo/ca/core/tracking/CaTrackFinder.cxx @@ -49,7 +49,7 @@ void TrackFinder::FindTracks() // frAlgo.fMonitorData.IncrementCounter(ECounter::TrackingCall); frAlgo.fMonitorData.IncrementCounter(ECounter::RecoHit, frAlgo.fInputData.GetNhits()); - frAlgo.fMonitorData.StartTimer(ETimer::Tracking); + frAlgo.fMonitorData.StartTimer(ETimer::FindTracks); auto timerStart = std::chrono::high_resolution_clock::now(); @@ -304,7 +304,7 @@ void TrackFinder::FindTracks() tsStart -= 5; // do 5 ns margin } - frAlgo.fMonitorData.StopTimer(ETimer::Tracking); + frAlgo.fMonitorData.StopTimer(ETimer::FindTracks); frAlgo.fMonitorData.IncrementCounter(ECounter::RecoTrack, frAlgo.fRecoTracks.size()); frAlgo.fMonitorData.IncrementCounter(ECounter::RecoHitUsed, frAlgo.fRecoHits.size()); diff --git a/algo/ca/core/utils/CaTrackingMonitor.h b/algo/ca/core/utils/CaTrackingMonitor.h index d127d0f1135e557bce5b5702dc924fd09da960f7..2d76b3ee1aa791c4a9f81e51176cc97c339c08b3 100644 --- a/algo/ca/core/utils/CaTrackingMonitor.h +++ b/algo/ca/core/utils/CaTrackingMonitor.h @@ -23,6 +23,12 @@ namespace cbm::algo::ca RecoHit, ///< number of reconstructed hits RecoHitUsed, ///< number of used reconstructed hits Triplet, ///< number of triplets + // TODO: Provide counters vs. detector ID + UndefinedMvdHit, ///< number of undefined MVD hits + UndefinedStsHit, ///< number of undefined STS hits + UndefinedMuchHit, ///< number of undefined MuCh hits + UndefinedTrdHit, ///< number of undefined TRD hits + UndefinedTofHit, ///< number of undefined TOF hits kEND }; @@ -31,6 +37,8 @@ namespace cbm::algo::ca enum class ETimer { Tracking, + PrepareInput, + FindTracks, TrackFinder, TrackFitter, TripletConstruction, @@ -53,7 +61,14 @@ namespace cbm::algo::ca SetCounterName(ECounter::Triplet, "triplets"); SetCounterName(ECounter::RecoHitUsed, "used reco hits"); SetCounterName(ECounter::SubTS, "sub-timeslices"); + SetCounterName(ECounter::UndefinedMvdHit, "undefined MVD hits"); + SetCounterName(ECounter::UndefinedStsHit, "undefined STS hits"); + SetCounterName(ECounter::UndefinedMuchHit, "undefined MuCh hits"); + SetCounterName(ECounter::UndefinedTrdHit, "undefined TRD hits"); + SetCounterName(ECounter::UndefinedTofHit, "undefined TOF hits"); SetTimerName(ETimer::Tracking, "full tracking"); + SetTimerName(ETimer::PrepareInput, "input data initialization"); + SetTimerName(ETimer::FindTracks, "find tracks procedure"); SetTimerName(ETimer::TrackFinder, "track finder"); SetTimerName(ETimer::TrackFitter, "track fitter"); SetTimerName(ETimer::TripletConstruction, "triplet construction");