19#ifndef ALICEO2_FIT_RAWREADERBASE_H_
20#define ALICEO2_FIT_RAWREADERBASE_H_
25#include <unordered_map>
28#include <boost/mpl/vector.hpp>
29#include <boost/mpl/set.hpp>
30#include <boost/mpl/find.hpp>
31#include <boost/mpl/count.hpp>
45template <
typename DigitBlockType,
typename... DataBlockTypes>
55 using HashTableCRU_t = std::unordered_map<EntryCRU_t, RawDataMetric, typename LookupTable_t::MapEntryCRU2ModuleType_t::hasher, typename LookupTable_t::MapEntryCRU2ModuleType_t::key_equal>;
58 typedef boost::mpl::vector<
typename DataBlockTypes::DataBlockInvertedPadding_t..., DataBlockTypes...>
VecDataBlocks_t;
59 std::tuple<std::vector<typename DataBlockTypes::DataBlockInvertedPadding_t>..., std::vector<DataBlockTypes>...>
mTupleVecDataBlocks;
65 typedef typename boost::mpl::find<VecDataBlocks_t, T>::type it_t;
69 template <
class DataBlockType>
73 const auto& payloadSize = binaryPayload.size();
74 const int nWords = payloadSize / DataBlockType::DataBlockWrapperHeader_t::sSizeWord;
75 const int pageSizeThreshold = DataBlockType::DataBlockWrapperHeader_t::sSizeWord * (nWords -
int(nWords > 1));
76 while (srcPos < pageSizeThreshold) {
77 auto& refDataBlock = vecDataBlocks.emplace_back();
78 refDataBlock.decodeBlock(binaryPayload, srcPos);
79 srcPos += refDataBlock.mSize;
82 vecDataBlocks.pop_back();
89 template <
class DataBlockType,
typename... T>
90 void processBinaryData(gsl::span<const uint8_t> payload, uint16_t feeID, uint8_t linkID, uint8_t epID)
92 auto& vecDataBlocks = getVecDataBlocks<DataBlockType>();
93 auto& metric =
addMetric(feeID, linkID, epID);
94 auto srcPos =
decodeBlocks(payload, metric, vecDataBlocks);
95 for (
const auto& dataBlock : vecDataBlocks) {
96 auto intRec = dataBlock.getInteractionRecord();
97 auto [digitIter, isNew] =
mMapDigits.try_emplace(intRec, intRec);
98 digitIter->second.template processDigits<DataBlockType>(dataBlock, metric,
static_cast<int>(linkID),
static_cast<int>(epID));
101 vecDataBlocks.clear();
105 auto metricPair =
mHashTableMetrics.try_emplace(
EntryCRU_t{
static_cast<int>(linkID),
static_cast<int>(epID)}, linkID, epID, feeID, isRegisteredFEE);
106 auto& metric = metricPair.first->second;
110 template <
typename... VecDigitType>
115 digit.second.getDigits(vecDigit...);
123 vecMetrics.push_back(en.second);
131 typedef std::void_t<std::enable_if_t<boost::mpl::count<boost::mpl::set<DataBlockTypes...>, DataBlockTypes>
::value == 1>...> CheckUniqueTypes;
HashTableCRU_t mHashTableMetrics
std::unordered_map< EntryCRU_t, RawDataMetric, typename LookupTable_t::MapEntryCRU2ModuleType_t::hasher, typename LookupTable_t::MapEntryCRU2ModuleType_t::key_equal > HashTableCRU_t
int getDigits(VecDigitType &... vecDigit)
std::tuple< std::vector< typename DataBlockTypes::DataBlockInvertedPadding_t >..., std::vector< DataBlockTypes >... > mTupleVecDataBlocks
typename LookupTable_t::EntryCRU_t EntryCRU_t
void processBinaryData(gsl::span< const uint8_t > payload, uint16_t feeID, uint8_t linkID, uint8_t epID)
DigitBlockType DigitBlock_t
RawDataMetric RawDataMetric_t
std::map< InteractionRecord, DigitBlock_t > mMapDigits
typename DigitBlock_t::LookupTable_t LookupTable_t
size_t decodeBlocks(const gsl::span< const uint8_t > binaryPayload, RawDataMetric &metric, std::vector< DataBlockType > &vecDataBlocks)
boost::mpl::vector< typename DataBlockTypes::DataBlockInvertedPadding_t..., DataBlockTypes... > VecDataBlocks_t
RawDataMetric & addMetric(uint16_t feeID, uint8_t linkID, uint8_t epID, bool isRegisteredFEE=true)
constexpr std::vector< T > & getVecDataBlocks()
void getMetrics(std::vector< RawDataMetric > &vecMetrics)
GLsizei const GLfloat * value
TFitResultPtr fit(const size_t nBins, const T *arr, const T xMin, const T xMax, TF1 &func, std::string_view option="")
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool checkBadDataBlock(Status_t metric)