Index: /trunk/FACT++/src/EventBuilder.c
===================================================================
--- /trunk/FACT++/src/EventBuilder.c	(revision 15412)
+++ /trunk/FACT++/src/EventBuilder.c	(revision 15413)
@@ -535,5 +535,4 @@
 } /*-----------------------------------------------------------------*/
 
-void swapEventHeaderBytes(int i);
 int checkRoiConsistency(int i, int roi[]);
 
@@ -553,5 +552,4 @@
 //   size_t needmem = 0;
 
-    swapEventHeaderBytes(sk);
 
     int nRoi[9];
@@ -559,318 +557,230 @@
         return -9999;
 
-   const int b = sk / 7;
-
-   if (nRoi[0] < 0 || nRoi[0] > 1024) {
-       factPrintf(kError, 999, "Illegal roi in channel 0: %d (allowed: 0<=roi<=1024)", nRoi[0]);
-      gj.badRoiR++;
-      gj.badRoi[b]++;
-      return -9999;
-   }
-
-   for (int jr = 1; jr < 8; jr++) {
-      if (nRoi[jr] != nRoi[0]) {
-         factPrintf(kError, 711, "Mismatch of roi (%d) in channel %d with roi (%d) in channel 0.", nRoi[jr], jr, nRoi[0]);
-         gj.badRoiB++;
-         gj.badRoi[b]++;
-         return -7101;
-      }
-   }
-   if (nRoi[8] < nRoi[0]) {
-      factPrintf(kError, 712, "Mismatch of roi (%d) in channel 8. Should be larger or equal than the roi (%d) in channel 0.", nRoi[8], nRoi[0]);
-      gj.badRoiB++;
-      gj.badRoi[b]++;
-      return -7102;
-   }
-
-   const int  evID   = rd[sk].evtID;
-   const uint runID  = rd[sk].runID;
-   const int  fadlen = rd[sk].fadLen;
-   const int  trgTyp = rd[sk].ftmTyp;
-   const int  trgNum = rd[sk].ftmID;
-   const int  fadNum = rd[sk].evtID;
-
-   int i = evID % MAX_EVT;
-   int evFree = -1;
-
-   for (int k = 0; k < MAX_RUN; k++) {
-      if (mBuffer[i].evNum == evID && mBuffer[i].runNum == runID) {     //event is already registered;
-         // is it ok ????
-         if (mBuffer[i].nRoi != nRoi[0]
-             || mBuffer[i].nRoiTM != nRoi[8]) {
-            factPrintf(kError, 821, "Mismatch of roi within event. Expected roi=%d and roi_tm=%d, got %d and %d.",
-                       mBuffer[i].nRoi, mBuffer[i].nRoiTM, nRoi[0], nRoi[8]);
-            gj.badRoiE++;
-            gj.badRoi[b]++;
-            return -8201;
-         }
-//       count for inconsistencies
-
-         if (mBuffer[i].trgNum != trgNum)
-            mBuffer[i].Errors[0]++;
-         if (mBuffer[i].fadNum != fadNum)
-            mBuffer[i].Errors[1]++;
-         if (mBuffer[i].trgTyp != trgTyp)
-            mBuffer[i].Errors[2]++;
-
-         //everything seems fine so far ==> use this slot ....
-         return i;
-      }
-      if (evFree < 0 && mBuffer[i].evNum < 0)
-         evFree = i;
-      i += MAX_EVT;
-   }
-
-
-   //event does not yet exist; create it
-   if (evFree < 0) {            //no space available in ctrl
-      factPrintf(kError, 881, "No control slot to keep event %d", evID);
-      return -1;
-   }
-   i = evFree;                  //found free entry; use it ...
-
-   struct timeval tv;
-   gettimeofday (&tv, NULL);
-
-   const uint32_t tsec = tv.tv_sec;
-   const uint32_t tusec = tv.tv_usec;
-
-   //check if runId already registered in runCtrl
-   evFree = -1;
-
-   uint oldest = g_actTime + 1000;
-   int jold = -1;
-
-   for (int k = 0; k < MAX_RUN; k++) {
-      if (runCtrl[k].runId == runID) {
-//         if (runCtrl[k].procId > 0) {   //run is closed -> reject
-//            snprintf (str, MXSTR, "skip event since run %d finished", runID);
-//            factOut (kInfo, 931, str);
-//            return -21;
-//         }
-
-         if (runCtrl[k].roi0 != nRoi[0]
-             || runCtrl[k].roi8 != nRoi[8]) {
-            factPrintf(kError, 931, "Mismatch of roi within run. Expected roi=%d and roi_tm=%d, got %d and %d.",
-                       runCtrl[k].roi0, runCtrl[k].roi8, nRoi[0], nRoi[8]);
-            gj.badRoiR++;
-            gj.badRoi[b]++;
-            return -9301;
-         }
-         goto RUNFOUND;
-      } else if (evFree < 0 && runCtrl[k].fileId < 0) { //not yet used
-         evFree = k;
-      } else if (evFree < 0 && runCtrl[k].fileId > 0) { //already closed
-         if (runCtrl[k].closeTime < oldest) {
+    //const int b = sk / 7;
+
+    const int  evID   = rd[sk].evtID;
+    const uint runID  = rd[sk].runID;
+    const int  fadlen = rd[sk].fadLen;
+    const int  trgTyp = rd[sk].ftmTyp;
+    const int  trgNum = rd[sk].ftmID;
+    const int  fadNum = rd[sk].evtID;
+
+    int i = evID % MAX_EVT;
+    int evFree = -1;
+
+    for (int k = 0; k < MAX_RUN; k++)
+    {
+        //event is already registered;
+        if (mBuffer[i].evNum == evID && mBuffer[i].runNum == runID)
+        {
+            // is it ok ????
+            if (mBuffer[i].nRoi != nRoi[0] || mBuffer[i].nRoiTM != nRoi[8])
+            {
+                factPrintf(kError, 821, "Mismatch of roi within event. Expected roi=%d and roi_tm=%d, got %d and %d.",
+                           mBuffer[i].nRoi, mBuffer[i].nRoiTM, nRoi[0], nRoi[8]);
+                return -8201;
+            }
+
+            // count for inconsistencies
+            if (mBuffer[i].trgNum != trgNum)
+                mBuffer[i].Errors[0]++;
+            if (mBuffer[i].fadNum != fadNum)
+               mBuffer[i].Errors[1]++;
+            if (mBuffer[i].trgTyp != trgTyp)
+                mBuffer[i].Errors[2]++;
+
+            //everything seems fine so far ==> use this slot ....
+            return i;
+        }
+
+        if (evFree < 0 && mBuffer[i].evNum < 0)
+            evFree = i;
+
+        i += MAX_EVT;
+    }
+
+
+    //event does not yet exist; create it
+
+    if (evFree < 0) //no space available in ctrl
+    {
+        factPrintf(kError, 881, "No control slot to keep event %d", evID);
+        return -1;
+    }
+
+    i = evFree;                  //found free entry; use it ...
+
+    // FIXME: This should be the time of the first receiped board
+    struct timeval tv;
+    gettimeofday (&tv, NULL);
+
+    const uint32_t tsec = tv.tv_sec;
+    const uint32_t tusec = tv.tv_usec;
+
+    //check if runId already registered in runCtrl
+    evFree = -1;
+
+    uint oldest = g_actTime + 1000;
+    int jold = -1;
+
+    int found = 0;
+
+    for (int k = 0; k < MAX_RUN; k++)
+    {
+        if (runCtrl[k].runId == runID)
+        {
+            if (runCtrl[k].roi0 != nRoi[0] || runCtrl[k].roi8 != nRoi[8])
+            {
+                factPrintf(kError, 931, "Mismatch of roi within run. Expected roi=%d and roi_tm=%d, got %d and %d.",
+                           runCtrl[k].roi0, runCtrl[k].roi8, nRoi[0], nRoi[8]);
+                return -9301;
+            }
+
+            found = 1;
+            break;
+        }
+
+        if (evFree>=0)
+            continue;
+
+        //not yet used
+        if (runCtrl[k].fileId < 0)
+        {
+            evFree = k;
+            continue;
+        }
+
+        //already closed
+        if (runCtrl[k].fileId > 0 && runCtrl[k].closeTime < oldest)
+        {
             oldest = runCtrl[k].closeTime;
             jold = k;
-         }
-      }
-   }
-
-   if (evFree < 0 && jold < 0) {
-      factPrintf(kFatal, 883, "Not able to register the new run %d", runID);
-      return -1001;
-   }
-
-      if (evFree < 0)
-         evFree = jold;
-      factPrintf(kInfo, 503, "New run %d (evFree=%d) registered with roi=%d and roi_tm=%d", runID,
-                 evFree, nRoi[0], nRoi[8]);
-      runCtrl[evFree].runId = runID;
-      runCtrl[evFree].roi0 = nRoi[0];
-      runCtrl[evFree].roi8 = nRoi[8];
-      runCtrl[evFree].fileId = -2;
-      runCtrl[evFree].procId = -2;
-      runCtrl[evFree].lastEvt = -1;
-      runCtrl[evFree].nextEvt = 0;
-      runCtrl[evFree].actEvt = 0;
-      runCtrl[evFree].procEvt = 0;
-      runCtrl[evFree].maxEvt = 999999999;       //max number events allowed
-      runCtrl[evFree].firstUsec = tusec;
-      runCtrl[evFree].firstTime = runCtrl[evFree].lastTime = tsec;
-      runCtrl[evFree].closeTime = tsec + 3600 * 24;     //max time allowed
-//    runCtrl[evFree].lastTime = 0;
-
-      runTail[evFree].nEventsOk =
-         runTail[evFree].nEventsRej =
-         runTail[evFree].nEventsBad =
-         runTail[evFree].PCtime0 = runTail[evFree].PCtimeX = 0;
-
- RUNFOUND:
- //ETIENNE
-/*   needmem = sizeof (EVENT) + NPIX * nRoi[0] * 2 + NTMARK * nRoi[0] * 2;        //
-
-   headmem = NBOARDS * sizeof (PEVNT_HEADER);
-
-   if (gj.usdMem + needmem + headmem + gi_maxSize > g_maxMem) {
-      gj.maxMem = gj.usdMem + needmem + headmem + gi_maxSize;
-      if (gi_memStat > 0) {
-         gi_memStat = -99;
-         snprintf (str, MXSTR, "no memory left to keep event %6d sock %3d",
-                   evID, sk);
-         factOut (kError, 882, str);
-      } else {
-         snprintf (str, MXSTR, "no memory left to keep event %6d sock %3d",
-                   evID, sk);
-         factOut (kDebug, 882, str);
-      }
-      return -11;
-   }
-   */
-
-#ifdef THOMAS_MALLOC
-   mBuffer[i].FADhead = TGB_Malloc();
-   mBuffer[i].fEvent  = NULL;
-   mBuffer[i].buffer  = NULL;
-   if (mBuffer[i].FADhead == NULL) {
-      factPrintf(kError, 882, "malloc header failed for event %d", evID);
-      return -12;
-   }
-   mBuffer[i].fEvent = (void*)((char*)mBuffer[i].FADhead+MAX_HEAD_MEM);
+        }
+    }
+
+    if (!found)
+    {
+        if (evFree < 0 && jold < 0)
+        {
+            factPrintf(kFatal, 883, "Not able to register the new run %d", runID);
+            return -1001;
+        }
+
+        if (evFree < 0)
+            evFree = jold;
+
+        factPrintf(kInfo, 503, "New run %d (evFree=%d) registered with roi=%d and roi_tm=%d", runID,
+                   evFree, nRoi[0], nRoi[8]);
+
+        runCtrl[evFree].runId      = runID;
+        runCtrl[evFree].roi0       = nRoi[0];
+        runCtrl[evFree].roi8       = nRoi[8];
+        runCtrl[evFree].fileId     = -2;
+        runCtrl[evFree].procId     = -2;
+        runCtrl[evFree].lastEvt    = -1;
+        runCtrl[evFree].nextEvt    = 0;
+        runCtrl[evFree].actEvt     = 0;
+        runCtrl[evFree].procEvt    = 0;
+        runCtrl[evFree].maxEvt     = 999999999;       //max number events allowed
+        runCtrl[evFree].firstTime  = tsec;
+        runCtrl[evFree].firstUsec  = tusec;
+        runCtrl[evFree].lastTime   = tsec;
+        runCtrl[evFree].closeTime  = tsec + 3600 * 24;     //max time allowed
+
+        runTail[evFree].nEventsOk  = 0;
+        runTail[evFree].nEventsRej = 0;
+        runTail[evFree].nEventsBad = 0;
+        runTail[evFree].PCtime0    = 0;
+        runTail[evFree].PCtimeX    = 0;
+    }
+
+    // FIXME: Why is that done if FOUND?
+
+    //flag all boards as unused
+    mBuffer[i].nBoard = 0;
+    for (int k = 0; k < NBOARDS; k++)
+        mBuffer[i].board[k] = -1;
+
+    mBuffer[i].pcTime[0]         = tsec;
+    mBuffer[i].pcTime[1]         = tusec;
+    mBuffer[i].nRoi              = nRoi[0];
+    mBuffer[i].nRoiTM            = nRoi[8];
+    mBuffer[i].evNum             = evID;
+    mBuffer[i].runNum            = runID;
+    mBuffer[i].fadNum            = fadNum;
+    mBuffer[i].trgNum            = trgNum;
+    mBuffer[i].trgTyp            = trgTyp;
+    mBuffer[i].Errors[0]         = 0;
+    mBuffer[i].Errors[1]         = 0;
+    mBuffer[i].Errors[2]         = 0;
+    mBuffer[i].Errors[3]         = 0;
+    mBuffer[i].fEvent            = NULL;
+    mBuffer[i].buffer            = NULL;
+    mBuffer[i].FADhead           = NULL;
+
+/*
+#ifdef ETIENNE_MALLOC
+    mBuffer[i].FADhead = ETI_Malloc(evID, i);
+    mBuffer[i].buffer = NULL;
+    if (mBuffer[i].FADhead != NULL)
+        mBuffer[i].fEvent = (EVENT*)&(((char*)(mBuffer[i].FADhead))[MAX_HEAD_MEM]);
+    else
+    {
+        mBuffer[i].fEvent = NULL;
+        gj.usdMem = 0;
+        for (int k=0;k<numAllocatedChunks;k++)
+            gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
+        if (gj.usdMem > gj.maxMem)
+            gj.maxMem = gj.usdMem;
+        else
+        {
+            factPrintf(kDebug, 882, "No memory left to keep event %6d sock %3d", evID, sk);
+        }
+        return -11;
+    }
 #endif
 
+#ifdef STANDARD_MALLOC
+    mBuffer[i].FADhead = malloc (MAX_HEAD_MEM+MAX_EVT_MEM);
+    mBuffer[i].fEvent  = NULL;
+    mBuffer[i].buffer  = NULL;
+    if (mBuffer[i].FADhead == NULL)
+    {
+        factPrintf(kError, 882, "malloc header failed for event %d", evID);
+        return -12;
+    }
+    mBuffer[i].fEvent = (void*)((char*)mBuffer[i].FADhead+MAX_HEAD_MEM);
+#endif
+
 #ifdef ETIENNE_MALLOC
-   mBuffer[i].FADhead = ETI_Malloc(evID, i);
-   mBuffer[i].buffer = NULL;
-   if (mBuffer[i].FADhead != NULL)
-       mBuffer[i].fEvent = (EVENT*)&(((char*)(mBuffer[i].FADhead))[MAX_HEAD_MEM]);
-   else
-   {
-       mBuffer[i].fEvent = NULL;
-       gj.usdMem = 0;
-       for (int k=0;k<numAllocatedChunks;k++)
-           gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
-       if (gj.usdMem > gj.maxMem)
-          gj.maxMem = gj.usdMem;
-       /*if (gi_memStat > 0) {
-           gi_memStat = -99;
-           snprintf (str, MXSTR, "No memory left to keep event %6d sock %3d",
-                     evID, sk);
-           factOut (kError, 882, str);
-        }*/
-#ifdef EVTDEBUG
-       else
-       {
-           factPrintf(kDebug, 882, "No memory left to keep event %6d sock %3d", evID, sk);
-        }
+    //ETIENNE
+    //gj.usdMem += needmem + headmem + gi_maxSize;
+    gj.usdMem = 0;
+    for (int k=0;k<numAllocatedChunks;k++)
+        gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
+    //END ETIENNE
 #endif
