Update responsibles for MCH, MTR, HMP
[u/mrichter/AliRoot.git] / RAW / event.h
1 /****************************************************************************
2  *
3  * event.h: DATE event data format
4  *
5  * Revision History:
6  *    V01.00  RD PVV    09-Jan-97 Initial version
7  *    V01.01  AV        24-Feb-97 Added START_OF_RUN_FILES and triggerNb
8  *    V02.02  RD        13-Mar-97 Detector ID mask type added
9  *    V02.03  PVV       20-Mar-97 Detector ID on 128 bits
10  *    V02.03  RD PVV    20-Mar-97 Added EVENT_DATA_TRUNCATED
11  *    V02.04  PVV       06-May-97 Added EVENT_TYPE_MASK
12  *    V02.05  RD PVV    09-May-97 Increase EVENT_DATA_MAX_SIZE to 50 K
13  *    V02.06  WB MG     22-May-97 Added END_OF_RUN_FILES
14  *    V02.07  WB        23-May-97 Added errorCode, deadTime, deadTimeusec
15  *                                EVENT_DATA_MAX_SIZE set to 100 * 1024
16  *                                MAX_DETECTORS set to 126
17  *    V02.08  PVV       02-Jun-97 Modify the encoding of types
18  *    V02.09  WB RD PVV 28-Jul-98 Add fileSeqNb in the header.
19  *                                Reduce detector mask to 3 long
20  *    V02.10  RD        31-Jul-98 (start|end)OfRunFiles added to eventType
21  *    V02.11  PVV RD    02-Sep-98 Event type re-numbered
22  *                                Equipment bit added to event type
23  *    V02.12  AV PVV RD 03-Sep-98 FileSeqNo moved before detectorId
24  *    V02.13  RD        08-Oct-98 32 bits fields defined as long32
25  *    V02.13  RD        19-Feb-99 Endianness/swap definitions added
26  *    V02.14  WB PVV RD 21-Jun-99 typeAttribute added
27  *    V02.15  RD        27-Jul-99 Macros for typeAttribute handling added
28  *    V02.16  RD        19-Nov-99 Bug in Attributes test/set fixed
29  *    V02.17  WB PVV RD 08-May-00 System attributes for SOR and EOR added
30  *    V02.18  RD        18-May-00 EVENT_H_ID added
31  *    V02.19  RD        10-Aug-00 Macros for detectorId handling added
32  *    V03.00  RD        23-Nov-00 Version for DATE V4
33  *    V03.01  AV KS     05-Apr-02 Introduction of eventLocationDescriptorStruct
34  *    V03.02  KS        10-May-02 Added ATTR_KEEP_PAGES for COLE
35  *            RD        30-Apr-04 Added definitions for the Common Data Header
36  *            RD        24-Jun-04 Added definitions for HLT DECISION
37  *            RD        13-Jul-04 Added macros to OR attributes
38  *    V03.03  RD        25-May-05 Added eventTimestamp
39  *    V03.04  RD        17-Aug-05 Added VANGUARD and REARGUARD events
40  *    V03.05  RD        05-Sep-05 Added SYSTEM and DETECTOR software tri evts
41  *    V03.06  RD        14-Sep-05 VANGUARD/REARGUARD changed into START_OF_DATA
42  *                                and END_OF_DATA
43  *    V03.07  RD        26-Jul-06 Modifications for CDH version 2
44  *            KS        20-Dec-06 Corrected CDH layout for MBZ[22-23] and 
45  *                                L1 trigger message [14-21]
46  *    V03.08  RD        17-Jan-07 Added "BY DETECTOR" event system attribute
47  *    V03.09  RD        08-Feb-07 Moved trigger and detector masks down 1 bit
48  *            KS        14-May-08 Define trigger error bits 13+14 for the CDH
49  *    V03.10  RD        10-Nov-09 Define ATTR_EMPTY_EVENT attribute (removed)
50  *    V03.11  RD        01-Dec-10 Timestamp sec + usec
51  *    V03.12  RD        13-Sep-11 Added ATTR_ORIGINAL_EVENT and CDH_ORIGINAL_EVENT
52  *    V03.13  RD        15-Feb-12 Added SYNC event
53  *            RD        15-Jan-14 Added FLUSHED_EVENT and INCOMPLETE_EVENT
54  *    V03.14  RD        12-Feb-14 Changes for increased number of trigger classes
55  *                                (old:50, new:100) and for CDH V3
56  *
57  * Preprocessor definitions:
58  *  NDEBUG  Define BEFORE including this file to disable run-time checks on
59  *          various parameters made via assert()
60  *
61  * Related facilities:
62  *  validateEvent.c  Validation program, should be run after EACH change to
63  *                   the definitions given here below
64  ***************************************************************************/
65 #ifndef __event_h__
66 #define __event_h__
67
68 #define EVENT_MAJOR_VERSION_NUMBER  3
69 #define EVENT_MINOR_VERSION_NUMBER 14
70
71 /* ========== System includes ========= */
72 #include <string.h> /* Needed by: memset, memcpy */
73 #include <assert.h> /* Needed by: assert */
74
75 /* ========== Definitions for the event header ========== */
76
77 /* ------------------------- Header base size ------------------------- */
78 /* This value must be updated for each change in the eventHeaderStruct  */
79 /* This has not been made automatic as we want to keep this value under */
80 /* strict control...                                                    */
81 #define EVENT_HEAD_BASE_SIZE 80
82
83 /* ---------- Event size ---------- */
84 typedef unsigned long32 eventSizeType;
85
86 /* ----------- Magic signature and its byte-swapped version ----------- */
87 typedef unsigned long32 eventMagicType;
88 #define EVENT_MAGIC_NUMBER         ((eventMagicType)0xDA1E5AFE)
89 #define EVENT_MAGIC_NUMBER_SWAPPED ((eventMagicType)0xFE5A1EDA)
90
91 /* ---------- Header size ---------- */
92 typedef unsigned long32 eventHeadSizeType;
93
94 /* ---------- Unique version identifier ---------- */
95 #define EVENT_CURRENT_VERSION \
96   (((EVENT_MAJOR_VERSION_NUMBER<<16)&0xffff0000)|\
97    (EVENT_MINOR_VERSION_NUMBER&0x0000ffff))
98 typedef unsigned long32 eventVersionType;
99
100 /* ---------- Event type ---------- */
101 typedef unsigned long32 eventTypeType;
102 #define START_OF_RUN                    ((eventTypeType) 1)
103 #define END_OF_RUN                      ((eventTypeType) 2)
104 #define START_OF_RUN_FILES              ((eventTypeType) 3)
105 #define END_OF_RUN_FILES                ((eventTypeType) 4)
106 #define START_OF_BURST                  ((eventTypeType) 5)
107 #define END_OF_BURST                    ((eventTypeType) 6)
108 #define PHYSICS_EVENT                   ((eventTypeType) 7)
109 #define CALIBRATION_EVENT               ((eventTypeType) 8)
110 #define EVENT_FORMAT_ERROR              ((eventTypeType) 9)
111 #define START_OF_DATA                   ((eventTypeType)10)
112 #define END_OF_DATA                     ((eventTypeType)11)
113 #define SYSTEM_SOFTWARE_TRIGGER_EVENT   ((eventTypeType)12)
114 #define DETECTOR_SOFTWARE_TRIGGER_EVENT ((eventTypeType)13)
115 #define SYNC_EVENT                      ((eventTypeType)14)
116 #define EVENT_TYPE_MIN                  1
117 #define EVENT_TYPE_MAX                  14
118 enum eventTypeEnum {
119   startOfRun                   = START_OF_RUN,
120   endOfRun                     = END_OF_RUN,
121   startOfRunFiles              = START_OF_RUN_FILES,
122   endOfRunFiles                = END_OF_RUN_FILES,
123   startOfBurst                 = START_OF_BURST,
124   endOfBurst                   = END_OF_BURST,
125   physicsEvent                 = PHYSICS_EVENT,
126   calibrationEvent             = CALIBRATION_EVENT,
127   formatError                  = EVENT_FORMAT_ERROR,
128   startOfData                  = START_OF_DATA,
129   endOfData                    = END_OF_DATA,
130   systemSoftwareTriggerEvent   = SYSTEM_SOFTWARE_TRIGGER_EVENT,
131   detectorSoftwareTriggerEvent = DETECTOR_SOFTWARE_TRIGGER_EVENT,
132   syncEvent                    = SYNC_EVENT
133 };
134 #define EVENT_TYPE_OK(t) (((t) >= EVENT_TYPE_MIN) && (((t) <= EVENT_TYPE_MAX)))
135
136 /* ---------- Run number ---------- */
137 typedef unsigned long32 eventRunNbType;
138
139 /* ---------- The eventId field ---------- */
140 #define EVENT_ID_BYTES 8
141 #define EVENT_ID_WORDS ((EVENT_ID_BYTES) >> 2)
142 typedef unsigned long32 eventIdType[EVENT_ID_WORDS];
143
144    /* PERIOD - ORBIT - BUNCH crossing type events */
145 #define EVENT_ID_MAX_PERIOD         0x0fffffff
146 #define EVENT_ID_MAX_ORBIT          0x00ffffff
147 #define EVENT_ID_MAX_BUNCH_CROSSING 0x00000fff
148 #define LOAD_EVENT_ID(id,s,o,bc)       \
149   (EVENT_ID_SET_PERIOD(id,s),          \
150    EVENT_ID_SET_ORBIT(id,o),           \
151    EVENT_ID_SET_BUNCH_CROSSING(id,bc))
152 #define EVENT_ID_GET_BUNCH_CROSSING(id) ((id)[1]&0x00000fff)
153 #define EVENT_ID_GET_ORBIT(id) \
154                      ((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff))
155 #define EVENT_ID_GET_PERIOD(id) (((id)[0]>>4)&0x0fffffff)
156
157 #define EVENT_ID_SET_BUNCH_CROSSING(id,v)                \
158   (assert(((v)>=0)&&((v)<=EVENT_ID_MAX_BUNCH_CROSSING)), \
159    (id)[1]=((id)[1]&0xfffff000)|((v)&0xfff))
160 #define EVENT_ID_SET_ORBIT(id,v) \
161   (assert(((v)>=0)&&((v)<=EVENT_ID_MAX_ORBIT)),           \
162    (id)[0]=(((id)[0])&0xfffffff0)|(((v)&0x00f00000)>>20), \
163    (id)[1]=(((id)[1])&0x00000fff)|(((v)&0x000fffff)<<12))
164 #define EVENT_ID_SET_PERIOD(id,v)                         \
165   (assert(((v)>=0)&&((v)<=EVENT_ID_MAX_PERIOD)),          \
166    (id)[0]=(((id)[0])&0x0000000f)|(((v)&0x0fffffff)<<4))
167
168    /* RAW type event */
169 #define EVENT_ID_MAX_NB_IN_RUN   0xffffffff
170 #define EVENT_ID_MAX_BURST_NB    0x00000fff
171 #define EVENT_ID_MAX_NB_IN_BURST 0x000fffff
172 #define LOAD_RAW_EVENT_ID(id,nir,bn,nib)                     \
173   (assert(((bn)>=0)  && ((bn)<=EVENT_ID_MAX_BURST_NB) &&     \
174           ((nib)>=0) && ((nib)<=EVENT_ID_MAX_NB_IN_BURST)),  \
175    (id)[0]=nir,                                              \
176    (id)[1]=((bn<<20)&0xfff00000)|(nib&0x000fffff))
177 #define EVENT_ID_SET_NB_IN_RUN(id,nir)                  \
178   (assert(((nir)>=0)&&((nir)<=EVENT_ID_MAX_NB_IN_RUN)), \
179    (id)[0]=(nir))
180 #define EVENT_ID_SET_BURST_NB(id,bn)                    \
181   (assert(((bn)>=0)&&((bn)<=EVENT_ID_MAX_BURST_NB)),    \
182    (id)[1]=((id)[1]&0x000fffff)|(((bn)<<20)&0xfff00000))
183 #define EVENT_ID_SET_NB_IN_BURST(id,nib)                  \
184   (assert(((nib)>=0)&&((nib)<=EVENT_ID_MAX_NB_IN_BURST)), \
185    (id)[1]=((id)[1]&0xfff00000)|((nib)&0x000fffff))
186 #define EVENT_ID_GET_NB_IN_RUN(id)   ((id)[0])
187 #define EVENT_ID_GET_BURST_NB(id)    (((id)[1]>>20)&0x00000fff)
188 #define EVENT_ID_GET_NB_IN_BURST(id) ((id)[1]&0x000fffff)
189
190    /* All events */
191 #define EQ_EVENT_ID(a,b) ((((a)[0])==((b)[0]))&&(((a)[1])==((b)[1])))
192 #define GT_EVENT_ID(a,b) \
193     (((((a)[0])>((b)[0])))||((((a)[0])==((b)[0]))&&(((a)[1])>((b)[1]))))
194 #define LT_EVENT_ID(a,b) \
195     ((((a)[0])<((b)[0])) || ((((a)[0])==((b)[0]))&&(((a)[1])<((b)[1]))))
196 #define GE_EVENT_ID(a,b) (!LT_EVENT_ID(a,b))
197 #define LE_EVENT_ID(a,b) (!GT_EVENT_ID(a,b))
198 #define COPY_EVENT_ID(from,to) \
199                       memcpy((void*)to,(const void*)from,EVENT_ID_BYTES)
200 #define ADD_EVENT_ID(a,b) ((a)[1]+=(b)[1],(a)[0]+=(b)[0])
201 #define SUB_EVENT_ID(a,b) ((a)[1]-=(b)[1],(a)[0]-=(b)[0])
202 #define ZERO_EVENT_ID(id) memset((void *)(id),0,EVENT_ID_BYTES)
203
204 /* ---------- Trigger pattern (and relative masks) ---------- */
205 // The top bit of the trigger pattern is reserved for the validity flag
206 #define EVENT_TRIGGER_PATTERN_BYTES    16
207 #define EVENT_TRIGGER_PATTERN_WORDS    ((EVENT_TRIGGER_PATTERN_BYTES)>>2)
208 typedef unsigned long32 eventTriggerPatternType[EVENT_TRIGGER_PATTERN_WORDS];
209 #define EVENT_TRIGGER_ID_MIN           0
210 #define EVENT_TRIGGER_ID_MAX           99
211 #define CHECK_TRIGGER(t)               (assert(((t)>=EVENT_TRIGGER_ID_MIN) && \
212                                                ((t)<=EVENT_TRIGGER_ID_MAX)))
213 #define TRIGGER_TO_BIT(t)              (1<<((t)&0x1f))
214 #define TRIGGER_TO_WORD(t)             (CHECK_TRIGGER(t), (t)>>5)
215 #define ZERO_TRIGGER_PATTERN(p)        memset( (void *)(p), 0, EVENT_TRIGGER_PATTERN_BYTES )
216 #define SET_TRIGGER_IN_PATTERN(p,id)   (p)[TRIGGER_TO_WORD(id)] |= \
217                                                             TRIGGER_TO_BIT(id)
218 #define CLEAR_TRIGGER_IN_PATTERN(p,id) (p)[TRIGGER_TO_WORD(id)] &= \
219                                                          ~(TRIGGER_TO_BIT(id))
220 #define FLIP_TRIGGER_IN_PATTERN(p,id)  (p)[TRIGGER_TO_WORD(id)] ^= \
221                                                             TRIGGER_TO_BIT(id)
222 #define TEST_TRIGGER_IN_PATTERN(p,id)  (((p)[TRIGGER_TO_WORD(id)] & \
223                                                      TRIGGER_TO_BIT(id)) != 0)
224 #define TRIGGER_PATTERN_INVALID(p)     (((p)[EVENT_TRIGGER_PATTERN_WORDS-1] & 0x80000000) == 0)
225 #define TRIGGER_PATTERN_VALID(p)       (((p)[EVENT_TRIGGER_PATTERN_WORDS-1] & 0x80000000) != 0)
226 #define VALIDATE_TRIGGER_PATTERN(p)    ((p)[EVENT_TRIGGER_PATTERN_WORDS-1] |= 0x80000000)
227 #define INVALIDATE_TRIGGER_PATTERN(p)  ((p)[EVENT_TRIGGER_PATTERN_WORDS-1] &= 0x7fffffff)
228 #define COPY_TRIGGER_PATTERN(f,t)      memcpy( (void *)(t), (void *)(f),  EVENT_TRIGGER_PATTERN_BYTES )
229 #define TRIGGER_PATTERN_OK(p)          (((p)[EVENT_TRIGGER_PATTERN_WORDS-1] & 0x7ffffff0) == 0)
230
231 /* ---------- Detectors cluster (and relative masks) ---------- */
232 #define EVENT_DETECTOR_PATTERN_BYTES 4
233 #define EVENT_DETECTOR_PATTERN_WORDS (EVENT_DETECTOR_PATTERN_BYTES>>2)
234 typedef unsigned long32 eventDetectorPatternType[EVENT_DETECTOR_PATTERN_WORDS];
235 #define EVENT_DETECTOR_ID_MIN     0
236 #define EVENT_DETECTOR_ID_MAX    30
237 #define CHECK_DETECTOR(d) (assert(((d) >= EVENT_DETECTOR_ID_MIN) &&\
238                                   ((d) <= EVENT_DETECTOR_ID_MAX)))
239 #define DETECTOR_TO_BIT(d)              (CHECK_DETECTOR(d), 1<<(d))
240 #define ZERO_DETECTOR_PATTERN(p)        ((p)[0] = 0)
241 #define SET_DETECTOR_IN_PATTERN(p,d)    ((p)[0] |= DETECTOR_TO_BIT(d))
242 #define CLEAR_DETECTOR_IN_PATTERN(p,d)  ((p)[0] &= ~(DETECTOR_TO_BIT(d)))
243 #define FLIP_DETECTOR_IN_PATTERN(p,d)   ((p)[0] ^= DETECTOR_TO_BIT(d))
244 #define TEST_DETECTOR_IN_PATTERN(p,d)   (((p)[0] & DETECTOR_TO_BIT(d))!=0)
245 #define DETECTOR_PATTERN_INVALID(p)     (((p)[0] & 0x80000000) == 0)
246 #define DETECTOR_PATTERN_VALID(p)       (((p)[0] & 0x80000000) != 0)
247 #define VALIDATE_DETECTOR_PATTERN(p)    ((p)[0] |= 0x80000000)
248 #define INVALIDATE_DETECTOR_PATTERN(p)  ((p)[0] &= 0x7fffffff)
249 #define COPY_DETECTOR_PATTERN(f,t)      ((t)[0] = (f)[0])
250 #define DETECTOR_PATTERN_OK(p)          (((p)[0] & 0x1f000000) == 0)
251
252
253 /* ---------- The sizes and positions of the typeAttribute field ---------- */
254 #define ALL_ATTRIBUTE_WORDS    3
255 #define ALL_ATTRIBUTE_BYTES    (ALL_ATTRIBUTE_WORDS * 4)
256 #define ALL_ATTRIBUTE_BITS     (ALL_ATTRIBUTE_BYTES * 8)
257 #define USER_ATTRIBUTE_WORDS   2
258 #define USER_ATTRIBUTE_BYTES   (USER_ATTRIBUTE_WORDS * 4)
259 #define USER_ATTRIBUTE_BITS    (USER_ATTRIBUTE_BYTES * 8)
260 #define FIRST_USER_ATTRIBUTE   0
261 #define LAST_USER_ATTRIBUTE    (USER_ATTRIBUTE_BITS - 1)
262 #define SYSTEM_ATTRIBUTE_WORDS 1
263 #define SYSTEM_ATTRIBUTE_BYTES (SYSTEM_ATTRIBUTE_WORDS * 4)
264 #define SYSTEM_ATTRIBUTE_BITS  (SYSTEM_ATTRIBUTE_BYTES * 8)
265 #define FIRST_SYSTEM_ATTRIBUTE USER_ATTRIBUTE_BITS
266 #define LAST_SYSTEM_ATTRIBUTE  (USER_ATTRIBUTE_BITS + \
267                                  SYSTEM_ATTRIBUTE_BITS - 1)
268 typedef unsigned long32 eventTypeAttributeType[ALL_ATTRIBUTE_WORDS];
269
270    /* Word and bit definitions */
271 #define SYS_ATTR_2_W(b) (assert(((b)>=64)&&((b)<=95)),2)
272 #define USR_ATTR_2_W(b) (assert(((b)>= 0)&&((b)<=63)),(b)>>5)
273 #define ATTR_2_W(b)     (assert(((b)>= 0)&&((b)<=95)),(b)>>5)
274 #define ATTR_2_B(b)     (1<<((b)&0x1f))
275
276    /* Macros to handle all attributes without distinction */
277 #define RESET_ATTRIBUTES(m)      ((m)[2] = (m)[1] = (m)[0] = 0)
278 #define SET_ANY_ATTRIBUTE(m,b)   (m)[ATTR_2_W(b)] |=  ATTR_2_B(b)
279 #define CLEAR_ANY_ATTRIBUTE(m,b) (m)[ATTR_2_W(b)] &= ~(ATTR_2_B(b))
280 #define FLIP_ANY_ATTRIBUTE(m,b)  (m)[ATTR_2_W(b)] ^=  ATTR_2_B(b)
281 #define TEST_ANY_ATTRIBUTE(m,b)  (((m)[ATTR_2_W(b)] & ATTR_2_B(b))!= 0)
282 #define COPY_ALL_ATTRIBUTES( from, to ) \
283       memcpy((void *)&to[0], (const void *)&from[0], ALL_ATTRIBUTE_BYTES)
284 #define OR_ALL_ATTRIBUTES( from, to ) \
285       ((to)[2] |= (from)[2], (to)[1] |= (from)[1], (to)[0] |= (from)[0])
286
287    /* Macros to handle SYSTEM attributes */
288 #define RESET_SYSTEM_ATTRIBUTES(m)  ((m)[2] = 0)
289 #define SET_SYSTEM_ATTRIBUTE(m,b)   (m)[SYS_ATTR_2_W(b)] |= ATTR_2_B(b)
290 #define CLEAR_SYSTEM_ATTRIBUTE(m,b) (m)[SYS_ATTR_2_W(b)] &= ~(ATTR_2_B(b))
291 #define FLIP_SYSTEM_ATTRIBUTE(m,b)  (m)[SYS_ATTR_2_W(b)] ^= ATTR_2_B(b)
292 #define TEST_SYSTEM_ATTRIBUTE(m,b)  (((m)[SYS_ATTR_2_W(b)] & ATTR_2_B(b)) != 0)
293 #define COPY_SYSTEM_ATTRIBUTES( from, to ) \
294    memcpy((void *)&to[2], (const void *)&from[2], SYSTEM_ATTRIBUTE_BYTES)
295 #define OR_SYSTEM_ATTRIBUTES( from, to ) ((to)[2] |= (from)[2])
296
297    /* Macros to handle USER attributes */
298 #define RESET_USER_ATTRIBUTES(m)  ((m)[0] = (m)[1] = 0)
299 #define SET_USER_ATTRIBUTE(m,b)   (m)[USR_ATTR_2_W(b)] |= ATTR_2_B(b)
300 #define CLEAR_USER_ATTRIBUTE(m,b) (m)[USR_ATTR_2_W(b)] &= ~(ATTR_2_B(b))
301 #define FLIP_USER_ATTRIBUTE(m,b)  (m)[USR_ATTR_2_W(b)] ^= ATTR_2_B(b)
302 #define TEST_USER_ATTRIBUTE(m,b)  (((m)[USR_ATTR_2_W(b)] & ATTR_2_B(b)) != 0)
303 #define COPY_USER_ATTRIBUTES( from, to ) \
304      memcpy((void *)&to[0], (const void *)&from[0], USER_ATTRIBUTE_BYTES)
305 #define OR_USER_ATTRIBUTES( from, to ) \
306       ((to)[1] |= (from)[1], (to)[0] |= (from)[0])
307
308    /* System attributes assignment */
309 #define ATTR_P_START              64          /* Start of a phase          */
310 #define ATTR_P_END                65          /* End of a phase            */
311 #define ATTR_START_OF_RUN_START   ATTR_P_START/* Start of SOR phase        */
312 #define ATTR_START_OF_RUN_END     ATTR_P_END  /* End of SOR phase          */
313 #define ATTR_END_OF_RUN_START     ATTR_P_START/* Start of EOR phase        */
314 #define ATTR_END_OF_RUN_END       ATTR_P_END  /* End of SOR phase          */
315 #define ATTR_EVENT_SWAPPED        66          /* Swapped event header      */
316 #define ATTR_EVENT_PAGED          67          /* Paged event               */
317 #define ATTR_SUPER_EVENT          68          /* Super event               */
318 #define ATTR_ORBIT_BC             69          /* Orbit/bunch crossing in ID*/
319 #define ATTR_KEEP_PAGES           70          /* Do not deallocate pages   */
320 #define ATTR_HLT_DECISION         71          /* Event contains HLT decis. */
321 #define ATTR_BY_DETECTOR_EVENT    72          /* Event created by "by det."*/
322 #define ATTR_ORIGINAL_EVENT       73          /* All original payloads     */
323
324 #define ATTR_FLUSHED_EVENT        92          /* Flushed event             */
325 #define ATTR_INCOMPLETE_EVENT     93          /* Incomplete event          */
326 #define ATTR_EVENT_DATA_TRUNCATED 94          /* Truncated payload         */
327 #define ATTR_EVENT_ERROR          95          /* Invalid event content     */
328
329 #define SYSTEM_ATTRIBUTES_OK(m) \
330   ((((m)[2]) & ~(ATTR_2_B(ATTR_P_START)              | \
331                  ATTR_2_B(ATTR_P_END)                | \
332                  ATTR_2_B(ATTR_EVENT_SWAPPED)        | \
333                  ATTR_2_B(ATTR_EVENT_PAGED)          | \
334                  ATTR_2_B(ATTR_SUPER_EVENT)          | \
335                  ATTR_2_B(ATTR_ORBIT_BC)             | \
336                  ATTR_2_B(ATTR_KEEP_PAGES)           | \
337                  ATTR_2_B(ATTR_HLT_DECISION)         | \
338                  ATTR_2_B(ATTR_BY_DETECTOR_EVENT)    | \
339                  ATTR_2_B(ATTR_ORIGINAL_EVENT)       | \
340                  ATTR_2_B(ATTR_INCOMPLETE_EVENT)     | \
341                  ATTR_2_B(ATTR_FLUSHED_EVENT)        | \
342                  ATTR_2_B(ATTR_EVENT_DATA_TRUNCATED) | \
343                  ATTR_2_B(ATTR_EVENT_ERROR))) == 0)
344
345 /* ---------- LDC and GDC identifier ---------- */
346 typedef unsigned long32 eventHostIdType;
347 typedef eventHostIdType eventLdcIdType;
348 typedef eventHostIdType eventGdcIdType;
349 #define HOST_ID_MIN ((eventHostIdType)0)         /* The minimum allowed ID */
350 #define HOST_ID_MAX ((eventHostIdType)511)       /* The maximum allowed ID */
351 #define VOID_ID     ((eventHostIdType)-1)        /* Unloaded ID            */
352
353 /* ---------- Timestamps ----------
354
355    The timestamp of the event is associated to:
356
357    - Trigger arrived on the LDC
358    - First sub-event arrived on the GDC
359    - Event ready when monitoring by detector
360
361    The timestamp is split into seconds and microseconds.
362    
363    Please note that the typical accuracy of the Unix clock is on
364    the order of the millisecond.
365
366    For more details on the subject, see the man page for gettimeofday
367    and the description of the Unix standard type struct timeval
368 */
369
370 /* ---------- Seconds timestamp ----------
371
372    The following definition is in common for 32 and 64 bit machines.
373    In both architectures, the field must be loaded into a time_t
374    variable before being used. Failure to do so may cause undefined
375    results up to the early termination of the process.
376
377    The recommended procedure to use this field is the following:
378
379    #include <time.h>
380
381    time_t t;
382
383    t = eventHeaderStruct.eventTimestampSec;
384    cTime( &t ); (or whatever else can be done with a time_t)
385
386    Please note that the available timestamp will wrap sometime
387    around Jan 18, 19:14:07, 2038...
388 */
389 typedef unsigned long32 eventTimestampSecType;
390
391 /* Microseconds: range [0..999999]
392  */
393 typedef unsigned long32 eventTimestampUsecType;
394
395 /* ---------- The event header structure (with + without data) ---------- */
396 struct eventHeaderStruct { 
397   eventSizeType             eventSize;
398   eventMagicType            eventMagic;
399   eventHeadSizeType         eventHeadSize;
400   eventVersionType          eventVersion;
401   eventTypeType             eventType;
402   eventRunNbType            eventRunNb;
403   eventIdType               eventId;
404   eventTriggerPatternType   eventTriggerPattern;
405   eventDetectorPatternType  eventDetectorPattern;
406   eventTypeAttributeType    eventTypeAttribute;
407   eventLdcIdType            eventLdcId;
408   eventGdcIdType            eventGdcId;
409   union {
410     eventTimestampSecType   eventTimestampSec;
411     /* This definition is only for backward compatibility with event.h < 3.11 */
412     eventTimestampSecType   eventTimestamp;
413   };
414   eventTimestampUsecType    eventTimestampUsec;
415 };
416
417 struct eventStruct {
418     struct eventHeaderStruct eventHeader;
419            unsigned short    eventRawData[1];
420 };
421
422 /* ========== Definitions for the Vector ========== */
423 typedef short       eventVectorBankIdType;
424 typedef datePointer eventVectorSizeType;
425 typedef datePointer eventVectorOffsetType;
426
427 struct eventVectorStruct {
428   eventVectorBankIdType eventVectorBankId;
429   unsigned              eventVectorPointsToVector : 1;
430   eventVectorSizeType   eventVectorSize;
431   eventVectorOffsetType eventVectorStartOffset;
432 };
433
434 /* ========== Definitions for the payload descriptor ========== */
435 typedef        unsigned long32   eventNumEquipmentsType;
436 typedef struct eventVectorStruct eventExtensionVectorType;
437
438 struct vectorPayloadDescriptorStruct {
439   eventNumEquipmentsType   eventNumEquipments;
440   eventExtensionVectorType eventExtensionVector;
441 };
442
443 /* ========== Definitions for the equipment header ========== */
444 typedef long32                 equipmentSizeType;
445 typedef long32                 equipmentTypeType;
446 typedef long32                 equipmentIdType;
447 typedef eventTypeAttributeType equipmentTypeAttributeType;
448 typedef long32                 equipmentBasicElementSizeType;
449
450 struct equipmentHeaderStruct {
451   equipmentSizeType             equipmentSize;
452   equipmentTypeType             equipmentType;
453   equipmentIdType               equipmentId;
454   equipmentTypeAttributeType    equipmentTypeAttribute;
455   equipmentBasicElementSizeType equipmentBasicElementSize;
456 };
457
458 struct equipmentDescriptorStruct {
459   struct equipmentHeaderStruct equipmentHeader;
460   struct eventVectorStruct     equipmentVector;
461 }
462 #ifdef __GNUC__
463   __attribute__((__packed__));
464 #else
465   // Find whatever method for your compiler to pack the above structure without paddings
466   ;
467 #endif
468
469 struct equipmentStruct {
470   struct equipmentHeaderStruct equipmentHeader;
471          unsigned short        equipmentRawData[1];
472 };
473
474 /* ========== Definition of the event location for the simpleFifo ========== */
475 struct eventLocationDescriptorStruct {
476   eventVectorBankIdType eventBankId;
477   eventVectorOffsetType eventOffset;
478 };
479
480 /* ========== Global macros ========== */
481
482 /* The macro PAGED_EVENT_SIZE receives in input the ADDRESS of a paged
483    event and returns the size (in bytes) of the first page of the
484    event */
485 #define PAGED_EVENT_SIZE( event ) \
486   (EVENT_HEAD_BASE_SIZE +sizeof( struct vectorPayloadDescriptorStruct ) + \
487    ((*(eventNumEquipmentsType *)((void*)event+EVENT_HEAD_BASE_SIZE))* \
488      (sizeof( struct equipmentDescriptorStruct ))))
489
490 /* ========== Common data header ========== */
491 #define CDH_SIZE (4* 10)
492 #define CDH_VERSION 3
493
494 #define CDH_TRIGGER_OVERLAP_ERROR_BIT             0
495 #define CDH_TRIGGER_MISSING_ERROR_BIT             1
496 #define CDH_DATA_PARITY_ERROR_BIT                 2
497 #define CDH_CONTROL_PARITY_ERROR_BIT              3
498 #define CDH_TRIGGER_INFORMATION_UNAVAILABLE_BIT   4
499 #define CDH_FEE_ERROR_BIT                         5
500 #define CDH_HLT_DECISION_BIT                      6
501 #define CDH_HLT_PAYLOAD_BIT                       7
502 #define CDH_DDG_PAYLOAD_BIT                       8
503 #define CDH_TRIGGER_L1_TIME_VIOLATION_ERROR_BIT   9
504 #define CDH_TRIGGER_L2_TIME_VIOLATION_ERROR_BIT  10
505 #define CDH_TRIGGER_PREPULSE_ERROR_BIT           11
506 #define CDH_TRIGGER_ERROR_BIT                    12
507 #define CDH_TRIGGER_L1_MISSING_L2_RECEIVED_BIT   13
508 #define CDH_TRIGGER_MULTI_EVENT_BUFFER_ERROR_BIT 14
509 #define CDH_ORIGINAL_EVENT_BIT                   15
510
511 /* Macro to load the trigger classes of an event header
512    using the cdhTriggerClasses* fields */
513 #define CDH_LOAD_EVENT_TRIGGER_PATTERN( etp, l, ml, mh, h )     \
514   ( etp[0] = ((unsigned long32)(l)),                                    \
515     etp[1] = ((unsigned long32)(ml) & 0x0003ffff) | ((unsigned long32)(mh) << 18), \
516     etp[2] = ((unsigned long32)(mh) >> 14) | ((unsigned long32)(h) << 18), \
517     etp[3] = ((unsigned long32)(h)  >> 14) & 0xf)
518
519 /* Please note how the above data structure has been
520    defined for LE systems. Code running on BE systems
521    must have all fields reverted to work correctly! */
522 struct commonDataHeaderStruct {
523   unsigned cdhBlockLength               : 32;
524   /* ------------------------------------- */
525   unsigned cdhEventId1                  : 12;
526   unsigned cdhMBZ1                      :  2;
527   unsigned cdhL1TriggerMessage          :  8;
528   unsigned cdhMBZ0                      :  2;
529   unsigned cdhVersion                   :  8;
530   /* ------------------------------------- */
531   unsigned cdhEventId2                  : 24;
532   unsigned cdhParRequests               :  8;
533   /* ------------------------------------- */
534   unsigned cdhParticipatingSubDetectors : 24;
535   unsigned cdhBlockAttributes           :  8;
536   /* ------------------------------------- */
537   unsigned cdhMiniEventId               : 12;
538   unsigned cdhStatusErrorBits           : 20;
539   /* ------------------------------------- */
540   unsigned cdhTriggerClassesLow         : 32; // Goes into eventTriggerPattern[0]
541   /* ------------------------------------- */
542   unsigned cdhTriggerClassesMiddleLow   : 18; // Goes into eventTriggerPattern[1] (low)
543   unsigned cdhMBZ2                      : 14;
544   /* ------------------------------------- */
545   unsigned cdhTriggerClassesMiddleHigh  : 32; // Goes into eventTriggerPattern[1] (high) and [2] (low)
546   /* ------------------------------------- */
547   unsigned cdhTriggerClassesHigh        : 18; // Goes into eventTriggerPattern[2] (high) and [3]
548   unsigned cdhMBZ4                      : 10;
549   unsigned cdhRoiLow                    :  4;
550   /* ------------------------------------- */
551   unsigned cdhRoiHigh                   : 32;
552 };
553
554 /* Old (V2) structure, defined for backward
555    compatibility.
556
557    MAY DISAPPEAR IN FUTURE VERSIONS OF DATE!
558 */
559 struct commonDataHeaderV2Struct {
560   unsigned cdhBlockLength               : 32;
561   /* ------------------------------------- */
562   unsigned cdhEventId1                  : 12;
563   unsigned cdhMBZ1                      :  2;
564   unsigned cdhL1TriggerMessage          :  8;
565   unsigned cdhMBZ0                      :  2;
566   unsigned cdhVersion                   :  8;
567   /* ------------------------------------- */
568   unsigned cdhEventId2                  : 24;
569   unsigned cdhMBZ2                      :  8;
570   /* ------------------------------------- */
571   unsigned cdhParticipatingSubDetectors : 24;
572   unsigned cdhBlockAttributes           :  8;
573   /* ------------------------------------- */
574   unsigned cdhMiniEventId               : 12;
575   unsigned cdhStatusErrorBits           : 16;
576   unsigned cdhMBZ3                      :  4;
577   /* ------------------------------------- */
578   unsigned cdhTriggerClassesLow         : 32;
579   /* ------------------------------------- */
580   unsigned cdhTriggerClassesHigh        : 18;
581   unsigned cdhMBZ4                      : 10;
582   unsigned cdhRoiLow                    :  4;
583   /* ------------------------------------- */
584   unsigned cdhRoiHigh                   : 32;
585 };
586
587 #endif