CbmRoot
Loading...
Searching...
No Matches
rich/UnpackMS.h
Go to the documentation of this file.
1/* Copyright (C) 2021 Goethe-University Frankfurt, Frankfurt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pascal Raisig, Dominik Smith [committer] */
4#pragma once
5
6#include "CbmRichDigi.h"
7#include "Timeslice.hpp"
10
11#include <cstddef>
12#include <cstdint>
13#include <iomanip>
14#include <memory>
15#include <sstream>
16#include <utility>
17
18namespace cbm::algo::rich
19{
20 class MicrosliceReader;
21
31
32
33 struct TdcTimeData {
34 uint32_t fCoarse = 0; // 11 bits
35 uint32_t fIsRisingEdge = 0; // 1 bit
36 uint32_t fFine = 0; // 10 bits
37 uint32_t fChannel = 0; // 7 bits
38 };
39
40
47 std::vector<double> fToTshift;
48 int64_t fTimeOffset = 0;
49 };
50
51
57 struct UnpackPar {
58 std::map<uint32_t, UnpackElinkPar> fElinkParams = {};
59 };
60
61
68 uint32_t fNumDebugMessage = 0;
75 uint32_t fNumErrWildEpoch = 0;
76 uint32_t fNumErrWildTdcTime = 0;
77 uint32_t fNumErrTdcErrorWord = 0;
81 uint32_t fNumErrInvalidHubId = 0;
82 uint32_t fNumErrInvalidHubSize = 0;
85
95 std::string print() const
96 {
97 std::stringstream ss;
98 ss << "errors " << fNumDebugMessage << " | " << fNumCtsAndUnmappedDirich << " | " << fNumErrInvalidFirstMessage
99 << " | " << fNumErrInvalidSecondMessage << " | " << fNumErrInvalidLastMessage << " | "
101 << fNumErrWildTdcTime << " | " << fNumErrTdcErrorWord << " | " << fNumErrChannelOutOfBounds << " | "
104 return ss.str();
105 }
126 };
127
135 };
136
137 class UnpackMS : public UnpackMSBase<CbmRichDigi, UnpackMonitorData, UnpackAuxData> {
138
139 public:
141 UnpackMS(const UnpackPar& pars);
142
143
145 ~UnpackMS() override;
146
147
154 Result_t operator()(const uint8_t* msContent, const fles::MicrosliceDescriptor& msDescr,
155 const uint64_t tTimeslice) const override;
156
160 void SetParams(std::unique_ptr<UnpackPar> params) { fParams = *(std::move(params)); }
161
162 private:
163 struct MSContext {
164 u64 cbmTimeMS = 0; // CbmTime of MS. Used to get time offset of subtriggers to MS start
167
168 // FIXME: Magic number, should be named.
169 //
170 // Comment from RICH expert (Martin Beyer):
171 // > This number will also be valid for the Cbm Rich, 1 Rich backplane contains max. 12 DiRICHes.
172 // > For the Cbm Rich the number of backplanes will be scaled
173 // > up. Nevertheless it is very likely that fewer DiRiches(maybe not constant)
174 // > per backplane are used in the day1 setup.
175 double prevLastCh0ReTime[13]; // 12 DiRICHes chnl0 + 1 CTS chnl0
176 double mbsCorr = 0.;
177
178 uint16_t currentSubSubEvent = 0;
179
180 std::vector<CbmRichDigi> digis;
182 };
183
184 private:
185 void ProcessTrbPacket(MicrosliceReader& reader, MSContext& ctx) const;
186
187 void ProcessHubBlock(MicrosliceReader& reader, MSContext& ctx) const;
188
189 int ProcessCtsHeader(MicrosliceReader& reader, uint32_t subSubEventSize, uint32_t subSubEventId) const;
190
191 void ProcessSubSubEvent(MicrosliceReader& reader, int nofTimeWords, uint32_t subSubEventId, MSContext& ctx) const;
192
193 bool ProcessTimeDataWord(uint32_t epoch, uint32_t tdcWord, uint32_t subSubEventId, std::vector<double>& raisingTime,
194 MSContext& ctx) const;
195
196 TdcWordType GetTdcWordType(uint32_t tdcWord) const;
197
198 TdcTimeData ProcessTimeData(uint32_t tdcWord) const;
199
200 uint32_t ProcessEpoch(uint32_t tdcWord) const;
201
202 uint16_t ProcessHeader(uint32_t tdcWord) const;
203
204 uint16_t ProcessTrailer(uint32_t tdcWord) const;
205
206 void WriteOutputDigi(int32_t fpgaID, int32_t channel, double time, double tot, MSContext& ctx) const;
207
208 double CalculateTime(uint32_t epoch, uint32_t coarse, uint32_t fine) const;
209
210 int32_t GetPixelUID(int32_t fpgaID, int32_t ch) const;
211
212 bool CheckMaskedDiRICH(int32_t subSubEventId) const;
213
214 private:
216
217 std::vector<int32_t> fMaskedDiRICHes;
218
219 bool fbDoToTCorr = true; //activates ToT correction from parameter file
220
221 // uint64_t fCbmTimeMS;
222 // uint64_t fCbmTimePacket;
223
224 // double fMbsCorr = 0.;
225 // double fPrevLastCh0ReTime[13]; // 12 DiRICHes chnl0 + 1 CTS chnl0
226 // uint16_t fCurrentSubSubEvent = 0;
227
228 double fToTMin = -20.;
229 double fToTMax = 100.;
230 };
231
232
234 private:
235 const uint8_t* fData = nullptr;
236 size_t fSize = 0;
237 size_t fOffset = 0; // offset in bytes
238 size_t fWordCounter = 0;
239 uint32_t fCurWord = 0;
240
241 public:
242 void SetData(const uint8_t* data, size_t size)
243 {
244 fData = data;
245 fSize = size;
246 fOffset = 0;
247 fWordCounter = 0;
248 fCurWord = 0;
249 }
250
251 const uint8_t* GetData() { return fData; }
252 size_t GetSize() { return fSize; }
253 size_t GetOffset() { return fOffset; }
254 size_t GetWordCounter() { return fWordCounter; }
255 uint32_t GetCurWord() { return fCurWord; }
256
257 std::string GetWordAsHexString(uint32_t word)
258 {
259 std::stringstream stream;
260 stream << "0x" << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex << word;
261 return stream.str();
262 }
263
264 uint32_t NextWord()
265 {
266 uint32_t i = ((uint32_t*) (fData + fOffset))[0];
267 //swap bytes
268 i = (i >> 24) | ((i << 8) & 0x00FF0000) | ((i >> 8) & 0x0000FF00) | (i << 24);
269 fOffset += 4;
270 fWordCounter++;
271 fCurWord = i;
272 return i;
273 }
274
276 {
277 uint32_t nextWord = ((uint32_t*) (fData + fOffset))[0];
278 if (nextWord == 0xffffffff) return true;
279 return false;
280 }
281
282 bool IsLastSubSubEvent(uint32_t subSubEventSize)
283 {
284 uint32_t i = ((uint32_t*) (fData + fOffset + 4 * subSubEventSize))[0];
285 i = (i >> 24) | ((i << 8) & 0x00ff0000) | ((i >> 8) & 0x0000ff00) | (i << 24);
286 if (i == 0x00015555) return true;
287 return false;
288 }
289 };
290
291} // namespace cbm::algo::rich
static constexpr size_t size()
Definition KfSimdPseudo.h:2
std::tuple< std::vector< Digi_t >, Monitor_t, Aux_t > Result_t
void SetData(const uint8_t *data, size_t size)
std::string GetWordAsHexString(uint32_t word)
bool IsLastSubSubEvent(uint32_t subSubEventSize)
double CalculateTime(uint32_t epoch, uint32_t coarse, uint32_t fine) const
bool CheckMaskedDiRICH(int32_t subSubEventId) const
UnpackPar fParams
Parameter container.
uint32_t ProcessEpoch(uint32_t tdcWord) const
UnpackMS(const UnpackPar &pars)
Construct from parameters.
std::vector< int32_t > fMaskedDiRICHes
void ProcessTrbPacket(MicrosliceReader &reader, MSContext &ctx) const
void WriteOutputDigi(int32_t fpgaID, int32_t channel, double time, double tot, MSContext &ctx) const
TdcWordType GetTdcWordType(uint32_t tdcWord) const
int ProcessCtsHeader(MicrosliceReader &reader, uint32_t subSubEventSize, uint32_t subSubEventId) const
Result_t operator()(const uint8_t *msContent, const fles::MicrosliceDescriptor &msDescr, const uint64_t tTimeslice) const override
Algorithm execution.
~UnpackMS() override
Destructor.
void ProcessSubSubEvent(MicrosliceReader &reader, int nofTimeWords, uint32_t subSubEventId, MSContext &ctx) const
int32_t GetPixelUID(int32_t fpgaID, int32_t ch) const
TdcTimeData ProcessTimeData(uint32_t tdcWord) const
void SetParams(std::unique_ptr< UnpackPar > params)
Set the parameter container.
void ProcessHubBlock(MicrosliceReader &reader, MSContext &ctx) const
bool ProcessTimeDataWord(uint32_t epoch, uint32_t tdcWord, uint32_t subSubEventId, std::vector< double > &raisingTime, MSContext &ctx) const
uint16_t ProcessTrailer(uint32_t tdcWord) const
uint16_t ProcessHeader(uint32_t tdcWord) const
uint64_t u64
Definition Definitions.h:23
RICH Unpacking parameters for one eLink / ASIC.
std::vector< double > fToTshift
TOT shift for different channels.
int64_t fTimeOffset
Time calibration parameter.
std::vector< CbmRichDigi > digis
Monitoring data for RICH unpacking.
uint32_t fNumErrWildHeaderMessage
TDC header in invalid position.
uint32_t fNumErrInvalidSecondMessage
Second message is not EPOCH.
uint32_t fNumErrWildEpoch
TDC epoch in invalid position.
uint32_t fNumErrInvalidHubSize
Premature end of hub block.
uint32_t fNumErrTdcErrorWord
TDC word of error type.
uint32_t fNumErrChannelOutOfBounds
TDC channel out of bounds.
uint32_t fNumErrOrphanRecovTimeData
TimeData in last position (not TRAILER) but not creating a Digi.
uint32_t fNumErrExcessLastWords
More than expected trailing words.
uint32_t fNumCtsAndUnmappedDirich
Dirich address is unknown (or is of a CTS)
uint32_t fNumErrInvalidLastMessage
Last message is not TRAILER.
uint32_t fNumSkippedSubsubevent
Whenever subsubevent skipped due to error (but not mask)
uint32_t fNumErrInvalidFirstMessage
First message is not HEADER.
uint32_t fNumErrInvalidHubId
"SubSubEvent" has invalid ID
uint32_t fNumErrWildTdcTime
TDC time (digi) in invalid position.
uint32_t fNumDebugMessage
Received debug messages.
void add(const UnpackMonitorData &rhs)
uint32_t fNumWarnRecoveredLastDigi
TimeData in last position (not TRAILER) led to recovered Digi.
uint32_t fNumErrWildTrailerMessage
TDC trailer in invalid position.
Parameters required for the RICH unpacking (specific to one component)
std::map< uint32_t, UnpackElinkPar > fElinkParams
Map TRB address to elink params.