-       return -11;
-   }
-#endif
-
-#ifdef STANDARD_MALLOC
-
-   mBuffer[i].FADhead = malloc (MAX_HEAD_MEM+MAX_EVT_MEM);
-   mBuffer[i].fEvent  = NULL;
-   mBuffer[i].buffer  = NULL;
-   if (mBuffer[i].FADhead == NULL) {
-      factPrintf(kError, 882, "malloc header failed for event %d", evID);
-      return -12;
-   }
-   mBuffer[i].fEvent = (void*)((char*)mBuffer[i].FADhead+MAX_HEAD_MEM);
-#endif
-
-   /*
-   mBuffer[i].FADhead = malloc (headmem);
-   if (mBuffer[i].FADhead == NULL) {
-      snprintf (str, MXSTR, "malloc header failed for event %d", evID);
-      factOut (kError, 882, str);
-      return -12;
-   }
-
-   mBuffer[i].fEvent = malloc (needmem);
-   if (mBuffer[i].fEvent == NULL) {
-      snprintf (str, MXSTR, "malloc data failed for event %d", evID);
-      factOut (kError, 882, str);
-      free (mBuffer[i].FADhead);
-      mBuffer[i].FADhead = NULL;
-      return -22;
-   }
-
-   mBuffer[i].buffer = malloc (gi_maxSize);
-   if (mBuffer[i].buffer == NULL) {
-      snprintf (str, MXSTR, "malloc buffer failed for event %d", evID);
-      factOut (kError, 882, str);
-      free (mBuffer[i].FADhead);
-      mBuffer[i].FADhead = NULL;
-      free (mBuffer[i].fEvent);
-      mBuffer[i].fEvent = NULL;
-      return -32;
-   }*/
-   //END ETIENNE
-   //flag all boards as unused
-   mBuffer[i].nBoard = 0;
-   for (int k = 0; k < NBOARDS; k++) {
-      mBuffer[i].board[k] = -1;
-   }
-   //flag all pixels as unused
-   for (int k = 0; k < NPIX; k++) {
-      mBuffer[i].fEvent->StartPix[k] = -1;
-   }
-   //flag all TMark as unused
-   for (int k = 0; k < NTMARK; k++) {
-      mBuffer[i].fEvent->StartTM[k] = -1;
-   }
-
-   mBuffer[i].fEvent->NumBoards = 0;
-   mBuffer[i].fEvent->PCUsec = tusec;
-   mBuffer[i].fEvent->PCTime = mBuffer[i].pcTime = tsec;
-   mBuffer[i].nRoi = nRoi[0];
-   mBuffer[i].nRoiTM = nRoi[8];
-   mBuffer[i].evNum = evID;
-   mBuffer[i].runNum = runID;
-   mBuffer[i].fadNum = fadNum;
-   mBuffer[i].trgNum = trgNum;
-   mBuffer[i].trgTyp = trgTyp;
-//   mBuffer[i].evtLen = needmem;
-   mBuffer[i].Errors[0] =
-       mBuffer[i].Errors[1] = mBuffer[i].Errors[2] = mBuffer[i].Errors[3] = 0;
-
-#ifdef ETIENNE_MALLOC
-//ETIENNE
-   //gj.usdMem += needmem + headmem + gi_maxSize;
-   gj.usdMem = 0;
-   for (int k=0;k<numAllocatedChunks;k++)
-   {
-       gj.usdMem += EtiMemoryChunks[k].nSlots * MAX_SLOT_SIZE;
-   }
-//END ETIENNE
-#endif
-
-#ifdef THOMAS_MALLOC
-   gj.usdMem = tgb_inuse;
-#endif
-
-   if (gj.usdMem > gj.maxMem)
-      gj.maxMem = gj.usdMem;
-
-   gj.bufTot++;
-   if (gj.bufTot > gj.maxEvt)
-      gj.maxEvt = gj.bufTot;
-
-   gj.rateNew++;
-
-   //register event in 'active list (reading)'
-
-   evtCtrl.evtBuf[evtCtrl.lastPtr] = i;
-   evtCtrl.evtStat[evtCtrl.lastPtr] = 0;
-   evtCtrl.pcTime[evtCtrl.lastPtr] = g_actTime;
-   evtIdx[i] = evtCtrl.lastPtr;
-
-
-#ifdef EVTDEBUG
-   factPrintf(kDebug, -11, "%5d %8d start new evt  %8d %8d sock %3d len %5d t %10d",
-              evID, runID, i, evtCtrl.lastPtr, sk, fadlen, mBuffer[i].pcTime);
-#endif
-   evtCtrl.lastPtr++;
-   evtCtrl.lastPtr %= MAX_EVT * MAX_RUN;
-
-   //gi.evtGet++;
-
-   return i;
+*/
+
+    return i;
 
 } /*-----------------------------------------------------------------*/
 
