Project
Loading...
Searching...
No Matches
RawReaderBase.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11//
12// file RawReaderBase.h base class for RAW data reading
13//
14// Artur.Furs
15// afurs@cern.ch
16//
17// Main purpuse is to decode FT0 data blocks and push them to DigitBlockFT0 for process
18
19#ifndef ALICEO2_FIT_RAWREADERBASE_H_
20#define ALICEO2_FIT_RAWREADERBASE_H_
21#include <iostream>
22#include <type_traits>
23#include <vector>
24#include <map>
25#include <unordered_map>
26#include <tuple>
27
28#include <boost/mpl/vector.hpp>
29#include <boost/mpl/set.hpp>
30#include <boost/mpl/find.hpp>
31#include <boost/mpl/count.hpp>
32
33#include <Rtypes.h>
36#include <Framework/Logger.h>
39
40#include <gsl/span>
41namespace o2
42{
43namespace fit
44{
45template <typename DigitBlockType, typename... DataBlockTypes>
47{
48 public:
49 RawReaderBase() = default;
50 ~RawReaderBase() = default;
51 typedef DigitBlockType DigitBlock_t;
53 using LookupTable_t = typename DigitBlock_t::LookupTable_t;
54 using EntryCRU_t = typename LookupTable_t::EntryCRU_t;
55 using HashTableCRU_t = std::unordered_map<EntryCRU_t, RawDataMetric, typename LookupTable_t::MapEntryCRU2ModuleType_t::hasher, typename LookupTable_t::MapEntryCRU2ModuleType_t::key_equal>;
56
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;
60
61 std::map<InteractionRecord, DigitBlock_t> mMapDigits;
62 template <typename T>
63 constexpr std::vector<T>& getVecDataBlocks()
64 {
65 typedef typename boost::mpl::find<VecDataBlocks_t, T>::type it_t;
66 return std::get<it_t::pos::value>(mTupleVecDataBlocks);
67 }
68 // decoding binary data into data blocks
69 template <class DataBlockType>
70 size_t decodeBlocks(const gsl::span<const uint8_t> binaryPayload, RawDataMetric& metric, std::vector<DataBlockType>& vecDataBlocks)
71 {
72 size_t srcPos = 0;
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)); // no need in reading last GBT word, this will be 0xff... or empty header
76 while (srcPos < pageSizeThreshold) {
77 auto& refDataBlock = vecDataBlocks.emplace_back();
78 refDataBlock.decodeBlock(binaryPayload, srcPos);
79 srcPos += refDataBlock.mSize;
80 if (metric.checkBadDataBlock(refDataBlock.mStatusBitsAll)) {
81 // exclude data block in case of single header(no data, total size == 16 bytes)
82 vecDataBlocks.pop_back();
83 }
84 }
85 return srcPos;
86 }
87
88 // processing data blocks into digits
89 template <class DataBlockType, typename... T>
90 void processBinaryData(gsl::span<const uint8_t> payload, uint16_t feeID, uint8_t linkID, uint8_t epID)
91 {
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));
100 }
101 vecDataBlocks.clear();
102 }
103 RawDataMetric& addMetric(uint16_t feeID, uint8_t linkID, uint8_t epID, bool isRegisteredFEE = true)
104 {
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;
107 return metric;
108 }
109 // pop digits
110 template <typename... VecDigitType>
111 int getDigits(VecDigitType&... vecDigit)
112 {
113 int digitCounter = mMapDigits.size();
114 for (auto& digit : mMapDigits) {
115 digit.second.getDigits(vecDigit...);
116 }
117 mMapDigits.clear();
118 return digitCounter;
119 }
120 void getMetrics(std::vector<RawDataMetric>& vecMetrics)
121 {
122 for (const auto& en : mHashTableMetrics) {
123 vecMetrics.push_back(en.second);
124 }
125 mHashTableMetrics.clear();
126 }
127
128 private:
129 // Check for unique DataBlock classes
130 // Line below will not be compiled in case of duplicates among DataBlockTypes
131 typedef std::void_t<std::enable_if_t<boost::mpl::count<boost::mpl::set<DataBlockTypes...>, DataBlockTypes>::value == 1>...> CheckUniqueTypes;
132};
133
134} // namespace fit
135} // namespace o2
136
137#endif
Definition of the RAW Data Header.
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
Definition glcorearb.h:819
TFitResultPtr fit(const size_t nBins, const T *arr, const T xMin, const T xMax, TF1 &func, std::string_view option="")
Definition fit.h:59
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool checkBadDataBlock(Status_t metric)