1 /****************************************************************************
3 * event.h: DATE event data format
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
34 * Preprocessor definitions:
35 * NDEBUG Define BEFORE including this file to disable run-time checks on
39 * validateEvent.c Validation program, should be run after EACH change to
40 * the definitions given here below
41 ***************************************************************************/
45 #define EVENT_MAJOR_VERSION_NUMBER 0x0003
46 #define EVENT_MINOR_VERSION_NUMBER 0x0000
48 /* ========== System includes ========= */
49 #include <string.h> /* Needed by: memset, memcpy */
50 #include <assert.h> /* Needed by: assert */
52 /* ========== Definitions for the event header ========== */
54 /* ---------- Header base size ---------- */
55 /* This value must be updated for each change in the eventHeaderStruct */
56 #define EVENT_HEAD_BASE_SIZE 64
58 /* ---------- Event size ---------- */
59 typedef unsigned long32 eventSizeType;
61 /* ---------- Magic signature and its byte-swapped version ---------- */
62 #define EVENT_MAGIC_NUMBER ((eventMagicType)0xDA1E5AFE)
63 #define EVENT_MAGIC_NUMBER_SWAPPED ((eventMagicType)0xFE5A1EDA)
64 typedef unsigned long32 eventMagicType;
66 /* ---------- Header size ---------- */
67 typedef unsigned long32 eventHeadSizeType;
69 /* ---------- Unique version identifier ---------- */
70 #define EVENT_CURRENT_VERSION \
71 (((EVENT_MAJOR_VERSION_NUMBER<<16)&0xffff0000)|\
72 (EVENT_MINOR_VERSION_NUMBER&0x0000ffff))
73 typedef unsigned long32 eventVersionType;
75 /* ---------- Event type ---------- */
76 typedef unsigned long32 eventTypeType;
77 #define START_OF_RUN ((eventTypeType)1)
78 #define END_OF_RUN ((eventTypeType)2)
79 #define START_OF_RUN_FILES ((eventTypeType)3)
80 #define END_OF_RUN_FILES ((eventTypeType)4)
81 #define START_OF_BURST ((eventTypeType)5)
82 #define END_OF_BURST ((eventTypeType)6)
83 #define PHYSICS_EVENT ((eventTypeType)7)
84 #define CALIBRATION_EVENT ((eventTypeType)8)
85 #define EVENT_FORMAT_ERROR ((eventTypeType)9)
86 #define EVENT_TYPE_MIN 1
87 #define EVENT_TYPE_MAX 9
89 startOfRun = START_OF_RUN,
90 endOfRun = END_OF_RUN,
91 startOfRunFiles = START_OF_RUN_FILES,
92 endOfRunFiles = END_OF_RUN_FILES,
93 startOfBurst = START_OF_BURST,
94 endOfBurst = END_OF_BURST,
95 physicsEvent = PHYSICS_EVENT,
96 calibrationEvent = CALIBRATION_EVENT,
97 formatError = EVENT_FORMAT_ERROR
99 #define EVENT_TYPE_OK(t) (((t) >= EVENT_TYPE_MIN) && (((t) <= EVENT_TYPE_MAX)))
101 /* ---------- Run number ---------- */
102 typedef unsigned long32 eventRunNbType;
104 /* ---------- The eventId field ---------- */
105 #define EVENT_ID_BYTES 8
106 #define EVENT_ID_WORDS ((EVENT_ID_BYTES) >> 2)
107 typedef unsigned long32 eventIdType[EVENT_ID_WORDS];
109 /* PERIOD - ORBIT - BUNCH crossing type events */
110 #define EVENT_ID_MAX_PERIOD 0x0fffffff
111 #define EVENT_ID_MAX_ORBIT 0x00ffffff
112 #define EVENT_ID_MAX_BUNCH_CROSSING 0x00000fff
113 #define LOAD_EVENT_ID(id,s,o,bc) \
114 (EVENT_ID_SET_PERIOD(id,s), \
115 EVENT_ID_SET_ORBIT(id,o), \
116 EVENT_ID_SET_BUNCH_CROSSING(id,bc))
117 #define EVENT_ID_GET_BUNCH_CROSSING(id) ((id)[1]&0x00000fff)
118 #define EVENT_ID_GET_ORBIT(id) \
119 ((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff))
120 #define EVENT_ID_GET_PERIOD(id) (((id)[0]>>4)&0x0fffffff)
122 #define EVENT_ID_SET_BUNCH_CROSSING(id,v) \
123 (assert(((v)>=0)&&((v)<=EVENT_ID_MAX_BUNCH_CROSSING)), \
124 (id)[1]=((id)[1]&0xfffff000)|((v)&0xfff))
125 #define EVENT_ID_SET_ORBIT(id,v) \
126 (assert(((v)>=0)&&((v)<=EVENT_ID_MAX_ORBIT)), \
127 (id)[0]=(((id)[0])&0xfffffff0)|(((v)&0x00f00000)>>20), \
128 (id)[1]=(((id)[1])&0x00000fff)|(((v)&0x000fffff)<<12))
129 #define EVENT_ID_SET_PERIOD(id,v) \
130 (assert(((v)>=0)&&((v)<=EVENT_ID_MAX_PERIOD)), \
131 (id)[0]=(((id)[0])&0x0000000f)|(((v)&0x0fffffff)<<4))
134 #define EVENT_ID_MAX_NB_IN_RUN 0xffffffff
135 #define EVENT_ID_MAX_BURST_NB 0x00000fff
136 #define EVENT_ID_MAX_NB_IN_BURST 0x000fffff
137 #define LOAD_RAW_EVENT_ID(id,nir,bn,nib) \
138 (assert(((nir)>=0) && ((nir) <= EVENT_ID_MAX_NB_IN_RUN) && \
139 ((bn)>=0) && ((bn)<=EVENT_ID_MAX_BURST_NB) && \
140 ((nib)>=0) && ((nib)<=EVENT_ID_MAX_NB_IN_BURST)), \
142 (id)[1]=((bn<<20)&0xfff00000)|(nib&0x000fffff))
143 #define EVENT_ID_SET_NB_IN_RUN(id,nir) \
144 (assert(((nir)>=0)&&((nir)<=EVENT_ID_MAX_NB_IN_RUN)), \
146 #define EVENT_ID_SET_BURST_NB(id,bn) \
147 (assert(((bn)>=0)&&((bn)<=EVENT_ID_MAX_BURST_NB)), \
148 (id)[1]=((id)[1]&0x000fffff)|(((bn)<<20)&0xfff00000))
149 #define EVENT_ID_SET_NB_IN_BURST(id,nib) \
150 (assert(((nib)>=0)&&((nib)<=EVENT_ID_MAX_NB_IN_BURST)), \
151 (id)[1]=((id)[1]&0xfff00000)|((nib)&0x000fffff))
152 #define EVENT_ID_GET_NB_IN_RUN(id) ((id)[0])
153 #define EVENT_ID_GET_BURST_NB(id) (((id)[1]>>20)&0x00000fff)
154 #define EVENT_ID_GET_NB_IN_BURST(id) ((id)[1]&0x000fffff)
157 #define EQ_EVENT_ID(a,b) ((((a)[0])==((b)[0]))&&(((a)[1])==((b)[1])))
158 #define GT_EVENT_ID(a,b) \
159 (((((a)[0])>((b)[0])))||((((a)[0])==((b)[0]))&&(((a)[1])>((b)[1]))))
160 #define LT_EVENT_ID(a,b) \
161 ((((a)[0])<((b)[0])) || ((((a)[0])==((b)[0]))&&(((a)[1])<((b)[1]))))
162 #define GE_EVENT_ID(a,b) (!LT_EVENT_ID(a,b))
163 #define LE_EVENT_ID(a,b) (!GT_EVENT_ID(a,b))
164 #define COPY_EVENT_ID(from,to) \
165 memcpy((void*)to,(const void*)from,EVENT_ID_BYTES)
166 #define ADD_EVENT_ID(a,b) ((a)[1]+=(b)[1],(a)[0]+=(b)[0])
167 #define SUB_EVENT_ID(a,b) ((a)[1]-=(b)[1],(a)[0]-=(b)[0])
168 #define ZERO_EVENT_ID(id) memset(id,0,EVENT_ID_BYTES)
170 /* ---------- Trigger pattern (and relative masks) ---------- */
171 #define EVENT_TRIGGER_PATTERN_BYTES 8
172 #define EVENT_TRIGGER_PATTERN_WORDS ((EVENT_TRIGGER_PATTERN_BYTES)>>2)
173 typedef unsigned long32 eventTriggerPatternType[EVENT_TRIGGER_PATTERN_WORDS];
174 #define EVENT_TRIGGER_ID_MIN 1
175 #define EVENT_TRIGGER_ID_MAX 50
176 #define CHECK_TRIGGER(t) (assert(((t)>=EVENT_TRIGGER_ID_MIN) && \
177 ((t)<=EVENT_TRIGGER_ID_MAX)))
178 #define TRIGGER_TO_BIT(t) (1<<((t)&0x1f))
179 #define TRIGGER_TO_WORD(t) (CHECK_TRIGGER(t), (t)>>5)
180 #define ZERO_TRIGGER_PATTERN(p) memset(p,0,EVENT_TRIGGER_PATTERN_BYTES)
181 #define SET_TRIGGER_IN_PATTERN(p,id) (p)[TRIGGER_TO_WORD(id)] |= \
183 #define CLEAR_TRIGGER_IN_PATTERN(p,id) (p)[TRIGGER_TO_WORD(id)] &= \
184 ~(TRIGGER_TO_BIT(id))
185 #define FLIP_TRIGGER_IN_PATTERN(p,id) (p)[TRIGGER_TO_WORD(id)] ^= \
187 #define TEST_TRIGGER_IN_PATTERN(p,id) (((p)[TRIGGER_TO_WORD(id)] & \
188 TRIGGER_TO_BIT(id)) != 0)
189 #define TRIGGER_PATTERN_INVALID(p) (((p)[0] & 1) == 0)
190 #define TRIGGER_PATTERN_VALID(p) (((p)[0] & 1) != 0)
191 #define VALIDATE_TRIGGER_PATTERN(p) ((p)[0] |= 1)
192 #define INVALIDATE_TRIGGER_PATTERN(p) ((p)[0] &= 0xfffffffe)
193 #define COPY_TRIGGER_PATTERN(f,t) memcpy(t,f,EVENT_TRIGGER_PATTERN_BYTES)
194 #define TRIGGER_PATTERN_OK(p) (((p)[1] & 0xfff80000) == 0)
196 /* ---------- Detectors cluster (and relative masks) ---------- */
197 #define EVENT_DETECTOR_PATTERN_BYTES 4
198 #define EVENT_DETECTOR_PATTERN_WORDS (EVENT_DETECTOR_PATTERN_BYTES>>2)
199 typedef unsigned long32 eventDetectorPatternType[EVENT_DETECTOR_PATTERN_WORDS];
200 #define EVENT_DETECTOR_ID_MIN 1
201 #define EVENT_DETECTOR_ID_MAX 24
202 #define CHECK_DETECTOR(d) (assert(((d) >= EVENT_DETECTOR_ID_MIN) &&\
203 ((d) <= EVENT_DETECTOR_ID_MAX)))
204 #define DETECTOR_TO_BIT(d) (CHECK_DETECTOR(d), 1<<(d))
205 #define ZERO_DETECTOR_PATTERN(p) ((p)[0] = 0)
206 #define SET_DETECTOR_IN_PATTERN(p,d) ((p)[0] |= DETECTOR_TO_BIT(d))
207 #define CLEAR_DETECTOR_IN_PATTERN(p,d) ((p)[0] &= ~(DETECTOR_TO_BIT(d)))
208 #define FLIP_DETECTOR_IN_PATTERN(p,d) ((p)[0] ^= DETECTOR_TO_BIT(d))
209 #define TEST_DETECTOR_IN_PATTERN(p,d) (((p)[0] & DETECTOR_TO_BIT(d))!=0)
210 #define DETECTOR_PATTERN_INVALID(p) (((p)[0] & 1) == 0)
211 #define DETECTOR_PATTERN_VALID(p) (((p)[0] & 1) != 0)
212 #define VALIDATE_DETECTOR_PATTERN(p) ((p)[0] |= 1)
213 #define INVALIDATE_DETECTOR_PATTERN(p) ((p)[0] &= 0xfffffffe)
214 #define COPY_DETECTOR_PATTERN(f,t) ((t)[0] = (f)[0])
215 #define DETECTOR_PATTERN_OK(p) (((p)[0] & 0xfe000000) == 0)
217 /* ---------- The sizes and positions of the typeAttribute field ---------- */
218 #define ALL_ATTRIBUTE_WORDS 3
219 #define ALL_ATTRIBUTE_BYTES (ALL_ATTRIBUTE_WORDS * 4)
220 #define ALL_ATTRIBUTE_BITS (ALL_ATTRIBUTE_BYTES * 8)
221 #define USER_ATTRIBUTE_WORDS 2
222 #define USER_ATTRIBUTE_BYTES (USER_ATTRIBUTE_WORDS * 4)
223 #define USER_ATTRIBUTE_BITS (USER_ATTRIBUTE_BYTES * 8)
224 #define FIRST_USER_ATTRIBUTE 0
225 #define LAST_USER_ATTRIBUTE (USER_ATTRIBUTE_BITS - 1)
226 #define SYSTEM_ATTRIBUTE_WORDS 1
227 #define SYSTEM_ATTRIBUTE_BYTES (SYSTEM_ATTRIBUTE_WORDS * 4)
228 #define SYSTEM_ATTRIBUTE_BITS (SYSTEM_ATTRIBUTE_BYTES * 8)
229 #define FIRST_SYSTEM_ATTRIBUTE USER_ATTRIBUTE_BITS
230 #define LAST_SYSTEM_ATTRIBUTE (USER_ATTRIBUTE_BITS + \
231 SYSTEM_ATTRIBUTE_BITS - 1)
232 typedef unsigned long32 eventTypeAttributeType[ALL_ATTRIBUTE_WORDS];
234 /* Word and bit definitions */
235 #define SYS_ATTR_2_W(b) (assert(((b)>=64)&&((b)<=95)),2)
236 #define USR_ATTR_2_W(b) (assert(((b)>= 0)&&((b)<=63)),(b)>>5)
237 #define ATTR_2_W(b) (assert(((b)>= 0)&&((b)<=95)),(b)>>5)
238 #define ATTR_2_B(b) (1<<((b)&0x1f))
240 /* Macros to handle all attributes without distinction */
241 #define RESET_ATTRIBUTES(m) ((m)[2] = (m)[1] = (m)[0] = 0)
242 #define SET_ANY_ATTRIBUTE(m,b) (m)[ATTR_2_W(b)] |= ATTR_2_B(b)
243 #define CLEAR_ANY_ATTRIBUTE(m,b) (m)[ATTR_2_W(b)] &= ~(ATTR_2_B(b))
244 #define FLIP_ANY_ATTRIBUTE(m,b) (m)[ATTR_2_W(b)] ^= ATTR_2_B(b)
245 #define TEST_ANY_ATTRIBUTE(m,b) (((m)[ATTR_2_W(b)] & ATTR_2_B(b))!= 0)
246 #define COPY_ALL_ATTRIBUTES( from, to )\
247 memcpy((void *)&to[0], (const void *)&from[0], ALL_ATTRIBUTE_BYTES)
249 /* Macros to handle SYSTEM attributes */
250 #define RESET_SYSTEM_ATTRIBUTES(m) ((m)[2] = 0)
251 #define SET_SYSTEM_ATTRIBUTE(m,b) (m)[SYS_ATTR_2_W(b)] |= ATTR_2_B(b)
252 #define CLEAR_SYSTEM_ATTRIBUTE(m,b) (m)[SYS_ATTR_2_W(b)] &= ~(ATTR_2_B(b))
253 #define FLIP_SYSTEM_ATTRIBUTE(m,b) (m)[SYS_ATTR_2_W(b)] ^= ATTR_2_B(b)
254 #define TEST_SYSTEM_ATTRIBUTE(m,b) (((m)[SYS_ATTR_2_W(b)] & ATTR_2_B(b)) != 0)
255 #define COPY_SYSTEM_ATTRIBUTES( from, to ) \
256 memcpy((void *)&to[2], (const void *)&from[2], SYSTEM_ATTRIBUTE_BYTES)
258 /* Macros to handle USER attributes */
259 #define RESET_USER_ATTRIBUTES(m) ((m)[0] = (m)[1] = 0)
260 #define SET_USER_ATTRIBUTE(m,b) (m)[USR_ATTR_2_W(b)] |= ATTR_2_B(b)
261 #define CLEAR_USER_ATTRIBUTE(m,b) (m)[USR_ATTR_2_W(b)] &= ~(ATTR_2_B(b))
262 #define FLIP_USER_ATTRIBUTE(m,b) (m)[USR_ATTR_2_W(b)] ^= ATTR_2_B(b)
263 #define TEST_USER_ATTRIBUTE(m,b) (((m)[USR_ATTR_2_W(b)] & ATTR_2_B(b)) != 0)
264 #define COPY_USER_ATTRIBUTES( from, to ) \
265 memcpy((void *)&to[0], (const void *)&from[0], USER_ATTRIBUTE_BYTES)
267 /* System attributes assignment */
268 #define ATTR_P_START 64 /* Start of a phase */
269 #define ATTR_P_END 65 /* End of a phase */
270 #define ATTR_START_OF_RUN_START ATTR_P_START/* Start of SOR phase */
271 #define ATTR_START_OF_RUN_END ATTR_P_END /* End of SOR phase */
272 #define ATTR_END_OF_RUN_START ATTR_P_START/* Start of EOR phase */
273 #define ATTR_END_OF_RUN_END ATTR_P_END /* End of SOR phase */
274 #define ATTR_EVENT_SWAPPED 66 /* Swapped event header */
275 #define ATTR_EVENT_PAGED 67 /* Paged event */
276 #define ATTR_SUPER_EVENT 68 /* Super event */
277 #define ATTR_ORBIT_BC 69 /* Orbit/bunch crossing in ID*/
279 #define ATTR_EVENT_DATA_TRUNCATED 94 /* Truncated payload */
280 #define ATTR_EVENT_ERROR 95 /* Invalid event content */
282 #define SYSTEM_ATTRIBUTES_OK(m) \
283 ((((m)[2]) & ~(ATTR_2_B(ATTR_P_START) | \
284 ATTR_2_B(ATTR_P_END) | \
285 ATTR_2_B(ATTR_EVENT_SWAPPED) | \
286 ATTR_2_B(ATTR_EVENT_PAGED) | \
287 ATTR_2_B(ATTR_SUPER_EVENT) | \
288 ATTR_2_B(ATTR_ORBIT_BC) | \
289 ATTR_2_B(ATTR_EVENT_DATA_TRUNCATED) | \
290 ATTR_2_B(ATTR_EVENT_ERROR))) == 0)
292 /* ---------- LDC and GDC identifier ---------- */
293 typedef unsigned long32 eventHostIdType;
294 typedef eventHostIdType eventLdcIdType;
295 typedef eventHostIdType eventGdcIdType;
296 #define HOST_ID_MIN ((eventHostIdType)0) /* The minimum allowed ID */
297 #define HOST_ID_MAX ((eventHostIdType)511) /* The maximum allowed ID */
298 #define VOID_ID ((eventHostIdType)-1) /* Unloaded ID */
300 /* ---------- The event header structure (with + without data) ---------- */
301 struct eventHeaderStruct {
302 eventSizeType eventSize;
303 eventMagicType eventMagic;
304 eventHeadSizeType eventHeadSize;
305 eventVersionType eventVersion;
306 eventTypeType eventType;
307 eventRunNbType eventRunNb;
309 eventTriggerPatternType eventTriggerPattern;
310 eventDetectorPatternType eventDetectorPattern;
311 eventTypeAttributeType eventTypeAttribute;
312 eventLdcIdType eventLdcId;
313 eventGdcIdType eventGdcId;
317 struct eventHeaderStruct eventHeader;
318 unsigned short eventRawData[1];
321 /* ========== Definitions for the Vector ========== */
322 typedef short eventVectorBankIdType;
323 typedef unsigned int eventVectorSizeType;
324 typedef unsigned int eventVectorOffsetType;
326 struct eventVectorStruct {
327 eventVectorBankIdType eventVectorBankId;
328 unsigned eventVectorPointsToVector : 1;
329 eventVectorSizeType eventVectorSize;
330 eventVectorOffsetType eventVectorStartOffset;
333 /* ========== Definitions for the payload descriptor ========== */
334 typedef unsigned long32 eventNumEquipmentsType;
335 typedef struct eventVectorStruct eventExtensionVectorType;
337 struct vectorPayloadDescriptorStruct {
338 eventNumEquipmentsType eventNumEquipments;
339 eventExtensionVectorType eventExtensionVector;
342 /* ========== Definitions for the equipment header ========== */
343 typedef long32 equipmentSizeType;
344 typedef long32 equipmentTypeType;
345 typedef long32 equipmentIdType;
346 typedef eventTypeAttributeType equipmentTypeAttributeType;
347 typedef long32 equipmentBasicElementSizeType;
349 struct equipmentHeaderStruct {
350 equipmentSizeType equipmentSize;
351 equipmentTypeType equipmentType;
352 equipmentIdType equipmentId;
353 equipmentTypeAttributeType equipmentTypeAttribute;
354 equipmentBasicElementSizeType equipmentBasicElementSize;
357 struct equipmentDescriptorStruct {
358 struct equipmentHeaderStruct equipmentHeader;
359 struct eventVectorStruct equipmentVector;
362 struct equipmentStruct {
363 struct equipmentHeaderStruct equipmentHeader;
364 unsigned short equipmentRawData[1];
367 /* ========== Global macros ========== */
369 /* The macro PAGED_EVENT_SIZE receives in input the ADDRESS of a paged
370 event and returns the size (in bytes) of the first page of the
372 #define PAGED_EVENT_SIZE( event ) \
373 (EVENT_HEAD_BASE_SIZE +sizeof( struct vectorPayloadDescriptorStruct ) + \
374 ((*(eventNumEquipmentsType *)((void*)event+EVENT_HEAD_BASE_SIZE))* \
375 (sizeof( struct equipmentDescriptorStruct ))))