-
+void initEvent(int i)
+{
+    mBuffer[i].fEvent = (void*)((char*)mBuffer[i].FADhead+MAX_HEAD_MEM);
+
+    //flag all pixels as unused
+    for (int k = 0; k < NPIX; k++)
+        mBuffer[i].fEvent->StartPix[k] = -1;
+
+    //flag all TMark as unused
+    for (int k = 0; k < NTMARK; k++)
+        mBuffer[i].fEvent->StartTM[k] = -1;
+
+    mBuffer[i].fEvent->NumBoards = 0;
+    mBuffer[i].fEvent->PCTime    = mBuffer[i].pcTime[0];
+    mBuffer[i].fEvent->PCUsec    = mBuffer[i].pcTime[1];
+}
 
 
@@ -1027,11 +937,18 @@
     int roiPtr = sizeof(PEVNT_HEADER)/2 + 2;
 
-    roi[0] = rd[i].rBuf->S[roiPtr];
+    roi[0] = ntohs(rd[i].rBuf->S[roiPtr]);
 
     for (int jr = 0; jr < 9; jr++)
     {
-        roi[jr] = rd[i].rBuf->S[roiPtr];
-
-        if (roi[jr]!=roi[0])
+        roi[jr] = ntohs(rd[i].rBuf->S[roiPtr]);
+
+        if (roi[jr]<0 || roi[jr]>1024)
+        {
+            factPrintf(kError, 999, "Illegal roi in channel %d (allowed: 0<=roi<=1024)", jr, roi[jr]);
+            return 0;
+        }
+
+        // Check that the roi of pixels jr are compatible with the one of pixel 0
+        if (jr!=8 && roi[jr]!=roi[0])
         {
             xjr = jr;
@@ -1039,7 +956,8 @@
         }
 
+        // Check that the roi of all other DRS chips on boards are compatible
         for (int kr = 1; kr < 4; kr++)
         {
-            const int kroi = rd[i].rBuf->S[roiPtr];
+            const int kroi = ntohs(rd[i].rBuf->S[roiPtr]);
             if (kroi != roi[jr])
             {
@@ -1052,13 +970,46 @@
     }
 
-    if (xjr<0)
-        return 1;
-
-    if (xkr<0)
-        factPrintf(kFatal, 1, "Inconsistent Roi accross boards B=%d, expected %d, got %d", xjr, roi[xjr], roi[0]);
-    else
-        factPrintf(kFatal, 1, "Inconsistent Roi accross patches B=%d P=%d, expected %d, got %d", xjr, xkr, roi[xjr], rd[i].rBuf->S[roiPtr]);
-
-    return 0;
+    if (xjr>=0)
+    {
+        if (xkr<0)
+            factPrintf(kFatal, 1, "Inconsistent Roi accross chips [DRS=%d], expected %d, got %d", xjr, roi[0], roi[xjr]);
+        else
+            factPrintf(kFatal, 1, "Inconsistent Roi accross channels [DRS=%d Ch=%d], expected %d, got %d", xjr, xkr, roi[xjr], ntohs(rd[i].rBuf->S[roiPtr]));
+
+        return 0;
+    }
+
+    //const int b = i / 7;
+
+/*
+    if (roi[0]<0 || roi[0] > 1024)
+    {
+        factPrintf(kError, 999, "Illegal roi in channel 0: %d (allowed: 0<=roi<=1024)", roi[0]);
+        gj.badRoiR++;
+        gj.badRoi[b]++;
+        return 0;
+    }
+    */
+    /*
+    for (int jr = 1; jr < 8; jr++)
+    {
+        if (roi[jr] != roi[0])
+        {
+            factPrintf(kError, 711, "Mismatch of roi (%d) in channel %d with roi (%d) in channel 0.", roi[jr], jr, roi[0]);
+            gj.badRoiB++;
+            gj.badRoi[b]++;
+            return 0;
+        }
+    }
+*/
+    if (roi[8] < roi[0])
+    {
+        factPrintf(kError, 712, "Mismatch of roi (%d) in channel 8. Should be larger or equal than the roi (%d) in channel 0.", roi[8], roi[0]);
+        //gj.badRoiB++;
+        //gj.badRoi[b]++;
+        return 0;
+    }
+
+    return 1;
 }
 
@@ -1080,4 +1031,6 @@
 void copyData(int i, int evID, /*int roi,*/ int boardId)
 {
+    swapEventHeaderBytes(i);
+
     memcpy(&mBuffer[evID].FADhead[boardId].start_package_flag,
            &rd[i].rBuf->S[0], sizeof(PEVNT_HEADER));
@@ -1189,6 +1142,4 @@
    const int minLen = sizeof(PEVNT_HEADER);  //min #bytes needed to check header: full header for debug
 
-   int frst_len = sizeof(PEVNT_HEADER);  //max #bytes to read first: fad_header only, so each event must be longer, even for roi=0
-
    start.S = 0xFB01;
    stop.S = 0x04FE;
@@ -1243,9 +1194,9 @@
 #endif
       gj.bufNew = gj.bufEvt = 0;
-      gj.badRoiE = gj.badRoiR = gj.badRoiB =
-         gj.evtSkip = gj.evtWrite = gj.evtErr = 0;
-
-      for (int b = 0; b < NBOARDS; b++)
-         gj.badRoi[b] = 0;
+      //gj.badRoiE = gj.badRoiR = gj.badRoiB = 0;
+      gj.evtSkip = gj.evtWrite = gj.evtErr = 0;
+
+      //for (int b = 0; b < NBOARDS; b++)
+      //   gj.badRoi[b] = 0;
 
       mBufInit ();              //initialize buffers
@@ -1349,6 +1300,6 @@
               if (sockDef[b] > 0)
               {
-                  rd[i].bufTyp = 0;         // expect a header
-                  rd[i].bufLen = frst_len;  // max size to read at begining
+                  rd[i].bufTyp = 0;                     // expect a header
+                  rd[i].bufLen = sizeof(PEVNT_HEADER);  // max size to read at begining
               }
               else
@@ -1370,56 +1321,61 @@
 
           // Do not read from this socket
-          if (rd[i].bufLen<=0)
+          if (rd[i].bufLen<0)
               continue;
 
           //numok++;
 
-          const int32_t jrd =
-              recv(rd[i].socket, &rd[i].rBuf->B[rd[i].bufPos],
-                   rd[i].bufLen, MSG_DONTWAIT);
-
-          // recv failed
-          if (jrd<0)
+          if (rd[i].bufLen>0)
           {
-              // There was just nothing waiting
-              if (errno==EWOULDBLOCK || errno==EAGAIN)
+              const int32_t jrd =
+                  recv(rd[i].socket, &rd[i].rBuf->B[rd[i].bufPos],
+                       rd[i].bufLen, MSG_DONTWAIT);
+
+              // recv failed
+              if (jrd<0)
               {
-                  //numok--;
+                  // There was just nothing waiting
+                  if (errno==EWOULDBLOCK || errno==EAGAIN)
+                  {
+                      //numok--;
+                      continue;
+                  }
+
+                  factPrintf(kError, 442, "Reading from socket %d failed: %m (recv,rc=%d)", i, errno);
+                  //gi.gotErr[b]++;
                   continue;
               }
 
-              factPrintf(kError, 442, "Reading from socket %d failed: %m (recv,rc=%d)", i, errno);
-              //gi.gotErr[b]++;
-              continue;
+              // connection was closed ...
+              if (jrd==0)
+              {
+                  factPrintf(kInfo, 441, "Socket %d closed by FAD", i);
+
+                  const int s0 = sockDef[b] > 0 ? +1 : -1;
+                  GenSock(s0, i, 0, NULL, &rd[i]);
+
+                  //gi.gotErr[b]++;
+
+                  gi_NumConnect[b]-= cntsock ;
+                  //gi.numConn[b]--;
+                  gj.numConn[b]--;
+
+                  continue;
+              }
+              // Success (jrd > 0)
+
+              gj.rateBytes[b] += jrd;
+
+              // are we skipping this board ...
+              if (rd[i].bufTyp < 0)
+                  continue;
+
+              rd[i].bufPos += jrd;  //==> prepare for continuation
+              rd[i].bufLen -= jrd;
+
+#ifdef EVTDEBUG
+              debugRead(i, jrd, rd[i].evtID, rd[i].ftmID, rd[i].runID, rd[i].bufTyp, tv.tv_sec, tv.tv_usec); // i=socket; jrd=#bytes; ievt=eventid; 1=finished event
+#endif
           }
-
-          // connection was closed ...
-          if (jrd==0)
-          {
-              factPrintf(kInfo, 441, "Socket %d closed by FAD", i);
-
-              const int s0 = sockDef[b] > 0 ? +1 : -1;
-              GenSock(s0, i, 0, NULL, &rd[i]);
-
-              //gi.gotErr[b]++;
-
-              gi_NumConnect[b]-= cntsock ;
-              //gi.numConn[b]--;
-              gj.numConn[b]--;
-
-              continue;
-          }
-
-          // Success (jrd > 0)
-
-          //gi.gotByte[b]   += jrd;
-          gj.rateBytes[b] += jrd;
-
-          // are we skipping this board ...
-          if (rd[i].bufTyp < 0)
-              continue;
-
-          rd[i].bufPos += jrd;  //==> prepare for continuation
-          rd[i].bufLen -= jrd;
 
           // are we reading data?
@@ -1429,9 +1385,4 @@
               if (rd[i].bufLen > 0)
                   continue;
-
-              // ready to read next header
-              rd[i].bufTyp = 0;
-              rd[i].bufLen = frst_len;
-              rd[i].bufPos = 0;
 
               if (rd[i].rBuf->B[rd[i].fadLen - 1] != stop.B[0] ||
@@ -1442,10 +1393,12 @@
                              i, rd[i].evtID, rd[i].fadLen, stop.B[0], stop.B[1],
                              rd[i].rBuf->B[rd[i].fadLen - 1], rd[i].rBuf->B[rd[i].fadLen - 2]);
+
+                  // ready to read next header
+                  rd[i].bufTyp = 0;
+                  rd[i].bufLen = sizeof(PEVNT_HEADER);
+                  rd[i].bufPos = 0;
+
                   continue;
               }
-
-#ifdef EVTDEBUG
-              debugRead (i, jrd, rd[i].evtID, rd[i].ftmID, rd[i].runID, 1, tv.tv_sec, tv.tv_usec); // i=socket; jrd=#bytes; ievt=eventid; 1=finished event
-#endif
 
               //  int actid;
@@ -1458,18 +1411,56 @@
               const int evID = mBufEvt(i);
 
+              // no free entry in mBuffer, retry later
+              if (evID < 0)
+                  continue;
+
+              // If memory has not been allocated yet, allocate it
+              if (evID > 0 && mBuffer[evID].FADhead == NULL)
+              {
+                  mBuffer[evID].FADhead = TGB_Malloc();
+                  if (mBuffer[evID].FADhead == NULL)
+                  {
+                      // If this works properly, this is a hack which can be removed, or
+                      // replaced by a signal or dim message
+                      if (rd[i].bufTyp==2)
+                          factPrintf(kError, 882, "malloc failed for event %d", evID);
+                      rd[i].bufTyp = 2;
+                      continue;
+                  }
+
+                  initEvent(evID);
+
+                  // Some statistics
+                  gj.usdMem = tgb_inuse;
+
+                  if (gj.usdMem > gj.maxMem)
+                      gj.maxMem = gj.usdMem;
+
+                  gj.rateNew++;
+                  gj.bufTot++;
+                  if (gj.bufTot > gj.maxEvt)
+                      gj.maxEvt = gj.bufTot;
+
+                  //register event in 'active list (reading)'
+                  evtIdx[evID] = evtCtrl.lastPtr;
+
+                  evtCtrl.evtBuf[evtCtrl.lastPtr]  = evID;
+                  evtCtrl.evtStat[evtCtrl.lastPtr] = 0;
+                  evtCtrl.pcTime[evtCtrl.lastPtr]  = g_actTime;
+
+                  evtCtrl.lastPtr++;
+                  evtCtrl.lastPtr %= MAX_EVT * MAX_RUN;
+              }
+
+              // ready to read next header
+              rd[i].bufTyp = 0;
+              rd[i].bufLen = sizeof(PEVNT_HEADER);
+              rd[i].bufPos = 0;
+
+              // Fatal error occured. Event cannot be processed. Skip it. Start reading next header.
               if (evID < -1000)
                   continue;
 
-              // no space left, retry later
-              if (evID < 0)
-              {
-                  rd[i].bufTyp = -1;
-                  rd[i].bufLen =  0;
-                  rd[i].bufPos = rd[i].fadLen;
-                  continue;
-              }
-
               //we have a valid entry in mBuffer[]; fill it
-
               const int boardId  = b;
               const int fadBoard = rd[i].rBuf->S[12];
@@ -1489,6 +1480,5 @@
                              rd[i].rBuf->B[rd[i].fadLen - 2],
                              rd[i].rBuf->B[rd[i].fadLen - 1]);
-                  // FIXME: Is that action the right one?
-                  continue;
+                  continue; // Continue reading next header
               }
 
@@ -1533,4 +1523,6 @@
                   //gi.evtTot++;
               }
+
+              // Continue reading next header
           }
           else
@@ -1619,13 +1611,15 @@
 
               const int fadBoard = rd[i].rBuf->S[12];
-              debugHead (i, fadBoard, rd[i].rBuf);
-              debugRead (i, jrd, rd[i].evtID, rd[i].ftmID, rd[i].runID, -1, tv.tv_sec, tv.tv_usec);        // i=socket; jrd=#bytes; ievt=eventid;-1=start event
+              debugHead(i, fadBoard, rd[i].rBuf);
+
+              // Continue reading data
+
           } // end if data or header
+
       } // end for loop over all sockets
 
-      //gi.numRead[numok]++;
-
       g_actTime = time (NULL);
-      if (g_actTime <= gi_SecTime) {
+      if (g_actTime <= gi_SecTime)
+      {
           usleep(1);
           continue;
