Project
Loading...
Searching...
No Matches
DataDecoder.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
18
19#ifndef O2_MCH_DATADECODER_H_
20#define O2_MCH_DATADECODER_H_
21
22#include <gsl/span>
23#include <unordered_set>
24#include <unordered_map>
25#include <fstream>
26
27#include "Headers/RDHAny.h"
33
34namespace o2
35{
36namespace mch
37{
38namespace raw
39{
40
41using RdhHandler = std::function<void(o2::header::RDHAny*)>;
42
43// custom hash for OrbitInfo objects
45 std::size_t operator()(const OrbitInfo& info) const noexcept
46 {
47 return std::hash<uint64_t>{}(info.get());
48 }
49};
50
51void dumpOrbits(const std::unordered_set<OrbitInfo, OrbitInfoHash>& mOrbits);
52
53//_________________________________________________________________
54//
55// Data decoder
56//_________________________________________________________________
58{
59 public:
60 static constexpr int32_t tfTimeMax{0x7FFFFFFF};
61 static constexpr int32_t tfTimeInvalid{-tfTimeMax};
62
63 enum class TimeRecoMode : uint8_t {
64 HBPackets = 0,
65 BCReset = 1
66 };
67
69 struct SampaInfo {
70 union {
71 uint32_t id = 0;
72 struct {
73 uint32_t chip : 1;
74 uint32_t ds : 6;
75 uint32_t solar : 16;
76 uint32_t unused : 9;
77 };
78 };
79
80 union {
81 // default value
82 uint64_t time = 0x0000000000000000;
83 struct {
84 uint32_t sampaTime : 10;
85 uint32_t bunchCrossing : 20;
86 uint32_t reserved : 2;
87 uint32_t orbit;
88 };
89 };
90 uint32_t getBXTime() const
91 {
92 return (bunchCrossing + (sampaTime * 4));
93 }
94 int32_t tfTime;
95 bool timeValid() const
96 {
97 return (tfTime != tfTimeInvalid);
98 }
99
100 bool operator==(const SampaInfo&) const;
101 bool operator<(const SampaInfo& rhs) const
102 {
103 if (id < rhs.id) {
104 return true;
105 } else if (time < rhs.time) {
106 return true;
107 }
108 return false;
109 }
110 };
111
117
119 bool update(uint32_t orbit, uint32_t bunchCrossing, bool verbose = false);
120 bool check(int32_t orbit, uint32_t bc, int32_t orbitRef, uint32_t bcRef, bool verbose = false);
121
122 int64_t mOrbit{-1};
123 int64_t mBunchCrossing{-1};
124
125 int64_t mOrbitPrev{-1};
127
128 bool mValid{true};
129 };
130
133 struct RawDigit {
136 auto getDetID() const { return digit.getDetID(); }
137 auto getPadID() const { return digit.getPadID(); }
138 uint32_t getADC() const { return digit.getADC(); }
139 auto getTime() const { return info.tfTime; }
140 bool timeValid() const { return info.timeValid(); }
141 auto getOrbit() const { return info.orbit; }
142 auto getBunchCrossing() const { return info.bunchCrossing; }
143 auto getSampaTime() const { return info.sampaTime; }
144 auto getBXTime() const { return info.getBXTime(); }
145
146 bool operator==(const RawDigit&) const;
147 };
148
149 using RawDigitVector = std::vector<RawDigit>;
150
151 DataDecoder(SampaChannelHandler channelHandler, RdhHandler rdhHandler,
152 std::string mapCRUfile, std::string mapFECfile,
153 bool ds2manu, bool verbose, bool useDummyElecMap,
155 uint32_t nofOrbitsPerTF = 32);
156
157 void reset();
158
159 /* set the number of orbits that comprise one time frame. */
160 void setOrbitsInTF(uint32_t nofOrbitsPerTF) { mOrbitsInTF = nofOrbitsPerTF; }
161
164 void setFirstOrbitInTF(uint32_t orbit);
165
171 bool decodeBuffer(gsl::span<const std::byte> buf);
172
174 void updateTimeFrameStartRecord(uint64_t chipId, uint32_t mFirstOrbitInTF, uint32_t bcTF);
176 static uint64_t getChipId(uint32_t solar, uint32_t ds, uint32_t chip);
178 static int32_t getDigitTimeHBPackets(uint32_t orbitTF, uint32_t bcTF, uint32_t orbitDigit, uint32_t bcDigit);
181 int32_t getDigitTimeBCRst(uint32_t orbitTF, uint32_t bcTF, uint32_t orbitDigit, uint32_t bcDigit);
184 void computeDigitsTime();
185
187 const RawDigitVector& getDigits() const { return mDigits; }
189 const std::unordered_set<OrbitInfo, OrbitInfoHash>& getOrbits() const { return mOrbits; }
191 const std::vector<o2::mch::DecoderError>& getErrors() const { return mErrors; }
193 const std::vector<o2::mch::HeartBeatPacket>& getHBPackets() const { return mHBPackets; }
195 void setDigits(const RawDigitVector& digits) { mDigits = digits; }
196
198 void logErrorMap(int tfcount) const;
199
200 private:
201 void initElec2DetMapper(std::string filename);
202 void initFee2SolarMapper(std::string filename);
203 void init();
204 void decodePage(gsl::span<const std::byte> page);
205 void dumpDigits();
206 bool getPadMapping(const DsElecId& dsElecId, DualSampaChannelId channel, int& deId, int& dsIddet, int& padId);
207 bool addDigit(const DsElecId& dsElecId, DualSampaChannelId channel, const o2::mch::raw::SampaCluster& sc);
208 bool getTimeFrameStartRecord(const RawDigit& digit, uint32_t& orbit, uint32_t& bc);
209 bool getMergerChannelId(const DsElecId& dsElecId, DualSampaChannelId channel, uint32_t& chId, uint32_t& dsId);
210 uint64_t getMergerChannelBitmask(DualSampaChannelId channel);
211 void updateMergerRecord(uint32_t mergerChannelId, uint32_t mergerBoardId, uint64_t mergerChannelBitmask, uint32_t digitId);
212 bool mergeDigits(uint32_t mergerChannelId, uint32_t mergerBoardId, uint64_t mergerChannelBitmask, o2::mch::raw::SampaCluster& sc);
213
214 // structure that stores the index of the last decoded digit for a given readout channel,
215 // as well as the time stamp of the last ADC sample of the digit
216 struct MergerChannelRecord {
217 MergerChannelRecord() = default;
218 uint32_t digitId{0xFFFF};
219 uint32_t bcEnd{0xFFFF};
220 };
221
222 static constexpr uint32_t sMaxSolarId = 200 * 8 - 1;
223 static constexpr uint32_t sReadoutBoardsNum = (sMaxSolarId + 1) * 40;
224 static constexpr uint32_t sReadoutChipsNum = sReadoutBoardsNum * 2;
225 static constexpr uint32_t sReadoutChannelsNum = sReadoutChipsNum * 32;
226 // table storing the last recorded TF time stamp in SAMPA BC counter units
227 std::vector<TimeFrameStartRecord> mTimeFrameStartRecords;
228
230
231 // table storing the digits merging information for each readout channel in the MCH system
232 std::vector<MergerChannelRecord> mMergerRecords;
233 std::vector<uint64_t> mMergerRecordsReady;
234
235 Elec2DetMapper mElec2Det{nullptr};
236 FeeLink2SolarMapper mFee2Solar{nullptr};
237 std::string mMapFECfile;
238 std::string mMapCRUfile;
239
241
242 RawDigitVector mDigits;
243 std::unordered_set<OrbitInfo, OrbitInfoHash> mOrbits;
244 std::vector<o2::mch::DecoderError> mErrors;
245 std::vector<o2::mch::HeartBeatPacket> mHBPackets;
246
247 uint32_t mOrbitsInTF;
248 uint32_t mBcInOrbit;
249 uint32_t mFirstOrbitInTF;
250 uint32_t mSampaTimeOffset{0};
251
252 SampaChannelHandler mChannelHandler;
253 std::function<void(o2::header::RDHAny*)> mRdhHandler;
254
255 bool mDebug{false};
256 int mErrorCount{0};
257 bool mDs2manu{false};
258 uint32_t mOrbit{0};
259 bool mUseDummyElecMap{false};
260 std::map<std::string, uint64_t> mErrorMap; // counts for error messages
261};
262
263bool operator<(const DataDecoder::RawDigit& d1, const DataDecoder::RawDigit& d2);
264
265std::ostream& operator<<(std::ostream& os, const DataDecoder::RawDigit& d);
266
267std::string asString(const DataDecoder::RawDigit& d);
268
269} // namespace raw
270} // namespace mch
271} // end namespace o2
272#endif // O2_MCH_DATADECODER_H_
uint64_t orbit
Definition RawEventData.h:6
uint64_t bc
Definition RawEventData.h:5
MCH digit implementation.
Definition Digit.h:31
int getPadID() const
Definition Digit.h:54
int getDetID() const
Definition Digit.h:52
uint32_t getADC() const
Definition Digit.h:57
MCH orbit info implementation.
Definition OrbitInfo.h:32
std::vector< RawDigit > RawDigitVector
void logErrorMap(int tfcount) const
send all messages from our error map to the infologger
void setOrbitsInTF(uint32_t nofOrbitsPerTF)
void computeDigitsTimeBCRst()
Compute the time of all the digits that have been decoded in the current TimeFrame.
void computeDigitsTimeHBPackets()
Compute the time of all the digits that have been decoded in the current TimeFrame.
static constexpr int32_t tfTimeInvalid
Definition DataDecoder.h:61
static int32_t getDigitTimeHBPackets(uint32_t orbitTF, uint32_t bcTF, uint32_t orbitDigit, uint32_t bcDigit)
Helper function for computing the digit time relative to the beginning of the TimeFrame.
static constexpr int32_t tfTimeMax
Definition DataDecoder.h:60
const std::vector< o2::mch::HeartBeatPacket > & getHBPackets() const
Get the list of heart-beat packets that have been found in the current TimeFrame.
const std::vector< o2::mch::DecoderError > & getErrors() const
Get the list of decoding errors that have been found in the current TimeFrame.
void setFirstOrbitInTF(uint32_t orbit)
int32_t getDigitTimeBCRst(uint32_t orbitTF, uint32_t bcTF, uint32_t orbitDigit, uint32_t bcDigit)
static uint64_t getChipId(uint32_t solar, uint32_t ds, uint32_t chip)
Convert a Solar/Ds/Chip triplet into an unique chip index.
void setDigits(const RawDigitVector &digits)
Initialize the digits from an external vector. To be only used for unit tests.
void updateTimeFrameStartRecord(uint64_t chipId, uint32_t mFirstOrbitInTF, uint32_t bcTF)
For a given SAMPA chip, update the information about the BC counter value at the beginning of the Tim...
const RawDigitVector & getDigits() const
Get the vector of digits that have been decoded in the current TimeFrame.
const std::unordered_set< OrbitInfo, OrbitInfoHash > & getOrbits() const
Get the list of orbits that have been found in the current TimeFrame for each CRU link.
bool decodeBuffer(gsl::span< const std::byte > buf)
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glcorearb.h:2514
std::function< void(o2::header::RDHAny *)> RdhHandler
Definition DataDecoder.h:41
std::function< std::optional< DsDetId >(DsElecId)> Elec2DetMapper
Definition Mapper.h:42
std::function< void(Page buffer)> PageDecoder
Definition PageDecoder.h:28
void dumpOrbits(const std::unordered_set< OrbitInfo, OrbitInfoHash > &mOrbits)
std::function< void(DsElecId dsId, DualSampaChannelId channel, SampaCluster)> SampaChannelHandler
uint6_t DualSampaChannelId
Definition DataFormats.h:65
std::function< std::optional< uint16_t >(FeeLinkId id)> FeeLink2SolarMapper
From (feeId,linkId) to solarId.
Definition Mapper.h:52
std::string asString(const SampaCluster &sc)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool operator<(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
std::ostream & operator<<(std::ostream &stream, o2::InteractionRecord const &ir)
std::string filename()
bool operator==(const RawDigit &) const
Structure storing the raw SAMPA information.
Definition DataDecoder.h:69
bool operator<(const SampaInfo &rhs) const
bool operator==(const SampaInfo &) const
uint32_t bunchCrossing
bit 0 to 9: sampa time
Definition DataDecoder.h:85
uint32_t reserved
bit 10 to 29: bunch crossing counter
Definition DataDecoder.h:86
uint32_t orbit
bit 30 to 31: reserved
Definition DataDecoder.h:87
bool check(int32_t orbit, uint32_t bc, int32_t orbitRef, uint32_t bcRef, bool verbose=false)
bool update(uint32_t orbit, uint32_t bunchCrossing, bool verbose=false)
store the new orbit/bc pair, and copy the existing one in the "*Prev" data members
std::size_t operator()(const OrbitInfo &info) const noexcept
Definition DataDecoder.h:45
Piece of data for one Sampa channel.
const bool useDummyElecMap
DataDecoder::RawDigitVector RawDigitVector
o2::mch::DsIndex ds
std::vector< Digit > digits