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 enum { unknown, ldc, gdc } workingAs;
49 enum { collider, fixedTarget } workingMode;
50 struct ldcDescriptorStruct {
52 struct ldcDescriptorStruct *next;
53 } *ldcsHead, *ldcsTail;
54 void *eventsHead, *eventsTail;
55 struct gdcEventDescriptorStruct {
56 struct ldcEventDescriptorStruct *head;
57 struct ldcEventDescriptorStruct *tail;
58 struct gdcEventDescriptorStruct *next;
59 struct eventHeaderStruct header;
62 struct ldcEventDescriptorStruct {
63 struct equipmentEventDescriptorStruct *head;
64 struct equipmentEventDescriptorStruct *tail;
65 struct ldcEventDescriptorStruct *next;
67 struct eventHeaderStruct header;
70 struct equipmentEventDescriptorStruct {
71 struct equipmentEventDescriptorStruct *next;
73 struct payloadDescriptorStruct *payload;
74 struct equipmentHeaderStruct header;
76 struct payloadDescriptorStruct {
77 struct payloadDescriptorStruct *next;
82 } *payloadsHead, *payloadsTail;
84 eventGdcIdType currGdcId;
85 eventLdcIdType currLdcId;
86 equipmentIdType currEquipmentId;
92 eventIdType oneEventDelta;
93 eventIdType currEventId;
97 void dumpPayload( const struct payloadDescriptorStruct *p ) {
102 if ( p->data != NULL ) {
103 for ( i = 0, c = (char *)p->data, printable = TRUE;
104 printable && i != p->size;
106 printable = isascii( *c );
109 for ( i = 0, c = (char *)p->data; i != p->size; c++, i++ ) {
115 if ( *c != '\n' ) printf( "\"\n" );
118 for ( i = 0, v = (long32 *)p->data;
121 if ( i % (4*8) == 0 ) {
122 if ( i != 0 ) printf( "\n" );
125 printf( "%08x ", *v );
131 while ( i != p->size ) {
132 printf( "%02x ", *((char *)p->data + p->size - j - 1) & 0xff );
140 } /* End of dumpPayload */
143 assert( workingAs == ldc || workingAs == gdc );
144 if ( eventsHead != NULL ) {
145 printf( "Events:\n" );
146 if ( workingAs == gdc ) {
147 struct gdcEventDescriptorStruct *gdc;
149 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
152 struct ldcEventDescriptorStruct *ldc;
154 printf( " GDC (%p)\n", gdc );
155 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
156 struct equipmentEventDescriptorStruct *eq;
158 printf( " LDC (%p): %d\n", ldc, ldc->id );
159 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
160 printf( " EQUIPMENT (%p): %d PAYLOAD (%p):",
165 printf( "\"%s\" (%d bytes)\n",
166 eq->payload->fileName,
168 dumpPayload( eq->payload );
173 if ( workingAs == ldc ) {
174 struct ldcEventDescriptorStruct *ldc;
176 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
179 struct equipmentEventDescriptorStruct *eq;
182 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
183 printf( " EQUIPMENT (%p): %d PAYLOAD (%p):",
188 printf( "\"%s\" (%d bytes)\n",
189 eq->payload->fileName,
191 dumpPayload( eq->payload );
196 printf( "Events: EMPTY\n" );
198 } /* End of dumpEvents */
200 void getLine( char *line, const int maxSize ) {
204 for ( read = 0; !feof( stdin ) && !ferror( stdin ) && read != maxSize; read++ ) {
205 if ( (line[read] = getchar()) == '\n' ) break;
207 if ( ferror( stdin ) ) {
209 "%s: failed to read configuration input errno:%d ",
214 if ( feof( stdin ) ) read--;
215 if ( read == maxSize && line[read] != '\n' ) {
217 "%s: Input line # %d too long (%d chars max)\n",
218 myName, lineNo, maxSize-1 );
223 if ( !( read == 0 && feof( stdin ) ) ) {
224 printf( "%d) [%3d] \"%s\"", lineNo, read, line );
227 for ( c = 0; c != read; c++ ) {
228 if ( line[c] == '#' ) {
235 printf( " => \"%s\"", line );
237 if ( feof( stdin ) ) printf( "<<< EOF >>>" );
238 if ( ferror( stdin ) ) printf( "<<< FERROR >>>" );
241 } /* End of getLine */
243 void handleLdc( eventLdcIdType ldcId ) {
244 struct ldcDescriptorStruct *ldc;
246 if ( ldcsHead != NULL ) {
247 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
248 if ( ldc->id == ldcId ) {
253 if ( (ldc = (struct ldcDescriptorStruct *)malloc( sizeof( *ldc ) )) == NULL ) {
255 "%s: Failed to malloc for %d bytes (struct ldcDescriptorStruct)\n",
256 myName, (int)sizeof( *ldc ) );
261 if ( ldcsHead == NULL ) {
262 ldcsHead = ldcsTail = ldc;
264 ldcsTail->next = ldc;
268 } /* End of handleLdc */
270 void createNewEvent() {
271 assert( workingAs == ldc || workingAs == gdc );
272 if ( workingAs == ldc ) {
273 struct ldcEventDescriptorStruct *p;
275 if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
278 "%s: failed to malloc for %d bytes (createNewEvent: struct ldcEventDescriptorStruct)",
279 myName, (int)sizeof( *p ) );
284 p->head = p->tail = NULL;
287 if ( eventsHead == NULL ) {
288 eventsHead = eventsTail = p;
290 struct ldcEventDescriptorStruct *q =
291 (struct ldcEventDescriptorStruct *)eventsTail;
297 } else if ( workingAs == gdc ) {
298 struct gdcEventDescriptorStruct *p;
300 if ( (p = (struct gdcEventDescriptorStruct *)malloc( sizeof( *p ) ))
303 "%s: failed to malloc for %d bytes (createNewEvent: struct gdcEventDescriptorStruct)",
304 myName, (int)sizeof( *p ) );
310 p->head = p->tail = NULL;
312 if ( eventsHead == NULL ) {
313 eventsHead = eventsTail = p;
315 struct gdcEventDescriptorStruct *q =
316 (struct gdcEventDescriptorStruct *)eventsTail;
322 } /* End of createNewEvent */
324 void createNewLdcEvent() {
325 struct gdcEventDescriptorStruct *gdcDesc;
326 struct ldcEventDescriptorStruct *p;
328 if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
331 "%s: failed to malloc for %d bytes (createNewLdcEvent: struct ldcEventDescriptorStruct)",
332 myName, (int)sizeof( *p ) );
337 p->head = p->tail = NULL;
339 gdcDesc = (struct gdcEventDescriptorStruct *)eventsTail;
340 if ( gdcDesc->head == NULL ) {
341 gdcDesc->head = gdcDesc->tail = p;
343 gdcDesc->tail->next = p;
347 } /* End of createNewLdcEvent */
349 void loadBuffer( struct payloadDescriptorStruct * const payload ) {
353 if ( (f = fopen( payload->fileName, "r" )) == NULL ) {
355 "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
360 perror( "System-dependent error " );
363 if ( (payload->data = malloc( payload->size )) == NULL ) {
365 "%s: line:%d Failed to malloc for payload file \"%s\" size:%d errno:%d ",
371 perror( "System-dependent status " );
374 if ( (bytesRead = fread( payload->data, payload->fileSize, 1, f )) != 1 ) {
376 "%s: line:%d Failed to read payload file \"%s\" size:%d requested:1 got:%d feof:%s ferror:%s errno:%d ",
382 feof(f) ? "TRUE" : "false",
383 ferror(f) ? "TRUE" : "false",
385 perror( "System-dependent status " );
389 if ( payload->size != payload->fileSize ) {
390 memset( (char *)payload->data + payload->fileSize,
392 payload->size - payload->fileSize );
394 } /* End of loadBuffer */
396 void unloadBuffer( struct payloadDescriptorStruct * const payload ) {
397 if ( payload->data != NULL ) {
398 free( payload->data );
399 payload->data = NULL;
401 } /* End of unloadBuffer */
403 void unloadAllBuffers() {
404 struct payloadDescriptorStruct *payload;
406 for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
407 unloadBuffer( payload );
409 } /* End of unloadAllBuffers */
411 void loadPayload( const char *fileName ) {
412 struct payloadDescriptorStruct *payload;
414 for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
415 if ( strcmp( fileName, payload->fileName ) == 0 )
418 if ( payload == NULL ) {
421 if ( (payload = (struct payloadDescriptorStruct *)malloc( sizeof( *payload ) ))
424 "%s: failed to malloc for %d bytes (loadPayload/payloadDescriptorStruct)\n",
426 (int)sizeof( *payload ) );
429 if ( (payload->fileName = strdup( fileName )) == NULL ) {
431 "%s: failed to duplicate string \"%s\" (loadPaload/fileName)\n",
436 if ( (f = fopen( fileName, "r" )) == NULL ) {
438 "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
443 perror( "System-dependent error " );
446 if ( fseek( f, 0L, SEEK_END ) != 0 ) {
448 "%s: line:%d Failed to seek payload file \"%s\" errno:%d ",
453 perror( "System-dependent error " );
456 if ( (payload->size = ftell( f )) <= 0 ) {
458 "%s: line:%d Failed to get file \"%s\" size size:%d errno:%d ",
464 perror( "System-dependent status " );
467 payload->fileSize = payload->size;
468 while ( (payload->size & 3) != 0 ) payload->size++;
472 loadBuffer( payload );
474 payload->data = NULL;
477 payload->next = NULL;
478 if ( payloadsHead == NULL ) {
479 payloadsHead = payloadsTail = payload;
481 payloadsTail->next = payload;
482 payloadsTail = payload;
487 printf( "%d) Payload \"%s\" loaded at %p\n",
493 struct commonDataHeaderStruct *cdh =
494 (struct commonDataHeaderStruct *)payload->data;
496 printf( " CDH: blockLenght:%d=0x%08x ",
497 cdh->cdhBlockLength, cdh->cdhBlockLength );
498 if ( cdh->cdhBlockLength < sizeof( *cdh ) ) {
499 printf( "TOO SMALL (minimum:%d=0x%08x)\n",
500 sizeof( *cdh ), sizeof( *cdh ) );
502 printf( "version:%d=0x%x ", cdh->cdhVersion, cdh->cdhVersion );
503 if ( cdh->cdhVersion != CDH_VERSION ) {
504 printf( "EXPECTED:%d=%x (decoding may be inaccurate) ",
505 CDH_VERSION, CDH_VERSION );
508 printf( "L1TriggerMessage:0x%x", cdh->cdhL1TriggerMessage );
509 if ( cdh->cdhL1TriggerMessage != 0 ) {
510 for ( b = 0, n = 0; b != 10; b++ ) {
511 if ( (cdh->cdhL1TriggerMessage & (1<<b)) != 0 ) {
512 if ( n++ != 0 )printf( "+" );
514 case 0: printf( "L1SwC" ); break;
515 case 1: printf( "ESR" ); break;
516 case 2: printf( "RoC1" ); break;
517 case 3: printf( "RoC2" ); break;
518 case 4: printf( "RoC3" ); break;
519 case 5: printf( "RoC4" ); break;
520 case 6: printf( "ClT" ); break;
521 default: printf( "spare %d", b+14 );
528 if ( cdh->cdhMBZ0 != 0 )
529 printf( "MBZ0:0x%x ",
534 printf( "EventId2(orbit):%d=0x%x ",
535 cdh->cdhEventId2, cdh->cdhEventId2 );
536 printf( "EventId1(bunchCrossing):%d=0x%x ",
537 cdh->cdhEventId1, cdh->cdhEventId1 );
541 if ( cdh->cdhMBZ1 != 0 )
542 printf( "MBZ1:0x%x ",
544 printf( "BlockAttributes:0x%x",
545 cdh->cdhBlockAttributes );
546 if ( cdh->cdhBlockAttributes != 0 ) {
548 for ( b = 0, n = 0; b != 8; b++ ) {
549 if ( (cdh->cdhBlockAttributes & (1<<b)) != 0 ) {
558 printf( "ParticipatingSubDetectors:0x%x ",
559 cdh->cdhParticipatingSubDetectors );
563 if ( cdh->cdhMBZ2 != 0 )
564 printf( "MBZ2:0x%x ",
566 printf( "Status/Error:0x%x", cdh->cdhStatusErrorBits );
567 if ( cdh->cdhStatusErrorBits != 0 ) {
569 for ( b = 0,n = 0; b != 16; b++ ) {
570 if ( (cdh->cdhStatusErrorBits & (1<<b)) != 0 ) {
571 if ( n++ != 0 ) printf( "+" );
573 case 0: printf( "TriggerOverLapError" ); break;
574 case 1: printf( "TriggerMissingError" ); break;
575 case 2: printf( "DataParityError" ); break;
576 case 3: printf( "ControlParityError" ); break;
577 case 4: printf( "TriggerInformationUnavailable" ); break;
578 case 5: printf( "FEEError" ); break;
579 case 6: printf( "HLTDecision" ); break;
580 case 7: printf( "HLTPayload" ); break;
581 case 8: printf( "DDGPayload" ); break;
582 default: printf( "spare %d", b );
589 printf( "MiniEventId(bunchCrossing):%d=0x%x ",
590 cdh->cdhMiniEventId, cdh->cdhMiniEventId );
594 printf( "Trigger classes: 0x(%05x-%08x)",
595 cdh->cdhTriggerClassesHigh,
596 cdh->cdhTriggerClassesLow );
597 if ( cdh->cdhTriggerClassesHigh != 0
598 || cdh->cdhTriggerClassesLow != 0 ) {
600 for ( b=0, n=0; b != 32; b++ ) {
601 if ( (cdh->cdhTriggerClassesLow & (1<<b)) != 0 ) {
602 if ( n++ != 0 ) printf( "+" );
606 for ( b=0; b != 18; b++ ) {
607 if ( (cdh->cdhTriggerClassesHigh & (1<<b)) != 0 ) {
608 if ( n++ != 0 ) printf( "+" );
609 printf( "%d", b+32 );
617 if ( cdh->cdhMBZ3 != 0 ) {
618 printf( "MBZ3:0x%x ",
621 printf( "ROI:0x(%08x-%01x)", cdh->cdhRoiHigh, cdh->cdhRoiLow );
622 if ( cdh->cdhRoiHigh != 0
623 || cdh->cdhRoiLow != 0 ) {
625 for ( b=0, n=0; b != 5; b++ ) {
626 if ( (cdh->cdhRoiLow & (1<<b)) != 0 ) {
627 if ( n++ != 0 ) printf( "+" );
631 for ( b=0; b != 32; b++ ) {
632 if ( (cdh->cdhRoiHigh & (1<<b)) != 0 ) {
633 if ( n++ != 0 ) printf( "+" );
645 printf( "%d) Payload \"%s\" already loaded at %p\n",
651 currEvent->payload = payload;
652 } /* End of loadPayload */
654 void parseEquipment( char * const line ) {
655 struct equipmentEventDescriptorStruct *equipment;
656 int payloadFound = FALSE;
661 (struct equipmentEventDescriptorStruct *)malloc( sizeof( *equipment ) )) == NULL ) {
663 "%s: filed to malloc for %d bytes (parseEquipment/equipmentEventDescriptorStruct) errno:%d ",
665 (int)sizeof( *equipment ),
670 currEvent = equipment;
673 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
674 DBG_VERBOSE printf( "%d) Equipment - Keyword:\"%s\"\n",
677 if ( strcasecmp( "id", keyword ) == 0 ) {
680 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
682 "%s: line:%d EQUIPMENT declaration, ID needed",
687 if ( sscanf( idNum, "%d", &currEquipmentId ) != 1 ) {
689 "%s: line:%d EQUIPMENT declaration, numeric ID needed (%s)",
695 DBG_VERBOSE printf( "%d) EQUIPMENT - ID:%d\n",
698 } else if ( strncasecmp( "pay", keyword, 3 ) == 0 ) {
701 if ( (fileName = strtok_r( p, " \t", &p )) == NULL ) {
703 "%s line:%d Payload without filename found\n",
708 DBG_VERBOSE printf( "%d) Equipment - Payload:\"%s\"\n",
711 if ( payloadFound ) {
713 "%s line:%d Payload with multiple filenames found\n",
718 loadPayload( fileName );
722 "%s: line:%d Equipment declaration, unknown keyword \"%s\"\n",
729 if ( !payloadFound ) {
731 "%s: line:%d Equipment without payload found\n",
737 equipment->id = currEquipmentId;
738 equipment->next = NULL;
739 if ( currLdc->head == NULL ) {
740 currLdc->head = currLdc->tail = equipment;
742 currLdc->tail->next = equipment;
743 currLdc->tail = equipment;
745 } /* End of parseEquipment */
747 void parseGdc( char * const line ) {
752 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
753 if ( strcasecmp( "id", keyword ) == 0 ) {
756 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
758 "%s: line:%d GDC declaration, ID needed",
763 if ( sscanf( idNum, "%d", &currGdcId ) != 1 ) {
765 "%s: line:%d GDC declaration, numeric ID needed (%s)",
771 DBG_VERBOSE printf( "%d) GDC - ID:%d\n",
776 "%s: line:%d GDC declaration, unknown keyword \"%s\"\n",
783 } /* End of parseGdc */
785 void parseLdc( char * const line ) {
790 while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
791 if ( strcasecmp( "id", keyword ) == 0 ) {
794 if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
796 "%s: line:%d LDC declaration, ID needed",
801 if ( sscanf( idNum, "%d", &currLdcId ) != 1 ) {
803 "%s: line:%d LDC declaration, numeric ID needed (%s)",
809 DBG_VERBOSE printf( "%d) LDC - ID:%d\n",
814 "%s: line:%d LDC declaration, unknown keyword \"%s\"\n",
821 } /* End of parseLdc */
826 currLdcId = HOST_ID_MIN;
827 currGdcId = HOST_ID_MIN;
829 for ( lineNo = 1; !feof( stdin ); lineNo++ ) {
830 getLine( line, sizeof(line) );
831 if ( strlen(line) != 0 ) {
835 if ( (keyword = strtok_r( line, " \t", &p )) != NULL ) {
836 DBG_VERBOSE printf( "%d) Keyword:\"%s\"\n", lineNo, keyword );
837 if ( strcasecmp( "gdc", keyword ) == 0 ) {
838 if ( workingAs != gdc && workingAs != unknown ) {
840 "%s: line:%d GDC found when working in non-GDC mode (e.g. as a LDC)\n",
847 currLdcId = HOST_ID_MIN;
850 } else if ( strcasecmp( "ldc", keyword ) == 0 ) {
851 if ( workingAs != gdc && workingAs != ldc && workingAs != unknown ) {
853 "%s: line:%d LDC found when working in non-LDC/GDC mode\n",
857 if ( workingAs == unknown ) workingAs = ldc;
859 if ( workingAs == ldc ) {
864 handleLdc( currLdcId );
868 } else if ( strncasecmp( "equ", keyword, 3 ) == 0 ) {
869 if ( workingAs == unknown
870 || (workingAs == ldc && currLdc == NULL )
871 || (workingAs == gdc && currGdc == NULL ) ) {
873 "%s: line:%d Unexpected EQUIPMENT declaration (LDC or GDC needed first)\n",
882 "%s: line:%d Parse error in \"%s\" unknown keyword\n",
890 } while ( !feof( stdin ) );
894 printf( "End of parse: %d line%s found\n",
896 lineNo != 1 ? "s" : "" );
897 printf( "Working as %s\n",
898 workingAs == gdc ? "GDC" :
899 workingAs == ldc ? "LDC" :
901 if ( workingAs == gdc ) {
902 struct ldcDescriptorStruct *ldc;
904 printf( "LDCs (%d):", numOfLdcs );
905 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
906 printf( " %d", ldc->id );
913 if ( workingAs == ldc ) {
914 assert( ldcsHead == ldcsTail );
915 assert( ldcsTail == NULL );
918 if ( workingAs == gdc ) {
919 struct ldcDescriptorStruct *ldc;
921 assert( ldcsHead != NULL );
922 assert( ldcsTail != NULL );
923 assert( ldcsTail->next == NULL );
924 for ( ldc = ldcsHead; ldc->next != NULL; ldc = ldc->next );
925 assert ( ldc == ldcsTail );
928 if ( workingAs == unknown ) {
929 DBG_VERBOSE printf( "Empty configuration: nothing to do!\n" );
933 assert( (eventsHead == NULL && eventsTail == NULL)
934 || (eventsHead != NULL && eventsTail != NULL) );
935 } /* End of parseRules */
937 void loadTimestamp( struct eventHeaderStruct * const ev ) {
940 if ( time( &t ) == (time_t)-1 ) {
942 "%s: failed to get system time errno:%d (%s)\n",
943 myName, errno, strerror( errno ) );
946 ev->eventTimestamp = (eventTimestampType)t;
947 } /* End of loadTimestamp */
949 void initEvent( struct eventHeaderStruct * const ev ) {
950 memset( ev, 0, sizeof( *ev ) );
952 ev->eventMagic = EVENT_MAGIC_NUMBER;
953 ev->eventHeadSize = EVENT_HEAD_BASE_SIZE;
954 ev->eventVersion = EVENT_CURRENT_VERSION;
955 ev->eventRunNb = currRunNb;
956 ZERO_EVENT_ID( ev->eventId );
957 ZERO_TRIGGER_PATTERN( ev->eventTriggerPattern );
958 ZERO_DETECTOR_PATTERN( ev->eventDetectorPattern );
959 RESET_ATTRIBUTES( ev->eventTypeAttribute );
960 if ( workingMode == collider )
961 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_ORBIT_BC );
962 ev->eventLdcId = VOID_ID;
963 ev->eventGdcId = VOID_ID;
965 } /* End of initEvent */
967 void outputEvent( const void * const ev,
972 const long32 * const v = (long32 *)ev;
973 printf( "Writing %d bytes @ %p (%d)\n", size, ev, *v );
976 if ( (done = fwrite( ev, size, 1, outF )) != 1 ) {
978 "%s: failed to write event size:%d bytes, errno:%d (%s)\n",
979 myName, size, errno, strerror( errno ) );
982 } /* End of outputEvent */
984 void createSorAndEor( const int sor ) {
985 unsigned char event[ 1000 ];
986 struct eventHeaderStruct *ev;
987 struct eventHeaderStruct sev;
989 assert( workingAs == ldc || workingAs == gdc );
991 if ( !createSorEor ) return;
992 ev = (struct eventHeaderStruct *)event;
994 ev->eventSize = sizeof( event );
995 ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
996 if ( workingMode == fixedTarget )
997 LOAD_RAW_EVENT_ID( ev->eventId, 0, 0, 0 );
999 LOAD_EVENT_ID( ev->eventId, 0, 0, 0 );
1000 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
1002 if ( workingAs == ldc ) {
1003 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1005 if ( workingAs == gdc ) {
1007 sev.eventGdcId = currGdcId;
1008 ev->eventGdcId = currGdcId;
1009 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1010 currLdc = currGdc->head;
1012 ev->eventLdcId = currLdc->id;
1014 if ( workingAs == ldc ) {
1015 loadTimestamp( ev );
1016 outputEvent( ev, ev->eventSize );
1018 if ( workingAs == gdc ) {
1019 struct ldcDescriptorStruct *ldc;
1021 loadTimestamp( ev );
1023 sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
1024 sev.eventType = sor ? START_OF_RUN : END_OF_RUN ;
1025 COPY_EVENT_ID( ev->eventId, sev.eventId );
1026 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1027 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1028 loadTimestamp( &sev );
1029 outputEvent( &sev, sizeof( sev ) );
1031 ev->eventGdcId = currGdcId;
1032 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1033 ev->eventLdcId = ldc->id;
1034 outputEvent( ev, ev->eventSize );
1038 ADD_EVENT_ID( ev->eventId, oneEventDelta );
1039 ev->eventSize = ev->eventSize / 2;
1040 ev->eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1041 CLEAR_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
1042 if ( workingAs == ldc ) {
1043 loadTimestamp( ev );
1044 outputEvent( ev, ev->eventSize );
1046 if ( workingAs == gdc ) {
1047 struct ldcDescriptorStruct *ldc;
1049 loadTimestamp( ev );
1051 sev.eventSize = ev->eventSize;
1052 sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1053 COPY_EVENT_ID( ev->eventId, sev.eventId );
1054 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1055 CLEAR_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1056 outputEvent( &sev, sizeof( sev ) );
1057 outputEvent( ev, ev->eventSize - sizeof( sev ) );
1059 sev.eventSize = sizeof( sev ) + ev->eventSize;
1060 sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
1061 COPY_EVENT_ID( ev->eventId, sev.eventId );
1062 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1063 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1065 loadTimestamp( &sev );
1067 ev->eventGdcId = currGdcId;
1068 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1069 loadTimestamp( &sev );
1070 outputEvent( &sev, sizeof( sev ) );
1071 ev->eventLdcId = ldc->id;
1072 outputEvent( ev, ev->eventSize );
1076 ADD_EVENT_ID( ev->eventId, oneEventDelta );
1077 ev->eventSize = sizeof( *ev );
1078 ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
1079 SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_END );
1080 if ( workingAs == ldc ) {
1081 loadTimestamp( ev );
1082 outputEvent( ev, ev->eventSize );
1084 if ( workingAs == gdc ) {
1085 struct ldcDescriptorStruct *ldc;
1087 loadTimestamp( ev );
1089 sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
1090 sev.eventType = sor ? START_OF_RUN : END_OF_RUN;
1091 COPY_EVENT_ID( ev->eventId, sev.eventId );
1092 COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
1093 SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
1094 loadTimestamp( &sev );
1096 outputEvent( &sev, sizeof( sev ) );
1098 for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
1099 ev->eventLdcId = ldc->id;
1100 outputEvent( ev, ev->eventSize );
1103 } /* End of createSorEor */
1106 createSorAndEor( TRUE );
1107 } /* End of createSor */
1110 createSorAndEor( FALSE );
1111 } /* End of createEor */
1113 void loadCdh( struct commonDataHeaderStruct * const cdh,
1114 eventIdType * const eventId ) {
1115 if ( !handleCDH ) return;
1117 if ( gotAliceTrigger ) {
1118 cdh->cdhEventId1 = EVENT_ID_GET_BUNCH_CROSSING( *eventId );
1119 cdh->cdhEventId2 = EVENT_ID_GET_ORBIT( *eventId );
1121 cdh->cdhEventId1 = 0;
1122 cdh->cdhEventId2 = EVENT_ID_GET_NB_IN_RUN( *eventId );
1124 cdh->cdhMiniEventId = cdh->cdhEventId1;
1126 void decodeCDH( struct ldcEventDescriptorStruct * const ldc,
1127 const struct payloadDescriptorStruct * const payloadDesc );
1129 void createEvent( void ) {
1130 assert( workingAs == ldc || workingAs == gdc );
1132 /* Step 1: load all buffers (if needed) and compose the GDC/LDC headers */
1133 if ( workingAs == gdc ) {
1134 struct ldcEventDescriptorStruct *ldc;
1136 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1137 COPY_EVENT_ID( currEventId, ldc->header.eventId );
1138 loadTimestamp( &ldc->header );
1140 COPY_EVENT_ID( currEventId, currGdc->header.eventId );
1141 loadTimestamp( &currGdc->header );
1143 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1144 struct equipmentEventDescriptorStruct *eq;
1147 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1148 if ( !bufferData ) {
1149 loadBuffer( eq->payload );
1150 if ( !currGdc->loaded ) decodeCDH( ldc, eq->payload );
1152 loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
1156 if ( !currGdc->loaded ) {
1157 for ( n = 0; n != EVENT_TRIGGER_PATTERN_WORDS; n++ )
1158 currGdc->header.eventTriggerPattern[n] |= ldc->header.eventTriggerPattern[n];
1159 for ( n = 0; n != EVENT_DETECTOR_PATTERN_WORDS; n++ )
1160 currGdc->header.eventDetectorPattern[n] |= ldc->header.eventDetectorPattern[n];
1161 for ( n = 0; n != ALL_ATTRIBUTE_WORDS; n++ )
1162 currGdc->header.eventTypeAttribute[n] |= ldc->header.eventTypeAttribute[n];
1163 currGdc->loaded = TRUE;
1166 } else if ( workingAs == ldc ) {
1167 struct equipmentEventDescriptorStruct *eq;
1169 COPY_EVENT_ID( currEventId, currLdc->header.eventId );
1170 loadTimestamp( &currLdc->header );
1172 for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
1173 if ( !bufferData ) {
1174 loadBuffer( eq->payload );
1175 if ( !currLdc->loaded ) decodeCDH( currLdc, eq->payload );
1177 loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
1179 currLdc->loaded = TRUE;
1182 ADD_EVENT_ID( currEventId, oneEventDelta );
1184 /* Step 2: output the event */
1185 if ( workingAs == gdc ) {
1186 struct ldcEventDescriptorStruct *ldc;
1188 outputEvent( &currGdc->header, sizeof( currGdc->header ) );
1190 for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
1191 struct equipmentEventDescriptorStruct *eq;
1193 outputEvent( &ldc->header, sizeof( ldc->header ) );
1195 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1196 outputEvent( &eq->header, sizeof( eq->header ) );
1197 outputEvent( eq->payload->data, eq->payload->size );
1198 if ( !bufferData ) unloadBuffer( eq->payload );
1201 if ( (currGdc = currGdc->next) == NULL )
1202 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1203 } else if ( workingAs == ldc ) {
1204 struct equipmentEventDescriptorStruct *eq;
1206 outputEvent( &currLdc->header, sizeof( currLdc->header ) );
1208 for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
1209 outputEvent( &eq->header, sizeof( eq->header ) );
1210 outputEvent( eq->payload->data, eq->payload->size );
1211 if ( !bufferData ) unloadBuffer( eq->payload );
1213 if ( (currLdc = currLdc->next) == NULL )
1214 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1216 } /* End of createEvent */
1218 void createEvents() {
1221 currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
1222 currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
1227 eventNum != numOfEvents && numOfEvents != 0;
1232 } /* End of createEvents */
1236 "Usage: %s [-?][-d][-i definitionFile][-o outputFile][-# numOfEvents][-s][-F|-C]\n\
1238 -v Print version ID and exit\n\
1239 -d Enable debug (repeat for more verbosity)\n\
1240 -i definitionFile File with the description of the events to create (default: stdin)\n\
1241 -o outputFile File used to store events (default: stdout)\n\
1242 -# numOfEvents Number of events to generate (default: 1 event)\n\
1243 -s Do not generate SOR/EOR files (valid only for GDCs)\n\
1244 -F/-C Working in Fixed Target (F) or Collider (C) mode\n\
1246 -D Direct disc access (no buffering)\n",
1249 } /* End of usage */
1251 void parseArgs( int argc, char **argv ) {
1253 int inFileName = -1;
1254 int outFileName = -1;
1257 while ( arg < argc ) {
1258 if ( strcmp( "-?", argv[ arg ] ) == 0 ) {
1262 if ( strcmp( "-i", argv[ arg ] ) == 0 ) {
1263 if ( ++arg == argc ) exit( usage() );
1265 if ( freopen( argv[arg], "r", stdin ) == NULL ){
1267 "%s: failed to open input definition \"%s\" errno:%d ",
1268 myName, argv[arg], errno );
1272 } else if ( strcmp( "-v", argv[ arg ] ) == 0 ) {
1273 printf( "%s\n", fileHandlerIdent );
1275 } else if ( strcmp( "-o", argv[ arg ] ) == 0 ) {
1276 if ( ++arg == argc ) exit( usage() );
1278 } else if ( strcmp( "-#", argv[ arg ] ) == 0 ) {
1281 if ( ++arg == argc ) exit( usage() );
1282 if ( sscanf( argv[ arg ], "%d", &n ) != 1 ) exit( usage() );
1283 if ( n < 0 ) exit( usage() );
1285 } else if ( strcmp( "-s", argv[ arg ] ) == 0 ) {
1286 createSorEor = FALSE;
1287 } else if ( strcmp( "-F", argv[ arg ] ) == 0 ) {
1288 workingMode = fixedTarget;
1289 } else if ( strcmp( "-C", argv[ arg ] ) == 0 ) {
1290 workingMode = collider;
1291 } else if ( strcmp( "-d", argv[ arg ] ) == 0 ) {
1293 } else if ( strcmp( "-c", argv[ arg ] ) == 0 ) {
1295 } else if ( strcmp( "-D", argv[ arg ] ) == 0 ) {
1298 fprintf( stderr, "%s: Unknown switch \"%s\"\n", myName, argv[argc] );
1304 if ( workingMode == fixedTarget )
1305 LOAD_RAW_EVENT_ID( oneEventDelta, 1, 0, 1 );
1307 LOAD_EVENT_ID( oneEventDelta, 0, 0, 1 );
1308 ZERO_EVENT_ID( currEventId );
1311 printf( "Configuration:\n" );
1312 printf( " Debug level: %d\n", debug );
1313 printf( " Configuration: %s\n",
1314 inFileName == -1 ? "stdin" : argv[ inFileName ] );
1315 printf( " Output: %s\n",
1316 outFileName == -1 ? "stdout" : argv[ outFileName ] );
1317 printf( " Working mode: %s\n",
1318 workingMode == fixedTarget ? "fixed target" : "collider" );
1319 printf( " Number of events: %d\n", numOfEvents );
1320 printf( " %s SOR/EOR files\n",
1321 createSorEor ? "Create" : "Do not create" );
1322 printf( " CDH handling: %s\n",
1323 handleCDH ? "enabled" : "disabled" );
1324 printf( " data buffering: %s\n",
1325 bufferData ? "enabled" : "DISABLED" );
1328 if ( outFileName == -1 ) {
1330 printf( "No more trace information from this point...\n" );
1334 if ( ( outF = fopen( argv[ outFileName ], "w" ) ) == NULL ) {
1336 "%s: failed to open output file \"%s\" for writing, errno:%d (%s)\n",
1338 argv[ outFileName ],
1340 strerror( errno ) );
1344 printf( "Output file \"%s\" opened OK for writing\n",
1345 argv[ outFileName ] );
1347 } /* End of parseArgs */
1348 void initEquipment( struct equipmentHeaderStruct * const eq ) {
1349 memset( eq, 0, sizeof( *eq ) );
1350 RESET_ATTRIBUTES( eq->equipmentTypeAttribute );
1351 eq->equipmentBasicElementSize = 4;
1352 } /* End of initEquipment */
1354 void decodeCDH( struct ldcEventDescriptorStruct * const ldc,
1355 const struct payloadDescriptorStruct * const payloadDesc ) {
1357 static struct commonDataHeaderStruct *cdhRef = NULL;
1358 struct commonDataHeaderStruct *cdh;
1359 static int softwareTriggerIndicator = FALSE;
1363 if ( payloadDesc->size < CDH_SIZE ) {
1365 "%s: payload too small got:%d CDH:%d\n",
1371 if ( (cdh = (struct commonDataHeaderStruct *)payloadDesc->data) != NULL ) {
1372 if ( cdh->cdhVersion != CDH_VERSION ) {
1374 "%s: CDH version mismatch expected:%d got:%d\n",
1380 if ( cdhRef == NULL ) {
1382 #define CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK (1<<CDH_TRIGGER_INFORMATION_UNAVAILABLE_BIT)
1383 gotAliceTrigger = (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0;
1384 if ( gotAliceTrigger && workingMode == fixedTarget ) {
1386 "%s: ALICE trigger and fixed target mode are not compatible.\n\
1387 Either work in Collider mode or set the trigger unavailable status bit in the CDH.\n",
1391 if ( gotAliceTrigger ) {
1392 if ( (cdh->cdhL1TriggerMessage & 0x40) != 0 ) {
1394 "%s: CDH is a calibration trigger (unsupported) L1TriggerMessage:0x%x\n",
1395 myName, cdh->cdhL1TriggerMessage );
1398 if ( (cdh->cdhL1TriggerMessage & 0x01) != 0 ) {
1399 softwareTriggerIndicator = TRUE;
1401 if ( softwareTriggerIndicator ) {
1402 switch ((cdh->cdhL1TriggerMessage >> 2) & 0xF) {
1410 /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xF --> END_OF_DATA */
1412 /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xE0 --> START_OF_DATA */
1414 /* L1SwC bit = on, Clt bit = off, RoC[4] = 1, but not 0xE or 0xF
1415 --> SYSTEM_SOFTWARE_TRIGGER_EVENT */
1417 /* L1SwC bit = on, Clt bit = off, RoC[4] = 0
1418 --> DETECTOR_SOFTWARE_TRIGGER_EVENT */
1420 "%s: CDH trigger SOD/EOD/SST/DST (unsupported) \
1421 L1TriggerMessage:0x%x ALICETrigger:%s\n",
1423 cdh->cdhL1TriggerMessage,
1424 gotAliceTrigger ? "yes" : "no" );
1430 if ( (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) !=
1431 (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) ) {
1433 "%s: CDH coherency check failed. \
1434 Trigger information reference:%savailable current:%savailable\n",
1436 (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "",
1437 (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "" );
1440 if ( gotAliceTrigger ) {
1441 if ( cdhRef->cdhL1TriggerMessage != cdh->cdhL1TriggerMessage ) {
1443 "%s: CDH coherency check failed. \
1444 L1 trigger message reference:0x%x current:0x%x\n",
1446 cdhRef->cdhL1TriggerMessage,
1447 cdh->cdhL1TriggerMessage );
1450 if ( cdh->cdhParticipatingSubDetectors != cdhRef->cdhParticipatingSubDetectors ) {
1452 "%s: CDH coherency check failed. \
1453 ParticipatingSubDetectors reference:0x%x current:0x%x\n",
1455 cdhRef->cdhParticipatingSubDetectors,
1456 cdh->cdhParticipatingSubDetectors );
1459 if ( cdh->cdhTriggerClassesLow != cdhRef->cdhTriggerClassesLow
1460 || cdh->cdhTriggerClassesHigh != cdhRef->cdhTriggerClassesHigh ) {
1462 "%s: CDH coherency check failed. \
1463 TriggerClassesHigh/Low reference:0x%x-%x current:0x%x-%x\n",
1465 cdhRef->cdhTriggerClassesHigh, cdhRef->cdhTriggerClassesLow,
1466 cdh ->cdhTriggerClassesHigh, cdh ->cdhTriggerClassesLow );
1469 if ( cdh->cdhBlockLength != 0xffffffff ) {
1470 if ( (unsigned)payloadDesc->size != cdh->cdhBlockLength ) {
1472 "%s: CDH coherency check failed. \
1473 Payload size:%d (0x%08x) CDH block length:%d (0x%08x)\n",
1475 payloadDesc->size, payloadDesc->size,
1476 cdh->cdhBlockLength, cdh->cdhBlockLength );
1480 if ( cdh->cdhRoiLow != cdhRef->cdhRoiLow
1481 || cdh->cdhRoiHigh != cdhRef->cdhRoiHigh ) {
1483 "%s: CDH coherency check failed. \
1484 RoiHigh/Low reference:0x%x-%x current:0x%x-%x\n",
1486 cdhRef->cdhRoiHigh, cdhRef->cdhRoiLow,
1487 cdh ->cdhRoiHigh, cdh ->cdhRoiLow );
1491 if ( cdh->cdhMBZ0 != 0
1492 || cdh->cdhMBZ1 != 0
1493 || cdh->cdhMBZ2 != 0
1494 || cdh->cdhMBZ3 != 0 ) {
1496 "%s: CDH check failed. MBZ0:0x%x MBZ1:0x%x MBZ2:0x%x MBZ3:0x%x\n",
1498 cdh->cdhMBZ0, cdh->cdhMBZ1, cdh->cdhMBZ2, cdh->cdhMBZ3 );
1502 for ( attr = 0; attr != 8; attr++ ) {
1503 if ( (cdh->cdhBlockAttributes & (1<<attr)) != 0 ) {
1504 SET_USER_ATTRIBUTE( ldc->header.eventTypeAttribute, attr );
1507 for ( trig = 0; trig != 32; trig++ ) {
1508 if ( (cdh->cdhTriggerClassesLow & (1<<trig)) != 0 ) {
1509 SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
1513 for ( trig = 0; trig != 18; trig++ ) {
1514 if ( (cdh->cdhTriggerClassesHigh & (1<<trig)) != 0 ) {
1515 SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
1519 if ( gotAliceTrigger )
1520 VALIDATE_TRIGGER_PATTERN( ldc->header.eventTriggerPattern );
1523 } /* End of decodeCDH */
1526 assert( workingAs == ldc || workingAs == gdc );
1528 if ( workingAs == gdc ) {
1529 struct gdcEventDescriptorStruct *gdc;
1531 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
1534 struct ldcEventDescriptorStruct *ldc;
1536 initEvent( &gdc->header );
1537 gdc->header.eventSize = gdc->header.eventHeadSize;
1538 gdc->header.eventType = PHYSICS_EVENT;
1539 SET_SYSTEM_ATTRIBUTE( gdc->header.eventTypeAttribute, ATTR_SUPER_EVENT );
1540 gdc->header.eventGdcId = currGdcId;
1541 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
1542 struct equipmentEventDescriptorStruct *eq;
1544 initEvent( &ldc->header );
1545 ldc->header.eventSize = ldc->header.eventHeadSize;
1546 ldc->header.eventType = PHYSICS_EVENT;
1547 ldc->header.eventGdcId = currGdcId;
1548 ldc->header.eventLdcId = ldc->id;
1549 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1550 initEquipment( &eq->header );
1551 eq->header.equipmentId = eq->id;
1552 if ( workingMode == collider )
1553 SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
1555 eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
1556 ldc->header.eventSize += eq->header.equipmentSize;
1557 decodeCDH( ldc, eq->payload );
1558 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1559 ldc->header.eventTypeAttribute );
1560 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1561 gdc->header.eventTypeAttribute );
1563 gdc->header.eventSize += ldc->header.eventSize;
1568 printf( "Headers:\n" );
1569 for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
1572 struct ldcEventDescriptorStruct *ldc;
1574 printf( " GDC:%d size:%d vers:%08x\n",
1576 gdc->header.eventSize,
1577 gdc->header.eventVersion);
1578 for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
1579 struct equipmentEventDescriptorStruct *eq;
1581 printf( " LDC:%d size:%d vers:%08x\n",
1583 ldc->header.eventSize,
1584 ldc->header.eventVersion );
1585 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1586 printf( " EQ:%d size:%d %spayload:%d\n",
1588 eq->header.equipmentSize,
1589 eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
1590 eq->payload->size );
1595 } else if ( workingAs == ldc ) {
1596 struct ldcEventDescriptorStruct *ldc;
1598 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
1601 struct equipmentEventDescriptorStruct *eq;
1603 initEvent( &ldc->header );
1604 ldc->header.eventSize = ldc->header.eventHeadSize;
1605 ldc->header.eventType = PHYSICS_EVENT;
1606 ldc->header.eventGdcId = VOID_ID;
1607 ldc->header.eventLdcId = ldc->id;
1608 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1609 initEquipment( &eq->header );
1610 eq->header.equipmentId = eq->id;
1611 if ( workingMode == collider )
1612 SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
1614 eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
1615 ldc->header.eventSize += eq->header.equipmentSize;
1616 decodeCDH( ldc, eq->payload );
1617 OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
1618 ldc->header.eventTypeAttribute );
1622 printf( "Headers:\n" );
1623 for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
1626 struct equipmentEventDescriptorStruct *eq;
1628 printf( " LDC:%d size:%d vers:%08x\n",
1630 ldc->header.eventSize,
1631 ldc->header.eventVersion );
1632 for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
1633 printf( " EQ:%d size:%d %spayload:%d\n",
1635 eq->header.equipmentSize,
1636 eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
1637 eq->payload->size );
1642 } /* End of initEvents */
1646 workingAs = unknown;
1647 workingMode = fixedTarget;
1648 ldcsHead = ldcsTail = NULL;
1649 eventsHead = eventsTail = NULL;
1653 payloadsHead = payloadsTail = NULL;
1657 createSorEor = TRUE;
1659 gotAliceTrigger = TRUE;
1661 } /* End of initVars */
1663 int main( int argc, char **argv ) {
1665 parseArgs( argc, argv );