5 Utility to simulate a DATE raw data stream using a given set of raw
6 data files and a configuration file.
10 V01.00 4/05/2004 RD Created
11 V01.01 25/10/2005 RD Support added for timestamp
12 V01.02 4/04/2006 RD Support for CDH
13 V01.03 24/05/2006 RD Added "Direct disk access" option
26 #define DESCRIPTION "DATE raw data stream simulator"
30 char fileHandlerIdent[]= "@(#)""" __FILE__ """: """ DESCRIPTION \
32 """ compiled """ __DATE__ """ """ __TIME__;
34 #define DBG_BASE if ( debug > 0 )
35 #define DBG_DETAILED if ( debug > 1 )
36 #define DBG_VERBOSE if ( debug > 2 )
39 # define TRUE (0 == 0)
42 # define FALSE (0 == 1)
48 typedef enum { unknown, ldc, gdc } workingAsType;
49 typedef enum { collider, fixedTarget } workingModeType;
50 workingAsType workingAs;
51 workingModeType workingMode;
52 struct ldcDescriptorStruct {
54 struct ldcDescriptorStruct *next;
55 } *ldcsHead, *ldcsTail;
56 void *eventsHead, *eventsTail;
57 struct gdcEventDescriptorStruct {
58 struct ldcEventDescriptorStruct *head;
59 struct ldcEventDescriptorStruct *tail;
60 struct gdcEventDescriptorStruct *next;
61 struct eventHeaderStruct header;
64 struct ldcEventDescriptorStruct {
65 struct equipmentEventDescriptorStruct *head;
66 struct equipmentEventDescriptorStruct *tail;
67 struct ldcEventDescriptorStruct *next;
69 struct eventHeaderStruct header;
72 struct equipmentEventDescriptorStruct {
73 struct equipmentEventDescriptorStruct *next;
75 struct payloadDescriptorStruct *payload;
76 struct equipmentHeaderStruct header;
78 struct payloadDescriptorStruct {
79 struct payloadDescriptorStruct *next;
84 } *payloadsHead, *payloadsTail;
86 eventGdcIdType currGdcId;
87 unsigned long32 currDetPattern;
88 eventLdcIdType currLdcId;
89 equipmentIdType currEquipmentId;
95 eventIdType oneEventDelta;
96 eventIdType currEventId;
100 struct commonDataHeaderStruct *cdhRef = NULL;
102 void dumpPayload( const struct payloadDescriptorStruct *p ) {
107 if ( p->data != NULL ) {
108 for ( i = 0, c = (char *)p->data, printable = TRUE;
109 printable && i != p->size;
111 printable = isascii( *c );
114 for ( i = 0, c = (char *)p->data; i != p->size; c++, i++ ) {
120 if ( *c != '\n' ) printf( "\"\n" );
123 for ( i = 0, v = (long32 *)p->data;
126 if ( i % (4*8) == 0 ) {
127 if ( i != 0 ) printf( "\n" );
130 printf( "%08x ", *v );
136 while ( i != p->size ) {
137 printf( "%02x ", *((char *)p->data + p->size - j - 1) & 0xff );
145 } /* End of dumpPayload */
148 assert( workingAs == ldc || workingAs == gdc );
149 if ( eventsHead != NULL ) {
150 printf( "Events:\n" );
151 if ( workingAs == gdc ) {
152 struct gdcEventDescriptorStruct *gdc;
154 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
157 struct ldcEventDescriptorStruct *ldc;
159 printf( " GDC (%p)\n", (void*)gdc );
160 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
161 struct equipmentEventDescriptorStruct *eq;
163 printf( " LDC (%p): %d\n", (void*)ldc, ldc->id );
164 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
165 printf( " EQUIPMENT (%p): %d PAYLOAD (%p):",
168 (void*)eq->payload );
170 printf( "\"%s\" (%d bytes)\n",
171 eq->payload->fileName,
173 dumpPayload( eq->payload );
178 if ( workingAs == ldc ) {
179 struct ldcEventDescriptorStruct *ldc;
181 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
184 struct equipmentEventDescriptorStruct *eq;
187 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
188 printf( " EQUIPMENT (%p): %d PAYLOAD (%p):",
191 (void*)eq->payload );
193 printf( "\"%s\" (%d bytes)\n",
194 eq->payload->fileName,
196 dumpPayload( eq->payload );
201 printf( "Events: EMPTY\n" );
203 } /* End of dumpEvents */
205 void getLine( char *line, const int maxSize ) {
209 for ( read = 0; !feof( stdin ) && !ferror( stdin ) && read != maxSize; read++ ) {
210 if ( (line[read] = getchar()) == '\n' ) break;
212 if ( ferror( stdin ) ) {
214 "%s: failed to read configuration input errno:%d ",
219 if ( feof( stdin ) ) read--;
220 if ( read == maxSize && line[read] != '\n' ) {
222 "%s: Input line # %d too long (%d chars max)\n",
223 myName, lineNmb, maxSize-1 );
228 if ( !( read == 0 && feof( stdin ) ) ) {
229 printf( "%d) [%3d] \"%s\"", lineNmb, read, line );
232 for ( c = 0; c != read; c++ ) {
233 if ( line[c] == '#' ) {
240 printf( " => \"%s\"", line );
242 if ( feof( stdin ) ) printf( "<<< EOF >>>" );
243 if ( ferror( stdin ) ) printf( "<<< FERROR >>>" );
246 } /* End of getLine */
248 void handleLdc( eventLdcIdType ldcId ) {
249 struct ldcDescriptorStruct *ldc;
251 if ( ldcsHead != NULL ) {
252 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
253 if ( ldc->id == ldcId ) {
258 if ( (ldc = (struct ldcDescriptorStruct *)malloc( sizeof( *ldc ) )) == NULL ) {
260 "%s: Failed to malloc for %d bytes (struct ldcDescriptorStruct)\n",
261 myName, (int)sizeof( *ldc ) );
266 if ( ldcsHead == NULL ) {
267 ldcsHead = ldcsTail = ldc;
269 ldcsTail->next = ldc;
273 } /* End of handleLdc */
275 void createNewEvent() {
276 assert( workingAs == ldc || workingAs == gdc );
277 if ( workingAs == ldc ) {
278 struct ldcEventDescriptorStruct *p;
280 if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
283 "%s: failed to malloc for %d bytes (createNewEvent: struct ldcEventDescriptorStruct)",
284 myName, (int)sizeof( *p ) );
289 p->head = p->tail = NULL;
292 if ( eventsHead == NULL ) {
293 eventsHead = eventsTail = p;
295 struct ldcEventDescriptorStruct *q =
296 (struct ldcEventDescriptorStruct *)eventsTail;
302 } else if ( workingAs == gdc ) {
303 struct gdcEventDescriptorStruct *p;
305 if ( (p = (struct gdcEventDescriptorStruct *)malloc( sizeof( *p ) ))
308 "%s: failed to malloc for %d bytes (createNewEvent: struct gdcEventDescriptorStruct)",
309 myName, (int)sizeof( *p ) );
315 p->head = p->tail = NULL;
317 if ( eventsHead == NULL ) {
318 eventsHead = eventsTail = p;
320 struct gdcEventDescriptorStruct *q =
321 (struct gdcEventDescriptorStruct *)eventsTail;
327 } /* End of createNewEvent */
329 void createNewLdcEvent() {
330 struct gdcEventDescriptorStruct *gdcDesc;
331 struct ldcEventDescriptorStruct *p;
333 if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
336 "%s: failed to malloc for %d bytes (createNewLdcEvent: struct ldcEventDescriptorStruct)",
337 myName, (int)sizeof( *p ) );
342 p->head = p->tail = NULL;
344 gdcDesc = (struct gdcEventDescriptorStruct *)eventsTail;
345 if ( gdcDesc->head == NULL ) {
346 gdcDesc->head = gdcDesc->tail = p;
348 gdcDesc->tail->next = p;
352 } /* End of createNewLdcEvent */
354 void loadBuffer( struct payloadDescriptorStruct * const payload ) {
358 if ( (f = fopen( payload->fileName, "r" )) == NULL ) {
360 "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
365 perror( "System-dependent error " );
368 if ( (payload->data = malloc( payload->size )) == NULL ) {
370 "%s: line:%d Failed to malloc for payload file \"%s\" size:%d errno:%d ",
376 perror( "System-dependent status " );
379 if ( (bytesRead = fread( payload->data, payload->fileSize, 1, f )) != 1 ) {
381 "%s: line:%d Failed to read payload file \"%s\" size:%d requested:1 got:%d feof:%s ferror:%s errno:%d ",
387 feof(f) ? "TRUE" : "false",
388 ferror(f) ? "TRUE" : "false",
390 perror( "System-dependent status " );
394 if ( payload->size != payload->fileSize ) {
395 memset( (char *)payload->data + payload->fileSize,
397 payload->size - payload->fileSize );
399 } /* End of loadBuffer */
401 void unloadBuffer( struct payloadDescriptorStruct * const payload ) {
402 if ( payload->data != NULL ) {
403 free( payload->data );
404 payload->data = NULL;
406 } /* End of unloadBuffer */
408 void unloadAllBuffers() {
409 struct payloadDescriptorStruct *payload;
411 for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
412 unloadBuffer( payload );
414 } /* End of unloadAllBuffers */
416 void loadPayload( const char *fileName ) {
417 struct payloadDescriptorStruct *payload;
419 for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
420 if ( strcmp( fileName, payload->fileName ) == 0 )
423 if ( payload == NULL ) {
426 if ( (payload = (struct payloadDescriptorStruct *)malloc( sizeof( *payload ) ))
429 "%s: failed to malloc for %d bytes (loadPayload/payloadDescriptorStruct)\n",
431 (int)sizeof( *payload ) );
434 if ( (payload->fileName = strdup( fileName )) == NULL ) {
436 "%s: failed to duplicate string \"%s\" (loadPaload/fileName)\n",
441 if ( (f = fopen( fileName, "r" )) == NULL ) {
443 "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
448 perror( "System-dependent error " );
451 if ( fseek( f, 0L, SEEK_END ) != 0 ) {
453 "%s: line:%d Failed to seek payload file \"%s\" errno:%d ",
458 perror( "System-dependent error " );
461 if ( (payload->size = ftell( f )) <= 0 ) {
463 "%s: line:%d Failed to get file \"%s\" size size:%d errno:%d ",
469 perror( "System-dependent status " );
472 payload->fileSize = payload->size;
473 while ( (payload->size & 3) != 0 ) payload->size++;
477 loadBuffer( payload );
479 payload->data = NULL;
482 payload->next = NULL;
483 if ( payloadsHead == NULL ) {
484 payloadsHead = payloadsTail = payload;
486 payloadsTail->next = payload;
487 payloadsTail = payload;
492 printf( "%d) Payload \"%s\" loaded at %p\n",
498 strncmp(fileName,"TRG_",4) != 0 ) {
499 struct commonDataHeaderStruct *cdh =
500 (struct commonDataHeaderStruct *)payload->data;
502 printf( " CDH: blockLenght:%d=0x%08x ",
503 cdh->cdhBlockLength, cdh->cdhBlockLength );
504 if ( cdh->cdhBlockLength < sizeof( *cdh ) ) {
505 printf( "TOO SMALL (minimum:%ld=0x%08lx)\n",
506 (unsigned long)sizeof( *cdh ),
507 (unsigned long)sizeof( *cdh ) );
509 printf( "version:%d=0x%x ", cdh->cdhVersion, cdh->cdhVersion );
510 if ( cdh->cdhVersion != CDH_VERSION ) {
511 printf( "EXPECTED:%d=%x (decoding may be inaccurate) ",
512 CDH_VERSION, CDH_VERSION );
515 printf( "L1TriggerMessage:0x%x", cdh->cdhL1TriggerMessage );
516 if ( cdh->cdhL1TriggerMessage != 0 ) {
517 for ( b = 0, n = 0; b != 10; b++ ) {
518 if ( (cdh->cdhL1TriggerMessage & (1<<b)) != 0 ) {
519 if ( n++ != 0 )printf( "+" );
521 case 0: printf( "L1SwC" ); break;
522 case 1: printf( "ESR" ); break;
523 case 2: printf( "RoC1" ); break;
524 case 3: printf( "RoC2" ); break;
525 case 4: printf( "RoC3" ); break;
526 case 5: printf( "RoC4" ); break;
527 case 6: printf( "ClT" ); break;
528 default: printf( "spare %d", b+14 );
535 if ( cdh->cdhMBZ0 != 0 )
536 printf( "MBZ0:0x%x ",
541 printf( "EventId2(orbit):%d=0x%x ",
542 cdh->cdhEventId2, cdh->cdhEventId2 );
543 printf( "EventId1(bunchCrossing):%d=0x%x ",
544 cdh->cdhEventId1, cdh->cdhEventId1 );
548 if ( cdh->cdhMBZ1 != 0 )
549 printf( "MBZ1:0x%x ",
551 printf( "BlockAttributes:0x%x",
552 cdh->cdhBlockAttributes );
553 if ( cdh->cdhBlockAttributes != 0 ) {
555 for ( b = 0, n = 0; b != 8; b++ ) {
556 if ( (cdh->cdhBlockAttributes & (1<<b)) != 0 ) {
565 printf( "ParticipatingSubDetectors:0x%x ",
566 cdh->cdhParticipatingSubDetectors );
570 if ( cdh->cdhMBZ2 != 0 )
571 printf( "MBZ2:0x%x ",
573 printf( "Status/Error:0x%x", cdh->cdhStatusErrorBits );
574 if ( cdh->cdhStatusErrorBits != 0 ) {
576 for ( b = 0,n = 0; b != 16; b++ ) {
577 if ( (cdh->cdhStatusErrorBits & (1<<b)) != 0 ) {
578 if ( n++ != 0 ) printf( "+" );
580 case 0: printf( "TriggerOverLapError" ); break;
581 case 1: printf( "TriggerMissingError" ); break;
582 case 2: printf( "DataParityError" ); break;
583 case 3: printf( "ControlParityError" ); break;
584 case 4: printf( "TriggerInformationUnavailable" ); break;
585 case 5: printf( "FEEError" ); break;
586 case 6: printf( "HLTDecision" ); break;
587 case 7: printf( "HLTPayload" ); break;
588 case 8: printf( "DDGPayload" ); break;
589 default: printf( "spare %d", b );
596 printf( "MiniEventId(bunchCrossing):%d=0x%x ",
597 cdh->cdhMiniEventId, cdh->cdhMiniEventId );
601 printf( "Trigger classes: 0x(%05x-%08x)",
602 cdh->cdhTriggerClassesHigh,
603 cdh->cdhTriggerClassesLow );
604 if ( cdh->cdhTriggerClassesHigh != 0
605 || cdh->cdhTriggerClassesLow != 0 ) {
607 for ( b=0, n=0; b != 32; b++ ) {
608 if ( (cdh->cdhTriggerClassesLow & (1<<b)) != 0 ) {
609 if ( n++ != 0 ) printf( "+" );
613 for ( b=0; b != 18; b++ ) {
614 if ( (cdh->cdhTriggerClassesHigh & (1<<b)) != 0 ) {
615 if ( n++ != 0 ) printf( "+" );
616 printf( "%d", b+32 );
624 if ( cdh->cdhMBZ3 != 0 ) {
625 printf( "MBZ3:0x%x ",
628 printf( "ROI:0x(%08x-%01x)", cdh->cdhRoiHigh, cdh->cdhRoiLow );
629 if ( cdh->cdhRoiHigh != 0
630 || cdh->cdhRoiLow != 0 ) {
632 for ( b=0, n=0; b != 5; b++ ) {
633 if ( (cdh->cdhRoiLow & (1<<b)) != 0 ) {
634 if ( n++ != 0 ) printf( "+" );
638 for ( b=0; b != 32; b++ ) {
639 if ( (cdh->cdhRoiHigh & (1<<b)) != 0 ) {
640 if ( n++ != 0 ) printf( "+" );
652 printf( "%d) Payload \"%s\" already loaded at %p\n",
658 currEvent->payload = payload;
659 } /* End of loadPayload */
661 void parseEquipment( char * const line ) {
662 struct equipmentEventDescriptorStruct *equipment;
663 int payloadFound = FALSE;
668 (struct equipmentEventDescriptorStruct *)malloc( sizeof( *equipment ) )) == NULL ) {
670 "%s: filed to malloc for %d bytes (parseEquipment/equipmentEventDescriptorStruct) errno:%d ",
672 (int)sizeof( *equipment ),
677 currEvent = equipment;
680 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
681 DBG_VERBOSE printf( "%d) Equipment - Keyword:\"%s\"\n",
684 if ( strcasecmp( "id", keyword ) == 0 ) {
687 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
689 "%s: line:%d EQUIPMENT declaration, ID needed",
694 if ( sscanf( idNum, "%d", &currEquipmentId ) != 1 ) {
696 "%s: line:%d EQUIPMENT declaration, numeric ID needed (%s)",
702 DBG_VERBOSE printf( "%d) EQUIPMENT - ID:%d\n",
705 } else if ( strncasecmp( "pay", keyword, 3 ) == 0 ) {
708 if ( (fileName = strtok_r( p, " \t", &p )) == NULL ) {
710 "%s line:%d Payload without filename found\n",
715 DBG_VERBOSE printf( "%d) Equipment - Payload:\"%s\"\n",
718 if ( payloadFound ) {
720 "%s line:%d Payload with multiple filenames found\n",
725 loadPayload( fileName );
729 "%s: line:%d Equipment declaration, unknown keyword \"%s\"\n",
736 if ( !payloadFound ) {
738 "%s: line:%d Equipment without payload found\n",
744 equipment->id = currEquipmentId;
745 equipment->next = NULL;
746 if ( currLdc->head == NULL ) {
747 currLdc->head = currLdc->tail = equipment;
749 currLdc->tail->next = equipment;
750 currLdc->tail = equipment;
752 } /* End of parseEquipment */
754 void parseGdc( char * const line ) {
759 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
760 if ( strcasecmp( "id", keyword ) == 0 ) {
763 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
765 "%s: line:%d GDC declaration, ID needed",
770 if ( sscanf( idNum, "%d", (int*)&currGdcId ) != 1 ) {
772 "%s: line:%d GDC declaration, numeric ID needed (%s)",
778 DBG_VERBOSE printf( "%d) GDC - ID:%d\n",
781 } else if ( strcasecmp( "DetectorPattern", keyword ) == 0 ) {
784 if ( (detPattern = strtok_r( p, " \t", &p )) == NULL ) {
786 "%s: line:%d GDC declaration, DetectorPattern needed",
791 if ( sscanf( detPattern, "%u", &currDetPattern ) != 1 ) {
793 "%s: line:%d GDC declaration, numeric DetectorPattern needed (%s)",
799 DBG_VERBOSE printf( "%d) GDC - DetectorPattern:%u\n",
804 "%s: line:%d GDC declaration, unknown keyword \"%s\"\n",
811 } /* End of parseGdc */
813 void parseLdc( char * const line ) {
818 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
819 if ( strcasecmp( "id", keyword ) == 0 ) {
822 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
824 "%s: line:%d LDC declaration, ID needed",
830 if ( sscanf( idNum, "%d", &inCurrLdcId ) != 1 ) {
832 "%s: line:%d LDC declaration, numeric ID needed (%s)",
838 currLdcId = (eventLdcIdType)inCurrLdcId;
839 DBG_VERBOSE printf( "%d) LDC - ID:%d\n",
844 "%s: line:%d LDC declaration, unknown keyword \"%s\"\n",
851 } /* End of parseLdc */
856 currLdcId = HOST_ID_MIN;
857 currGdcId = HOST_ID_MIN;
860 for ( lineNmb = 1; !feof( stdin ); lineNmb++ ) {
861 getLine( line, sizeof(line) );
862 if ( strlen(line) != 0 ) {
866 if ( (keyword = strtok_r( line, " \t", &p )) != NULL ) {
867 DBG_VERBOSE printf( "%d) Keyword:\"%s\"\n", lineNmb, keyword );
868 if ( strcasecmp( "gdc", keyword ) == 0 ) {
869 if ( workingAs != gdc && workingAs != unknown ) {
871 "%s: line:%d GDC found when working in non-GDC mode (e.g. as a LDC)\n",
878 currLdcId = HOST_ID_MIN;
881 } else if ( strcasecmp( "ldc", keyword ) == 0 ) {
882 if ( workingAs != gdc && workingAs != ldc && workingAs != unknown ) {
884 "%s: line:%d LDC found when working in non-LDC/GDC mode\n",
888 if ( workingAs == unknown ) workingAs = ldc;
890 if ( workingAs == ldc ) {
895 handleLdc( currLdcId );
899 } else if ( strncasecmp( "equ", keyword, 3 ) == 0 ) {
900 if ( workingAs == unknown
901 || (workingAs == ldc && currLdc == NULL )
902 || (workingAs == gdc && currGdc == NULL ) ) {
904 "%s: line:%d Unexpected EQUIPMENT declaration (LDC or GDC needed first)\n",
913 "%s: line:%d Parse error in \"%s\" unknown keyword\n",
921 } while ( !feof( stdin ) ) {}
925 printf( "End of parse: %d line%s found\n",
927 lineNmb != 1 ? "s" : "" );
928 printf( "Working as %s\n",
929 workingAs == gdc ? "GDC" :
930 workingAs == ldc ? "LDC" :
932 if ( workingAs == gdc ) {
933 struct ldcDescriptorStruct *ldc;
935 printf( "LDCs (%d):", numOfLdcs );
936 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
937 printf( " %d", ldc->id );
944 if ( workingAs == ldc ) {
945 assert( ldcsHead == ldcsTail );
946 assert( ldcsTail == NULL );
949 if ( workingAs == gdc ) {
950 struct ldcDescriptorStruct *ldc;
952 assert( ldcsHead != NULL );
953 assert( ldcsTail != NULL );
954 assert( ldcsTail->next == NULL );
955 for ( ldc = ldcsHead; ldc->next != NULL; ldc = ldc->next ) {}
956 assert ( ldc == ldcsTail );
959 if ( workingAs == unknown ) {
960 DBG_VERBOSE printf( "Empty configuration: nothing to do!\n" );
964 assert( (eventsHead == NULL && eventsTail == NULL)
965 || (eventsHead != NULL && eventsTail != NULL) );
966 } /* End of parseRules */
968 void loadTimestamp( struct eventHeaderStruct * const ev ) {
971 if ( time( &t ) == (time_t)-1 ) {
973 "%s: failed to get system time errno:%d (%s)\n",
974 myName, errno, strerror( errno ) );
977 ev->eventTimestamp = (eventTimestampType)t;
978 } /* End of loadTimestamp */
980 void initEvent( struct eventHeaderStruct * const ev ) {
981 memset( ev, 0, sizeof( *ev ) );
983 ev->eventMagic = EVENT_MAGIC_NUMBER;
984 ev->eventHeadSize = EVENT_HEAD_BASE_SIZE;
985 ev->eventVersion = EVENT_CURRENT_VERSION;
986 ev->eventRunNb = currRunNb;
987 ZERO_EVENT_ID( ev->eventId );
988 ZERO_TRIGGER_PATTERN( ev->eventTriggerPattern );
989 ZERO_DETECTOR_PATTERN( ev->eventDetectorPattern );
990 RESET_ATTRIBUTES( ev->eventTypeAttribute );
991 if ( workingMode == collider )
992 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_ORBIT_BC );
993 ev->eventLdcId = VOID_ID;
994 ev->eventGdcId = VOID_ID;
996 } /* End of initEvent */
1000 // Swap the endianess of the integer value 'x'
1002 return (((x & 0x000000ffU) << 24) | ((x & 0x0000ff00U) << 8) |
1003 ((x & 0x00ff0000U) >> 8) | ((x & 0xff000000U) >> 24));
1006 void outputEvent( const void * const ev,
1011 const long32 * const v = (long32 *)ev;
1012 printf( "Writing %d bytes @ %p (%d)\n", size, ev, *v );
1015 // .............................Test endianess..............................
1017 char* ptemp = (char*) &temp;
1019 if (ptemp[0]!=1) { // Mac platform: ptemp != 1..............................................................................
1020 int bufSize= size; if (bufSize > (int) sizeof(eventHeaderStruct)) { bufSize = sizeof(eventHeaderStruct); }
1021 char* evTemp = (char*) malloc (bufSize);
1022 memcpy(evTemp, ev, bufSize);
1024 if ((bufSize % sizeof(int)) != 0) {
1025 fprintf( stderr, "%s: size of the input buffer ev is not multiple of 4 (size = %d)\n", myName, bufSize);
1029 // Invert header to evTemp.....................................................
1030 int* buf = (int*) evTemp;
1031 for (int i=0; i < (int) (bufSize / sizeof(int)); i++, buf++) {
1032 int value = Swap(*buf);
1033 memcpy(evTemp + (i * sizeof(int)), &value, sizeof(int));
1036 // Write inverted header to file...............................................
1037 if ((done = fwrite( evTemp, bufSize, 1, outF )) != 1 ) {
1038 fprintf( stderr, "%s: failed to write inverted header. event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
1042 if (size > bufSize) { // Still theraw-data payload to write (but not inverted, since it is inverted eariler).............
1043 if ((done = fwrite( (char*)ev + bufSize, size - bufSize, 1, outF )) != 1 ) {
1044 fprintf( stderr, "%s: failed to write additional event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
1051 else { // Intel platform: ptemp == 1............................................................................
1052 if ((done = fwrite( ev, size, 1, outF )) != 1 ) {
1053 fprintf( stderr, "%s: failed to write event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
1057 } /* End of outputEvent */
1059 void createSorAndEor( const int sor ) {
1060 unsigned char event[ 1000 ];
1061 struct eventHeaderStruct *ev;
1062 struct eventHeaderStruct sev;
1064 assert( workingAs == ldc || workingAs == gdc );
1066 if ( !createSorEor ) return;
1067 ev = (struct eventHeaderStruct *)event;
1069 ev->eventSize = sizeof( event );
1070 ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
1071 if ( workingMode == fixedTarget )
1072 LOAD_RAW_EVENT_ID( ev->eventId, 0, 0, 0 );
1074 LOAD_EVENT_ID( ev->eventId, 0, 0, 0 );
1075 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
1077 if ( workingAs == ldc ) {
1078 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1080 if ( workingAs == gdc ) {
1082 sev.eventGdcId = currGdcId;
1083 ev->eventGdcId = currGdcId;
1084 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1085 currLdc = currGdc->head;
1087 ev->eventLdcId = currLdc->id;
1089 if ( workingAs == ldc ) {
1090 loadTimestamp( ev );
1091 outputEvent( ev, ev->eventSize );
1093 if ( workingAs == gdc ) {
1094 struct ldcDescriptorStruct *ldc;
1096 loadTimestamp( ev );
1098 sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
1099 sev.eventType = sor ? START_OF_RUN : END_OF_RUN ;
1100 COPY_EVENT_ID( ev->eventId, sev.eventId );
1101 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1102 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1103 loadTimestamp( &sev );
1104 outputEvent( &sev, sizeof( sev ) );
1106 ev->eventGdcId = currGdcId;
1107 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1108 ev->eventLdcId = ldc->id;
1109 outputEvent( ev, ev->eventSize );
1113 ADD_EVENT_ID( ev->eventId, oneEventDelta );
1114 ev->eventSize = ev->eventSize / 2;
1115 ev->eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1116 CLEAR_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
1117 if ( workingAs == ldc ) {
1118 loadTimestamp( ev );
1119 outputEvent( ev, ev->eventSize );
1121 if ( workingAs == gdc ) {
1122 struct ldcDescriptorStruct *ldc;
1124 loadTimestamp( ev );
1126 sev.eventSize = ev->eventSize;
1127 sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1128 COPY_EVENT_ID( ev->eventId, sev.eventId );
1129 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1130 CLEAR_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1131 outputEvent( &sev, sizeof( sev ) );
1132 outputEvent( ev, ev->eventSize - sizeof( sev ) );
1134 sev.eventSize = sizeof( sev ) + ev->eventSize;
1135 sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1136 COPY_EVENT_ID( ev->eventId, sev.eventId );
1137 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1138 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1140 loadTimestamp( &sev );
1142 ev->eventGdcId = currGdcId;
1143 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1144 loadTimestamp( &sev );
1145 outputEvent( &sev, sizeof( sev ) );
1146 ev->eventLdcId = ldc->id;
1147 outputEvent( ev, ev->eventSize );
1151 ADD_EVENT_ID( ev->eventId, oneEventDelta );
1152 ev->eventSize = sizeof( *ev );
1153 ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
1154 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_END );
1155 if ( workingAs == ldc ) {
1156 loadTimestamp( ev );
1157 outputEvent( ev, ev->eventSize );
1159 if ( workingAs == gdc ) {
1160 struct ldcDescriptorStruct *ldc;
1162 loadTimestamp( ev );
1164 sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
1165 sev.eventType = sor ? START_OF_RUN : END_OF_RUN;
1166 COPY_EVENT_ID( ev->eventId, sev.eventId );
1167 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1168 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1169 loadTimestamp( &sev );
1171 outputEvent( &sev, sizeof( sev ) );
1173 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1174 ev->eventLdcId = ldc->id;
1175 outputEvent( ev, ev->eventSize );
1178 } /* End of createSorEor */
1181 createSorAndEor( TRUE );
1182 } /* End of createSor */
1185 createSorAndEor( FALSE );
1186 } /* End of createEor */
1188 void loadCdh( struct commonDataHeaderStruct * const cdh,
1189 eventIdType * const eventId,
1190 equipmentIdType id ) {
1191 if ( !handleCDH ) return;
1193 // CTP raw-data does not contain CDH
1194 if ( id == 4352) return;
1196 if ( gotAliceTrigger ) {
1197 cdh->cdhEventId1 = EVENT_ID_GET_BUNCH_CROSSING( *eventId );
1198 cdh->cdhEventId2 = EVENT_ID_GET_ORBIT( *eventId );
1200 cdh->cdhEventId1 = 0;
1201 cdh->cdhEventId2 = EVENT_ID_GET_NB_IN_RUN( *eventId );
1203 cdh->cdhMiniEventId = cdh->cdhEventId1;
1205 void decodeCDH( struct ldcEventDescriptorStruct * const ldc,
1206 const struct payloadDescriptorStruct * const payloadDesc,
1207 equipmentIdType id );
1209 void createEvent( void ) {
1210 assert( workingAs == ldc || workingAs == gdc );
1212 /* Step 1: load all buffers (if needed) and compose the GDC/LDC headers */
1213 if ( workingAs == gdc ) {
1214 struct ldcEventDescriptorStruct *ldc;
1216 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1217 COPY_EVENT_ID( currEventId, ldc->header.eventId );
1218 loadTimestamp( &ldc->header );
1220 COPY_EVENT_ID( currEventId, currGdc->header.eventId );
1221 loadTimestamp( &currGdc->header );
1223 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1224 struct equipmentEventDescriptorStruct *eq;
1227 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1228 if ( !bufferData ) {
1229 loadBuffer( eq->payload );
1230 decodeCDH( ldc, eq->payload, eq->id );
1232 loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
1237 if ( !currGdc->loaded ) {
1238 for ( n = 0; n != EVENT_TRIGGER_PATTERN_WORDS; n++ )
1239 currGdc->header.eventTriggerPattern[n] |= ldc->header.eventTriggerPattern[n];
1240 for ( n = 0; n != EVENT_DETECTOR_PATTERN_WORDS; n++ )
1241 currGdc->header.eventDetectorPattern[n] |= ldc->header.eventDetectorPattern[n];
1242 for ( n = 0; n != ALL_ATTRIBUTE_WORDS; n++ )
1243 currGdc->header.eventTypeAttribute[n] |= ldc->header.eventTypeAttribute[n];
1244 currGdc->loaded = TRUE;
1248 } else if ( workingAs == ldc ) {
1249 struct equipmentEventDescriptorStruct *eq;
1251 COPY_EVENT_ID( currEventId, currLdc->header.eventId );
1252 loadTimestamp( &currLdc->header );
1254 for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
1255 if ( !bufferData ) {
1256 loadBuffer( eq->payload );
1257 decodeCDH( currLdc, eq->payload, eq->id );
1259 loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
1262 currLdc->loaded = TRUE;
1266 ADD_EVENT_ID( currEventId, oneEventDelta );
1268 /* Step 2: output the event */
1269 if ( workingAs == gdc ) {
1270 struct ldcEventDescriptorStruct *ldc;
1272 outputEvent( &currGdc->header, sizeof( currGdc->header ) );
1274 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1275 struct equipmentEventDescriptorStruct *eq;
1277 outputEvent( &ldc->header, sizeof( ldc->header ) );
1279 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1280 outputEvent( &eq->header, sizeof( eq->header ) );
1281 outputEvent( eq->payload->data, eq->payload->size );
1282 if ( !bufferData ) unloadBuffer( eq->payload );
1285 if ( (currGdc = currGdc->next) == NULL )
1286 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1287 } else if ( workingAs == ldc ) {
1288 struct equipmentEventDescriptorStruct *eq;
1290 outputEvent( &currLdc->header, sizeof( currLdc->header ) );
1292 for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
1293 outputEvent( &eq->header, sizeof( eq->header ) );
1294 outputEvent( eq->payload->data, eq->payload->size );
1295 if ( !bufferData ) unloadBuffer( eq->payload );
1297 if ( (currLdc = currLdc->next) == NULL )
1298 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1300 } /* End of createEvent */
1302 void createEvents() {
1305 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1306 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1311 eventNum != numOfEvents && numOfEvents != 0;
1316 } /* End of createEvents */
1320 "Usage: %s [-?][-d][-i definitionFile][-o outputFile][-# numOfEvents][-s][-F|-C]\n\
1322 -v Print version ID and exit\n\
1323 -d Enable debug (repeat for more verbosity)\n\
1324 -i definitionFile File with the description of the events to create (default: stdin)\n\
1325 -o outputFile File used to store events (default: stdout)\n\
1326 -# numOfEvents Number of events to generate (default: 1 event)\n\
1327 -s Do not generate SOR/EOR files (valid only for GDCs)\n\
1328 -F/-C Working in Fixed Target (F) or Collider (C) mode\n\
1330 -D Direct disc access (no buffering)\n",
1333 } /* End of usage */
1335 void parseArgs( int argc, char **argv ) {
1337 int inFileName = -1;
1338 int outFileName = -1;
1341 while ( arg < argc ) {
1342 if ( strcmp( "-?", argv[ arg ] ) == 0 ) {
1346 if ( strcmp( "-i", argv[ arg ] ) == 0 ) {
1347 if ( ++arg == argc ) exit( usage() );
1349 if ( freopen( argv[arg], "r", stdin ) == NULL ){
1351 "%s: failed to open input definition \"%s\" errno:%d ",
1352 myName, argv[arg], errno );
1356 } else if ( strcmp( "-v", argv[ arg ] ) == 0 ) {
1357 printf( "%s\n", fileHandlerIdent );
1359 } else if ( strcmp( "-o", argv[ arg ] ) == 0 ) {
1360 if ( ++arg == argc ) exit( usage() );
1362 } else if ( strcmp( "-#", argv[ arg ] ) == 0 ) {
1365 if ( ++arg == argc ) exit( usage() );
1366 if ( sscanf( argv[ arg ], "%d", &n ) != 1 ) exit( usage() );
1367 if ( n < 0 ) exit( usage() );
1369 } else if ( strcmp( "-s", argv[ arg ] ) == 0 ) {
1370 createSorEor = FALSE;
1371 } else if ( strcmp( "-F", argv[ arg ] ) == 0 ) {
1372 workingMode = fixedTarget;
1373 } else if ( strcmp( "-C", argv[ arg ] ) == 0 ) {
1374 workingMode = collider;
1375 } else if ( strcmp( "-d", argv[ arg ] ) == 0 ) {
1377 } else if ( strcmp( "-c", argv[ arg ] ) == 0 ) {
1379 } else if ( strcmp( "-D", argv[ arg ] ) == 0 ) {
1381 } else if ( strcmp( "-run", argv[ arg ] ) == 0 ) {
1383 if ( ++arg == argc ) exit( usage() );
1384 if ( sscanf( argv[ arg ], "%d", &runnumber ) != 1 ) exit( usage() );
1385 if ( runnumber < 0 ) exit( usage() );
1386 currRunNb = runnumber;
1388 fprintf( stderr, "%s: Unknown switch \"%s\"\n", myName, argv[argc] );
1394 if ( workingMode == fixedTarget )
1395 LOAD_RAW_EVENT_ID( oneEventDelta, 1, 0, 1 );
1397 LOAD_EVENT_ID( oneEventDelta, 0, 0, 1 );
1398 ZERO_EVENT_ID( currEventId );
1401 printf( "Configuration:\n" );
1402 printf( " Debug level: %d\n", debug );
1403 printf( " Configuration: %s\n",
1404 inFileName == -1 ? "stdin" : argv[ inFileName ] );
1405 printf( " Output: %s\n",
1406 outFileName == -1 ? "stdout" : argv[ outFileName ] );
1407 printf( " Working mode: %s\n",
1408 workingMode == fixedTarget ? "fixed target" : "collider" );
1409 printf( " Number of events: %d\n", numOfEvents );
1410 printf( " %s SOR/EOR files\n",
1411 createSorEor ? "Create" : "Do not create" );
1412 printf( " CDH handling: %s\n",
1413 handleCDH ? "enabled" : "disabled" );
1414 printf( " data buffering: %s\n",
1415 bufferData ? "enabled" : "DISABLED" );
1418 if ( outFileName == -1 ) {
1420 printf( "No more trace information from this point...\n" );
1424 if ( ( outF = fopen( argv[ outFileName ], "w" ) ) == NULL ) {
1426 "%s: failed to open output file \"%s\" for writing, errno:%d (%s)\n",
1428 argv[ outFileName ],
1430 strerror( errno ) );
1434 printf( "Output file \"%s\" opened OK for writing\n",
1435 argv[ outFileName ] );
1437 } /* End of parseArgs */
1438 void initEquipment( struct equipmentHeaderStruct * const eq ) {
1439 memset( eq, 0, sizeof( *eq ) );
1440 RESET_ATTRIBUTES( eq->equipmentTypeAttribute );
1441 eq->equipmentBasicElementSize = 4;
1442 } /* End of initEquipment */
1444 void decodeCDH( struct ldcEventDescriptorStruct * const ldc,
1445 const struct payloadDescriptorStruct * const payloadDesc,
1446 equipmentIdType id ) {
1449 struct commonDataHeaderStruct *cdh;
1450 static int softwareTriggerIndicator = FALSE;
1454 if ( payloadDesc->size < CDH_SIZE ) {
1456 "%s: payload too small got:%d CDH:%d\n",
1462 if ( (cdh = (struct commonDataHeaderStruct *)payloadDesc->data) != NULL ) {
1463 if ( cdh->cdhVersion != CDH_VERSION ) {
1465 "%s: CDH version mismatch expected:%d got:%d\n",
1471 if ( cdhRef == NULL ) {
1473 #define CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK (1<<CDH_TRIGGER_INFORMATION_UNAVAILABLE_BIT)
1474 gotAliceTrigger = (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0;
1475 if ( gotAliceTrigger && workingMode == fixedTarget ) {
1477 "%s: ALICE trigger and fixed target mode are not compatible.\n\
1478 Either work in Collider mode or set the trigger unavailable status bit in the CDH.\n",
1482 if ( gotAliceTrigger ) {
1483 if ( (cdh->cdhL1TriggerMessage & 0x40) != 0 ) {
1485 "%s: CDH is a calibration trigger (unsupported) L1TriggerMessage:0x%x\n",
1486 myName, cdh->cdhL1TriggerMessage );
1489 if ( (cdh->cdhL1TriggerMessage & 0x01) != 0 ) {
1490 softwareTriggerIndicator = TRUE;
1492 if ( softwareTriggerIndicator ) {
1493 switch ((cdh->cdhL1TriggerMessage >> 2) & 0xF) {
1501 /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xF --> END_OF_DATA */
1503 /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xE0 --> START_OF_DATA */
1505 /* L1SwC bit = on, Clt bit = off, RoC[4] = 1, but not 0xE or 0xF
1506 --> SYSTEM_SOFTWARE_TRIGGER_EVENT */
1508 /* L1SwC bit = on, Clt bit = off, RoC[4] = 0
1509 --> DETECTOR_SOFTWARE_TRIGGER_EVENT */
1511 "%s: CDH trigger SOD/EOD/SST/DST (unsupported) \
1512 L1TriggerMessage:0x%x ALICETrigger:%s\n",
1514 cdh->cdhL1TriggerMessage,
1515 gotAliceTrigger ? "yes" : "no" );
1521 if ( (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) !=
1522 (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) ) {
1524 "%s: CDH coherency check failed. \
1525 Trigger information reference:%savailable current:%savailable\n",
1527 (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "",
1528 (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "" );
1531 if ( gotAliceTrigger ) {
1532 if ( cdhRef->cdhL1TriggerMessage != cdh->cdhL1TriggerMessage ) {
1534 "%s: CDH coherency check failed. \
1535 L1 trigger message reference:0x%x current:0x%x\n",
1537 cdhRef->cdhL1TriggerMessage,
1538 cdh->cdhL1TriggerMessage );
1541 if ( cdh->cdhParticipatingSubDetectors != cdhRef->cdhParticipatingSubDetectors ) {
1543 "%s: CDH coherency check failed. \
1544 ParticipatingSubDetectors reference:0x%x current:0x%x\n",
1546 cdhRef->cdhParticipatingSubDetectors,
1547 cdh->cdhParticipatingSubDetectors );
1550 if ( cdh->cdhTriggerClassesLow != cdhRef->cdhTriggerClassesLow
1551 || cdh->cdhTriggerClassesHigh != cdhRef->cdhTriggerClassesHigh ) {
1553 "%s: CDH coherency check failed. \
1554 TriggerClassesHigh/Low reference:0x%x-%x current:0x%x-%x\n",
1556 cdhRef->cdhTriggerClassesHigh, cdhRef->cdhTriggerClassesLow,
1557 cdh ->cdhTriggerClassesHigh, cdh ->cdhTriggerClassesLow );
1560 if ( cdh->cdhBlockLength != 0xffffffff ) {
1561 if ( (unsigned)payloadDesc->size != cdh->cdhBlockLength ) {
1563 "%s: CDH coherency check failed. \
1564 Payload size:%d (0x%08x) CDH block length:%d (0x%08x)\n",
1566 payloadDesc->size, payloadDesc->size,
1567 cdh->cdhBlockLength, cdh->cdhBlockLength );
1571 if ( cdh->cdhRoiLow != cdhRef->cdhRoiLow
1572 || cdh->cdhRoiHigh != cdhRef->cdhRoiHigh ) {
1574 "%s: CDH coherency check failed. \
1575 RoiHigh/Low reference:0x%x-%x current:0x%x-%x\n",
1577 cdhRef->cdhRoiHigh, cdhRef->cdhRoiLow,
1578 cdh ->cdhRoiHigh, cdh ->cdhRoiLow );
1582 if ( cdh->cdhMBZ0 != 0
1583 || cdh->cdhMBZ1 != 0
1584 || cdh->cdhMBZ2 != 0
1585 || cdh->cdhMBZ3 != 0 ) {
1587 "%s: CDH check failed. MBZ0:0x%x MBZ1:0x%x MBZ2:0x%x MBZ3:0x%x\n",
1589 cdh->cdhMBZ0, cdh->cdhMBZ1, cdh->cdhMBZ2, cdh->cdhMBZ3 );
1593 for ( attr = 0; attr != 8; attr++ ) {
1594 if ( (cdh->cdhBlockAttributes & (1<<attr)) != 0 ) {
1595 SET_USER_ATTRIBUTE( ldc->header.eventTypeAttribute, attr );
1598 for ( trig = 0; trig != 32; trig++ ) {
1599 if ( (cdh->cdhTriggerClassesLow & (1<<trig)) != 0 ) {
1600 SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
1604 for ( trig = 0; trig != 18; trig++ ) {
1605 if ( (cdh->cdhTriggerClassesHigh & (1<<trig)) != 0 ) {
1606 SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
1610 if ( gotAliceTrigger )
1611 VALIDATE_TRIGGER_PATTERN( ldc->header.eventTriggerPattern );
1614 } /* End of decodeCDH */
1617 assert( workingAs == ldc || workingAs == gdc );
1619 if ( workingAs == gdc ) {
1620 struct gdcEventDescriptorStruct *gdc;
1622 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
1625 struct ldcEventDescriptorStruct *ldc;
1627 initEvent( &gdc->header );
1628 gdc->header.eventSize = gdc->header.eventHeadSize;
1629 gdc->header.eventType = PHYSICS_EVENT;
1630 SET_SYSTEM_ATTRIBUTE( gdc->header.eventTypeAttribute, ATTR_SUPER_EVENT );
1631 gdc->header.eventGdcId = currGdcId;
1632 COPY_DETECTOR_PATTERN(&currDetPattern, gdc->header.eventDetectorPattern);
1633 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
1634 struct equipmentEventDescriptorStruct *eq;
1636 initEvent( &ldc->header );
1637 ldc->header.eventSize = ldc->header.eventHeadSize;
1638 ldc->header.eventType = PHYSICS_EVENT;
1639 ldc->header.eventGdcId = currGdcId;
1640 COPY_DETECTOR_PATTERN(&currDetPattern, ldc->header.eventDetectorPattern);
1641 ldc->header.eventLdcId = ldc->id;
1642 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1643 initEquipment( &eq->header );
1644 eq->header.equipmentId = eq->id;
1645 if ( workingMode == collider )
1646 SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
1648 eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
1649 ldc->header.eventSize += eq->header.equipmentSize;
1650 decodeCDH( ldc, eq->payload, eq->id );
1651 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1652 ldc->header.eventTypeAttribute );
1653 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1654 gdc->header.eventTypeAttribute );
1656 gdc->header.eventSize += ldc->header.eventSize;
1662 printf( "Headers:\n" );
1663 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
1666 struct ldcEventDescriptorStruct *ldc;
1668 printf( " GDC:%d size:%d vers:%08x\n",
1670 gdc->header.eventSize,
1671 gdc->header.eventVersion);
1672 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
1673 struct equipmentEventDescriptorStruct *eq;
1675 printf( " LDC:%d size:%d vers:%08x\n",
1677 ldc->header.eventSize,
1678 ldc->header.eventVersion );
1679 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1680 printf( " EQ:%d size:%d %spayload:%d\n",
1682 eq->header.equipmentSize,
1683 eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
1684 eq->payload->size );
1689 } else if ( workingAs == ldc ) {
1690 struct ldcEventDescriptorStruct *ldc;
1692 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
1695 struct equipmentEventDescriptorStruct *eq;
1697 initEvent( &ldc->header );
1698 ldc->header.eventSize = ldc->header.eventHeadSize;
1699 ldc->header.eventType = PHYSICS_EVENT;
1700 ldc->header.eventGdcId = VOID_ID;
1701 ldc->header.eventLdcId = ldc->id;
1702 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1703 initEquipment( &eq->header );
1704 eq->header.equipmentId = eq->id;
1705 if ( workingMode == collider )
1706 SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
1708 eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
1709 ldc->header.eventSize += eq->header.equipmentSize;
1710 decodeCDH( ldc, eq->payload, eq->id );
1711 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1712 ldc->header.eventTypeAttribute );
1717 printf( "Headers:\n" );
1718 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
1721 struct equipmentEventDescriptorStruct *eq;
1723 printf( " LDC:%d size:%d vers:%08x\n",
1725 ldc->header.eventSize,
1726 ldc->header.eventVersion );
1727 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1728 printf( " EQ:%d size:%d %spayload:%d\n",
1730 eq->header.equipmentSize,
1731 eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
1732 eq->payload->size );
1737 } /* End of initEvents */
1741 workingAs = unknown;
1742 workingMode = fixedTarget;
1743 ldcsHead = ldcsTail = NULL;
1744 eventsHead = eventsTail = NULL;
1748 payloadsHead = payloadsTail = NULL;
1752 createSorEor = TRUE;
1754 gotAliceTrigger = TRUE;
1756 } /* End of initVars */
1758 int main( int argc, char **argv ) {
1760 parseArgs( argc, argv );