CbmRoot
Loading...
Searching...
No Matches
trd2d/UnpackMS.h
Go to the documentation of this file.
1/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pascal Raisig, Alexandru Bercuci, Dominik Smith [committer] */
4#pragma once
5
6#include "CbmTrdDigi.h"
7#include "MicrosliceDescriptor.hpp"
8#include "UnpackMSBase.h"
9
10#include <array>
11#include <memory>
12#include <sstream>
13
14#define NFASPMOD 180
15#define NROBMOD 5
16#define NFASPROB NFASPMOD / NROBMOD
17#define NFASPCH 16
18#define NFASPPAD NFASPCH / 2
19
20#define FASP_EPOCH_LENGTH 128 // the length in clks of FASP epoch [1600ns @ 40MHz]
21
22namespace cbm::algo::trd2d
23{
24 enum class eMessageLength : int
25 {
26 kMessCh = 4,
27 kMessType = 1,
28 kMessTlab = 7,
29 kMessData = 14,
30 kMessFasp = 6,
31 kMessEpoch = 21
32 };
33
34 enum class eMessageVersion : uint8_t
35 {
36 kMessLegacy = 2,
37 kMess24 = 3,
38 };
39
40 enum class eMessageType : int
41 {
42 kData = 0,
43 kEpoch = 1,
44 kNone
45 };
46
48 // Constants
78 struct FaspMessage {
79 FaspMessage() = default;
80 FaspMessage(const FaspMessage&) = default;
81 FaspMessage(uint8_t c, uint8_t typ, uint8_t t, uint16_t d, uint8_t asic);
82
86 template<std::uint8_t mess_ver>
87 static eMessageType getType(uint32_t w);
88
89 std::string print() const;
90
94 template<std::uint8_t mess_ver>
95 void readDW(uint32_t w);
96
100 template<std::uint8_t mess_ver>
101 void readEW(uint32_t w);
102
103 uint8_t ch = 0;
105 uint8_t tlab = 0;
106 uint16_t data = 0;
107 uint32_t epoch = 0;
108 uint8_t fasp = 0;
109 };
110
117 int32_t fPadAddress;
118 bool fMask;
119 uint8_t fDaqOffset = 0;
120 uint16_t fSignalThres = 0;
121 };
122
129 std::vector<UnpackChannelPar> fChanParams;
130 };
131
137 struct UnpackPar {
138 int32_t fSystemTimeOffset = 0;
139 uint16_t fModId = 0;
140 uint16_t fEqAdd = 0;
141 uint8_t fEqId = 0xff;
142 std::map<uint8_t, UnpackAsicPar> fAsicParams = {};
143
145 void dump() const;
146
152 template<uint8_t ver>
153 uint8_t mapFaspId2Mod(uint8_t fasp_id) const;
154 };
155
156
164 uint32_t fNumIncompleteDigis = 0;
165 uint32_t fNumErrEndBitSet = 0;
166
168 {
169 uint32_t numErrors = fNumErrEndBitSet;
170 return (numErrors > 0 ? true : false);
171 }
172 std::string print()
173 {
174 std::stringstream ss;
175 ss << "stats " << fNumSelfTriggeredData << " | " << fNumIncompleteDigis << " | errors " << fNumErrEndBitSet
176 << " | ";
177 return ss.str();
178 }
179 };
180
188 };
189
195 template<std::uint8_t sys_ver>
196 class UnpackMS : public UnpackMSBase<CbmTrdDigi, UnpackMonitorData, UnpackAuxData> {
197
198 public:
200 UnpackMS(const UnpackPar& pars) : fParams(pars) {}
201
203 ~UnpackMS() override = default;
204
211 Result_t operator()(const uint8_t* msContent, const fles::MicrosliceDescriptor& msDescr,
212 const uint64_t tTimeslice) const override;
213
217 void SetParams(std::unique_ptr<UnpackPar> params) { fParams = *(std::move(params)); }
218
219 private: // Types
220 struct MsContext {
222
223 std::array<std::vector<CbmTrdDigi>, NFASPMOD* NFASPCH> fDigiBuffer = {
224 {}};
225 };
226
227 private: // members
229
230 bool pushDigis(std::vector<FaspMessage> messages, const uint64_t time, MsContext& ctx) const;
231
233 std::vector<CbmTrdDigi> FinalizeComponent(MsContext& ctx) const;
234 };
235
236
245 template<>
247 public UnpackMSBase<CbmTrdDigi, UnpackMonitorData, UnpackAuxData> {
248
249 public:
251 UnpackMS(const UnpackPar& pars) : fParams(pars) {}
252
254 ~UnpackMS() override = default;
255
256
263 Result_t operator()(const uint8_t* msContent, const fles::MicrosliceDescriptor& msDescr,
264 const uint64_t tTimeslice) const override;
265
269 void SetParams(std::unique_ptr<UnpackPar> params) { fParams = *(std::move(params)); }
270
271 private: // Types
272 struct MsContext {
274 std::array<std::vector<CbmTrdDigi>, NFASPMOD* NFASPPAD> fRobDigi = {
275 {}};
277 };
278
279 private: // members
280 bool pushDigis(std::vector<FaspMessage> messages, const uint64_t time, MsContext& ctx) const;
281
283
285 static constexpr float fAsicClockFreq = 0.08;
286 };
287
288} // namespace cbm::algo::trd2d
std::tuple< std::vector< Digi_t >, Monitor_t, Aux_t > Result_t
bool pushDigis(std::vector< FaspMessage > messages, const uint64_t time, MsContext &ctx) const
UnpackMS(const UnpackPar &pars)
Construct from parameters.
void SetParams(std::unique_ptr< UnpackPar > params)
Set the parameter container.
Unpack algorithm for TRD2D.
~UnpackMS() override=default
Destructor.
void SetParams(std::unique_ptr< UnpackPar > params)
Set the parameter container.
std::vector< CbmTrdDigi > FinalizeComponent(MsContext &ctx) const
Finalize component (e.g. copy from temp buffers)
UnpackMS(const UnpackPar &pars)
Construct from parameters.
bool pushDigis(std::vector< FaspMessage > messages, const uint64_t time, MsContext &ctx) const
UnpackPar fParams
Parameter container.
Result_t operator()(const uint8_t *msContent, const fles::MicrosliceDescriptor &msDescr, const uint64_t tTimeslice) const override
Algorithm execution.
@ kMess24
unpacker version for 2-board FASPRO+GETS HW
Data structure for unpacking the FASP word.
uint8_t tlab
time of the digi inside the epoch
void readDW(uint32_t w)
Read DATA WORD and store the content locally.
uint32_t epoch
epoch id (not used for the moment)
uint8_t ch
ch id in the FASP
void readEW(uint32_t w)
Read EPOCH WORD and store the content locally.
uint8_t fasp
FASP id in the module.
eMessageType type
message type 0 = data, 1 = epoch (not used for the moment)
static eMessageType getType(uint32_t w)
Implementation of message type descriptor according to message version.
FaspMessage(const FaspMessage &)=default
TRD2D Unpacking parameters for one Asic.
std::vector< UnpackChannelPar > fChanParams
Parameters for different channels.
TRD2D Unpacking parameters for one Asic channel.
int32_t fPadAddress
Pad address for channel.
uint16_t fSignalThres
Signal threshold to remove ringing channels.
uint8_t fDaqOffset
Time calibration parameter.
bool fMask
Flag for channel masking.
UnpackMonitorData fMonitor
Container for monitoring data.
std::array< std::vector< CbmTrdDigi >, NFASPMOD *NFASPCH > fDigiBuffer
uint32_t fNumSelfTriggeredData
word fulfills data & 0x2000
uint32_t fNumIncompleteDigis
incomplete digis left in pads after finalization
uint32_t fNumErrEndBitSet
Corrupted data with end bit set.
Parameters required for the TRD2D unpacking (specific to one component)
void dump() const
Write to the debug stream the content of the current param object.
uint8_t fEqId
Equipment (optical fiber) ID of component.
uint16_t fModId
Module ID of component.
int32_t fSystemTimeOffset
Time calibration parameter.
std::map< uint8_t, UnpackAsicPar > fAsicParams
Parameters for each ASIC.
uint8_t mapFaspId2Mod(uint8_t fasp_id) const
Calculate the module wise FASP id from the FASP id provided at the level of equipment Id (optical fib...
uint16_t fEqAdd
Equipment (optical fiber) address [HEX].
#define NFASPCH
#define NFASPPAD
#define NFASPMOD