Project
Loading...
Searching...
No Matches
RawDataFormat.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
16
18
20
23
29
30#ifndef O2_TOF_RAWDATAFORMAT
31#define O2_TOF_RAWDATAFORMAT
32
33#ifdef __cplusplus
34#include <cstdint>
35#else
36#include <stdint.h>
37#endif
38
39#ifdef __cplusplus
40namespace o2
41{
42namespace tof
43{
44namespace raw
45{
46#endif
47
48#define TOF_MAGIC 0x70F // 12 bits pattern inserted in some key data to flag TOF data
49#define TOF_SOURCE_ID 0x5 // sourceId assigned to TOF (must match value in RDH sourceId field)
50
51/* TOF detField description RDH Word3 bit 0-31
52 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
53 -------------------------------------------------------------------------------------------------
54 | Served Triggers | Received Triggers | 0 | 70F |
55 -------------------------------------------------------------------------------------------------
56*/
57typedef struct {
58 uint32_t TOFmagic : 12;
59 uint32_t mbz : 4;
60 uint32_t triggerRecvInOrbit : 8;
61 uint32_t triggerServInOrbit : 8;
62} __attribute__((__packed__)) TOFDetField_t;
63#define TOF_DETFIELD_MAGIC(x) (x & FFF)
64#define TOF_DETFIELD_RECVTRIGGER(x) ((x >> 16) & 0xFF)
65#define TOF_DETFIELD_SERVTRIGGER(x) ((x >> 24) & 0xFF)
66
67/* GEO Ad assigned to TOF modules */
68#define DRM_GEOAD 1
69#define LTM_GEOAD 2
70#define TRM_GEOAD_MIN 3
71#define TRM_GEOAD_MAX 12
72
73/* Symbols and macros valid for all slots */
74#define TOF_HEADER 4
75#define TOF_TRAILER 5
76#define TOF_FILLER 7
77#define FILLER_WORD (TOF_FILLER << 28)
78#define TOF_GETGEO(x) (x & 0xF)
79#define TOF_GETDATAID(x) ((x >> 28) & 0xF)
80
81/* TOF Data Header (former CDH)
82 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
83 -------------------------------------------------------------------------------------------------
84Word 0 | 0100 | 00 | Event Length (Bytes) |
85 -------------------------------------------------------------------------------------------------
86Word 1 | LHC Orbit |
87 -------------------------------------------------------------------------------------------------
88*/
89// TDH - TOF Data Header
90typedef struct {
91 uint32_t bytePayload : 20;
92 uint32_t mbz : 8;
93 uint32_t dataId : 4;
94} __attribute__((__packed__)) TOFDataHeader_t;
95
96typedef struct {
97 uint32_t orbit : 32;
98} __attribute__((__packed__)) TOFOrbit_t;
99
100typedef struct {
101 TOFDataHeader_t head;
102 TOFOrbit_t orbit;
103} __attribute__((__packed__)) TDH_t;
104
105#define TDH_SIZE sizeof(TDH_t) // size is in bytes length is in words
106#define TDH_LENGTH TDH_SIZE / 4
107
108#define TDH_HEADER(d) TOF_GETDATAID(d)
109#define TDH_PAYLOAD(d) (d & 0x3FFFF)
110#define TDH_WORDS(d) TDH_PAYLOAD(d) / 4
111#define TDH_ORBIT(d) (d & 0xFFFFFFFF) //32 bit
112
113/* DRM headers & trailer
114
115 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
116 -------------------------------------------------------------------------------------------------
117Word 0 | 0100 |DG| Drm Id | Event Length (Words) | 0001 |
118 -------------------------------------------------------------------------------------------------
119Word 1 | 0100 |0 | DRMHWords | DRMHVersion | CLK |0 | Slot Participating Mask | 0001 |
120 -------------------------------------------------------------------------------------------------
121Word 2 | 0100 |TO| Slot Fault Mask |0 | Slot Enable Mask | 0001 |
122 -------------------------------------------------------------------------------------------------
123Word 3 | 0100 | Bunch Crossing (Local) | Bunch Crossing (GBTx) | 0001 |
124 -------------------------------------------------------------------------------------------------
125Word 4 | 0100 | 00 | Temp Ad | Temp Value | 0001 |
126 -------------------------------------------------------------------------------------------------
127Word 5 | 0100 | 00 |IR| Event CRC | 0001 |
128 -------------------------------------------------------------------------------------------------
129Trailer | 0101 | 000 | Event Counter (Local) | 0001 |
130 -------------------------------------------------------------------------------------------------
131*/
132// DRMH - DRM Data Header and Trailer
133//----------------------------------- Word 0
134typedef struct {
135 uint32_t slotId : 4;
136 uint32_t eventWords : 16;
137 uint32_t drmId : 7; // 0-71== 0x0-0x47 (Bits 0-7 of A_DRM_ID register)
138 uint32_t drmGenData : 1; // DRM generated payload (Bit 8 of A_DRM_ID)
139 uint32_t dataId : 4;
140} __attribute__((__packed__)) DRMDataHeader_t;
141
142//----------------------------------- Word 1
143typedef struct {
144 uint32_t slotId : 4;
145 uint32_t partSlotMask : 11;
146 uint32_t mbza : 1;
147 uint32_t clockStatus : 2;
148 uint32_t drmhVersion : 5; // > 0x10 is for Run3-4
149 uint32_t drmHSize : 4; // it doesn't count previous word, so currently it is 5
150 uint32_t mbzb : 1;
151 uint32_t dataId : 4;
152} __attribute__((__packed__)) DRMHeadW1_t;
153//----------------------------------- Word 2
154typedef struct {
155 uint32_t slotId : 4;
156 uint32_t enaSlotMask : 11;
157 uint32_t mbz : 1;
158 uint32_t faultSlotMask : 11;
159 uint32_t readoutTimeOut : 1;
160 uint32_t dataId : 4;
161} __attribute__((__packed__)) DRMHeadW2_t;
162//----------------------------------- Word 3
163typedef struct {
164 uint32_t slotId : 4;
165 uint32_t gbtBunchCnt : 12;
166 uint32_t locBunchCnt : 12;
167 uint32_t dataId : 4;
168} __attribute__((__packed__)) DRMHeadW3_t;
169//----------------------------------- Word 4
170typedef struct {
171 uint32_t slotId : 4;
172 uint32_t tempValue : 10;
173 uint32_t mbza : 2;
174 uint32_t tempAddress : 4;
175 uint32_t mbzb : 8;
176 uint32_t dataId : 4;
177} __attribute__((__packed__)) DRMHeadW4_t;
178//----------------------------------- Word 5
179typedef struct {
180 uint32_t slotId : 4;
181 uint32_t eventCRC : 16;
182 uint32_t irq : 1;
183 uint32_t mbz : 7;
184 uint32_t dataId : 4;
185} __attribute__((__packed__)) DRMHeadW5_t;
186
187// full DRMH (header + 5 words)
188typedef struct {
189 DRMDataHeader_t head;
190 DRMHeadW1_t w1;
191 DRMHeadW2_t w2;
192 DRMHeadW3_t w3;
193 DRMHeadW4_t w4;
194 DRMHeadW5_t w5;
195} __attribute__((__packed__)) DRMh_t;
196
197typedef struct {
198 uint32_t slotId : 4;
199 uint32_t locEvCnt : 12;
200 uint32_t mbz : 12;
201 uint32_t dataId : 4;
202} __attribute__((__packed__)) DRMDataTrailer_t;
203
204#define DRMH_SIZE sizeof(DRMh_t)
205#define DRMH_LENGTH DRMH_SIZE / 4
206#define DRM_HEAD_NW DRMH_LENGTH
207
208// Word 0
209#define DRM_EVWORDS(a) ((a & 0x000FFFF0) >> 4)
210#define DRM_DRMID(a) ((a & 0x07F00000) >> 20)
211#define DRM_GENDATA(a) ((a & 0x08000000) >> 27)
212#define DRM_DRMID_OLD(a) ((a & 0x007E00000) >> 21)
213#define DRM_EVWORDS_OLD(a) ((a & 0x0001FFFF0) >> 4)
214// Word 1
215#define DRM_SLOTID(a) ((a & 0x00007FF0) >> 4)
216#define DRM_CLKFLG(a) ((a & 0x00030000) >> 16)
217#define DRM_VERSID(a) ((a & 0x007C0000) >> 18)
218#define DRM_HSIZE(a) ((a & 0x07800000) >> 23)
219#define DRM_VERSID_OLD(a) ((a & 0x003E0000) >> 17)
220#define DRM_CLKFLG_OLD(a) ((a & 0x00018000) >> 15)
221#define DRM_HSIZE_OLD(a) ((a & 0x03C00000) >> 22)
222#define DRM_NEW_VERSION(a) ((a & 0x02000000) >> 25)
223// Word 2
224#define DRM_ENABLEID(a) ((a & 0x00007FF0) >> 4)
225#define DRM_FAULTID(a) ((a & 0x07FF0000) >> 16)
226#define DRM_RTMO(a) ((a & 0x08000000) >> 27)
227// Word 3
228#define DRM_BCGBT(a) ((a & 0x0000FFF0) >> 4)
229#define DRM_BCLOC(a) ((a & 0x0FFF0000) >> 16)
230// Word 4
231#define DRM_TEMP(a) ((a & 0x00003FF0) >> 4)
232#define DRM_SENSAD(a) ((a & 0x00070000) >> 16)
233// Word 5
234#define DRM_EVCRC(a) ((a & 0x000FFFF0) >> 4)
235// Trailer
236#define DRM_LOCEVCNT(a) ((a & 0x0000FFF0) >> 4)
237
238/* TRM headers & trailers */
239#define TRM_HEADER TOF_HEADER
240#define TRM_TRAILER TOF_TRAILER
241#define CHAIN_0_HEADER 0
242#define CHAIN_0_TRAILER 1
243#define CHAIN_1_HEADER 2
244#define CHAIN_1_TRAILER 3
245#define HIT_LEADING 0xA
246#define HIT_TRAILING 0xC
247#define REPORT_ERROR 6
248#define DEBERR REPORT_ERROR
249
250#define TRM_WORDID(a) TOF_GETDATAID(a) // legacy
251
252/* TRM Global Header
253 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
254 -------------------------------------------------------------------------------------------------
255 | 0100 | E| EVENT NUMBER (10) | EVENT WORDS (13) | SLOT ID |
256 |
257 |__ Empty event
258*/
259// TRM - TRM Data Global and Chain Header and Trailer
260typedef struct {
261 uint32_t slotId : 4;
262 uint32_t eventWords : 13;
263 uint32_t eventCnt : 10;
264 uint32_t emptyBit : 1;
265 uint32_t dataId : 4;
266} __attribute__((__packed__)) TRMDataHeader_t;
267#define TRM_EVCNT_GH(a) ((a & 0x07FE0000) >> 17)
268#define TRM_EVWORDS(a) ((a & 0x0001FFF0) >> 4)
269#define TRM_EMPTYBIT(a) ((a & 0x08000000) >> 27)
270
271/* TRM Chain Header
272 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
273 -------------------------------------------------------------------------------------------------
274 | 0000/0010 | RESERVED | BUNCH ID | SLOT ID |
275*/
276typedef struct {
277 uint32_t slotId : 4;
278 uint32_t bunchCnt : 12;
279 uint32_t mbz : 12;
280 uint32_t dataId : 4; // bit 29 flag the chain
281} __attribute__((__packed__)) TRMChainHeader_t;
282#define TRM_BUNCHID(a) ((a & 0x0000FFF0) >> 4)
283
284/* TRM Chain Trailer
285 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
286 -------------------------------------------------------------------------------------------------
287 | 0001/0011 | EVENT COUNTER | CHAIN_EVNT_WORD (12) | STATUS |
288*/
289typedef struct {
290 uint32_t status : 4;
291 uint32_t mbz : 12;
292 uint32_t eventCnt : 12;
293 uint32_t dataId : 4; // bit 29 flag the chain
294} __attribute__((__packed__)) TRMChainTrailer_t;
295#define TRM_EVCNT_CT(a) ((a & 0x0FFF0000) >> 16)
296#define TRM_CHAINSTAT(a) (a & 0xF)
297
298/* TRM Global Trailer
299 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
300 -------------------------------------------------------------------------------------------------
301 | 0101 | L|TS|CN| SENS AD| TEMP (8) | EVENT CRC (12) | X| X|
302 | | |
303 | | |__ Chain
304 | |__ Temp Status bit (1=OK,0=not valid)
305 |__ Lut error
306*/
307typedef struct {
308 uint32_t trailerMark : 2;
309 uint32_t eventCRC : 12;
310 uint32_t tempValue : 8;
311 uint32_t tempAddress : 3;
312 uint32_t tempChain : 1;
313 uint32_t tempAck : 1;
314 uint32_t lutErrorBit : 1;
315 uint32_t dataId : 4;
316} __attribute__((__packed__)) TRMDataTrailer_t;
317
318#define TRM_LUTERRBIT(a) ((a & 0x08000000) >> 27)
319#define TRM_PB24TEMP(a) ((a & 0x003FC000) >> 14)
320#define TRM_PB24ID(a) ((a & 0x01C00000) >> 22)
321#define TRM_PB24CHAIN(a) ((a & 0x02000000) >> 25)
322#define TRM_PB24ACK(a) ((a & 0x04000000) >> 26)
323#define TRM_EVCRC2(a) ((a & 0x00003FFC) >> 2)
324#define TRM_TERM(a) (a & 0x3)
325
326//#define TRM_EVCNT2(a) ((a & 0x07FE0000)>>17)
327//#define TRM_EVCRC(a) ((a & 0x0000FFF0)>>4)
328
329// TDC Hit Decoding
330/*
331 |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
332 -------------------------------------------------------------------------------------------------
333 | Data Id | TDC Id | Ch Id | TIME |
334
335 Note on dataId: all values > 5 here:
336 0110 HPTDC error or HPTDC test word (or global error if TDCId=0xF)
337 1010 Hit leading
338 1100 Hit trailing
339 if bit 28 is on, both copies of LUT corrupted, wrong compensation applied
340*/
341typedef struct {
342 uint32_t time : 21;
343 uint32_t chanId : 3;
344 uint32_t tdcId : 4;
345 uint32_t dataId : 4;
346} __attribute__((__packed__)) TRMDataHit_t;
347
348#define TRM_TIME(a) (a & 0x1FFFFF)
349#define TRM_CHANID(a) ((a >> 21) & 0x7)
350#define TRM_TDCID(a) ((a >> 24) & 0xF)
351
352// LTM
353// LTM - LTM Data Header and Trailer
354typedef struct {
355 uint32_t slotId : 4;
356 uint32_t eventWords : 13;
357 uint32_t cycloneErr : 1;
358 uint32_t fault : 6;
359 uint32_t mbz0 : 4;
360 uint32_t dataId : 4;
361} __attribute__((__packed__)) LTMDataHeader_t;
362#define LTM_HEAD_TAG(x) TOF_GETDATAID(x)
363#define LTM_HEAD_FAULTFLAG(x) (((x) >> 18) & 0x1)
364#define LTM_HEAD_CYCSTATUS(x) (((x) >> 17) & 0x1)
365#define LTM_EVENTSIZE(x) (((x) >> 4) & 0x1FFF) // actual event size
366#define LTM_HEAD_EVENTSIZE(x) (((x) >> 4) & 0x1FFF)
367#define LTM_HEAD_GEOADDR(x) TOF_GETGEO(x)
368#define LTM_HEADER TOF_HEADER
369
370typedef struct {
371 uint32_t slotId : 4;
372 uint32_t eventCRC : 12;
373 uint32_t eventCnt : 12;
374 uint32_t dataId : 4;
375} __attribute__((__packed__)) LTMDataTrailer_t;
376#define LTM_TAIL_TAG(x) TOF_GETDATAID(x)
377#define LTM_TAIL_EVENTNUM(x) (((x) >> 16) & 0xFFF)
378#define LTM_TAIL_EVENTCRC(x) (((x) >> 4) & 0xFFF)
379#define LTM_TAIL_GEOADDR(x) TOF_GETGEO(x)
380#define LTM_TRAILER TOF_TRAILER
381
382typedef struct {
383 uint32_t pdl0 : 8;
384 uint32_t pdl1 : 8;
385 uint32_t pdl2 : 8;
386 uint32_t pdl3 : 8;
387} __attribute__((__packed__)) LTMPdlWord_t;
388
389typedef struct {
390 uint32_t adc0 : 10;
391 uint32_t adc1 : 10;
392 uint32_t adc2 : 10;
393 uint32_t mbz : 2;
394} __attribute__((__packed__)) LTMAdcWord_t;
395
396typedef struct {
397 LTMDataHeader_t head;
398 LTMPdlWord_t pdlData[12];
399 // 48 PDL values 12 words
400 LTMAdcWord_t adcData[36];
401 // 16 Low Voltages 5 words + 10 bit
402 // 16 Thresholds 5 words + 10 bit
403 // 8 FEAC GND 2 words + 10 bit
404 // 8 FEAC Temp 2 words + 10 bit
405 // 12 LTM Temp: 4 words
406 // 48 OR trigger rates: 16 words
407 // 34 words + 2 words = 36 words
408 LTMDataTrailer_t trailer;
409} __attribute__((__packed__)) LTMPackedEvent_t;
410#define LTM_EVSIZE sizeof(LTMPackedEvent_t) // fixed expected event size
411#define LTM_PDL_FIELD(x, n) (((x) >> ((n)*8)) & 0xFF)
412#define LTM_V_FIELD(x, n) (((x) >> ((n)*10)) & 0x3FF)
413#define LTM_T_FIELD(x, n) (((x) >> ((n)*10)) & 0x3FF)
414#define LTM_OR_FIELD(x, n) (((x) >> ((n)*10)) & 0x3FF)
415
416typedef struct {
417 uint32_t TagHead;
418 uint32_t FaultFlag;
419 uint32_t CycStatus;
420 uint32_t EventSize;
421 uint32_t HeadGeo;
422 uint32_t PdlDelay[48];
423 uint32_t Vlv[16];
424 uint32_t Vth[16];
425 uint32_t GndFeac[8];
426 uint32_t FeacTemp[8];
427 uint32_t LocalTemp[12];
428 uint32_t OrRate[48];
429 uint32_t EventNum;
430 uint32_t EventCrc;
431 uint32_t TailGeo;
432 uint32_t TagTail;
433} LTMEvent_t;
434
437typedef union {
438 uint32_t data;
439 TOFDataHeader_t tofDataHeader;
440 TOFOrbit_t tofOrbit;
441 DRMDataHeader_t drmDataHeader;
442 DRMHeadW1_t drmHeadW1;
443 DRMHeadW2_t drmHeadW2;
444 DRMHeadW3_t drmHeadW3;
445 DRMHeadW4_t drmHeadW4;
446 DRMHeadW5_t drmHeadW5;
447 DRMDataTrailer_t drmDataTrailer;
448 TRMDataHeader_t trmDataHeader;
449 TRMDataTrailer_t trmDataTrailer;
450 TRMChainHeader_t trmChainHeader;
451 TRMChainTrailer_t trmChainTrailer;
452 TRMDataHit_t trmDataHit;
453} Union_t;
454
455#ifdef __cplusplus
456} // namespace raw
457} // namespace tof
458} // namespace o2
459#endif
460
461#endif
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
uint32_t HeadGeo
uint32_t EventNum
uint32_t TagTail
uint32_t TagHead
uint32_t CycStatus
uint32_t EventCrc
uint32_t FaultFlag
uint32_t EventSize
uint32_t TailGeo
DRMHeadW3_t w3
uint32_t tempValue
DRMHeadW4_t w4
uint32_t clockStatus
uint32_t tempChain
uint32_t eventCRC
LTMDataTrailer_t trailer
DRMHeadW1_t w1
uint32_t triggerRecvInOrbit
uint32_t enaSlotMask
LTMDataHeader_t head
uint32_t TOFmagic
uint32_t drmhVersion
uint32_t bunchCnt
uint32_t locEvCnt
uint32_t gbtBunchCnt
uint32_t drmHSize
uint32_t eventWords
uint32_t faultSlotMask
uint32_t partSlotMask
DRMHeadW2_t w2
uint32_t eventCnt
DRMHeadW5_t w5
uint32_t dataId
TOFOrbit_t orbit
uint32_t bytePayload
DRMDataHeader_t head
uint32_t emptyBit
uint32_t trailerMark
uint32_t triggerServInOrbit
uint32_t readoutTimeOut
TOFDataHeader_t head
uint32_t lutErrorBit
uint32_t locBunchCnt
uint32_t tempAddress
uint32_t cycloneErr
uint32_t drmGenData
DRMHeadW5_t drmHeadW5
DRMDataTrailer_t drmDataTrailer
TRMDataTrailer_t trmDataTrailer
TOFOrbit_t tofOrbit
DRMHeadW4_t drmHeadW4
TRMChainTrailer_t trmChainTrailer
DRMHeadW3_t drmHeadW3
DRMDataHeader_t drmDataHeader
TOFDataHeader_t tofDataHeader
TRMChainHeader_t trmChainHeader
DRMHeadW2_t drmHeadW2
DRMHeadW1_t drmHeadW1
TRMDataHeader_t trmDataHeader
uint32_t data
TRMDataHit_t trmDataHit