]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/dateStream.cxx
In AliMUONQADataMakerRec:
[u/mrichter/AliRoot.git] / RAW / dateStream.cxx
index 1c6b91c16ca640d49e45aa23500e27819456a053..0dd7a8347435eefd1bc31b9449fa12582b0ea7d9 100644 (file)
@@ -20,7 +20,7 @@
 #include <assert.h>
 #include <ctype.h>
 #include <time.h>
-
+#include <cassert>
 #include "event.h"
 
 #define DESCRIPTION "DATE raw data stream simulator"
@@ -96,6 +96,8 @@ eventIdType currEventId;
 int gotAliceTrigger;
 int bufferData;
 
+struct commonDataHeaderStruct *cdhRef = NULL;
+
 void dumpPayload( const struct payloadDescriptorStruct *p ) {
   char *c;
   int i;
@@ -491,7 +493,8 @@ void loadPayload( const char *fileName ) {
              fileName,
              payload );
       if ( bufferData ) {
-       if ( handleCDH ) {
+       if ( handleCDH &&
+            strncmp(fileName,"TRG_",4) != 0 ) {
          struct commonDataHeaderStruct *cdh =
            (struct commonDataHeaderStruct *)payload->data;
 
@@ -967,20 +970,64 @@ void initEvent( struct eventHeaderStruct * const ev ) {
   loadTimestamp( ev );
 } /* End of initEvent */
 
+int Swap(int x)
+{
+   // Swap the endianess of the integer value 'x'
+
+   return (((x & 0x000000ffU) << 24) | ((x & 0x0000ff00U) <<  8) |
+           ((x & 0x00ff0000U) >>  8) | ((x & 0xff000000U) >> 24));
+}
+
 void outputEvent( const void * const ev,
                  const int size ) {
   int done;
 
   DBG_VERBOSE {
-    const long32 * const v = (long32 *)ev;
+    const long32 * const v = (long32 *)ev; 
     printf( "Writing %d bytes @ %p (%d)\n", size, ev, *v );
   }
 
-  if ( (done = fwrite( ev, size, 1, outF )) != 1 ) {
-    fprintf( stderr,
-            "%s: failed to write event size:%d bytes, errno:%d (%s)\n",
-            myName, size, errno, strerror( errno ) );
-    exit( 1 );
+  // .............................Test endianess..............................
+  int temp = 1;
+  char* ptemp = (char*) &temp;
+
+  if (ptemp[0]!=1) { // Mac platform: ptemp != 1..............................................................................
+     int  bufSize= size; if (bufSize > (int) sizeof(eventHeaderStruct)) { bufSize = sizeof(eventHeaderStruct); }
+     char* evTemp = (char*) malloc (bufSize);
+     memcpy(evTemp, ev, bufSize);
+
+     if ((bufSize % sizeof(int)) != 0) {
+            fprintf( stderr, "%s: size of the input buffer ev is not multiple of 4 (size = %d)\n", myName, bufSize);
+            exit( 1 );
+          }
+     else {
+            // Invert header to evTemp.....................................................
+            int* buf = (int*) evTemp; 
+            for (int i=0; i < (int) (bufSize / sizeof(int)); i++, buf++) {
+                 int value = Swap(*buf); 
+                 memcpy(evTemp + (i * sizeof(int)), &value, sizeof(int)); 
+            }
+
+            // Write inverted header to file...............................................
+            if ((done = fwrite( evTemp, bufSize, 1, outF )) != 1 ) {
+                 fprintf( stderr, "%s: failed to write inverted header. event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
+                 exit( 1 );
+            }
+
+            if (size > bufSize) {  // Still theraw-data payload to write (but not inverted, since it is inverted eariler).............
+                if ((done = fwrite( (char*)ev + bufSize, size - bufSize, 1, outF )) != 1 ) {
+                    fprintf( stderr, "%s: failed to write additional event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
+                    exit( 1 );
+               }
+            }
+     }
+     free(evTemp);
+  }
+  else {             // Intel platform: ptemp == 1............................................................................
+     if ((done = fwrite( ev, size, 1, outF )) != 1 ) {
+          fprintf( stderr, "%s: failed to write event size:%d bytes, errno:%d (%s)\n", myName, size, errno, strerror( errno ) );
+          exit( 1 );
+     }
   }
 } /* End of outputEvent */
 
@@ -1114,9 +1161,13 @@ void createEor() {
 } /* End of createEor */
 
 void loadCdh( struct commonDataHeaderStruct * const cdh,
-                    eventIdType            * const eventId ) {
+                    eventIdType            * const eventId,
+                    equipmentIdType id ) {
   if ( !handleCDH ) return;
 
+  // CTP raw-data does not contain CDH
+  if ( id == 4352) return;
+
   if ( gotAliceTrigger ) {
     cdh->cdhEventId1 = EVENT_ID_GET_BUNCH_CROSSING( *eventId );
     cdh->cdhEventId2 = EVENT_ID_GET_ORBIT( *eventId );
@@ -1127,7 +1178,8 @@ void loadCdh( struct commonDataHeaderStruct * const cdh,
   cdh->cdhMiniEventId = cdh->cdhEventId1;
 }
 void decodeCDH( struct ldcEventDescriptorStruct       * const ldc,
-               const struct payloadDescriptorStruct  * const payloadDesc );
+               const struct payloadDescriptorStruct  * const payloadDesc,
+               equipmentIdType id );
 
 void createEvent( void ) {
   assert( workingAs == ldc || workingAs == gdc );
@@ -1150,10 +1202,11 @@ void createEvent( void ) {
       for ( eq = ldc->head; eq != NULL; eq = eq->next ) {
        if ( !bufferData ) {
          loadBuffer( eq->payload );
-         if ( !currGdc->loaded ) decodeCDH( ldc, eq->payload );
+         decodeCDH( ldc, eq->payload, eq->id );
        }
        loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
-                &currEventId );
+                &currEventId,
+                eq->id);
       }
 
       if ( !currGdc->loaded ) {
@@ -1166,6 +1219,7 @@ void createEvent( void ) {
        currGdc->loaded = TRUE;
       }
     }
+    cdhRef = NULL;
   } else if ( workingAs == ldc ) {
     struct equipmentEventDescriptorStruct *eq;
 
@@ -1175,12 +1229,14 @@ void createEvent( void ) {
     for ( eq = currLdc->head; eq != NULL; eq = eq->next ) {
       if ( !bufferData ) {
        loadBuffer( eq->payload );
-       if ( !currLdc->loaded ) decodeCDH( currLdc, eq->payload );
+       decodeCDH( currLdc, eq->payload, eq->id );
       }
       loadCdh( (struct commonDataHeaderStruct*)eq->payload->data,
-              &currEventId );
+              &currEventId,
+              eq->id);
       currLdc->loaded = TRUE;
     }
+    cdhRef = NULL;
   }
   ADD_EVENT_ID( currEventId, oneEventDelta );
 
@@ -1297,6 +1353,12 @@ void parseArgs( int argc, char **argv ) {
       handleCDH = TRUE;
     } else if ( strcmp( "-D", argv[ arg ] ) == 0 ) {
       bufferData = FALSE;
+    } else if ( strcmp( "-run", argv[ arg ] ) == 0 ) {
+      int runnumber;
+      if ( ++arg == argc ) exit( usage() );
+      if ( sscanf( argv[ arg ], "%d", &runnumber ) != 1 ) exit( usage() );
+      if ( runnumber < 0 ) exit( usage() );
+      currRunNb = runnumber;
     } else {
       fprintf( stderr, "%s: Unknown switch \"%s\"\n", myName, argv[argc] );
       exit( usage() );
@@ -1355,9 +1417,10 @@ void initEquipment( struct equipmentHeaderStruct * const eq ) {
 } /* End of initEquipment */
 
 void decodeCDH(       struct ldcEventDescriptorStruct * const ldc,
-               const struct payloadDescriptorStruct  * const payloadDesc ) {
-  if ( handleCDH ) {
-    static struct commonDataHeaderStruct *cdhRef = NULL;
+               const struct payloadDescriptorStruct  * const payloadDesc,
+                     equipmentIdType id ) {
+  if ( handleCDH && 
+       id != 4352 ) {
     struct commonDataHeaderStruct *cdh;
     static int softwareTriggerIndicator = FALSE;
     int attr;
@@ -1557,7 +1620,7 @@ void initEvents() {
                                  ATTR_ORBIT_BC );
          eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
          ldc->header.eventSize += eq->header.equipmentSize;
-         decodeCDH( ldc, eq->payload );
+         decodeCDH( ldc, eq->payload, eq->id );
          OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
                             ldc->header.eventTypeAttribute );
          OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
@@ -1565,6 +1628,7 @@ void initEvents() {
        }
        gdc->header.eventSize += ldc->header.eventSize;
       }
+      cdhRef = NULL;
     }
 
     DBG_VERBOSE {
@@ -1616,10 +1680,11 @@ void initEvents() {
                                ATTR_ORBIT_BC );
        eq->header.equipmentSize = eq->payload->size + sizeof( eq->header );
        ldc->header.eventSize += eq->header.equipmentSize;
-       decodeCDH( ldc, eq->payload );
+       decodeCDH( ldc, eq->payload, eq->id );
        OR_ALL_ATTRIBUTES( eq->header.equipmentTypeAttribute,
                           ldc->header.eventTypeAttribute );
       }
+      cdhRef = NULL;
     }
     DBG_VERBOSE {
       printf( "Headers:\n" );
@@ -1654,7 +1719,7 @@ void initVars() {
   currLdc = NULL;
   currEvent = NULL;
   payloadsHead = payloadsTail = NULL;
-  currRunNb = 1;
+  currRunNb = -1;
   numOfLdcs = 0;
   numOfEvents = 1;
   createSorEor = TRUE;