LCOV - code coverage report
Current view: top level - RAW/dateStream - dateStream.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 407 1120 36.3 %
Date: 2016-06-14 17:26:59 Functions: 25 30 83.3 %

          Line data    Source code
       1             : /*
       2             :                              dateStream.c
       3             :                              ============
       4             : 
       5             :    Utility to simulate a DATE raw data stream using a given set of raw
       6             :    data files and a configuration file.
       7             : 
       8             :    Revision history:
       9             : 
      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
      14             :    V01.04 15/10/2010  RD  Added possibility to set the run number
      15             : */
      16             : #define VID "1.04"
      17             : 
      18             : #include <stdio.h>
      19             : #include <stdlib.h>
      20             : #include <errno.h>
      21             : #include <assert.h>
      22             : #include <ctype.h>
      23             : #include <time.h>
      24             : #include <cassert>
      25             : #include "event.h"
      26             : 
      27             : #define DESCRIPTION "DATE raw data stream simulator"
      28             : #ifdef AIX
      29             : static
      30             : #endif
      31             : char fileHandlerIdent[]= "@(#)""" __FILE__ """: """ DESCRIPTION \
      32             :                          """ """ VID """ """ \
      33             :                          """ compiled """ __DATE__ """ """ __TIME__;
      34             : 
      35             : #define DBG_BASE     if ( debug > 0 )
      36             : #define DBG_DETAILED if ( debug > 1 )
      37             : #define DBG_VERBOSE  if ( debug > 2 )
      38             : 
      39             : #ifndef TRUE
      40             : # define TRUE (0 == 0)
      41             : #endif
      42             : #ifndef FALSE
      43             : # define FALSE (0 == 1)
      44             : #endif
      45             : 
      46             : const char *myName;
      47             : int debug;
      48             : FILE *outF;
      49             : typedef enum { unknown, ldc, gdc } workingAsType;
      50             : typedef enum { collider, fixedTarget } workingModeType;
      51             : workingAsType workingAs;
      52             : workingModeType workingMode;
      53             : struct ldcDescriptorStruct {
      54             :   eventLdcIdType id;
      55             :   struct ldcDescriptorStruct *next;
      56             : } *ldcsHead, *ldcsTail;
      57             : void *eventsHead, *eventsTail;
      58             : struct gdcEventDescriptorStruct {
      59             :   struct ldcEventDescriptorStruct *head;
      60             :   struct ldcEventDescriptorStruct *tail;
      61             :   struct gdcEventDescriptorStruct *next;
      62             :   struct eventHeaderStruct header;
      63             :   int loaded;
      64             :   unsigned long32 detPattern;
      65             :   eventTimestampSecType timestamp; 
      66             : } *currGdc;
      67             : struct ldcEventDescriptorStruct {
      68             :   struct equipmentEventDescriptorStruct *head;
      69             :   struct equipmentEventDescriptorStruct *tail;
      70             :   struct ldcEventDescriptorStruct *next;
      71             :   eventLdcIdType id;
      72             :   struct eventHeaderStruct header;
      73             :   int loaded;
      74             :   unsigned long32 detPattern;
      75             :   eventTimestampSecType timestamp; 
      76             : } *currLdc;
      77             : struct equipmentEventDescriptorStruct {
      78             :   struct equipmentEventDescriptorStruct *next;
      79             :   equipmentIdType id;
      80             :   struct payloadDescriptorStruct *payload;
      81             :   struct equipmentHeaderStruct header;
      82             : } *currEvent;
      83             : struct payloadDescriptorStruct {
      84             :   struct payloadDescriptorStruct *next;
      85             :   char *fileName;
      86             :   int fileSize;
      87             :   int size;
      88             :   void *data;
      89             : } *payloadsHead, *payloadsTail;
      90             : int lineNmb;
      91             : eventGdcIdType currGdcId;
      92             : unsigned long32 currDetPattern;
      93             : eventTimestampSecType currTimestamp; 
      94             : eventLdcIdType currLdcId;
      95             : equipmentIdType currEquipmentId;
      96             : int currRunNb;
      97             : int numOfLdcs;
      98             : int numOfEvents;
      99             : int createSorEor;
     100             : int handleCDH;
     101             : eventIdType oneEventDelta;
     102             : eventIdType currEventId;
     103             : int gotAliceTrigger;
     104             : int bufferData;
     105             : 
     106             : struct commonDataHeaderStruct *cdhRef = NULL;
     107             : 
     108             : void dumpPayload( const struct payloadDescriptorStruct *p ) {
     109             :   char *c;
     110             :   int i;
     111             :   int printable;
     112             :           
     113           0 :   if ( p->data != NULL ) {
     114           0 :     for ( i = 0, c = (char *)p->data, printable = TRUE;
     115           0 :           printable && i != p->size;
     116           0 :           c++, i++ )
     117           0 :       printable = isascii( *c );
     118           0 :     if ( printable ) {
     119           0 :       printf( "       \"" );
     120           0 :       for ( i = 0, c = (char *)p->data; i != p->size; c++, i++ ) {
     121           0 :         if ( *c == '\n' )
     122           0 :           printf( "\"\n       \"" );
     123             :         else
     124           0 :           putchar( *c );
     125             :       }
     126           0 :       if ( *c != '\n' ) printf( "\"\n" );
     127             :     } else {
     128             :       long32 *v;
     129           0 :       for ( i = 0, v = (long32 *)p->data;
     130           0 :             i+4 <= p->size;
     131           0 :             v++, i += 4 ) {
     132           0 :         if ( i % (4*8) == 0 ) {
     133           0 :           if ( i != 0 ) printf( "\n" );
     134           0 :           printf( "       " );
     135           0 :         }
     136           0 :         printf( "%08x ", *v );
     137             :       }
     138           0 :       if ( i < p->size ) {
     139             :         int j = 0;
     140             : 
     141           0 :         printf( "\n       " );
     142           0 :         while ( i != p->size ) {
     143           0 :           printf( "%02x ", *((char *)p->data + p->size - j - 1) & 0xff );
     144           0 :           j++;
     145           0 :           i++;
     146             :         }
     147           0 :       }
     148             :     }
     149           0 :     printf( "\n" );
     150           0 :   }
     151           0 : } /* End of dumpPayload */
     152             : 
     153             : void dumpEvents() {
     154           0 :   assert( workingAs == ldc || workingAs == gdc );
     155           0 :   if ( eventsHead != NULL ) {
     156           0 :     printf( "Events:\n" );
     157           0 :     if ( workingAs == gdc ) {
     158             :       struct gdcEventDescriptorStruct *gdc;
     159             : 
     160           0 :       for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
     161           0 :             gdc != NULL;
     162           0 :             gdc = gdc->next ) {
     163             :         struct ldcEventDescriptorStruct *ldc;
     164             : 
     165           0 :         printf( " GDC (%p)\n", (void*)gdc );
     166           0 :         for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
     167             :           struct equipmentEventDescriptorStruct *eq;
     168             :             
     169           0 :           printf( "   LDC (%p): %d\n", (void*)ldc, ldc->id );
     170           0 :           for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
     171           0 :             printf( "     EQUIPMENT (%p): %d PAYLOAD (%p):",
     172           0 :                     (void*)eq,
     173           0 :                     eq->id,
     174           0 :                     (void*)eq->payload );
     175           0 :             fflush( stdout );
     176           0 :             printf( "\"%s\" (%d bytes)\n",
     177           0 :                     eq->payload->fileName,
     178           0 :                     eq->payload->size );
     179           0 :             dumpPayload( eq->payload );
     180             :           }
     181             :         }
     182             :       }
     183           0 :     }
     184           0 :     if ( workingAs == ldc ) {
     185             :       struct ldcEventDescriptorStruct *ldc;
     186             : 
     187           0 :       for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
     188           0 :             ldc != NULL;
     189           0 :             ldc = ldc->next ) {
     190             :         struct equipmentEventDescriptorStruct *eq;
     191             :             
     192           0 :         printf( "   LDC\n" );
     193           0 :         for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
     194           0 :           printf( "     EQUIPMENT (%p): %d PAYLOAD (%p):",
     195           0 :                   (void*)eq,
     196           0 :                   eq->id,
     197           0 :                   (void*)eq->payload );
     198           0 :           fflush( stdout );
     199           0 :           printf( "\"%s\" (%d bytes)\n",
     200           0 :                   eq->payload->fileName,
     201           0 :                   eq->payload->size );
     202           0 :           dumpPayload( eq->payload );
     203             :         }
     204             :       }
     205           0 :     }
     206             :   } else {
     207           0 :     printf( "Events: EMPTY\n" );
     208             :   }
     209           0 : } /* End of dumpEvents */
     210             : 
     211             : void getLine( char *line, const int maxSize ) {
     212             :   int read;
     213             :   int c;
     214             : 
     215      317966 :   for ( read = 0; !feof( stdin ) && !ferror( stdin ) && read != maxSize; read++ ) {
     216       78966 :     if ( (line[read] = getchar()) == '\n' ) break;
     217             :   }
     218        2100 :   if ( ferror( stdin ) ) {
     219           0 :     fprintf( stderr,
     220             :              "%s: failed to read configuration input errno:%d ",
     221           0 :              myName, errno );
     222           0 :     perror( "" );
     223           0 :     exit( 1 );
     224             :   }
     225        2101 :   if ( feof( stdin ) ) read--;
     226        2100 :   if ( read == maxSize && line[read] != '\n' ) {
     227           0 :     fprintf( stderr,
     228             :              "%s: Input line # %d too long (%d chars max)\n",
     229           0 :              myName, lineNmb, maxSize-1 );
     230           0 :     exit( 1 );
     231             :   }
     232        2100 :   line[ read ] = 0;
     233        2100 :   DBG_VERBOSE {
     234           0 :     if ( !( read == 0 && feof( stdin ) ) ) {
     235           0 :       printf( "%d) [%3d] \"%s\"", lineNmb, read, line );
     236           0 :     }
     237             :   }
     238      157932 :   for ( c = 0; c != read; c++ ) {
     239       76866 :     if ( line[c] == '#' ) {
     240           0 :       line[c] = 0;
     241           0 :       break;
     242             :     }
     243             :   }
     244        2100 :   DBG_VERBOSE {
     245           0 :     if ( read != c ) {
     246           0 :       printf( " => \"%s\"", line );
     247           0 :     }
     248           0 :     if ( feof( stdin ) ) printf( "<<< EOF >>>" );
     249           0 :     if ( ferror( stdin ) ) printf( "<<< FERROR >>>" );
     250           0 :     printf( "\n" );
     251           0 :   }
     252        2100 : } /* End of getLine */
     253             : 
     254             : void handleLdc( eventLdcIdType ldcId ) {
     255             :   struct ldcDescriptorStruct *ldc;
     256             : 
     257         948 :   if ( ldcsHead != NULL ) {
     258       56682 :     for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
     259       28219 :       if ( ldc->id == ldcId ) {
     260         351 :         return;
     261             :       }
     262             :     }
     263             :   }
     264         123 :   if ( (ldc = (struct ldcDescriptorStruct *)malloc( sizeof( *ldc ) )) == NULL ) {
     265           0 :     fprintf( stderr,
     266             :              "%s: Failed to malloc for %d bytes (struct ldcDescriptorStruct)\n",
     267           0 :              myName, (int)sizeof( *ldc ) );
     268           0 :     exit( 1 );
     269             :   }
     270         123 :   ldc->id = ldcId;
     271         123 :   ldc->next = NULL;
     272         123 :   if ( ldcsHead == NULL ) {
     273           1 :     ldcsHead = ldcsTail = ldc;
     274           1 :   } else {
     275         122 :     ldcsTail->next = ldc;
     276         122 :     ldcsTail = ldc;
     277             :   }
     278         123 :   numOfLdcs++;
     279         597 : } /* End of handleLdc */
     280             : 
     281             : void createNewEvent() {
     282           8 :   assert( workingAs == ldc || workingAs == gdc );
     283           4 :   if ( workingAs == ldc ) {
     284             :     struct ldcEventDescriptorStruct *p;
     285             : 
     286           0 :     if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
     287           0 :            == NULL ) {
     288           0 :       fprintf( stderr,
     289             :                "%s: failed to malloc for %d bytes (createNewEvent: struct ldcEventDescriptorStruct)",
     290           0 :                myName, (int)sizeof( *p ) );
     291           0 :       perror( "" );
     292           0 :       exit( 1 );
     293             :     }
     294           0 :     p->loaded = FALSE;
     295           0 :     p->head = p->tail = NULL;
     296           0 :     p->next = NULL;
     297           0 :     currLdc = p;
     298           0 :     if ( eventsHead == NULL ) {
     299           0 :       eventsHead = eventsTail = p;
     300           0 :     } else {
     301             :       struct ldcEventDescriptorStruct *q =
     302           0 :         (struct ldcEventDescriptorStruct *)eventsTail;
     303             : 
     304           0 :       q->next = p;
     305           0 :       eventsTail = p;
     306             :     }
     307           0 :     p->id = currLdcId;
     308           0 :     p->detPattern = currDetPattern;
     309           0 :     p->timestamp = currTimestamp;
     310           4 :   } else if ( workingAs == gdc ) {
     311             :     struct gdcEventDescriptorStruct *p;
     312             : 
     313           8 :     if ( (p = (struct gdcEventDescriptorStruct *)malloc( sizeof( *p ) ))
     314           4 :            == NULL ) {
     315           0 :       fprintf( stderr,
     316             :                "%s: failed to malloc for %d bytes (createNewEvent: struct gdcEventDescriptorStruct)",
     317           0 :                myName, (int)sizeof( *p ) );
     318           0 :       perror( "" );
     319           0 :       exit( 1 );
     320             :     }
     321           4 :     p->loaded = FALSE;
     322           4 :     p->next = NULL;
     323           4 :     p->head = p->tail = NULL;
     324           4 :     currGdc = p;
     325           4 :     if ( eventsHead == NULL ) {
     326           1 :       eventsHead = eventsTail = p;
     327           1 :     } else {
     328             :       struct gdcEventDescriptorStruct *q =
     329           3 :         (struct gdcEventDescriptorStruct *)eventsTail;
     330             : 
     331           3 :       q->next = p;
     332           3 :       eventsTail = p;
     333             :     }
     334           4 :     p->detPattern = currDetPattern;
     335           4 :     p->timestamp = currTimestamp;
     336           4 :   }
     337           4 : } /* End of createNewEvent */
     338             : 
     339             : void createNewLdcEvent() {
     340             :   struct gdcEventDescriptorStruct *gdcDesc;
     341             :   struct ldcEventDescriptorStruct *p;
     342             : 
     343        1422 :   if ( (p = (struct ldcEventDescriptorStruct *)malloc( sizeof( *p ) ))
     344         474 :          == NULL ) {
     345           0 :     fprintf( stderr,
     346             :              "%s: failed to malloc for %d bytes (createNewLdcEvent: struct ldcEventDescriptorStruct)",
     347           0 :              myName, (int)sizeof( *p ) );
     348           0 :     perror( "" );
     349           0 :     exit( 1 );
     350             :   }
     351         474 :   p->id = currLdcId;
     352         474 :   p->detPattern = currDetPattern;
     353         474 :   p->timestamp = currTimestamp;
     354         474 :   p->head = p->tail = NULL;
     355         474 :   p->next = NULL;
     356         474 :   gdcDesc = (struct gdcEventDescriptorStruct *)eventsTail;
     357         948 :   if ( gdcDesc->head == NULL ) {
     358         478 :     gdcDesc->head = gdcDesc->tail = p;
     359           4 :   } else {
     360         470 :     gdcDesc->tail->next = p;
     361         470 :     gdcDesc->tail = p;
     362             :   }
     363         474 :   currLdc = p;
     364         474 : } /* End of createNewLdcEvent */
     365             : 
     366             : void loadBuffer( struct payloadDescriptorStruct * const payload ) {
     367             :   FILE *f;
     368             :   int bytesRead;
     369             : 
     370        3242 :   if ( (f = fopen( payload->fileName, "r" )) == NULL ) {
     371           0 :     fprintf( stderr,
     372             :              "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
     373           0 :              myName,
     374           0 :              lineNmb,
     375           0 :              payload->fileName,
     376           0 :              errno );
     377           0 :     perror( "System-dependent error " );
     378           0 :     exit( 1 );
     379             :   }
     380        1621 :   if ( (payload->data = malloc( payload->size )) == NULL ) {
     381           0 :     fprintf( stderr,
     382             :              "%s: line:%d Failed to malloc for payload file \"%s\" size:%d errno:%d ",
     383           0 :              myName,
     384           0 :              lineNmb,
     385           0 :              payload->fileName,
     386           0 :              payload->size,
     387           0 :              errno );
     388           0 :     perror( "System-dependent status " );
     389           0 :     exit( 1 );
     390             :   }
     391        1621 :   if ( (bytesRead = fread( payload->data, payload->fileSize, 1, f )) != 1 ) {
     392           0 :     fprintf( stderr,
     393             :              "%s: line:%d Failed to read payload file \"%s\" size:%d requested:1 got:%d feof:%s ferror:%s errno:%d ",
     394           0 :              myName,
     395           0 :              lineNmb,
     396           0 :              payload->fileName,
     397           0 :              payload->size,
     398             :              bytesRead,
     399           0 :              feof(f) ? "TRUE" : "false",
     400           0 :              ferror(f) ? "TRUE" : "false",
     401           0 :              errno );
     402           0 :     perror( "System-dependent status " );
     403           0 :     exit( 1 );
     404             :   }
     405        1621 :   fclose(f);
     406        1621 :   if ( payload->size != payload->fileSize ) {
     407           0 :     memset( (char *)payload->data + payload->fileSize,
     408             :             0,
     409           0 :             payload->size - payload->fileSize );
     410           0 :   }
     411        1621 : } /* End of loadBuffer */
     412             : 
     413             : void unloadBuffer( struct payloadDescriptorStruct * const payload ) {
     414        3242 :   if ( payload->data != NULL ) {
     415        1621 :     free( payload->data );
     416        1621 :     payload->data = NULL;
     417        1621 :   }
     418        1621 : } /* End of unloadBuffer */
     419             : 
     420             : void unloadAllBuffers() {
     421             :   struct payloadDescriptorStruct *payload;
     422             : 
     423           0 :   for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
     424           0 :     unloadBuffer( payload );
     425             :   }
     426           0 : } /* End of unloadAllBuffers */
     427             : 
     428             : void loadPayload( const char *fileName ) {
     429             :   struct payloadDescriptorStruct *payload;
     430             : 
     431     2630883 :   for ( payload = payloadsHead; payload != NULL; payload = payload->next ) {
     432     1313010 :     if ( strcmp( fileName, payload->fileName ) == 0 )
     433             :       break;
     434             :   }
     435        1621 :   if ( payload == NULL ) {
     436             :     FILE *f;
     437             : 
     438        3242 :     if ( (payload = (struct payloadDescriptorStruct *)malloc( sizeof( *payload ) ))
     439        1621 :            == NULL ) {
     440           0 :       fprintf( stderr,
     441             :                "%s: failed to malloc for %d bytes (loadPayload/payloadDescriptorStruct)\n",
     442           0 :                myName,
     443             :                (int)sizeof( *payload ) );
     444           0 :       exit( 1 );
     445             :     }
     446        1621 :     if ( (payload->fileName = strdup( fileName )) == NULL ) {
     447           0 :       fprintf( stderr,
     448             :                "%s: failed to duplicate string \"%s\" (loadPaload/fileName)\n",
     449           0 :                myName,
     450             :                fileName );
     451           0 :       exit( 1 );
     452             :     }
     453        1621 :     if ( (f = fopen( fileName, "r" )) == NULL ) {
     454           0 :       fprintf( stderr,
     455             :                "%s: line:%d payload file \"%s\" not found or not readable, errno:%d. ",
     456           0 :                myName,
     457           0 :                lineNmb,
     458             :                fileName,
     459           0 :                errno );
     460           0 :       perror( "System-dependent error " );
     461           0 :       exit( 1 );
     462             :     }
     463        1621 :     if ( fseek( f, 0L, SEEK_END ) != 0 ) {
     464           0 :       fprintf( stderr,
     465             :                "%s: line:%d Failed to seek payload file \"%s\" errno:%d ",
     466           0 :                myName,
     467           0 :                lineNmb,
     468             :                fileName,
     469           0 :                errno );
     470           0 :       perror( "System-dependent error " );
     471           0 :       exit( 1 );
     472             :     }
     473        1621 :     if ( (payload->size = ftell( f )) <= 0 ) {
     474           0 :       fprintf( stderr,
     475             :                "%s: line:%d Failed to get file \"%s\" size size:%d errno:%d ",
     476           0 :                myName,
     477           0 :                lineNmb,
     478             :                fileName,
     479             :                payload->size,
     480           0 :                errno );
     481           0 :       perror( "System-dependent status " );
     482           0 :       exit( 1 );
     483             :     }
     484        1621 :     payload->fileSize = payload->size;
     485        3242 :     while ( (payload->size & 3) != 0 ) payload->size++;
     486        1621 :     fclose( f );
     487             : 
     488        1621 :     if ( bufferData ) {
     489           0 :       loadBuffer( payload );
     490           0 :     } else {
     491        1621 :       payload->data = NULL;
     492             :     }
     493             : 
     494        1621 :     payload->next = NULL;
     495        1621 :     if ( payloadsHead == NULL ) {
     496           1 :       payloadsHead = payloadsTail = payload;
     497           1 :     } else {
     498        1620 :       payloadsTail->next = payload;
     499        1620 :       payloadsTail = payload;
     500             :     }
     501        1621 :     DBG_VERBOSE {
     502             :       int b, n;
     503             : 
     504           0 :       printf( "%d)       Payload \"%s\" loaded at %p\n",
     505           0 :               lineNmb,
     506             :               fileName,
     507           0 :               (void*)payload );
     508           0 :       if ( bufferData ) {
     509           0 :         if ( handleCDH &&
     510           0 :              strncmp(fileName,"TRG_",4) != 0 ) {
     511             :           struct commonDataHeaderStruct *cdh =
     512           0 :             (struct commonDataHeaderStruct *)payload->data;
     513             : 
     514           0 :           printf( " CDH: blockLenght:%d=0x%08x ",
     515           0 :                   cdh->cdhBlockLength, cdh->cdhBlockLength );
     516           0 :           if ( cdh->cdhBlockLength < sizeof( *cdh ) ) {
     517           0 :             printf( "TOO SMALL (minimum:%ld=0x%08lx)\n",
     518             :                    (unsigned long)sizeof( *cdh ),
     519             :                    (unsigned long)sizeof( *cdh ) );
     520           0 :           } else {
     521           0 :             printf( "version:%d=0x%x ", cdh->cdhVersion, cdh->cdhVersion );
     522           0 :             if ( cdh->cdhVersion != CDH_VERSION ) {
     523           0 :               printf( "EXPECTED:%d=%x (decoding may be inaccurate) ",
     524             :                       CDH_VERSION, CDH_VERSION );
     525           0 :             }
     526             :           }
     527           0 :           printf( "L1TriggerMessage:0x%x", cdh->cdhL1TriggerMessage );
     528           0 :           if (  cdh->cdhL1TriggerMessage != 0 ) {
     529           0 :             for ( b = 0, n = 0; b != 10; b++ ) {
     530           0 :               if ( (cdh->cdhL1TriggerMessage & (1<<b)) != 0 ) {
     531           0 :                 if ( n++ != 0 )printf( "+" );
     532           0 :                 switch (b) {
     533           0 :                 case 0: printf( "L1SwC" ); break;
     534           0 :                 case 1: printf( "ESR" ); break;
     535           0 :                 case 2: printf( "RoC1" ); break;
     536           0 :                 case 3: printf( "RoC2" ); break;
     537           0 :                 case 4: printf( "RoC3" ); break;
     538           0 :                 case 5: printf( "RoC4" ); break;
     539           0 :                 case 6: printf( "ClT" ); break;
     540           0 :                 default: printf( "spare %d", b+14 );
     541           0 :                 }
     542             :               }
     543             :             }
     544           0 :             printf( ">" );
     545           0 :           }
     546           0 :           printf( " " );
     547           0 :           if ( cdh->cdhMBZ0 != 0 )
     548           0 :             printf( "MBZ0:0x%x ",
     549             :                     cdh->cdhMBZ0 );
     550           0 :           printf( "\n" );
     551             :           
     552           0 :           printf( "      " );
     553           0 :           printf( "EventId2(orbit):%d=0x%x ",
     554           0 :                   cdh->cdhEventId2, cdh->cdhEventId2 );
     555           0 :           printf( "EventId1(bunchCrossing):%d=0x%x ",
     556           0 :                   cdh->cdhEventId1, cdh->cdhEventId1 );
     557           0 :           printf( "\n" );
     558             :           
     559           0 :           printf( "      " );
     560           0 :           if ( cdh->cdhMBZ1 != 0 )
     561           0 :             printf( "MBZ1:0x%x ",
     562             :                     cdh->cdhMBZ1 );
     563           0 :           printf( "BlockAttributes:0x%x",
     564           0 :                   cdh->cdhBlockAttributes );
     565           0 :           if ( cdh->cdhBlockAttributes != 0 ) {
     566           0 :             printf( "=<" );
     567           0 :             for ( b = 0, n = 0; b != 8; b++ ) {
     568           0 :               if ( (cdh->cdhBlockAttributes & (1<<b)) != 0 ) {
     569           0 :                 if ( n++ != 0 )
     570           0 :                   printf( "+" );
     571           0 :                 printf( "%d", b );
     572           0 :               }
     573             :             }
     574           0 :             printf( ">" );
     575           0 :           }
     576           0 :           printf( " " );
     577           0 :           printf( "ParticipatingSubDetectors:0x%x ",
     578           0 :                   cdh->cdhParticipatingSubDetectors );
     579           0 :           printf( "\n" );
     580           0 :           printf( "      " );
     581             :           
     582           0 :           printf( "Status/Error:0x%x", cdh->cdhStatusErrorBits );
     583           0 :           if ( cdh->cdhStatusErrorBits != 0 ) {
     584           0 :             printf( "=<" );
     585           0 :             for ( b = 0,n = 0; b != 16; b++ ) {
     586           0 :               if ( (cdh->cdhStatusErrorBits & (1<<b)) != 0 ) {
     587           0 :                 if ( n++ != 0 ) printf( "+" );
     588           0 :                 switch (b) {
     589           0 :                 case 0: printf( "TriggerOverLapError" ); break;
     590           0 :                 case 1: printf( "TriggerMissingError" ); break;
     591           0 :                 case 2: printf( "DataParityError" ); break;
     592           0 :                 case 3: printf( "ControlParityError" ); break;
     593           0 :                 case 4: printf( "TriggerInformationUnavailable" ); break;
     594           0 :                 case 5: printf( "FEEError" ); break;
     595           0 :                 case 6: printf( "HLTDecision" ); break;
     596           0 :                 case 7: printf( "HLTPayload" ); break;
     597           0 :                 case 8: printf( "DDGPayload" ); break;
     598           0 :                 default: printf( "spare %d", b );
     599           0 :                 }
     600             :               }
     601             :             }
     602           0 :             printf( ">" );
     603           0 :           }
     604           0 :           printf( " " );
     605           0 :           printf( "MiniEventId(bunchCrossing):%d=0x%x ",
     606           0 :                   cdh->cdhMiniEventId, cdh->cdhMiniEventId );
     607           0 :           printf( "\n" );
     608             :           
     609           0 :           printf( "      " );
     610           0 :           printf( "Trigger classes: 0x(%05x-%08x)",
     611           0 :                   cdh->cdhTriggerClassesHigh,
     612           0 :                   cdh->cdhTriggerClassesLow );
     613           0 :           if ( cdh->cdhTriggerClassesHigh != 0
     614           0 :                || cdh->cdhTriggerClassesLow != 0 ) {
     615           0 :             printf( "=<" );
     616           0 :             for ( b=0, n=0; b != 32; b++ ) {
     617           0 :               if ( (cdh->cdhTriggerClassesLow & (1<<b)) != 0 ) {
     618           0 :                 if ( n++ != 0 ) printf( "+" );
     619           0 :                 printf( "%d", b );
     620           0 :               }
     621             :             }
     622           0 :             for ( b=0; b != 18; b++ ) {
     623           0 :               if ( (cdh->cdhTriggerClassesHigh & (1<<b)) != 0 ) {
     624           0 :                 if ( n++ != 0 ) printf( "+" );
     625           0 :                 printf( "%d", b+32 );
     626           0 :               }
     627             :             }
     628           0 :             printf( ">" );
     629           0 :           }
     630           0 :           printf( "\n" );
     631             :           
     632           0 :           printf( "      " );
     633           0 :           printf( "ROI:0x(%08x-%01x)", cdh->cdhRoiHigh, cdh->cdhRoiLow );
     634           0 :           if ( cdh->cdhRoiHigh != 0
     635           0 :                || cdh->cdhRoiLow != 0 ) {
     636           0 :             printf( "=<" );
     637           0 :             for ( b=0, n=0; b != 5; b++ ) {
     638           0 :               if ( (cdh->cdhRoiLow & (1<<b)) != 0 ) {
     639           0 :                 if ( n++ != 0 ) printf( "+" );
     640           0 :                 printf( "%d", b );
     641           0 :               }
     642             :             }
     643           0 :             for ( b=0; b != 32; b++ ) {
     644           0 :               if ( (cdh->cdhRoiHigh & (1<<b)) != 0 ) {
     645           0 :                 if ( n++ != 0 ) printf( "+" );
     646           0 :                 printf( "%d", b+4 );
     647           0 :               }
     648             :             }
     649           0 :             printf( ">" );
     650           0 :           }
     651           0 :           printf( "\n" );
     652           0 :         }
     653             :       }
     654           0 :     }
     655        1621 :   } else {
     656           0 :     DBG_VERBOSE
     657           0 :       printf( "%d)       Payload \"%s\" already loaded at %p\n",
     658           0 :               lineNmb,
     659             :               fileName,
     660           0 :               (void*)payload );
     661             :   }
     662             : 
     663        1621 :   currEvent->payload = payload;
     664        1621 : } /* End of loadPayload */
     665             : 
     666             : void parseEquipment( char * const line ) {
     667             :   struct equipmentEventDescriptorStruct *equipment;
     668             :   int payloadFound = FALSE;
     669        3242 :   char *p;
     670             :   char *keyword;
     671             : 
     672        1621 :   if ( (equipment =
     673        1621 :          (struct equipmentEventDescriptorStruct *)malloc( sizeof( *equipment ) )) == NULL ) {
     674           0 :     fprintf( stderr,
     675             :              "%s: filed to malloc for %d bytes (parseEquipment/equipmentEventDescriptorStruct) errno:%d ",
     676           0 :              myName,
     677             :              (int)sizeof( *equipment ),
     678           0 :              errno );
     679           0 :     perror( "" );
     680           0 :     exit( 1 );
     681             :   }
     682        1621 :   currEvent = equipment;
     683             : 
     684        1621 :   p = line;
     685        6484 :   while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
     686        3242 :     DBG_VERBOSE printf( "%d)     Equipment - Keyword:\"%s\"\n",
     687           0 :                         lineNmb,
     688             :                         keyword );
     689        3242 :     if ( strcasecmp( "id", keyword ) == 0 ) {
     690             :       char *idNum;
     691             : 
     692        1621 :       if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
     693           0 :         fprintf( stderr,
     694             :                  "%s: line:%d EQUIPMENT declaration, ID needed",
     695           0 :                  myName,
     696           0 :                  lineNmb );
     697           0 :         exit( 1 );
     698             :       }
     699        1621 :       if ( sscanf( idNum, "%d", &currEquipmentId ) != 1 ) {
     700           0 :         fprintf( stderr,
     701             :                  "%s: line:%d EQUIPMENT declaration, numeric ID needed (%s)",
     702           0 :                  myName,
     703           0 :                  lineNmb,
     704             :                  idNum );
     705           0 :         exit( 1 );
     706             :       }
     707        1621 :       DBG_VERBOSE printf( "%d)     EQUIPMENT - ID:%d\n",
     708           0 :                           lineNmb,
     709           0 :                           currEquipmentId );
     710        3242 :     } else if ( strncasecmp( "pay", keyword, 3 ) == 0 ) {
     711             :       char *fileName;
     712             : 
     713        1621 :       if ( (fileName = strtok_r( p, " \t", &p )) == NULL ) {
     714           0 :         fprintf( stderr,
     715             :                  "%s line:%d Payload without filename found\n",
     716           0 :                  myName,
     717           0 :                  lineNmb );
     718           0 :         exit( 1 );
     719             :       }
     720        1621 :       DBG_VERBOSE printf( "%d)     Equipment - Payload:\"%s\"\n",
     721           0 :                           lineNmb,
     722             :                           fileName );
     723        1621 :       if ( payloadFound ) {
     724           0 :         fprintf( stderr,
     725             :                  "%s line:%d Payload with multiple filenames found\n",
     726           0 :                  myName,
     727           0 :                  lineNmb );
     728           0 :         exit( 1 );
     729             :       }
     730        1621 :       loadPayload( fileName );
     731             :       payloadFound = TRUE;
     732             :     } else {
     733           0 :       fprintf( stderr,
     734             :                "%s: line:%d Equipment declaration, unknown keyword \"%s\"\n",
     735           0 :                myName,
     736           0 :                lineNmb,
     737             :                keyword );
     738           0 :       exit( 1 );
     739             :     }
     740             :   }
     741        1621 :   if ( !payloadFound ) {
     742           0 :     fprintf( stderr,
     743             :              "%s: line:%d Equipment without payload found\n",
     744           0 :              myName,
     745           0 :              lineNmb );
     746           0 :     exit( 1 );
     747             :   }
     748             : 
     749        1621 :   equipment->id = currEquipmentId;
     750        1621 :   equipment->next = NULL;
     751        3242 :   if ( currLdc->head == NULL ) {
     752        2095 :     currLdc->head = currLdc->tail = equipment;
     753         474 :   } else {
     754        1147 :     currLdc->tail->next = equipment;
     755        1147 :     currLdc->tail = equipment;
     756             :   }
     757        1621 : } /* End of parseEquipment */
     758             : 
     759             : void parseGdc( char * const line ) {
     760           8 :   char *p;
     761             :   char *keyword;
     762             : 
     763           4 :   p = line;
     764          16 :   while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
     765           8 :     if ( strcasecmp( "id", keyword ) == 0 ) {
     766             :       char *idNum;
     767             : 
     768           0 :       if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
     769           0 :         fprintf( stderr,
     770             :                  "%s: line:%d GDC declaration, ID needed",
     771           0 :                  myName,
     772           0 :                  lineNmb );
     773           0 :         exit( 1 );
     774             :       }
     775           0 :       int inCurrGdcId;
     776           0 :       if ( sscanf( idNum, "%d", &inCurrGdcId ) != 1 ) {
     777           0 :         fprintf( stderr,
     778             :                  "%s: line:%d GDC declaration, numeric ID needed (%s)",
     779           0 :                  myName,
     780           0 :                  lineNmb,
     781             :                  idNum );
     782           0 :         exit( 1 );
     783             :       }
     784           0 :       currGdcId = (eventGdcIdType)inCurrGdcId;
     785           0 :       DBG_VERBOSE printf( "%d)     GDC - ID:%d\n",
     786           0 :                           lineNmb,
     787             :                           currGdcId );
     788           8 :     } else if ( strcasecmp( "DetectorPattern", keyword ) == 0 ) {
     789             :       char *detPattern;
     790             : 
     791           4 :       if ( (detPattern = strtok_r( p, " \t", &p )) == NULL ) {
     792           0 :         fprintf( stderr,
     793             :                  "%s: line:%d GDC declaration, DetectorPattern needed",
     794           0 :                  myName,
     795           0 :                  lineNmb );
     796           0 :         exit( 1 );
     797             :       }
     798           4 :       if ( sscanf( detPattern, "%u", &currDetPattern ) != 1 ) {
     799           0 :         fprintf( stderr,
     800             :                  "%s: line:%d GDC declaration, numeric DetectorPattern needed (%s)",
     801           0 :                  myName,
     802           0 :                  lineNmb,
     803             :                  detPattern );
     804           0 :         exit( 1 );
     805             :       }
     806           4 :       DBG_VERBOSE printf( "%d)     GDC - DetectorPattern:%u\n",
     807           0 :                           lineNmb,
     808           0 :                           currDetPattern );
     809           8 :     } else if ( strcasecmp( "Timestamp", keyword ) == 0 ) {
     810             :       char *timestamp;
     811             : 
     812           4 :       if ( (timestamp = strtok_r( p, " \t", &p )) == NULL ) {
     813           0 :         fprintf( stderr,
     814             :                  "%s: line:%d GDC declaration, Timestamp needed",
     815           0 :                  myName,
     816           0 :                  lineNmb );
     817           0 :         exit( 1 );
     818             :       }
     819           4 :       if ( sscanf( timestamp, "%u", &currTimestamp ) != 1 ) {
     820           0 :         fprintf( stderr,
     821             :                  "%s: line:%d GDC declaration, numeric Timestamp needed (%s)",
     822           0 :                  myName,
     823           0 :                  lineNmb,
     824             :                  timestamp );
     825           0 :         exit( 1 );
     826             :       }
     827           4 :       DBG_VERBOSE printf( "%d)     GDC - Timestamp:%u\n",
     828           0 :                           lineNmb,
     829           0 :                           currTimestamp );
     830             :     } else {
     831           0 :       fprintf( stderr,
     832             :                "%s: line:%d GDC declaration, unknown keyword \"%s\"\n",
     833           0 :                myName,
     834           0 :                lineNmb,
     835             :                keyword );
     836           0 :       exit( 1 );
     837             :     }  
     838             :   }
     839           4 : } /* End of parseGdc */
     840             : 
     841             : void parseLdc( char * const line ) {
     842         948 :   char *p;
     843             :   char *keyword;
     844             : 
     845         474 :   p = line;
     846        1896 :   while ( (keyword = strtok_r( p, " \t", &p )) != NULL ) {
     847         474 :     if ( strcasecmp( "id", keyword ) == 0 ) {
     848             :       char *idNum;
     849             : 
     850         474 :       if ( (idNum = strtok_r( p, " \t", &p )) == NULL ) {
     851           0 :         fprintf( stderr,
     852             :                  "%s: line:%d LDC declaration, ID needed",
     853           0 :                  myName,
     854           0 :                  lineNmb );
     855           0 :         exit( 1 );
     856             :       }
     857         474 :       int inCurrLdcId;
     858         474 :       if ( sscanf( idNum, "%d", &inCurrLdcId ) != 1 ) {
     859           0 :         fprintf( stderr,
     860             :                  "%s: line:%d LDC declaration, numeric ID needed (%s)",
     861           0 :                  myName,
     862           0 :                  lineNmb,
     863             :                  idNum );
     864           0 :         exit( 1 );
     865             :       }
     866         474 :       currLdcId = (eventLdcIdType)inCurrLdcId;
     867         474 :       DBG_VERBOSE printf( "%d)     LDC - ID:%d\n",
     868           0 :                           lineNmb,
     869             :                           currLdcId );
     870         474 :     } else {
     871           0 :       fprintf( stderr,
     872             :                "%s: line:%d LDC declaration, unknown keyword \"%s\"\n",
     873           0 :                myName,
     874           0 :                lineNmb,
     875             :                keyword );
     876           0 :       exit( 1 );
     877             :     }  
     878             :   }
     879         474 : } /* End of parseLdc */
     880             : 
     881             : void parseRules() {
     882           2 :   char line[ 1025 ];
     883             : 
     884           1 :   currLdcId = HOST_ID_MIN;
     885           1 :   currGdcId = HOST_ID_MIN;
     886           1 :   currDetPattern = 0;
     887           1 :   currTimestamp = 0;
     888             : 
     889        4202 :   for ( lineNmb = 1; !feof( stdin ); lineNmb++ ) {
     890        2100 :     getLine( line, sizeof(line) );
     891        2100 :     if ( strlen(line) != 0 ) {
     892        2099 :       char *p;
     893             :       char *keyword;
     894             : 
     895        2099 :       if ( (keyword = strtok_r( line, " \t", &p )) != NULL ) {
     896        2099 :         DBG_VERBOSE printf( "%d)   Keyword:\"%s\"\n", lineNmb, keyword );
     897        2099 :         if ( strcasecmp( "gdc", keyword ) == 0 ) {
     898           4 :           if ( workingAs != gdc && workingAs != unknown ) {
     899           0 :             fprintf( stderr,
     900             :                      "%s: line:%d GDC found when working in non-GDC mode (e.g. as a LDC)\n",
     901           0 :                      myName, lineNmb );
     902           0 :             exit( 1 );
     903             :           }
     904           4 :           workingAs = gdc;
     905           4 :           parseGdc( p );
     906           4 :           createNewEvent();
     907           4 :           currLdcId = HOST_ID_MIN;
     908           4 :           currLdc = NULL;
     909           4 :           currEquipmentId = 0;
     910        2099 :         } else if ( strcasecmp( "ldc", keyword ) == 0 ) {
     911         474 :           if ( workingAs != gdc && workingAs != ldc && workingAs != unknown ) {
     912           0 :             fprintf( stderr,
     913             :                      "%s: line:%d LDC found when working in non-LDC/GDC mode\n",
     914           0 :                      myName, lineNmb );
     915           0 :             exit( 1 );
     916             :           }
     917         474 :           if ( workingAs == unknown ) workingAs = ldc;
     918         474 :           parseLdc( p );
     919         474 :           if ( workingAs == ldc ) {
     920           0 :             createNewEvent();
     921           0 :             currEquipmentId = 0;
     922           0 :           } else {
     923         474 :             createNewLdcEvent();
     924         474 :             handleLdc( currLdcId );
     925         474 :             currLdcId++;
     926             :           }
     927         474 :           currEvent = NULL;
     928        2095 :         } else if ( strncasecmp( "equ", keyword, 3 ) == 0 ) {
     929        1621 :           if ( workingAs == unknown
     930        3242 :             || (workingAs == ldc && currLdc == NULL )
     931        1621 :             || (workingAs == gdc && currGdc == NULL ) ) {
     932           0 :             fprintf( stderr,
     933             :                      "%s: line:%d Unexpected EQUIPMENT declaration (LDC or GDC needed first)\n",
     934           0 :                      myName,
     935           0 :                      lineNmb );
     936           0 :             exit( 1 );
     937             :           }
     938        1621 :           parseEquipment( p );
     939        1621 :           currEquipmentId++;
     940             :         } else {
     941           0 :           fprintf( stderr,
     942             :                    "%s: line:%d Parse error in \"%s\" unknown keyword\n",
     943           0 :                    myName,
     944           0 :                    lineNmb,
     945             :                    keyword );
     946           0 :           exit( 1 );
     947             :         }
     948             :       }
     949        2099 :     }
     950           1 :   } while ( !feof( stdin ) ) {}
     951           1 :   lineNmb -= 2;
     952             : 
     953           1 :   DBG_VERBOSE {
     954           0 :     printf( "End of parse: %d line%s found\n",
     955             :             lineNmb,
     956           0 :             lineNmb != 1 ? "s" : "" );
     957           0 :     printf( "Working as %s\n",
     958           0 :             workingAs == gdc ? "GDC" :
     959           0 :              workingAs == ldc ? "LDC" :
     960             :               "UNKNOWN" );
     961           0 :     if ( workingAs == gdc ) {
     962             :       struct ldcDescriptorStruct *ldc;
     963             : 
     964           0 :       printf( "LDCs (%d):", numOfLdcs );
     965           0 :       for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
     966           0 :         printf( " %d", ldc->id );
     967             :       }
     968           0 :       printf( "\n" );
     969           0 :     }
     970           0 :     dumpEvents();
     971           0 :   }
     972             : 
     973           1 :   if ( workingAs == ldc ) {
     974           0 :     assert( ldcsHead == ldcsTail );
     975           0 :     assert( ldcsTail == NULL );
     976             :   }
     977             : 
     978           1 :   if ( workingAs == gdc ) {
     979             :     struct ldcDescriptorStruct *ldc;
     980             : 
     981           1 :     assert( ldcsHead != NULL );
     982           1 :     assert( ldcsTail != NULL );
     983           1 :     assert( ldcsTail->next == NULL );
     984         246 :     for ( ldc = ldcsHead; ldc->next != NULL; ldc = ldc->next ) {}
     985           1 :     assert ( ldc == ldcsTail );
     986           1 :   }
     987             : 
     988           1 :   if ( workingAs == unknown ) {
     989           0 :     DBG_VERBOSE printf( "Empty configuration: nothing to do!\n" );
     990           0 :     exit( 0 );
     991             :   }
     992             : 
     993           3 :   assert( (eventsHead == NULL && eventsTail == NULL)
     994             :        || (eventsHead != NULL && eventsTail != NULL) );
     995           1 : } /* End of parseRules */
     996             : 
     997             : void initEvent( struct eventHeaderStruct * const ev ) {
     998         956 :   memset( ev, 0, sizeof( *ev ) );
     999             : 
    1000         478 :   ev->eventMagic = EVENT_MAGIC_NUMBER;
    1001         478 :   ev->eventHeadSize = EVENT_HEAD_BASE_SIZE;
    1002         478 :   ev->eventVersion = EVENT_CURRENT_VERSION;
    1003         478 :   ev->eventRunNb = currRunNb;
    1004         478 :   ZERO_EVENT_ID( ev->eventId );
    1005         478 :   ZERO_TRIGGER_PATTERN( ev->eventTriggerPattern );
    1006         478 :   ZERO_DETECTOR_PATTERN( ev->eventDetectorPattern );
    1007         478 :   RESET_ATTRIBUTES( ev->eventTypeAttribute );
    1008         478 :   if ( workingMode == collider )
    1009         478 :     SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_ORBIT_BC );
    1010         478 :   ev->eventLdcId = VOID_ID;
    1011         478 :   ev->eventGdcId = VOID_ID;
    1012         478 : } /* End of initEvent */
    1013             : 
    1014             : int Swap(int x)
    1015             : {
    1016             :    // Swap the endianess of the integer value 'x'
    1017             : 
    1018           0 :    return (((x & 0x000000ffU) << 24) | ((x & 0x0000ff00U) <<  8) |
    1019           0 :            ((x & 0x00ff0000U) >>  8) | ((x & 0xff000000U) >> 24));
    1020             : }
    1021             : 
    1022             : void outputEvent( const void * const ev,
    1023             :                   const int size ) {
    1024             :   int done;
    1025             : 
    1026        7440 :   DBG_VERBOSE {
    1027           0 :     const long32 * const v = (long32 *)ev; 
    1028           0 :     printf( "Writing %d bytes @ %p (%d)\n", size, ev, *v );
    1029           0 :   }
    1030             : 
    1031             :   // .............................Test endianess..............................
    1032             :   int temp = 1;
    1033             :   char* ptemp = (char*) &temp;
    1034             : 
    1035        3720 :   if (ptemp[0]!=1) { // Mac platform: ptemp != 1..............................................................................
    1036           0 :      int  bufSize= size; if (bufSize > (int) sizeof(eventHeaderStruct)) { bufSize = sizeof(eventHeaderStruct); }
    1037           0 :      char* evTemp = (char*) malloc (bufSize);
    1038           0 :      memcpy(evTemp, ev, bufSize);
    1039             : 
    1040           0 :      if ((bufSize % sizeof(int)) != 0) {
    1041           0 :             fprintf( stderr, "%s: size of the input buffer ev is not multiple of 4 (size = %d)\n", myName, bufSize);
    1042           0 :             exit( 1 );
    1043             :           }
    1044             :      else {
    1045             :             // Invert header to evTemp.....................................................
    1046           0 :             int* buf = (int*) evTemp; 
    1047           0 :             for (int i=0; i < (int) (bufSize / sizeof(int)); i++, buf++) {
    1048           0 :                  int value = Swap(*buf); 
    1049           0 :                  memcpy(evTemp + (i * sizeof(int)), &value, sizeof(int)); 
    1050             :             }
    1051             : 
    1052             :             // Write inverted header to file...............................................
    1053           0 :             if ((done = fwrite( evTemp, bufSize, 1, outF )) != 1 ) {
    1054           0 :                  fprintf( stderr, "%s: failed to write inverted header. event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
    1055           0 :                  exit( 1 );
    1056             :             }
    1057             : 
    1058           0 :             if (size > bufSize) {  // Still theraw-data payload to write (but not inverted, since it is inverted eariler).............
    1059           0 :                 if ((done = fwrite( (char*)ev + bufSize, size - bufSize, 1, outF )) != 1 ) {
    1060           0 :                     fprintf( stderr, "%s: failed to write additional event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
    1061           0 :                     exit( 1 );
    1062             :                }
    1063             :             }
    1064             :      }
    1065           0 :      free(evTemp);
    1066           0 :   }
    1067             :   else {             // Intel platform: ptemp == 1............................................................................
    1068        3720 :      if ((done = fwrite( ev, size, 1, outF )) != 1 ) {
    1069           0 :           fprintf( stderr, "%s: failed to write event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
    1070           0 :           exit( 1 );
    1071             :      }
    1072             :   }
    1073        3720 : } /* End of outputEvent */
    1074             : 
    1075             : void createSorAndEor( const int sor ) {
    1076           4 :   unsigned char event[ 1000 ];
    1077             :   struct eventHeaderStruct *ev;
    1078           2 :   struct eventHeaderStruct sev;
    1079             : 
    1080           2 :   assert( workingAs == ldc || workingAs == gdc );
    1081             : 
    1082           4 :   if ( !createSorEor ) return;
    1083           0 :   ev = (struct eventHeaderStruct *)event;
    1084           0 :   initEvent( ev );
    1085           0 :   ev->eventSize = sizeof( event );
    1086           0 :   ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
    1087           0 :   if ( workingMode == fixedTarget )
    1088           0 :     LOAD_RAW_EVENT_ID( ev->eventId, 0, 0, 0 );
    1089             :   else
    1090           0 :     LOAD_EVENT_ID( ev->eventId, 0, 0, 0 );
    1091           0 :   SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
    1092             : 
    1093           0 :   if ( workingAs == ldc ) {
    1094           0 :     currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
    1095           0 :   }
    1096           0 :   if ( workingAs == gdc ) {
    1097           0 :     initEvent( &sev );
    1098           0 :     sev.eventGdcId = currGdcId;
    1099           0 :     ev->eventGdcId = currGdcId;
    1100           0 :     currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
    1101           0 :     currLdc = currGdc->head;
    1102           0 :   }
    1103           0 :   ev->eventLdcId = currLdc->id;
    1104             : 
    1105           0 :   if ( workingAs == ldc ) {
    1106           0 :     outputEvent( ev, ev->eventSize );
    1107           0 :   }
    1108           0 :   if ( workingAs == gdc ) {
    1109             :     struct ldcDescriptorStruct *ldc;
    1110             : 
    1111           0 :     sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
    1112           0 :     sev.eventType = sor ? START_OF_RUN : END_OF_RUN ;
    1113           0 :     COPY_EVENT_ID( ev->eventId, sev.eventId );
    1114           0 :     COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
    1115           0 :     SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
    1116           0 :     outputEvent( &sev, sizeof( sev ) );
    1117             : 
    1118           0 :     ev->eventGdcId = currGdcId;
    1119           0 :     for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
    1120           0 :       ev->eventLdcId = ldc->id;
    1121           0 :       outputEvent( ev, ev->eventSize );
    1122             :     }
    1123           0 :   }
    1124             : 
    1125           0 :   ADD_EVENT_ID( ev->eventId, oneEventDelta );
    1126           0 :   ev->eventSize = ev->eventSize / 2;
    1127           0 :   ev->eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
    1128           0 :   CLEAR_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_START );
    1129           0 :   if ( workingAs == ldc ) {
    1130           0 :     outputEvent( ev, ev->eventSize );
    1131           0 :   }
    1132           0 :   if ( workingAs == gdc ) {
    1133             :     struct ldcDescriptorStruct *ldc;
    1134             : 
    1135           0 :     sev.eventSize = ev->eventSize;
    1136           0 :     sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
    1137           0 :     COPY_EVENT_ID( ev->eventId, sev.eventId );
    1138           0 :     COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
    1139           0 :     CLEAR_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
    1140           0 :     outputEvent( &sev, sizeof( sev ) );
    1141           0 :     outputEvent( ev, ev->eventSize - sizeof( sev ) );
    1142             : 
    1143           0 :     sev.eventSize = sizeof( sev ) + ev->eventSize;
    1144           0 :     sev.eventType = sor ? START_OF_RUN_FILES : END_OF_RUN_FILES;
    1145           0 :     COPY_EVENT_ID( ev->eventId, sev.eventId );
    1146           0 :     COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
    1147           0 :     SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
    1148             : 
    1149           0 :     ev->eventGdcId = currGdcId;
    1150           0 :     for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
    1151           0 :       outputEvent( &sev, sizeof( sev ) );
    1152           0 :       ev->eventLdcId = ldc->id;
    1153           0 :       outputEvent( ev, ev->eventSize );
    1154             :     }
    1155           0 :   }
    1156             : 
    1157           0 :   ADD_EVENT_ID( ev->eventId, oneEventDelta );
    1158           0 :   ev->eventSize = sizeof( *ev );
    1159           0 :   ev->eventType = sor ? START_OF_RUN : END_OF_RUN;
    1160           0 :   SET_SYSTEM_ATTRIBUTE( ev->eventTypeAttribute, ATTR_P_END );
    1161           0 :   if ( workingAs == ldc ) {
    1162           0 :     outputEvent( ev, ev->eventSize );
    1163           0 :   }
    1164           0 :   if ( workingAs == gdc ) {
    1165             :     struct ldcDescriptorStruct *ldc;
    1166             : 
    1167           0 :     sev.eventSize = sizeof( sev ) + numOfLdcs * ev->eventSize;
    1168           0 :     sev.eventType = sor ? START_OF_RUN : END_OF_RUN;
    1169           0 :     COPY_EVENT_ID( ev->eventId, sev.eventId );
    1170           0 :     COPY_SYSTEM_ATTRIBUTES( ev->eventTypeAttribute, sev.eventTypeAttribute );
    1171           0 :     SET_SYSTEM_ATTRIBUTE( sev.eventTypeAttribute, ATTR_SUPER_EVENT );
    1172             : 
    1173           0 :     outputEvent( &sev, sizeof( sev ) );
    1174             : 
    1175           0 :     for ( ldc = ldcsHead; ldc != NULL; ldc = ldc->next ) {
    1176           0 :       ev->eventLdcId = ldc->id;
    1177           0 :       outputEvent( ev, ev->eventSize );
    1178             :     }
    1179           0 :   }
    1180           2 : } /* End of createSorEor */
    1181             : 
    1182             : void createSor() {
    1183           2 :   createSorAndEor( TRUE );
    1184           1 : } /* End of createSor */
    1185             : 
    1186             : void createEor() {
    1187           2 :   createSorAndEor( FALSE );
    1188           1 : } /* End of createEor */
    1189             : 
    1190             : void loadCdh( struct commonDataHeaderStruct * const cdh,
    1191             :                      eventIdType            * const eventId,
    1192             :                      equipmentIdType id ) {
    1193        4863 :   if ( !handleCDH ) return;
    1194             : 
    1195             :   // CTP raw-data does not contain CDH
    1196        1621 :   if ( id == 4352) return;
    1197             : 
    1198        1617 :   if ( gotAliceTrigger ) {
    1199           0 :     cdh->cdhEventId1 = EVENT_ID_GET_BUNCH_CROSSING( *eventId );
    1200           0 :     cdh->cdhEventId2 = EVENT_ID_GET_ORBIT( *eventId );
    1201           0 :   } else {
    1202        1617 :     cdh->cdhEventId1 = 0;
    1203        1617 :     cdh->cdhEventId2 = EVENT_ID_GET_NB_IN_RUN( *eventId );
    1204             :   }
    1205        1617 :   cdh->cdhMiniEventId = cdh->cdhEventId1;
    1206        3238 : }
    1207             : void decodeCDH( struct ldcEventDescriptorStruct       * const ldc,
    1208             :                 const struct payloadDescriptorStruct  * const payloadDesc,
    1209             :                 equipmentIdType id );
    1210             : 
    1211             : void createEvent( void ) {
    1212           8 :   assert( workingAs == ldc || workingAs == gdc );
    1213             : 
    1214             :   /* Step 1: load all buffers (if needed) and compose the GDC/LDC headers */
    1215           4 :   if ( workingAs == gdc ) {
    1216             :     struct ldcEventDescriptorStruct *ldc;
    1217             : 
    1218         956 :     for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
    1219         474 :       COPY_EVENT_ID( currEventId, ldc->header.eventId );
    1220             :     }
    1221           4 :     COPY_EVENT_ID( currEventId, currGdc->header.eventId );
    1222             : 
    1223         956 :     for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
    1224             :       struct equipmentEventDescriptorStruct *eq;
    1225             :       int n;
    1226             : 
    1227        4190 :       for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
    1228        1621 :         if ( !bufferData ) {
    1229        1621 :           loadBuffer( eq->payload );
    1230        1621 :           decodeCDH( ldc, eq->payload, eq->id );
    1231        1621 :         }
    1232        3242 :         loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
    1233             :                  &currEventId,
    1234        1621 :                  eq->id);
    1235             :       }
    1236             : 
    1237         474 :       if ( !currGdc->loaded ) {
    1238          40 :         for ( n = 0; n != EVENT_TRIGGER_PATTERN_WORDS; n++ )
    1239          16 :           currGdc->header.eventTriggerPattern[n] |= ldc->header.eventTriggerPattern[n];
    1240          16 :         for ( n = 0; n != EVENT_DETECTOR_PATTERN_WORDS; n++ )
    1241           4 :           currGdc->header.eventDetectorPattern[n] |= ldc->header.eventDetectorPattern[n];
    1242          32 :         for ( n = 0; n != ALL_ATTRIBUTE_WORDS; n++ )
    1243          12 :           currGdc->header.eventTypeAttribute[n] |= ldc->header.eventTypeAttribute[n];
    1244           4 :         currGdc->loaded = TRUE;
    1245           4 :       }
    1246             :     }
    1247           4 :     cdhRef = NULL;
    1248           4 :   } else if ( workingAs == ldc ) {
    1249             :     struct equipmentEventDescriptorStruct *eq;
    1250             : 
    1251           0 :     COPY_EVENT_ID( currEventId, currLdc->header.eventId );
    1252             : 
    1253           0 :     for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
    1254           0 :       if ( !bufferData ) {
    1255           0 :         loadBuffer( eq->payload );
    1256           0 :         decodeCDH( currLdc, eq->payload, eq->id );
    1257           0 :       }
    1258           0 :       loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
    1259             :                &currEventId,
    1260           0 :                eq->id);
    1261           0 :       currLdc->loaded = TRUE;
    1262             :     }
    1263           0 :     cdhRef = NULL;
    1264           0 :   }
    1265           4 :   ADD_EVENT_ID( currEventId, oneEventDelta );
    1266             : 
    1267             :   /* Step 2: output the event */
    1268           4 :   if ( workingAs == gdc ) {
    1269             :     struct ldcEventDescriptorStruct *ldc;
    1270             : 
    1271           4 :     outputEvent( &currGdc->header, sizeof( currGdc->header ) );
    1272             : 
    1273         956 :     for( ldc = currGdc->head; ldc != NULL; ldc = ldc->next ) {
    1274             :       struct equipmentEventDescriptorStruct *eq;
    1275             : 
    1276         474 :       outputEvent( &ldc->header, sizeof( ldc->header ) );
    1277             : 
    1278        4190 :       for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
    1279        1621 :         outputEvent( &eq->header, sizeof( eq->header ) );
    1280        1621 :         outputEvent( eq->payload->data, eq->payload->size );
    1281        3242 :         if ( !bufferData ) unloadBuffer( eq->payload );
    1282             :       }
    1283             :     }
    1284           4 :     if ( (currGdc = currGdc->next) == NULL )
    1285           1 :       currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
    1286           4 :   } else if ( workingAs == ldc ) {
    1287             :     struct equipmentEventDescriptorStruct *eq;
    1288             : 
    1289           0 :     outputEvent( &currLdc->header, sizeof( currLdc->header ) );
    1290             : 
    1291           0 :     for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
    1292           0 :       outputEvent( &eq->header, sizeof( eq->header ) );
    1293           0 :       outputEvent( eq->payload->data, eq->payload->size );
    1294           0 :       if ( !bufferData ) unloadBuffer( eq->payload );
    1295             :     }
    1296           0 :     if ( (currLdc = currLdc->next) == NULL )
    1297           0 :       currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
    1298           0 :   }
    1299           4 : } /* End of createEvent */
    1300             : 
    1301             : void createEvents() {
    1302             :   int eventNum = 0;
    1303             : 
    1304           2 :   currGdc = (struct gdcEventDescriptorStruct *)eventsHead;
    1305           1 :   currLdc = (struct ldcEventDescriptorStruct *)eventsHead;
    1306           1 :   currEvent = NULL;
    1307             : 
    1308           1 :   createSor();
    1309          10 :   for ( eventNum = 0;
    1310           5 :         eventNum != numOfEvents && numOfEvents != 0;
    1311           4 :         eventNum++ ) {
    1312           4 :     createEvent();
    1313             :   }
    1314           1 :   createEor();
    1315           1 : } /* End of createEvents */
    1316             : 
    1317             : int usage() {
    1318           0 :   fprintf( stderr,
    1319             :            "Usage: %s [-?][-d][-i definitionFile][-o outputFile][-# numOfEvents][-s][-F|-C]\n\
    1320             :    -?                  This text\n\
    1321             :    -v                  Print version ID and exit\n\
    1322             :    -d                  Enable debug (repeat for more verbosity)\n\
    1323             :    -i definitionFile   File with the description of the events to create (default: stdin)\n\
    1324             :    -o outputFile       File used to store events (default: stdout)\n\
    1325             :    -# numOfEvents      Number of events to generate (default: 1 event)\n\
    1326             :    -s                  Do not generate SOR/EOR files (valid only for GDCs)\n\
    1327             :    -F/-C               Working in Fixed Target (F) or Collider (C) mode\n\
    1328             :    -c                  Handles CDH\n\
    1329             :    -D                  Direct disc access (no buffering)\n",
    1330           0 :            myName );
    1331           0 :   return 1;
    1332             : } /* End of usage */
    1333             : 
    1334             : void parseArgs( int argc, char **argv ) {
    1335             :   int arg = 1;
    1336             :   int inFileName = -1;
    1337             :   int outFileName = -1;
    1338             : 
    1339           2 :   myName = argv[0] ;
    1340          16 :   while ( arg < argc ) {
    1341           7 :     if ( strcmp( "-?", argv[ arg ] ) == 0 ) {
    1342           0 :       usage();
    1343           0 :       exit( 0 );
    1344             :     }
    1345           7 :     if ( strcmp( "-i", argv[ arg ] ) == 0 ) {
    1346           0 :       if ( ++arg == argc ) exit( usage() );
    1347             :       inFileName = arg;
    1348           0 :       if ( freopen( argv[arg], "r", stdin ) == NULL ){
    1349           0 :         fprintf( stderr,
    1350             :                  "%s: failed to open input definition \"%s\" errno:%d ",
    1351           0 :                  myName, argv[arg], errno );
    1352           0 :         perror( "" );
    1353           0 :         exit( 1 );
    1354             :       }
    1355           7 :     } else if ( strcmp( "-v", argv[ arg ] ) == 0 ) {
    1356           0 :       printf( "%s\n", fileHandlerIdent );
    1357           0 :       exit( 0 );
    1358           7 :     } else if ( strcmp( "-o", argv[ arg ] ) == 0 ) {
    1359           1 :       if ( ++arg == argc ) exit( usage() );
    1360             :       outFileName = arg;
    1361           7 :     } else if ( strcmp( "-#", argv[ arg ] ) == 0 ) {
    1362           1 :       int n;
    1363             : 
    1364           1 :       if ( ++arg == argc ) exit( usage() );
    1365           1 :       if ( sscanf( argv[ arg ], "%d", &n ) != 1 ) exit( usage() );
    1366           1 :       if ( n < 0 ) exit( usage() );
    1367           1 :       numOfEvents = n;
    1368           6 :     } else if ( strcmp( "-s", argv[ arg ] ) == 0 ) {
    1369           1 :       createSorEor = FALSE;
    1370           5 :     } else if ( strcmp( "-F", argv[ arg ] ) == 0 ) {
    1371           0 :       workingMode = fixedTarget;
    1372           4 :     } else if ( strcmp( "-C", argv[ arg ] ) == 0 ) {
    1373           1 :       workingMode = collider;
    1374           4 :     } else if ( strcmp( "-d", argv[ arg ] ) == 0 ) {
    1375           0 :       debug++;
    1376           3 :     } else if ( strcmp( "-c", argv[ arg ] ) == 0 ) {
    1377           1 :       handleCDH = TRUE;
    1378           3 :     } else if ( strcmp( "-D", argv[ arg ] ) == 0 ) {
    1379           1 :       bufferData = FALSE;
    1380           2 :     } else if ( strcmp( "-run", argv[ arg ] ) == 0 ) {
    1381           1 :       int runnumber;
    1382           1 :       if ( ++arg == argc ) exit( usage() );
    1383           1 :       if ( sscanf( argv[ arg ], "%d", &runnumber ) != 1 ) exit( usage() );
    1384           1 :       if ( runnumber < 0 ) exit( usage() );
    1385           1 :       currRunNb = runnumber;
    1386           1 :     } else {
    1387           0 :       fprintf( stderr, "%s: Unknown switch \"%s\"\n", myName, argv[argc] );
    1388           0 :       exit( usage() );
    1389             :     }
    1390           7 :     arg++;
    1391             :   }
    1392             : 
    1393           1 :   if ( workingMode == fixedTarget )
    1394           0 :     LOAD_RAW_EVENT_ID( oneEventDelta, 1, 0, 1 );
    1395             :   else
    1396           1 :     LOAD_EVENT_ID( oneEventDelta, 0, 0, 1 );
    1397           1 :   ZERO_EVENT_ID( currEventId );
    1398             : 
    1399           1 :   DBG_VERBOSE {
    1400           0 :     printf( "Configuration:\n" );
    1401           0 :     printf( "  Debug level: %d\n", debug );
    1402           0 :     printf( "  Configuration: %s\n",
    1403           0 :             inFileName == -1 ? "stdin" : argv[ inFileName ] );
    1404           0 :     printf( "  Output: %s\n",
    1405           0 :             outFileName == -1 ? "stdout" : argv[ outFileName ] );
    1406           0 :     printf( "  Working mode: %s\n",
    1407           0 :             workingMode == fixedTarget ? "fixed target" : "collider" );
    1408           0 :     printf( "  Number of events: %d\n", numOfEvents );
    1409           0 :     printf( "  %s SOR/EOR files\n",
    1410           0 :             createSorEor ? "Create" : "Do not create" );
    1411           0 :     printf( "  CDH handling: %s\n",
    1412           0 :             handleCDH ? "enabled" : "disabled" );
    1413           0 :     printf( "  data buffering: %s\n",
    1414           0 :             bufferData ? "enabled" : "DISABLED" );
    1415           0 :   }
    1416             : 
    1417           1 :   if ( outFileName == -1 ) {
    1418           0 :     DBG_BASE
    1419           0 :       printf( "No more trace information from this point...\n" );
    1420           0 :     debug = 0;
    1421           0 :     outF = stdout;
    1422           0 :   } else {
    1423           1 :     if ( ( outF = fopen( argv[ outFileName ], "w" ) ) == NULL ) {
    1424           0 :       fprintf( stderr,
    1425             :                "%s: failed to open output file \"%s\" for writing, errno:%d (%s)\n",
    1426           0 :                myName,
    1427           0 :                argv[ outFileName ],
    1428           0 :                errno,
    1429           0 :                strerror( errno ) );
    1430           0 :       exit( 1 );
    1431             :     }
    1432           1 :     DBG_DETAILED
    1433           0 :       printf( "Output file \"%s\" opened OK for writing\n",
    1434           0 :               argv[ outFileName ] );
    1435             :   }
    1436           1 : } /* End of parseArgs */
    1437             : void initEquipment( struct equipmentHeaderStruct * const eq ) {
    1438        3242 :   memset( eq, 0, sizeof( *eq ) );
    1439        1621 :   RESET_ATTRIBUTES( eq->equipmentTypeAttribute );
    1440        1621 :   eq->equipmentBasicElementSize = 4;
    1441        1621 : } /* End of initEquipment */
    1442             : 
    1443             : void decodeCDH(       struct ldcEventDescriptorStruct * const ldc,
    1444             :                 const struct payloadDescriptorStruct  * const payloadDesc,
    1445             :                       equipmentIdType id ) {
    1446        9726 :   if ( handleCDH && 
    1447        3242 :        id != 4352 ) {
    1448             :     struct commonDataHeaderStruct *cdh;
    1449             :     static int softwareTriggerIndicator = FALSE;
    1450             :     int attr;
    1451             :     int trig;
    1452             : 
    1453        3234 :     if ( payloadDesc->size < CDH_SIZE ) {
    1454           0 :       fprintf( stderr,
    1455             :                "%s: payload too small got:%d CDH:%d\n",
    1456           0 :                myName,
    1457             :                payloadDesc->size,
    1458             :                CDH_SIZE );
    1459           0 :       exit( 1 );
    1460             :     }
    1461        3234 :     if ( (cdh = (struct commonDataHeaderStruct *)payloadDesc->data) != NULL ) {
    1462        1617 :       if ( cdh->cdhVersion != CDH_VERSION ) {
    1463           0 :         fprintf( stderr,
    1464             :                  "%s: CDH version mismatch expected:%d got:%d\n",
    1465           0 :                  myName,
    1466             :                  CDH_VERSION,
    1467             :                  cdh->cdhVersion );
    1468           0 :         exit( 1 );
    1469             :       }
    1470        1617 :       if ( cdhRef == NULL ) {
    1471           4 :         cdhRef = cdh;
    1472             : #define CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK (1<<CDH_TRIGGER_INFORMATION_UNAVAILABLE_BIT)
    1473           4 :         gotAliceTrigger = (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0;
    1474           4 :         if ( gotAliceTrigger && workingMode == fixedTarget ) {
    1475           0 :           fprintf( stderr,
    1476             :                    "%s: ALICE trigger and fixed target mode are not compatible.\n\
    1477             : Either work in Collider mode or set the trigger unavailable status bit in the CDH.\n",
    1478           0 :                    myName );
    1479           0 :           exit( 1 );
    1480             :         }
    1481           4 :         if ( gotAliceTrigger ) {
    1482           0 :           if ( (cdh->cdhL1TriggerMessage & 0x40) != 0 ) {
    1483           0 :             fprintf( stderr,
    1484             :                      "%s: CDH is a calibration trigger (unsupported) L1TriggerMessage:0x%x\n",
    1485           0 :                      myName, cdh->cdhL1TriggerMessage );
    1486           0 :             exit( 1 );
    1487             :           }
    1488           0 :           if ( (cdh->cdhL1TriggerMessage & 0x01) != 0 ) {
    1489           0 :             softwareTriggerIndicator = TRUE;
    1490           0 :           }
    1491           0 :           if ( softwareTriggerIndicator ) {
    1492           0 :             switch ((cdh->cdhL1TriggerMessage >> 2) & 0xF) {
    1493             :             case 0xC:
    1494             :             case 0xB:
    1495             :             case 0xA:
    1496             :             case 0x9:
    1497             :               break;
    1498             :             case 0xD:
    1499             :               /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xD --> SYNC */ 
    1500             :             case 0xF:
    1501             :               /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xF --> END_OF_DATA */ 
    1502             :             case 0xE:
    1503             :               /* L1SwC bit = on, Clt bit = off, RoC[4..1] = 0xE0 --> START_OF_DATA */
    1504             :             case 0x8:
    1505             :               /*  L1SwC bit = on, Clt bit = off, RoC[4] = 1, but not 0xE or 0xF
    1506             :                   --> SYSTEM_SOFTWARE_TRIGGER_EVENT */
    1507             :             default:
    1508             :               /*  L1SwC bit = on, Clt bit = off, RoC[4] = 0
    1509             :                   --> DETECTOR_SOFTWARE_TRIGGER_EVENT */
    1510           0 :               fprintf( stderr,
    1511             :                        "%s: CDH trigger SOD/EOD/SST/DST/SYNC (unsupported) \
    1512             : L1TriggerMessage:0x%x ALICETrigger:%s\n",
    1513           0 :                        myName,
    1514             :                        cdh->cdhL1TriggerMessage,
    1515           0 :                        gotAliceTrigger ? "yes" : "no" );
    1516           0 :               exit( 1 );
    1517             :             }
    1518             :           }
    1519             :         }
    1520             :       } else {
    1521        3226 :         if ( (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) !=
    1522        1613 :              (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) ) {
    1523           0 :           fprintf( stderr,
    1524             :                    "%s: CDH coherency check failed. \
    1525             : Trigger information reference:%savailable current:%savailable\n",
    1526           0 :                    myName,
    1527           0 :                    (cdhRef->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "",
    1528           0 :                    (cdh->cdhStatusErrorBits & CDH_TRIGGER_INFORMATION_UNAVAILABLE_MASK) == 0 ? "UN" : "" );
    1529           0 :           exit( 1 );
    1530             :         }
    1531        1613 :         if ( gotAliceTrigger ) {
    1532           0 :           if ( cdhRef->cdhL1TriggerMessage != cdh->cdhL1TriggerMessage ) {
    1533           0 :             fprintf( stderr,
    1534             :                      "%s: CDH coherency check failed. \
    1535             : L1 trigger message reference:0x%x current:0x%x\n",
    1536           0 :                      myName,
    1537             :                      cdhRef->cdhL1TriggerMessage,
    1538             :                      cdh->cdhL1TriggerMessage );
    1539           0 :             exit( 1 );
    1540             :           }
    1541           0 :           if ( cdh->cdhParticipatingSubDetectors != cdhRef->cdhParticipatingSubDetectors ) {
    1542           0 :             fprintf( stderr,
    1543             :                      "%s: CDH coherency check failed. \
    1544             : ParticipatingSubDetectors reference:0x%x current:0x%x\n",
    1545           0 :                      myName,
    1546             :                      cdhRef->cdhParticipatingSubDetectors,
    1547             :                      cdh->cdhParticipatingSubDetectors );
    1548           0 :             exit( 1 );
    1549             :           }
    1550           0 :           if ( cdh->cdhTriggerClassesLow  != cdhRef->cdhTriggerClassesLow
    1551           0 :                || cdh->cdhTriggerClassesHigh != cdhRef->cdhTriggerClassesHigh ) {
    1552           0 :             fprintf( stderr,
    1553             :                      "%s: CDH coherency check failed. \
    1554             : TriggerClassesHigh/Low reference:0x%x-%x current:0x%x-%x\n",
    1555           0 :                      myName,
    1556           0 :                      cdhRef->cdhTriggerClassesHigh, cdhRef->cdhTriggerClassesLow,
    1557           0 :                      cdh   ->cdhTriggerClassesHigh, cdh   ->cdhTriggerClassesLow  );
    1558           0 :             exit( 1 );
    1559             :           }
    1560           0 :           if ( cdh->cdhBlockLength != 0xffffffff ) {
    1561           0 :             if ( (unsigned)payloadDesc->size !=  cdh->cdhBlockLength ) {
    1562           0 :               fprintf( stderr,
    1563             :                        "%s: CDH coherency check failed. \
    1564             : Payload size:%d (0x%08x) CDH block length:%d (0x%08x)\n",
    1565           0 :                        myName,
    1566             :                        payloadDesc->size, payloadDesc->size,
    1567             :                        cdh->cdhBlockLength, cdh->cdhBlockLength );
    1568           0 :               exit( 1 );
    1569             :             }
    1570             :           }
    1571           0 :           if ( cdh->cdhRoiLow  != cdhRef->cdhRoiLow
    1572           0 :                || cdh->cdhRoiHigh != cdhRef->cdhRoiHigh ) {
    1573           0 :             fprintf( stderr,
    1574             :                      "%s: CDH coherency check failed. \
    1575             : RoiHigh/Low reference:0x%x-%x current:0x%x-%x\n",
    1576           0 :                      myName,
    1577           0 :                      cdhRef->cdhRoiHigh, cdhRef->cdhRoiLow,
    1578           0 :                      cdh   ->cdhRoiHigh, cdh   ->cdhRoiLow  );
    1579           0 :             exit( 1 );
    1580             :           }
    1581             :         }
    1582        3226 :         if ( cdh->cdhMBZ0 != 0
    1583        3226 :              || cdh->cdhMBZ1 != 0
    1584        3226 :              || cdh->cdhMBZ4 != 0 ) {
    1585           0 :           fprintf( stderr,
    1586             :                    "%s: CDH check failed. MBZ0:0x%x MBZ1:0x%x MBZ4:0x%x\n",
    1587           0 :                    myName,
    1588           0 :                    cdh->cdhMBZ0, cdh->cdhMBZ1, cdh->cdhMBZ4 );
    1589           0 :           exit( 1 );
    1590             :         }
    1591             :       }
    1592       29106 :       for ( attr = 0; attr != 8; attr++ ) {
    1593       12936 :         if ( (cdh->cdhBlockAttributes & (1<<attr)) != 0 ) {
    1594        4148 :           SET_USER_ATTRIBUTE( ldc->header.eventTypeAttribute, attr );
    1595        2074 :         }
    1596             :       }
    1597      106722 :       for ( trig = 0; trig != 32; trig++ ) {
    1598       51744 :         if ( (cdh->cdhTriggerClassesLow & (1<<trig)) != 0 ) {
    1599       27474 :           SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
    1600             :                                   trig );
    1601       13737 :         }
    1602             :       }
    1603       61446 :       for ( trig = 0; trig != 18; trig++ ) {
    1604       29106 :         if ( (cdh->cdhTriggerClassesMiddleLow & (1<<trig)) != 0 ) {
    1605           0 :           SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
    1606             :                                   32+trig );
    1607           0 :         }
    1608             :       }
    1609      106722 :       for ( trig = 0; trig != 32; trig++ ) {
    1610       51744 :         if ( (cdh->cdhTriggerClassesMiddleHigh & (1<<trig)) != 0 ) {
    1611           0 :           SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
    1612             :                                   18+32+trig );
    1613           0 :         }
    1614             :       }
    1615       61446 :       for ( trig = 0; trig != 18; trig++ ) {
    1616       29106 :         if ( (cdh->cdhTriggerClassesHigh & (1<<trig)) != 0 ) {
    1617           0 :           SET_TRIGGER_IN_PATTERN( ldc->header.eventTriggerPattern,
    1618             :                                   32+18+32+trig );
    1619           0 :         }
    1620             :       }
    1621        1617 :       if ( gotAliceTrigger )
    1622           0 :         VALIDATE_TRIGGER_PATTERN( ldc->header.eventTriggerPattern );
    1623             :     }
    1624        3234 :   }
    1625        3242 : } /* End of decodeCDH */
    1626             : 
    1627             : void initEvents() {
    1628           2 :   assert( workingAs == ldc || workingAs == gdc );
    1629             : 
    1630           1 :   if ( workingAs == gdc ) {
    1631             :     struct gdcEventDescriptorStruct *gdc;
    1632             : 
    1633          10 :     for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
    1634           5 :           gdc != NULL;
    1635           4 :           gdc = gdc->next ) {
    1636             :       struct ldcEventDescriptorStruct *ldc;
    1637             : 
    1638           4 :       initEvent( &gdc->header );
    1639           4 :       gdc->header.eventSize = gdc->header.eventHeadSize;
    1640           4 :       gdc->header.eventType = PHYSICS_EVENT;
    1641           4 :       SET_SYSTEM_ATTRIBUTE( gdc->header.eventTypeAttribute, ATTR_SUPER_EVENT );
    1642           4 :       gdc->header.eventGdcId = currGdcId;
    1643           4 :       COPY_DETECTOR_PATTERN(&gdc->detPattern, gdc->header.eventDetectorPattern);
    1644           4 :       gdc->header.eventTimestamp = gdc->timestamp;
    1645         956 :       for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
    1646             :         struct equipmentEventDescriptorStruct *eq;
    1647             : 
    1648         474 :         initEvent( &ldc->header );
    1649         474 :         ldc->header.eventSize = ldc->header.eventHeadSize;
    1650         474 :         ldc->header.eventType = PHYSICS_EVENT;
    1651         474 :         ldc->header.eventGdcId = currGdcId;
    1652         474 :         COPY_DETECTOR_PATTERN(&ldc->detPattern, ldc->header.eventDetectorPattern);
    1653         474 :         ldc->header.eventTimestamp = ldc->timestamp;
    1654         474 :         ldc->header.eventLdcId = ldc->id;
    1655        4190 :         for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
    1656        1621 :           initEquipment( &eq->header );
    1657        1621 :           eq->header.equipmentId = eq->id;
    1658        1621 :           if ( workingMode == collider )
    1659        1621 :             SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
    1660             :                                   ATTR_ORBIT_BC );
    1661        1621 :           eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
    1662        1621 :           ldc->header.eventSize += eq->header.equipmentSize;
    1663        1621 :           decodeCDH( ldc, eq->payload, eq->id );
    1664        1621 :           OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
    1665             :                              ldc->header.eventTypeAttribute );
    1666        1621 :           OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
    1667             :                              gdc->header.eventTypeAttribute );
    1668             :         }
    1669         474 :         gdc->header.eventSize += ldc->header.eventSize;
    1670             :       }
    1671           4 :       cdhRef = NULL;
    1672             :     }
    1673             : 
    1674           1 :     DBG_VERBOSE {
    1675           0 :       printf( "Headers:\n" );
    1676           0 :       for ( gdc = (struct gdcEventDescriptorStruct *)eventsHead;
    1677           0 :             gdc != NULL;
    1678           0 :             gdc = gdc->next ) {
    1679             :         struct ldcEventDescriptorStruct *ldc;
    1680             :         
    1681           0 :         printf( "   GDC:%d size:%d vers:%08x\n",
    1682           0 :                 currGdcId,
    1683           0 :                 gdc->header.eventSize,
    1684           0 :                 gdc->header.eventVersion);
    1685           0 :         for ( ldc = gdc->head; ldc != NULL; ldc = ldc->next ) {
    1686             :           struct equipmentEventDescriptorStruct *eq;
    1687             : 
    1688           0 :           printf( "      LDC:%d size:%d vers:%08x\n",
    1689           0 :                   ldc->id,
    1690           0 :                   ldc->header.eventSize,
    1691           0 :                   ldc->header.eventVersion );
    1692           0 :           for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
    1693           0 :             printf( "         EQ:%d size:%d %spayload:%d\n",
    1694           0 :                     eq->id,
    1695           0 :                     eq->header.equipmentSize,
    1696           0 :                     eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
    1697             :                     eq->payload->size );
    1698             :           }
    1699             :         }
    1700             :       }
    1701             :     }
    1702           1 :   } else if ( workingAs == ldc ) {
    1703             :     struct ldcEventDescriptorStruct *ldc;
    1704             : 
    1705           0 :     for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
    1706           0 :           ldc != NULL;
    1707           0 :           ldc = ldc->next ) {
    1708             :       struct equipmentEventDescriptorStruct *eq;
    1709             : 
    1710           0 :       initEvent( &ldc->header );
    1711           0 :       ldc->header.eventSize = ldc->header.eventHeadSize;
    1712           0 :       ldc->header.eventType = PHYSICS_EVENT;
    1713           0 :       ldc->header.eventGdcId = VOID_ID;
    1714           0 :       ldc->header.eventLdcId = ldc->id;
    1715           0 :       for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
    1716           0 :         initEquipment( &eq->header );
    1717           0 :         eq->header.equipmentId = eq->id;
    1718           0 :         if ( workingMode == collider )
    1719           0 :           SET_SYSTEM_ATTRIBUTE( eq->header.equipmentTypeAttribute,
    1720             :                                 ATTR_ORBIT_BC );
    1721           0 :         eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
    1722           0 :         ldc->header.eventSize += eq->header.equipmentSize;
    1723           0 :         decodeCDH( ldc, eq->payload, eq->id );
    1724           0 :         OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
    1725             :                            ldc->header.eventTypeAttribute );
    1726             :       }
    1727           0 :       cdhRef = NULL;
    1728             :     }
    1729           0 :     DBG_VERBOSE {
    1730           0 :       printf( "Headers:\n" );
    1731           0 :       for ( ldc = (struct ldcEventDescriptorStruct *)eventsHead;
    1732           0 :             ldc != NULL;
    1733           0 :             ldc = ldc->next ) {
    1734             :         struct equipmentEventDescriptorStruct *eq;
    1735             : 
    1736           0 :         printf( "      LDC:%d size:%d vers:%08x\n",
    1737           0 :                 ldc->id,
    1738           0 :                 ldc->header.eventSize,
    1739           0 :                 ldc->header.eventVersion );
    1740           0 :         for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
    1741           0 :           printf( "         EQ:%d size:%d %spayload:%d\n",
    1742           0 :                   eq->id,
    1743           0 :                   eq->header.equipmentSize,
    1744           0 :                   eq->header.equipmentSize - sizeof( struct equipmentHeaderStruct ) == (unsigned)eq->payload->size ? "" : "-ERROR",
    1745             :                   eq->payload->size );
    1746             :         }
    1747             :       }
    1748             :     }
    1749           0 :   }
    1750           1 : } /* End of initEvents */
    1751             : 
    1752             : void initVars() {
    1753           2 :   debug = 0;
    1754           1 :   workingAs = unknown;
    1755           1 :   workingMode = fixedTarget;
    1756           1 :   ldcsHead = ldcsTail = NULL;
    1757           1 :   eventsHead = eventsTail = NULL;
    1758           1 :   currGdc = NULL;
    1759           1 :   currLdc = NULL;
    1760           1 :   currEvent = NULL;
    1761           1 :   payloadsHead = payloadsTail = NULL;
    1762           1 :   currRunNb = -1;
    1763           1 :   numOfLdcs = 0;
    1764           1 :   numOfEvents = 1;
    1765           1 :   createSorEor = TRUE;
    1766           1 :   handleCDH = FALSE;
    1767           1 :   gotAliceTrigger = TRUE;
    1768           1 :   bufferData=TRUE;
    1769           1 : } /* End of initVars */
    1770             : 
    1771             : int main( int argc, char **argv ) {
    1772           2 :   initVars();
    1773           1 :   parseArgs( argc, argv );
    1774           1 :   parseRules();
    1775           1 :   initEvents();
    1776           1 :   createEvents();
    1777           1 :   return 0;
    1778             : } /* End of main */

Generated by: LCOV version 1.11