diff --git a/algo/test/_GTestTimeClusterTrigger.cxx b/algo/test/_GTestTimeClusterTrigger.cxx index 7113b5f4c78042291be0e6226daf94804f89d8e8..35e8891a98217ed66c81f06fbbb0209557a1b00c 100644 --- a/algo/test/_GTestTimeClusterTrigger.cxx +++ b/algo/test/_GTestTimeClusterTrigger.cxx @@ -24,10 +24,16 @@ TEST(_GTestTimeClusterTrigger, CheckTriggerAlgorithmSimple) dataIn.push_back(i * inputSpacing); } - std::vector<double> dataOut = trigger(dataIn, windowSize, nMinNumber, deadTime); + cbm::algo::TimeClusterTrigger::resultType result = trigger(dataIn, windowSize, nMinNumber, deadTime); + std::vector<double>& dataOut = result.first; + cbm::algo::TimeClusterTriggerMonitorData& monitor = result.second; + EXPECT_EQ(dataOut.size(), 10); for (uint i = 0; i < dataOut.size(); i++) { EXPECT_EQ(dataOut[i], 495. + i * 1000.); } + + EXPECT_EQ(dataIn.size(), monitor.fNum); + EXPECT_EQ(nMinNumber * dataOut.size(), monitor.fNumInTrigger); } diff --git a/algo/trigger/TimeClusterTrigger.cxx b/algo/trigger/TimeClusterTrigger.cxx index 85a35f8f99db0b6795f096c0b3a87f152f87a226..fe21815e2d1ac4ab0d7b5ee96d89ba5fb5ff12f3 100644 --- a/algo/trigger/TimeClusterTrigger.cxx +++ b/algo/trigger/TimeClusterTrigger.cxx @@ -14,13 +14,16 @@ using std::vector; namespace cbm::algo { - vector<double> TimeClusterTrigger::operator()(const vector<double>& dataVec, double winSize, int32_t minNumData, - double deadTime) const + TimeClusterTrigger::resultType TimeClusterTrigger::operator()(const vector<double>& dataVec, double winSize, + int32_t minNumData, double deadTime) const { - assert(std::is_sorted(dataVec.begin(), dataVec.end())); - vector<double> triggerVec; + // --- Output data + resultType result = {}; + vector<double>& triggerVec = result.first; + TimeClusterTriggerMonitorData& monitor = result.second; + auto winStart = dataVec.begin(); auto current = dataVec.begin(); @@ -34,6 +37,9 @@ namespace cbm::algo if (std::distance(winStart, current) >= minNumData - 1) { triggerVec.push_back(0.5 * (*current + *winStart)); + // Increment monitoring counter with number of digis used + monitor.fNumInTrigger += std::distance(winStart, current) + 1; + // Start new window after dead time winStart = current + 1; while (winStart != dataVec.end() && *winStart - *current <= deadTime) @@ -45,8 +51,10 @@ namespace cbm::algo else current++; } + // Store number of input data for monitoring + monitor.fNum += dataVec.size(); - return triggerVec; + return result; } } // namespace cbm::algo diff --git a/algo/trigger/TimeClusterTrigger.h b/algo/trigger/TimeClusterTrigger.h index e3794533e8a4af59bdbdfcdb6adb7ecafd5ed525..0ad85df3eee8efe449c101766cbaf6b41facce24 100644 --- a/algo/trigger/TimeClusterTrigger.h +++ b/algo/trigger/TimeClusterTrigger.h @@ -5,13 +5,23 @@ #ifndef CBM_ALGO_TIMECLUSTERTRIGGER_H #define CBM_ALGO_TIMECLUSTERTRIGGER_H 1 - +#include <cstddef> #include <cstdint> #include <vector> namespace cbm::algo { + /** @struct TimeClusterTriggerMonitorData + ** @author Dominik Smith <d.smith@gsi.de> + ** @since 23 Jun 2023 + ** @brief Monitoring data for time cluster trigger algorithm + **/ + struct TimeClusterTriggerMonitorData { + size_t fNumInTrigger = 0; ///< Time stamps used for trigger building + size_t fNum = 0; ///< Total time stamps in input + }; + /** @class TimeClusterTrigger ** @author Volker Friese <v.friese@gsi.de> ** @author Dominik Smith <d.smith@gsi.de> @@ -26,15 +36,17 @@ namespace cbm::algo class TimeClusterTrigger { public: + typedef std::pair<std::vector<double>, TimeClusterTriggerMonitorData> resultType; + /** @brief Execution ** @param dataVec Source data vector ** @param winSize Size of trigger window ** @param minNumData Threshold on number of data within the trigger window ** @param deadTime Minimum time between two triggers - ** @return Vector of trigger times + ** @return Vector of trigger times and monitoring data **/ - std::vector<double> operator()(const std::vector<double>& dataVec, double winSize, int32_t minNumData, - double deadTime) const; + resultType operator()(const std::vector<double>& dataVec, double winSize, int32_t minNumData, + double deadTime) const; }; diff --git a/reco/mq/CbmDevTrigger.cxx b/reco/mq/CbmDevTrigger.cxx index 29222c3475663cc279673f251d5fb1db7ac3f3e0..04acb3914eaceec8506aecc76a418c005100e169 100644 --- a/reco/mq/CbmDevTrigger.cxx +++ b/reco/mq/CbmDevTrigger.cxx @@ -148,7 +148,7 @@ std::vector<double> CbmDevTrigger::GetTriggerTimes(const CbmDigiTimeslice& ts) default: LOG(fatal) << "CbmDevTrigger::GetTriggerTimes(): Reading digis from unknown detector type!"; } LOG(debug) << "CbmDevTrigger::GetTriggerTimes(): Building triggers from " << vDigiTimes.size() << " digis."; - return fTriggerAlgo(vDigiTimes, fTriggerWindow, fMinNumDigis, fDeadTime); + return fTriggerAlgo(vDigiTimes, fTriggerWindow, fMinNumDigis, fDeadTime).first; } bool CbmDevTrigger::SendTriggers(const std::vector<double>& vTriggers, FairMQParts& partsIn) diff --git a/reco/tasks/CbmTaskTriggerDigi.cxx b/reco/tasks/CbmTaskTriggerDigi.cxx index d1a1f6ba7eb9d567e69f3e6c3c73ffe66970962d..31eee2cbbab01c72b98105e5b5c66915842550bc 100644 --- a/reco/tasks/CbmTaskTriggerDigi.cxx +++ b/reco/tasks/CbmTaskTriggerDigi.cxx @@ -103,7 +103,7 @@ void CbmTaskTriggerDigi::Exec(Option_t*) // --- Call the trigger algorithm timerStep.Start(); - *fTriggers = fAlgo(digiTimes, fTriggerWindow, fMinNumDigis, fDeadTime); + *fTriggers = fAlgo(digiTimes, fTriggerWindow, fMinNumDigis, fDeadTime).first; timerStep.Stop(); fTimeFind += timerStep.RealTime();