]>
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 | |
f3a800f8 | 56 | * |
57 | * Preprocessor definitions: | |
58 | * NDEBUG Define BEFORE including this file to disable run-time checks on | |
480f0332 | 59 | * various parameters made via assert() |
f3a800f8 | 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 | ||
480f0332 | 68 | #define EVENT_MAJOR_VERSION_NUMBER 3 |
69 | #define EVENT_MINOR_VERSION_NUMBER 14 | |
f3a800f8 | 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 | ||
480f0332 | 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 | |
f3a800f8 | 82 | |
83 | /* ---------- Event size ---------- */ | |
84 | typedef unsigned long32 eventSizeType; | |
85 | ||
480f0332 | 86 | /* ----------- Magic signature and its byte-swapped version ----------- */ |
f3a800f8 | 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) | |
480f0332 | 115 | #define SYNC_EVENT ((eventTypeType)14) |
f3a800f8 | 116 | #define EVENT_TYPE_MIN 1 |
480f0332 | 117 | #define EVENT_TYPE_MAX 14 |
f3a800f8 | 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, | |
480f0332 | 131 | detectorSoftwareTriggerEvent = DETECTOR_SOFTWARE_TRIGGER_EVENT, |
132 | syncEvent = SYNC_EVENT | |
f3a800f8 | 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]) | |
480f0332 | 202 | #define ZERO_EVENT_ID(id) memset((void *)(id),0,EVENT_ID_BYTES) |
f3a800f8 | 203 | |
204 | /* ---------- Trigger pattern (and relative masks) ---------- */ | |
480f0332 | 205 | // The top bit of the trigger pattern is reserved for the validity flag |
206 | #define EVENT_TRIGGER_PATTERN_BYTES 16 | |
f3a800f8 | 207 | #define EVENT_TRIGGER_PATTERN_WORDS ((EVENT_TRIGGER_PATTERN_BYTES)>>2) |
208 | typedef unsigned long32 eventTriggerPatternType[EVENT_TRIGGER_PATTERN_WORDS]; | |
07afbf5b | 209 | #define EVENT_TRIGGER_ID_MIN 0 |
480f0332 | 210 | #define EVENT_TRIGGER_ID_MAX 99 |
f3a800f8 | 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) | |
480f0332 | 215 | #define ZERO_TRIGGER_PATTERN(p) memset( (void *)(p), 0, EVENT_TRIGGER_PATTERN_BYTES ) |
f3a800f8 | 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) | |
480f0332 | 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) | |
f3a800f8 | 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]; | |
07afbf5b | 235 | #define EVENT_DETECTOR_ID_MIN 0 |
07afbf5b | 236 | #define EVENT_DETECTOR_ID_MAX 30 |
f3a800f8 | 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) | |
07afbf5b | 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) | |
f3a800f8 | 249 | #define COPY_DETECTOR_PATTERN(f,t) ((t)[0] = (f)[0]) |
480f0332 | 250 | #define DETECTOR_PATTERN_OK(p) (((p)[0] & 0x1f000000) == 0) |
251 | ||
f3a800f8 | 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. */ | |
07afbf5b | 321 | #define ATTR_BY_DETECTOR_EVENT 72 /* Event created by "by det."*/ |
480f0332 | 322 | #define ATTR_ORIGINAL_EVENT 73 /* All original payloads */ |
f3a800f8 | 323 | |
480f0332 | 324 | #define ATTR_FLUSHED_EVENT 92 /* Flushed event */ |
325 | #define ATTR_INCOMPLETE_EVENT 93 /* Incomplete event */ | |
f3a800f8 | 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) | \ | |
07afbf5b | 338 | ATTR_2_B(ATTR_BY_DETECTOR_EVENT) | \ |
480f0332 | 339 | ATTR_2_B(ATTR_ORIGINAL_EVENT) | \ |
340 | ATTR_2_B(ATTR_INCOMPLETE_EVENT) | \ | |
341 | ATTR_2_B(ATTR_FLUSHED_EVENT) | \ | |
f3a800f8 | 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 | ||
480f0332 | 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. | |
f3a800f8 | 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 | ||
480f0332 | 383 | t = eventHeaderStruct.eventTimestampSec; |
f3a800f8 | 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 | */ | |
480f0332 | 389 | typedef unsigned long32 eventTimestampSecType; |
390 | ||
391 | /* Microseconds: range [0..999999] | |
392 | */ | |
393 | typedef unsigned long32 eventTimestampUsecType; | |
f3a800f8 | 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; | |
480f0332 | 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; | |
f3a800f8 | 415 | }; |
416 | ||
417 | struct eventStruct { | |
418 | struct eventHeaderStruct eventHeader; | |
419 | unsigned short eventRawData[1]; | |
420 | }; | |
421 | ||
422 | /* ========== Definitions for the Vector ========== */ | |
480f0332 | 423 | typedef short eventVectorBankIdType; |
424 | typedef datePointer eventVectorSizeType; | |
425 | typedef datePointer eventVectorOffsetType; | |
f3a800f8 | 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; | |
480f0332 | 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 | |
f3a800f8 | 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 ========== */ | |
480f0332 | 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) | |
f3a800f8 | 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; | |
480f0332 | 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; | |
07afbf5b | 563 | unsigned cdhMBZ1 : 2; |
564 | unsigned cdhL1TriggerMessage : 8; | |
f3a800f8 | 565 | unsigned cdhMBZ0 : 2; |
f3a800f8 | 566 | unsigned cdhVersion : 8; |
567 | /* ------------------------------------- */ | |
568 | unsigned cdhEventId2 : 24; | |
07afbf5b | 569 | unsigned cdhMBZ2 : 8; |
f3a800f8 | 570 | /* ------------------------------------- */ |
571 | unsigned cdhParticipatingSubDetectors : 24; | |
572 | unsigned cdhBlockAttributes : 8; | |
573 | /* ------------------------------------- */ | |
574 | unsigned cdhMiniEventId : 12; | |
575 | unsigned cdhStatusErrorBits : 16; | |
07afbf5b | 576 | unsigned cdhMBZ3 : 4; |
f3a800f8 | 577 | /* ------------------------------------- */ |
578 | unsigned cdhTriggerClassesLow : 32; | |
579 | /* ------------------------------------- */ | |
580 | unsigned cdhTriggerClassesHigh : 18; | |
07afbf5b | 581 | unsigned cdhMBZ4 : 10; |
f3a800f8 | 582 | unsigned cdhRoiLow : 4; |
583 | /* ------------------------------------- */ | |
584 | unsigned cdhRoiHigh : 32; | |
585 | }; | |
586 | ||
587 | #endif |