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