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;
63 unsigned long32 detPattern;
64 eventTimestampType timestamp;
66 struct ldcEventDescriptorStruct {
67 struct equipmentEventDescriptorStruct *head;
68 struct equipmentEventDescriptorStruct *tail;
69 struct ldcEventDescriptorStruct *next;
71 struct eventHeaderStruct header;
73 unsigned long32 detPattern;
74 eventTimestampType timestamp;
76 struct equipmentEventDescriptorStruct {
77 struct equipmentEventDescriptorStruct *next;
79 struct payloadDescriptorStruct *payload;
80 struct equipmentHeaderStruct header;
82 struct payloadDescriptorStruct {
83 struct payloadDescriptorStruct *next;
88 } *payloadsHead, *payloadsTail;
90 eventGdcIdType currGdcId;
91 unsigned long32 currDetPattern;
92 eventTimestampType currTimestamp;
93 eventLdcIdType currLdcId;
94 equipmentIdType currEquipmentId;
100 eventIdType oneEventDelta;
101 eventIdType currEventId;
105 struct commonDataHeaderStruct *cdhRef = NULL;
107 void dumpPayload( const struct payloadDescriptorStruct *p ) {
112 if ( p->data != NULL ) {
113 for ( i = 0, c = (char *)p->data, printable = TRUE;
114 printable && i != p->size;
116 printable = isascii( *c );
119 for ( i = 0, c = (char *)p->data; i != p->size; c++, i++ ) {
125 if ( *c != '\n' ) printf( "\"\n" );
128 for ( i = 0, v = (long32 *)p->data;
131 if ( i % (4*8) == 0 ) {
132 if ( i != 0 ) printf( "\n" );
135 printf( "%08x ", *v );
141 while ( i != p->size ) {
142 printf( "%02x ", *((char *)p->data + p->size - j - 1) & 0xff );
150 } /* End of dumpPayload */
153 assert( workingAs == ldc || workingAs == gdc );
154 if ( eventsHead != NULL ) {
155 printf( "Events:\n" );
156 if ( workingAs == gdc ) {
157 struct gdcEventDescriptorStruct *gdc;
159 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
162 struct ldcEventDescriptorStruct *ldc;
164 printf( " GDC (%p)\n", (void*)gdc );
165 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
166 struct equipmentEventDescriptorStruct *eq;
168 printf( " LDC (%p): %d\n", (void*)ldc, ldc->id );
169 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
170 printf( " EQUIPMENT (%p): %d PAYLOAD (%p):",
173 (void*)eq->payload );
175 printf( "\"%s\" (%d bytes)\n",
176 eq->payload->fileName,
178 dumpPayload( eq->payload );
183 if ( workingAs == ldc ) {
184 struct ldcEventDescriptorStruct *ldc;
186 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
189 struct equipmentEventDescriptorStruct *eq;
192 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
193 printf( " EQUIPMENT (%p): %d PAYLOAD (%p):",
196 (void*)eq->payload );
198 printf( "\"%s\" (%d bytes)\n",
199 eq->payload->fileName,
201 dumpPayload( eq->payload );
206 printf( "Events: EMPTY\n" );
208 } /* End of dumpEvents */
210 void getLine( char *line, const int maxSize ) {
214 for ( read = 0; !feof( stdin ) && !ferror( stdin ) && read != maxSize; read++ ) {
215 if ( (line[read] = getchar()) == '\n' ) break;
217 if ( ferror( stdin ) ) {
219 "%s: failed to read configuration input errno:%d ",
224 if ( feof( stdin ) ) read--;
225 if ( read == maxSize && line[read] != '\n' ) {
227 "%s: Input line # %d too long (%d chars max)\n",
228 myName, lineNmb, maxSize-1 );
233 if ( !( read == 0 && feof( stdin ) ) ) {
234 printf( "%d) [%3d] \"%s\"", lineNmb, read, line );
237 for ( c = 0; c != read; c++ ) {
238 if ( line[c] == '#' ) {
245 printf( " => \"%s\"", line );
247 if ( feof( stdin ) ) printf( "<<< EOF >>>" );
248 if ( ferror( stdin ) ) printf( "<<< FERROR >>>" );
251 } /* End of getLine */
253 void handleLdc( eventLdcIdType ldcId ) {
254 struct ldcDescriptorStruct *ldc;
256 if ( ldcsHead != NULL ) {
257 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
258 if ( ldc->id == ldcId ) {
263 if ( (ldc = (struct ldcDescriptorStruct *)malloc( sizeof( *ldc ) )) == NULL ) {
265 "%s: Failed to malloc for %d bytes (struct ldcDescriptorStruct)\n",
266 myName, (int)sizeof( *ldc ) );
271 if ( ldcsHead == NULL ) {
272 ldcsHead = ldcsTail = ldc;
274 ldcsTail->next = ldc;
278 } /* End of handleLdc */
280 void createNewEvent() {
281 assert( workingAs == ldc || workingAs == gdc );
282 if ( workingAs == ldc ) {
283 struct ldcEventDescriptorStruct *p;
285 if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
288 "%s: failed to malloc for %d bytes (createNewEvent: struct ldcEventDescriptorStruct)",
289 myName, (int)sizeof( *p ) );
294 p->head = p->tail = NULL;
297 if ( eventsHead == NULL ) {
298 eventsHead = eventsTail = p;
300 struct ldcEventDescriptorStruct *q =
301 (struct ldcEventDescriptorStruct *)eventsTail;
307 p->detPattern = currDetPattern;
308 p->timestamp = currTimestamp;
309 } else if ( workingAs == gdc ) {
310 struct gdcEventDescriptorStruct *p;
312 if ( (p = (struct gdcEventDescriptorStruct *)malloc( sizeof( *p ) ))
315 "%s: failed to malloc for %d bytes (createNewEvent: struct gdcEventDescriptorStruct)",
316 myName, (int)sizeof( *p ) );
322 p->head = p->tail = NULL;
324 if ( eventsHead == NULL ) {
325 eventsHead = eventsTail = p;
327 struct gdcEventDescriptorStruct *q =
328 (struct gdcEventDescriptorStruct *)eventsTail;
333 p->detPattern = currDetPattern;
334 p->timestamp = currTimestamp;
336 } /* End of createNewEvent */
338 void createNewLdcEvent() {
339 struct gdcEventDescriptorStruct *gdcDesc;
340 struct ldcEventDescriptorStruct *p;
342 if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
345 "%s: failed to malloc for %d bytes (createNewLdcEvent: struct ldcEventDescriptorStruct)",
346 myName, (int)sizeof( *p ) );
351 p->detPattern = currDetPattern;
352 p->timestamp = currTimestamp;
353 p->head = p->tail = NULL;
355 gdcDesc = (struct gdcEventDescriptorStruct *)eventsTail;
356 if ( gdcDesc->head == NULL ) {
357 gdcDesc->head = gdcDesc->tail = p;
359 gdcDesc->tail->next = p;
363 } /* End of createNewLdcEvent */
365 void loadBuffer( struct payloadDescriptorStruct * const payload ) {
369 if ( (f = fopen( payload->fileName, "r" )) == NULL ) {
371 "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
376 perror( "System-dependent error " );
379 if ( (payload->data = malloc( payload->size )) == NULL ) {
381 "%s: line:%d Failed to malloc for payload file \"%s\" size:%d errno:%d ",
387 perror( "System-dependent status " );
390 if ( (bytesRead = fread( payload->data, payload->fileSize, 1, f )) != 1 ) {
392 "%s: line:%d Failed to read payload file \"%s\" size:%d requested:1 got:%d feof:%s ferror:%s errno:%d ",
398 feof(f) ? "TRUE" : "false",
399 ferror(f) ? "TRUE" : "false",
401 perror( "System-dependent status " );
405 if ( payload->size != payload->fileSize ) {
406 memset( (char *)payload->data + payload->fileSize,
408 payload->size - payload->fileSize );
410 } /* End of loadBuffer */
412 void unloadBuffer( struct payloadDescriptorStruct * const payload ) {
413 if ( payload->data != NULL ) {
414 free( payload->data );
415 payload->data = NULL;
417 } /* End of unloadBuffer */
419 void unloadAllBuffers() {
420 struct payloadDescriptorStruct *payload;
422 for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
423 unloadBuffer( payload );
425 } /* End of unloadAllBuffers */
427 void loadPayload( const char *fileName ) {
428 struct payloadDescriptorStruct *payload;
430 for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
431 if ( strcmp( fileName, payload->fileName ) == 0 )
434 if ( payload == NULL ) {
437 if ( (payload = (struct payloadDescriptorStruct *)malloc( sizeof( *payload ) ))
440 "%s: failed to malloc for %d bytes (loadPayload/payloadDescriptorStruct)\n",
442 (int)sizeof( *payload ) );
445 if ( (payload->fileName = strdup( fileName )) == NULL ) {
447 "%s: failed to duplicate string \"%s\" (loadPaload/fileName)\n",
452 if ( (f = fopen( fileName, "r" )) == NULL ) {
454 "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
459 perror( "System-dependent error " );
462 if ( fseek( f, 0L, SEEK_END ) != 0 ) {
464 "%s: line:%d Failed to seek payload file \"%s\" errno:%d ",
469 perror( "System-dependent error " );
472 if ( (payload->size = ftell( f )) <= 0 ) {
474 "%s: line:%d Failed to get file \"%s\" size size:%d errno:%d ",
480 perror( "System-dependent status " );
483 payload->fileSize = payload->size;
484 while ( (payload->size & 3) != 0 ) payload->size++;
488 loadBuffer( payload );
490 payload->data = NULL;
493 payload->next = NULL;
494 if ( payloadsHead == NULL ) {
495 payloadsHead = payloadsTail = payload;
497 payloadsTail->next = payload;
498 payloadsTail = payload;
503 printf( "%d) Payload \"%s\" loaded at %p\n",
509 strncmp(fileName,"TRG_",4) != 0 ) {
510 struct commonDataHeaderStruct *cdh =
511 (struct commonDataHeaderStruct *)payload->data;
513 printf( " CDH: blockLenght:%d=0x%08x ",
514 cdh->cdhBlockLength, cdh->cdhBlockLength );
515 if ( cdh->cdhBlockLength < sizeof( *cdh ) ) {
516 printf( "TOO SMALL (minimum:%ld=0x%08lx)\n",
517 (unsigned long)sizeof( *cdh ),
518 (unsigned long)sizeof( *cdh ) );
520 printf( "version:%d=0x%x ", cdh->cdhVersion, cdh->cdhVersion );
521 if ( cdh->cdhVersion != CDH_VERSION ) {
522 printf( "EXPECTED:%d=%x (decoding may be inaccurate) ",
523 CDH_VERSION, CDH_VERSION );
526 printf( "L1TriggerMessage:0x%x", cdh->cdhL1TriggerMessage );
527 if ( cdh->cdhL1TriggerMessage != 0 ) {
528 for ( b = 0, n = 0; b != 10; b++ ) {
529 if ( (cdh->cdhL1TriggerMessage & (1<<b)) != 0 ) {
530 if ( n++ != 0 )printf( "+" );
532 case 0: printf( "L1SwC" ); break;
533 case 1: printf( "ESR" ); break;
534 case 2: printf( "RoC1" ); break;
535 case 3: printf( "RoC2" ); break;
536 case 4: printf( "RoC3" ); break;
537 case 5: printf( "RoC4" ); break;
538 case 6: printf( "ClT" ); break;
539 default: printf( "spare %d", b+14 );
546 if ( cdh->cdhMBZ0 != 0 )
547 printf( "MBZ0:0x%x ",
552 printf( "EventId2(orbit):%d=0x%x ",
553 cdh->cdhEventId2, cdh->cdhEventId2 );
554 printf( "EventId1(bunchCrossing):%d=0x%x ",
555 cdh->cdhEventId1, cdh->cdhEventId1 );
559 if ( cdh->cdhMBZ1 != 0 )
560 printf( "MBZ1:0x%x ",
562 printf( "BlockAttributes:0x%x",
563 cdh->cdhBlockAttributes );
564 if ( cdh->cdhBlockAttributes != 0 ) {
566 for ( b = 0, n = 0; b != 8; b++ ) {
567 if ( (cdh->cdhBlockAttributes & (1<<b)) != 0 ) {
576 printf( "ParticipatingSubDetectors:0x%x ",
577 cdh->cdhParticipatingSubDetectors );
581 if ( cdh->cdhMBZ2 != 0 )
582 printf( "MBZ2:0x%x ",
584 printf( "Status/Error:0x%x", cdh->cdhStatusErrorBits );
585 if ( cdh->cdhStatusErrorBits != 0 ) {
587 for ( b = 0,n = 0; b != 16; b++ ) {
588 if ( (cdh->cdhStatusErrorBits & (1<<b)) != 0 ) {
589 if ( n++ != 0 ) printf( "+" );
591 case 0: printf( "TriggerOverLapError" ); break;
592 case 1: printf( "TriggerMissingError" ); break;
593 case 2: printf( "DataParityError" ); break;
594 case 3: printf( "ControlParityError" ); break;
595 case 4: printf( "TriggerInformationUnavailable" ); break;
596 case 5: printf( "FEEError" ); break;
597 case 6: printf( "HLTDecision" ); break;
598 case 7: printf( "HLTPayload" ); break;
599 case 8: printf( "DDGPayload" ); break;
600 default: printf( "spare %d", b );
607 printf( "MiniEventId(bunchCrossing):%d=0x%x ",
608 cdh->cdhMiniEventId, cdh->cdhMiniEventId );
612 printf( "Trigger classes: 0x(%05x-%08x)",
613 cdh->cdhTriggerClassesHigh,
614 cdh->cdhTriggerClassesLow );
615 if ( cdh->cdhTriggerClassesHigh != 0
616 || cdh->cdhTriggerClassesLow != 0 ) {
618 for ( b=0, n=0; b != 32; b++ ) {
619 if ( (cdh->cdhTriggerClassesLow & (1<<b)) != 0 ) {
620 if ( n++ != 0 ) printf( "+" );
624 for ( b=0; b != 18; b++ ) {
625 if ( (cdh->cdhTriggerClassesHigh & (1<<b)) != 0 ) {
626 if ( n++ != 0 ) printf( "+" );
627 printf( "%d", b+32 );
635 if ( cdh->cdhMBZ3 != 0 ) {
636 printf( "MBZ3:0x%x ",
639 printf( "ROI:0x(%08x-%01x)", cdh->cdhRoiHigh, cdh->cdhRoiLow );
640 if ( cdh->cdhRoiHigh != 0
641 || cdh->cdhRoiLow != 0 ) {
643 for ( b=0, n=0; b != 5; b++ ) {
644 if ( (cdh->cdhRoiLow & (1<<b)) != 0 ) {
645 if ( n++ != 0 ) printf( "+" );
649 for ( b=0; b != 32; b++ ) {
650 if ( (cdh->cdhRoiHigh & (1<<b)) != 0 ) {
651 if ( n++ != 0 ) printf( "+" );
663 printf( "%d) Payload \"%s\" already loaded at %p\n",
669 currEvent->payload = payload;
670 } /* End of loadPayload */
672 void parseEquipment( char * const line ) {
673 struct equipmentEventDescriptorStruct *equipment;
674 int payloadFound = FALSE;
679 (struct equipmentEventDescriptorStruct *)malloc( sizeof( *equipment ) )) == NULL ) {
681 "%s: filed to malloc for %d bytes (parseEquipment/equipmentEventDescriptorStruct) errno:%d ",
683 (int)sizeof( *equipment ),
688 currEvent = equipment;
691 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
692 DBG_VERBOSE printf( "%d) Equipment - Keyword:\"%s\"\n",
695 if ( strcasecmp( "id", keyword ) == 0 ) {
698 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
700 "%s: line:%d EQUIPMENT declaration, ID needed",
705 if ( sscanf( idNum, "%d", &currEquipmentId ) != 1 ) {
707 "%s: line:%d EQUIPMENT declaration, numeric ID needed (%s)",
713 DBG_VERBOSE printf( "%d) EQUIPMENT - ID:%d\n",
716 } else if ( strncasecmp( "pay", keyword, 3 ) == 0 ) {
719 if ( (fileName = strtok_r( p, " \t", &p )) == NULL ) {
721 "%s line:%d Payload without filename found\n",
726 DBG_VERBOSE printf( "%d) Equipment - Payload:\"%s\"\n",
729 if ( payloadFound ) {
731 "%s line:%d Payload with multiple filenames found\n",
736 loadPayload( fileName );
740 "%s: line:%d Equipment declaration, unknown keyword \"%s\"\n",
747 if ( !payloadFound ) {
749 "%s: line:%d Equipment without payload found\n",
755 equipment->id = currEquipmentId;
756 equipment->next = NULL;
757 if ( currLdc->head == NULL ) {
758 currLdc->head = currLdc->tail = equipment;
760 currLdc->tail->next = equipment;
761 currLdc->tail = equipment;
763 } /* End of parseEquipment */
765 void parseGdc( char * const line ) {
770 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
771 if ( strcasecmp( "id", keyword ) == 0 ) {
774 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
776 "%s: line:%d GDC declaration, ID needed",
782 if ( sscanf( idNum, "%d", &inCurrGdcId ) != 1 ) {
784 "%s: line:%d GDC declaration, numeric ID needed (%s)",
790 currGdcId = (eventGdcIdType)inCurrGdcId;
791 DBG_VERBOSE printf( "%d) GDC - ID:%d\n",
794 } else if ( strcasecmp( "DetectorPattern", keyword ) == 0 ) {
797 if ( (detPattern = strtok_r( p, " \t", &p )) == NULL ) {
799 "%s: line:%d GDC declaration, DetectorPattern needed",
804 if ( sscanf( detPattern, "%u", &currDetPattern ) != 1 ) {
806 "%s: line:%d GDC declaration, numeric DetectorPattern needed (%s)",
812 DBG_VERBOSE printf( "%d) GDC - DetectorPattern:%u\n",
815 } else if ( strcasecmp( "Timestamp", keyword ) == 0 ) {
818 if ( (timestamp = strtok_r( p, " \t", &p )) == NULL ) {
820 "%s: line:%d GDC declaration, Timestamp needed",
825 if ( sscanf( timestamp, "%u", &currTimestamp ) != 1 ) {
827 "%s: line:%d GDC declaration, numeric Timestamp needed (%s)",
833 DBG_VERBOSE printf( "%d) GDC - Timestamp:%u\n",
838 "%s: line:%d GDC declaration, unknown keyword \"%s\"\n",
845 } /* End of parseGdc */
847 void parseLdc( char * const line ) {
852 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
853 if ( strcasecmp( "id", keyword ) == 0 ) {
856 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
858 "%s: line:%d LDC declaration, ID needed",
864 if ( sscanf( idNum, "%d", &inCurrLdcId ) != 1 ) {
866 "%s: line:%d LDC declaration, numeric ID needed (%s)",
872 currLdcId = (eventLdcIdType)inCurrLdcId;
873 DBG_VERBOSE printf( "%d) LDC - ID:%d\n",
878 "%s: line:%d LDC declaration, unknown keyword \"%s\"\n",
885 } /* End of parseLdc */
890 currLdcId = HOST_ID_MIN;
891 currGdcId = HOST_ID_MIN;
895 for ( lineNmb = 1; !feof( stdin ); lineNmb++ ) {
896 getLine( line, sizeof(line) );
897 if ( strlen(line) != 0 ) {
901 if ( (keyword = strtok_r( line, " \t", &p )) != NULL ) {
902 DBG_VERBOSE printf( "%d) Keyword:\"%s\"\n", lineNmb, keyword );
903 if ( strcasecmp( "gdc", keyword ) == 0 ) {
904 if ( workingAs != gdc && workingAs != unknown ) {
906 "%s: line:%d GDC found when working in non-GDC mode (e.g. as a LDC)\n",
913 currLdcId = HOST_ID_MIN;
916 } else if ( strcasecmp( "ldc", keyword ) == 0 ) {
917 if ( workingAs != gdc && workingAs != ldc && workingAs != unknown ) {
919 "%s: line:%d LDC found when working in non-LDC/GDC mode\n",
923 if ( workingAs == unknown ) workingAs = ldc;
925 if ( workingAs == ldc ) {
930 handleLdc( currLdcId );
934 } else if ( strncasecmp( "equ", keyword, 3 ) == 0 ) {
935 if ( workingAs == unknown
936 || (workingAs == ldc && currLdc == NULL )
937 || (workingAs == gdc && currGdc == NULL ) ) {
939 "%s: line:%d Unexpected EQUIPMENT declaration (LDC or GDC needed first)\n",
948 "%s: line:%d Parse error in \"%s\" unknown keyword\n",
956 } while ( !feof( stdin ) ) {}
960 printf( "End of parse: %d line%s found\n",
962 lineNmb != 1 ? "s" : "" );
963 printf( "Working as %s\n",
964 workingAs == gdc ? "GDC" :
965 workingAs == ldc ? "LDC" :
967 if ( workingAs == gdc ) {
968 struct ldcDescriptorStruct *ldc;
970 printf( "LDCs (%d):", numOfLdcs );
971 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
972 printf( " %d", ldc->id );
979 if ( workingAs == ldc ) {
980 assert( ldcsHead == ldcsTail );
981 assert( ldcsTail == NULL );
984 if ( workingAs == gdc ) {
985 struct ldcDescriptorStruct *ldc;
987 assert( ldcsHead != NULL );
988 assert( ldcsTail != NULL );
989 assert( ldcsTail->next == NULL );
990 for ( ldc = ldcsHead; ldc->next != NULL; ldc = ldc->next ) {}
991 assert ( ldc == ldcsTail );
994 if ( workingAs == unknown ) {
995 DBG_VERBOSE printf( "Empty configuration: nothing to do!\n" );
999 assert( (eventsHead == NULL && eventsTail == NULL)
1000 || (eventsHead != NULL && eventsTail != NULL) );
1001 } /* End of parseRules */
1003 void initEvent( struct eventHeaderStruct * const ev ) {
1004 memset( ev, 0, sizeof( *ev ) );
1006 ev->eventMagic = EVENT_MAGIC_NUMBER;
1007 ev->eventHeadSize = EVENT_HEAD_BASE_SIZE;
1008 ev->eventVersion = EVENT_CURRENT_VERSION;
1009 ev->eventRunNb = currRunNb;
1010 ZERO_EVENT_ID( ev->eventId );
1011 ZERO_TRIGGER_PATTERN( ev->eventTriggerPattern );
1012 ZERO_DETECTOR_PATTERN( ev->eventDetectorPattern );
1013 RESET_ATTRIBUTES( ev->eventTypeAttribute );
1014 if ( workingMode == collider )
1015 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_ORBIT_BC );
1016 ev->eventLdcId = VOID_ID;
1017 ev->eventGdcId = VOID_ID;
1018 } /* End of initEvent */
1022 // Swap the endianess of the integer value 'x'
1024 return (((x & 0x000000ffU) << 24) | ((x & 0x0000ff00U) << 8) |
1025 ((x & 0x00ff0000U) >> 8) | ((x & 0xff000000U) >> 24));
1028 void outputEvent( const void * const ev,
1033 const long32 * const v = (long32 *)ev;
1034 printf( "Writing %d bytes @ %p (%d)\n", size, ev, *v );
1037 // .............................Test endianess..............................
1039 char* ptemp = (char*) &temp;
1041 if (ptemp[0]!=1) { // Mac platform: ptemp != 1..............................................................................
1042 int bufSize= size; if (bufSize > (int) sizeof(eventHeaderStruct)) { bufSize = sizeof(eventHeaderStruct); }
1043 char* evTemp = (char*) malloc (bufSize);
1044 memcpy(evTemp, ev, bufSize);
1046 if ((bufSize % sizeof(int)) != 0) {
1047 fprintf( stderr, "%s: size of the input buffer ev is not multiple of 4 (size = %d)\n", myName, bufSize);
1051 // Invert header to evTemp.....................................................
1052 int* buf = (int*) evTemp;
1053 for (int i=0; i < (int) (bufSize / sizeof(int)); i++, buf++) {
1054 int value = Swap(*buf);
1055 memcpy(evTemp + (i * sizeof(int)), &value, sizeof(int));
1058 // Write inverted header to file...............................................
1059 if ((done = fwrite( evTemp, bufSize, 1, outF )) != 1 ) {
1060 fprintf( stderr, "%s: failed to write inverted header. event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
1064 if (size > bufSize) { // Still theraw-data payload to write (but not inverted, since it is inverted eariler).............
1065 if ((done = fwrite( (char*)ev + bufSize, size - bufSize, 1, outF )) != 1 ) {
1066 fprintf( stderr, "%s: failed to write additional event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
1073 else { // Intel platform: ptemp == 1............................................................................
1074 if ((done = fwrite( ev, size, 1, outF )) != 1 ) {
1075 fprintf( stderr, "%s: failed to write event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
1079 } /* End of outputEvent */
1081 void createSorAndEor( const int sor ) {
1082 unsigned char event[ 1000 ];
1083 struct eventHeaderStruct *ev;
1084 struct eventHeaderStruct sev;
1086 assert( workingAs == ldc || workingAs == gdc );
1088 if ( !createSorEor ) return;
1089 ev = (struct eventHeaderStruct *)event;
1091 ev->eventSize = sizeof( event );
1092 ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
1093 if ( workingMode == fixedTarget )
1094 LOAD_RAW_EVENT_ID( ev->eventId, 0, 0, 0 );
1096 LOAD_EVENT_ID( ev->eventId, 0, 0, 0 );
1097 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
1099 if ( workingAs == ldc ) {
1100 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1102 if ( workingAs == gdc ) {
1104 sev.eventGdcId = currGdcId;
1105 ev->eventGdcId = currGdcId;
1106 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1107 currLdc = currGdc->head;
1109 ev->eventLdcId = currLdc->id;
1111 if ( workingAs == ldc ) {
1112 outputEvent( ev, ev->eventSize );
1114 if ( workingAs == gdc ) {
1115 struct ldcDescriptorStruct *ldc;
1117 sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
1118 sev.eventType = sor ? START_OF_RUN : END_OF_RUN ;
1119 COPY_EVENT_ID( ev->eventId, sev.eventId );
1120 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1121 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1122 outputEvent( &sev, sizeof( sev ) );
1124 ev->eventGdcId = currGdcId;
1125 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1126 ev->eventLdcId = ldc->id;
1127 outputEvent( ev, ev->eventSize );
1131 ADD_EVENT_ID( ev->eventId, oneEventDelta );
1132 ev->eventSize = ev->eventSize / 2;
1133 ev->eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1134 CLEAR_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
1135 if ( workingAs == ldc ) {
1136 outputEvent( ev, ev->eventSize );
1138 if ( workingAs == gdc ) {
1139 struct ldcDescriptorStruct *ldc;
1141 sev.eventSize = ev->eventSize;
1142 sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1143 COPY_EVENT_ID( ev->eventId, sev.eventId );
1144 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1145 CLEAR_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1146 outputEvent( &sev, sizeof( sev ) );
1147 outputEvent( ev, ev->eventSize - sizeof( sev ) );
1149 sev.eventSize = sizeof( sev ) + ev->eventSize;
1150 sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1151 COPY_EVENT_ID( ev->eventId, sev.eventId );
1152 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1153 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1155 ev->eventGdcId = currGdcId;
1156 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1157 outputEvent( &sev, sizeof( sev ) );
1158 ev->eventLdcId = ldc->id;
1159 outputEvent( ev, ev->eventSize );
1163 ADD_EVENT_ID( ev->eventId, oneEventDelta );
1164 ev->eventSize = sizeof( *ev );
1165 ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
1166 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_END );
1167 if ( workingAs == ldc ) {
1168 outputEvent( ev, ev->eventSize );
1170 if ( workingAs == gdc ) {
1171 struct ldcDescriptorStruct *ldc;
1173 sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
1174 sev.eventType = sor ? START_OF_RUN : END_OF_RUN;
1175 COPY_EVENT_ID( ev->eventId, sev.eventId );
1176 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1177 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1179 outputEvent( &sev, sizeof( sev ) );
1181 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1182 ev->eventLdcId = ldc->id;
1183 outputEvent( ev, ev->eventSize );
1186 } /* End of createSorEor */
1189 createSorAndEor( TRUE );
1190 } /* End of createSor */
1193 createSorAndEor( FALSE );
1194 } /* End of createEor */
1196 void loadCdh( struct commonDataHeaderStruct * const cdh,
1197 eventIdType * const eventId,
1198 equipmentIdType id ) {
1199 if ( !handleCDH ) return;
1201 // CTP raw-data does not contain CDH
1202 if ( id == 4352) return;
1204 if ( gotAliceTrigger ) {
1205 cdh->cdhEventId1 = EVENT_ID_GET_BUNCH_CROSSING( *eventId );
1206 cdh->cdhEventId2 = EVENT_ID_GET_ORBIT( *eventId );
1208 cdh->cdhEventId1 = 0;
1209 cdh->cdhEventId2 = EVENT_ID_GET_NB_IN_RUN( *eventId );
1211 cdh->cdhMiniEventId = cdh->cdhEventId1;
1213 void decodeCDH( struct ldcEventDescriptorStruct * const ldc,
1214 const struct payloadDescriptorStruct * const payloadDesc,
1215 equipmentIdType id );
1217 void createEvent( void ) {
1218 assert( workingAs == ldc || workingAs == gdc );
1220 /* Step 1: load all buffers (if needed) and compose the GDC/LDC headers */
1221 if ( workingAs == gdc ) {
1222 struct ldcEventDescriptorStruct *ldc;
1224 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1225 COPY_EVENT_ID( currEventId, ldc->header.eventId );
1227 COPY_EVENT_ID( currEventId, currGdc->header.eventId );
1229 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1230 struct equipmentEventDescriptorStruct *eq;
1233 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1234 if ( !bufferData ) {
1235 loadBuffer( eq->payload );
1236 decodeCDH( ldc, eq->payload, eq->id );
1238 loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
1243 if ( !currGdc->loaded ) {
1244 for ( n = 0; n != EVENT_TRIGGER_PATTERN_WORDS; n++ )
1245 currGdc->header.eventTriggerPattern[n] |= ldc->header.eventTriggerPattern[n];
1246 for ( n = 0; n != EVENT_DETECTOR_PATTERN_WORDS; n++ )
1247 currGdc->header.eventDetectorPattern[n] |= ldc->header.eventDetectorPattern[n];
1248 for ( n = 0; n != ALL_ATTRIBUTE_WORDS; n++ )
1249 currGdc->header.eventTypeAttribute[n] |= ldc->header.eventTypeAttribute[n];
1250 currGdc->loaded = TRUE;
1254 } else if ( workingAs == ldc ) {
1255 struct equipmentEventDescriptorStruct *eq;
1257 COPY_EVENT_ID( currEventId, currLdc->header.eventId );
1259 for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
1260 if ( !bufferData ) {
1261 loadBuffer( eq->payload );
1262 decodeCDH( currLdc, eq->payload, eq->id );
1264 loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
1267 currLdc->loaded = TRUE;
1271 ADD_EVENT_ID( currEventId, oneEventDelta );
1273 /* Step 2: output the event */
1274 if ( workingAs == gdc ) {
1275 struct ldcEventDescriptorStruct *ldc;
1277 outputEvent( &currGdc->header, sizeof( currGdc->header ) );
1279 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1280 struct equipmentEventDescriptorStruct *eq;
1282 outputEvent( &ldc->header, sizeof( ldc->header ) );
1284 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1285 outputEvent( &eq->header, sizeof( eq->header ) );
1286 outputEvent( eq->payload->data, eq->payload->size );
1287 if ( !bufferData ) unloadBuffer( eq->payload );
1290 if ( (currGdc = currGdc->next) == NULL )
1291 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1292 } else if ( workingAs == ldc ) {
1293 struct equipmentEventDescriptorStruct *eq;
1295 outputEvent( &currLdc->header, sizeof( currLdc->header ) );
1297 for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
1298 outputEvent( &eq->header, sizeof( eq->header ) );
1299 outputEvent( eq->payload->data, eq->payload->size );
1300 if ( !bufferData ) unloadBuffer( eq->payload );
1302 if ( (currLdc = currLdc->next) == NULL )
1303 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1305 } /* End of createEvent */
1307 void createEvents() {
1310 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1311 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1316 eventNum != numOfEvents && numOfEvents != 0;
1321 } /* End of createEvents */
1325 "Usage: %s [-?][-d][-i definitionFile][-o outputFile][-# numOfEvents][-s][-F|-C]\n\
1327 -v Print version ID and exit\n\
1328 -d Enable debug (repeat for more verbosity)\n\
1329 -i definitionFile File with the description of the events to create (default: stdin)\n\
1330 -o outputFile File used to store events (default: stdout)\n\
1331 -# numOfEvents Number of events to generate (default: 1 event)\n\
1332 -s Do not generate SOR/EOR files (valid only for GDCs)\n\
1333 -F/-C Working in Fixed Target (F) or Collider (C) mode\n\
1335 -D Direct disc access (no buffering)\n",
1338 } /* End of usage */
1340 void parseArgs( int argc, char **argv ) {
1342 int inFileName = -1;
1343 int outFileName = -1;
1346 while ( arg < argc ) {
1347 if ( strcmp( "-?", argv[ arg ] ) == 0 ) {
1351 if ( strcmp( "-i", argv[ arg ] ) == 0 ) {
1352 if ( ++arg == argc ) exit( usage() );
1354 if ( freopen( argv[arg], "r", stdin ) == NULL ){
1356 "%s: failed to open input definition \"%s\" errno:%d ",
1357 myName, argv[arg], errno );
1361 } else if ( strcmp( "-v", argv[ arg ] ) == 0 ) {
1362 printf( "%s\n", fileHandlerIdent );
1364 } else if ( strcmp( "-o", argv[ arg ] ) == 0 ) {
1365 if ( ++arg == argc ) exit( usage() );
1367 } else if ( strcmp( "-#", argv[ arg ] ) == 0 ) {
1370 if ( ++arg == argc ) exit( usage() );
1371 if ( sscanf( argv[ arg ], "%d", &n ) != 1 ) exit( usage() );
1372 if ( n < 0 ) exit( usage() );
1374 } else if ( strcmp( "-s", argv[ arg ] ) == 0 ) {
1375 createSorEor = FALSE;
1376 } else if ( strcmp( "-F", argv[ arg ] ) == 0 ) {
1377 workingMode = fixedTarget;
1378 } else if ( strcmp( "-C", argv[ arg ] ) == 0 ) {
1379 workingMode = collider;
1380 } else if ( strcmp( "-d", argv[ arg ] ) == 0 ) {
1382 } else if ( strcmp( "-c", argv[ arg ] ) == 0 ) {
1384 } else if ( strcmp( "-D", argv[ arg ] ) == 0 ) {
1386 } else if ( strcmp( "-run", argv[ arg ] ) == 0 ) {
1388 if ( ++arg == argc ) exit( usage() );
1389 if ( sscanf( argv[ arg ], "%d", &runnumber ) != 1 ) exit( usage() );
1390 if ( runnumber < 0 ) exit( usage() );
1391 currRunNb = runnumber;
1393 fprintf( stderr, "%s: Unknown switch \"%s\"\n", myName, argv[argc] );
1399 if ( workingMode == fixedTarget )
1400 LOAD_RAW_EVENT_ID( oneEventDelta, 1, 0, 1 );
1402 LOAD_EVENT_ID( oneEventDelta, 0, 0, 1 );
1403 ZERO_EVENT_ID( currEventId );
1406 printf( "Configuration:\n" );
1407 printf( " Debug level: %d\n", debug );
1408 printf( " Configuration: %s\n",
1409 inFileName == -1 ? "stdin" : argv[ inFileName ] );
1410 printf( " Output: %s\n",
1411 outFileName == -1 ? "stdout" : argv[ outFileName ] );
1412 printf( " Working mode: %s\n",
1413 workingMode == fixedTarget ? "fixed target" : "collider" );
1414 printf( " Number of events: %d\n", numOfEvents );
1415 printf( " %s SOR/EOR files\n",
1416 createSorEor ? "Create" : "Do not create" );
1417 printf( " CDH handling: %s\n",
1418 handleCDH ? "enabled" : "disabled" );
1419 printf( " data buffering: %s\n",
1420 bufferData ? "enabled" : "DISABLED" );
1423 if ( outFileName == -1 ) {
1425 printf( "No more trace information from this point...\n" );
1429 if ( ( outF = fopen( argv[ outFileName ], "w" ) ) == NULL ) {
1431 "%s: failed to open output file \"%s\" for writing, errno:%d (%s)\n",
1433 argv[ outFileName ],
1435 strerror( errno ) );
1439 printf( "Output file \"%s\" opened OK for writing\n",
1440 argv[ outFileName ] );
1442 } /* End of parseArgs */
1443 void initEquipment( struct equipmentHeaderStruct * const eq ) {
1444 memset( eq, 0, sizeof( *eq ) );
1445 RESET_ATTRIBUTES( eq->equipmentTypeAttribute );
1446 eq->equipmentBasicElementSize = 4;
1447 } /* End of initEquipment */
1449 void decodeCDH( struct ldcEventDescriptorStruct * const ldc,
1450 const struct payloadDescriptorStruct * const payloadDesc,
1451 equipmentIdType id ) {
1454 struct commonDataHeaderStruct *cdh;
1455 static int softwareTriggerIndicator = FALSE;
1459 if ( payloadDesc->size < CDH_SIZE ) {
1461 "%s: payload too small got:%d CDH:%d\n",
1467 if ( (cdh = (struct commonDataHeaderStruct *)payloadDesc->data) != NULL ) {
1468 if ( cdh->cdhVersion != CDH_VERSION ) {
1470 "%s: CDH version mismatch expected:%d got:%d\n",
1476 if ( cdhRef == NULL ) {
1478 #define CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK (1<<CDH_TRIGGER_INFORMATION_UNAVAILABLE_BIT)
1479 gotAliceTrigger = (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0;
1480 if ( gotAliceTrigger && workingMode == fixedTarget ) {
1482 "%s: ALICE trigger and fixed target mode are not compatible.\n\
1483 Either work in Collider mode or set the trigger unavailable status bit in the CDH.\n",
1487 if ( gotAliceTrigger ) {
1488 if ( (cdh->cdhL1TriggerMessage & 0x40) != 0 ) {
1490 "%s: CDH is a calibration trigger (unsupported) L1TriggerMessage:0x%x\n",
1491 myName, cdh->cdhL1TriggerMessage );
1494 if ( (cdh->cdhL1TriggerMessage & 0x01) != 0 ) {
1495 softwareTriggerIndicator = TRUE;
1497 if ( softwareTriggerIndicator ) {
1498 switch ((cdh->cdhL1TriggerMessage >> 2) & 0xF) {
1506 /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xF --> END_OF_DATA */
1508 /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xE0 --> START_OF_DATA */
1510 /* L1SwC bit = on, Clt bit = off, RoC[4] = 1, but not 0xE or 0xF
1511 --> SYSTEM_SOFTWARE_TRIGGER_EVENT */
1513 /* L1SwC bit = on, Clt bit = off, RoC[4] = 0
1514 --> DETECTOR_SOFTWARE_TRIGGER_EVENT */
1516 "%s: CDH trigger SOD/EOD/SST/DST (unsupported) \
1517 L1TriggerMessage:0x%x ALICETrigger:%s\n",
1519 cdh->cdhL1TriggerMessage,
1520 gotAliceTrigger ? "yes" : "no" );
1526 if ( (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) !=
1527 (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) ) {
1529 "%s: CDH coherency check failed. \
1530 Trigger information reference:%savailable current:%savailable\n",
1532 (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "",
1533 (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "" );
1536 if ( gotAliceTrigger ) {
1537 if ( cdhRef->cdhL1TriggerMessage != cdh->cdhL1TriggerMessage ) {
1539 "%s: CDH coherency check failed. \
1540 L1 trigger message reference:0x%x current:0x%x\n",
1542 cdhRef->cdhL1TriggerMessage,
1543 cdh->cdhL1TriggerMessage );
1546 if ( cdh->cdhParticipatingSubDetectors != cdhRef->cdhParticipatingSubDetectors ) {
1548 "%s: CDH coherency check failed. \
1549 ParticipatingSubDetectors reference:0x%x current:0x%x\n",
1551 cdhRef->cdhParticipatingSubDetectors,
1552 cdh->cdhParticipatingSubDetectors );
1555 if ( cdh->cdhTriggerClassesLow != cdhRef->cdhTriggerClassesLow
1556 || cdh->cdhTriggerClassesHigh != cdhRef->cdhTriggerClassesHigh ) {
1558 "%s: CDH coherency check failed. \
1559 TriggerClassesHigh/Low reference:0x%x-%x current:0x%x-%x\n",
1561 cdhRef->cdhTriggerClassesHigh, cdhRef->cdhTriggerClassesLow,
1562 cdh ->cdhTriggerClassesHigh, cdh ->cdhTriggerClassesLow );
1565 if ( cdh->cdhBlockLength != 0xffffffff ) {
1566 if ( (unsigned)payloadDesc->size != cdh->cdhBlockLength ) {
1568 "%s: CDH coherency check failed. \
1569 Payload size:%d (0x%08x) CDH block length:%d (0x%08x)\n",
1571 payloadDesc->size, payloadDesc->size,
1572 cdh->cdhBlockLength, cdh->cdhBlockLength );
1576 if ( cdh->cdhRoiLow != cdhRef->cdhRoiLow
1577 || cdh->cdhRoiHigh != cdhRef->cdhRoiHigh ) {
1579 "%s: CDH coherency check failed. \
1580 RoiHigh/Low reference:0x%x-%x current:0x%x-%x\n",
1582 cdhRef->cdhRoiHigh, cdhRef->cdhRoiLow,
1583 cdh ->cdhRoiHigh, cdh ->cdhRoiLow );
1587 if ( cdh->cdhMBZ0 != 0
1588 || cdh->cdhMBZ1 != 0
1589 || cdh->cdhMBZ2 != 0
1590 || cdh->cdhMBZ3 != 0 ) {
1592 "%s: CDH check failed. MBZ0:0x%x MBZ1:0x%x MBZ2:0x%x MBZ3:0x%x\n",
1594 cdh->cdhMBZ0, cdh->cdhMBZ1, cdh->cdhMBZ2, cdh->cdhMBZ3 );
1598 for ( attr = 0; attr != 8; attr++ ) {
1599 if ( (cdh->cdhBlockAttributes & (1<<attr)) != 0 ) {
1600 SET_USER_ATTRIBUTE( ldc->header.eventTypeAttribute, attr );
1603 for ( trig = 0; trig != 32; trig++ ) {
1604 if ( (cdh->cdhTriggerClassesLow & (1<<trig)) != 0 ) {
1605 SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
1609 for ( trig = 0; trig != 18; trig++ ) {
1610 if ( (cdh->cdhTriggerClassesHigh & (1<<trig)) != 0 ) {
1611 SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
1615 if ( gotAliceTrigger )
1616 VALIDATE_TRIGGER_PATTERN( ldc->header.eventTriggerPattern );
1619 } /* End of decodeCDH */
1622 assert( workingAs == ldc || workingAs == gdc );
1624 if ( workingAs == gdc ) {
1625 struct gdcEventDescriptorStruct *gdc;
1627 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
1630 struct ldcEventDescriptorStruct *ldc;
1632 initEvent( &gdc->header );
1633 gdc->header.eventSize = gdc->header.eventHeadSize;
1634 gdc->header.eventType = PHYSICS_EVENT;
1635 SET_SYSTEM_ATTRIBUTE( gdc->header.eventTypeAttribute, ATTR_SUPER_EVENT );
1636 gdc->header.eventGdcId = currGdcId;
1637 COPY_DETECTOR_PATTERN(&gdc->detPattern, gdc->header.eventDetectorPattern);
1638 gdc->header.eventTimestamp = gdc->timestamp;
1639 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
1640 struct equipmentEventDescriptorStruct *eq;
1642 initEvent( &ldc->header );
1643 ldc->header.eventSize = ldc->header.eventHeadSize;
1644 ldc->header.eventType = PHYSICS_EVENT;
1645 ldc->header.eventGdcId = currGdcId;
1646 COPY_DETECTOR_PATTERN(&ldc->detPattern, ldc->header.eventDetectorPattern);
1647 ldc->header.eventTimestamp = ldc->timestamp;
1648 ldc->header.eventLdcId = ldc->id;
1649 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1650 initEquipment( &eq->header );
1651 eq->header.equipmentId = eq->id;
1652 if ( workingMode == collider )
1653 SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
1655 eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
1656 ldc->header.eventSize += eq->header.equipmentSize;
1657 decodeCDH( ldc, eq->payload, eq->id );
1658 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1659 ldc->header.eventTypeAttribute );
1660 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1661 gdc->header.eventTypeAttribute );
1663 gdc->header.eventSize += ldc->header.eventSize;
1669 printf( "Headers:\n" );
1670 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
1673 struct ldcEventDescriptorStruct *ldc;
1675 printf( " GDC:%d size:%d vers:%08x\n",
1677 gdc->header.eventSize,
1678 gdc->header.eventVersion);
1679 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
1680 struct equipmentEventDescriptorStruct *eq;
1682 printf( " LDC:%d size:%d vers:%08x\n",
1684 ldc->header.eventSize,
1685 ldc->header.eventVersion );
1686 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1687 printf( " EQ:%d size:%d %spayload:%d\n",
1689 eq->header.equipmentSize,
1690 eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
1691 eq->payload->size );
1696 } else if ( workingAs == ldc ) {
1697 struct ldcEventDescriptorStruct *ldc;
1699 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
1702 struct equipmentEventDescriptorStruct *eq;
1704 initEvent( &ldc->header );
1705 ldc->header.eventSize = ldc->header.eventHeadSize;
1706 ldc->header.eventType = PHYSICS_EVENT;
1707 ldc->header.eventGdcId = VOID_ID;
1708 ldc->header.eventLdcId = ldc->id;
1709 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1710 initEquipment( &eq->header );
1711 eq->header.equipmentId = eq->id;
1712 if ( workingMode == collider )
1713 SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
1715 eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
1716 ldc->header.eventSize += eq->header.equipmentSize;
1717 decodeCDH( ldc, eq->payload, eq->id );
1718 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1719 ldc->header.eventTypeAttribute );
1724 printf( "Headers:\n" );
1725 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
1728 struct equipmentEventDescriptorStruct *eq;
1730 printf( " LDC:%d size:%d vers:%08x\n",
1732 ldc->header.eventSize,
1733 ldc->header.eventVersion );
1734 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1735 printf( " EQ:%d size:%d %spayload:%d\n",
1737 eq->header.equipmentSize,
1738 eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
1739 eq->payload->size );
1744 } /* End of initEvents */
1748 workingAs = unknown;
1749 workingMode = fixedTarget;
1750 ldcsHead = ldcsTail = NULL;
1751 eventsHead = eventsTail = NULL;
1755 payloadsHead = payloadsTail = NULL;
1759 createSorEor = TRUE;
1761 gotAliceTrigger = TRUE;
1763 } /* End of initVars */
1765 int main( int argc, char **argv ) {
1767 parseArgs( argc, argv );