Index: trunk/FACT++/src/EventBuilder.c
===================================================================
--- trunk/FACT++/src/EventBuilder.c	(revision 15471)
+++ trunk/FACT++/src/EventBuilder.c	(revision 15472)
@@ -1,4 +1,3 @@
-
-// // // #define EVTDEBUG
+// #define EVTDEBUG
 
 #define NUMSOCK   1          //set to 7 for old configuration
@@ -70,9 +69,6 @@
 int CloseRunFile (uint32_t runId, uint32_t closeTime, uint32_t maxEvt);
 
-
 int evtCtrl_frstPtr;
 int evtCtrl_lastPtr;
-
-
 
 int g_maxProc;
@@ -102,21 +98,7 @@
 int gw_runStat;
 
-//int gi_memStat = +1;
-
 uint32_t actrun = 0;
 
-
 uint gi_NumConnect[NBOARDS];    //4 crates * 10 boards
-
-//uint gi_EvtStart= 0 ;
-//uint gi_EvtRead = 0 ;
-//uint gi_EvtBad  = 0 ;
-//uint gi_EvtTot  = 0 ;
-//size_t gi_usedMem = 0 ;
-
-//uint gw_EvtTot  = 0 ;
-//uint gp_EvtTot  = 0 ;
-
-//PIX_MAP g_pixMap[NPIX];
 
 EVT_STAT gi;
@@ -124,7 +106,4 @@
 
 EVT_CTRL evtCtrl[MAX_EVT * MAX_RUN]; //control of events during processing
-
-//#define MXSTR 1000
-//char str[MXSTR];
 
 void factPrintf(int severity, int id, const char *fmt, ...)
@@ -195,6 +174,4 @@
 
 RUN_CTRL runCtrl[MAX_RUN];
-//RUN_TAIL runTail[MAX_RUN];
-
 
 /*
@@ -202,11 +179,10 @@
  */
 
-
 typedef union
 {
-   int8_t B[MAX_LEN];
-   int16_t S[MAX_LEN / 2];
-   int32_t I[MAX_LEN / 4];
-   int64_t L[MAX_LEN / 8];
+   uint8_t B[MAX_LEN];
+   uint16_t S[MAX_LEN / 2];
+   uint32_t I[MAX_LEN / 4];
+   uint64_t L[MAX_LEN / 8];
 } CNV_FACT;
 
@@ -216,5 +192,4 @@
    int32_t bufPos;              //next byte to read to the buffer next
    int32_t bufLen;              //number of bytes left to read
-// size_t bufLen;               //number of bytes left to read size_t might be better
    int32_t skip;                //number of bytes skipped before start of event
 
@@ -222,4 +197,5 @@
    int sockStat;                //-1 if socket not yet connected  , 99 if not exist
    int socket;                  //contains the sockets
+
    struct sockaddr_in SockAddr; //IP for each socket
 
@@ -230,5 +206,4 @@
    int fadVers;                 // Version of FAD
    int ftmTyp;                  // trigger type
-   int board;                   // boardID (softwareID: 0..40 )
    int Port;
 
@@ -236,21 +211,4 @@
 
 } READ_STRUCT;
-
-
-typedef union
-{
-   int8_t B[2];
-   int16_t S;
-} SHORT_BYTE;
-
-
-
-
-
-SHORT_BYTE start, stop;
-
-READ_STRUCT rd[MAX_SOCK];       //buffer to read IP and afterwards store in mBuffer
-
-
 
 /*-----------------------------------------------------------------*/
@@ -288,19 +246,8 @@
  */
 
-   int j;
-   int optval = 1;              //activate keepalive
-   socklen_t optlen = sizeof (optval);
-
-
-   if (sid % 7 >= NUMSOCK) {
-      //this is a not used socket, so do nothing ...
-      rs->sockStat = 77;
-      rs->rBuf = NULL ;
-      return 0;
-   }
-
-   if (rs->sockStat == 0) {     //close socket if open
-      j = close (rs->socket);
-      if (j > 0) {
+   //close socket if open
+   if (rs->sockStat == 0)
+   {
+      if (close (rs->socket) > 0) {
           factPrintf(kFatal, 771, "Closing socket %d failed: %m (close,rc=%d)", sid, errno);
       } else {
@@ -338,18 +285,19 @@
       return -2;
    }
-   optval = 1;
-   if (setsockopt (rs->socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
+
+   int optval = 1;
+   if (setsockopt (rs->socket, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(int)) < 0) {
        factPrintf(kInfo, 173, "Setting SO_KEEPALIVE for socket %d failed: %m (setsockopt,rc=%d)", sid, errno);
    }
    optval = 10;                 //start after 10 seconds
-   if (setsockopt (rs->socket, SOL_TCP, TCP_KEEPIDLE, &optval, optlen) < 0) {
+   if (setsockopt (rs->socket, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(int)) < 0) {
        factPrintf(kInfo, 173, "Setting TCP_KEEPIDLE for socket %d failed: %m (setsockopt,rc=%d)", sid, errno);
    }
    optval = 10;                 //do every 10 seconds
-   if (setsockopt (rs->socket, SOL_TCP, TCP_KEEPINTVL, &optval, optlen) < 0) {
+   if (setsockopt (rs->socket, SOL_TCP, TCP_KEEPINTVL, &optval, sizeof(int)) < 0) {
       factPrintf(kInfo, 173, "Setting TCP_KEEPINTVL for socket %d failed: %m (setsockopt,rc=%d)", sid, errno);
    }
    optval = 2;                  //close after 2 unsuccessful tries
-   if (setsockopt (rs->socket, SOL_TCP, TCP_KEEPCNT, &optval, optlen) < 0) {
+   if (setsockopt (rs->socket, SOL_TCP, TCP_KEEPCNT, &optval, sizeof(int)) < 0) {
       factPrintf(kInfo, 173, "Setting TCP_KEEPCNT for socket %d failed: %m (setsockopt,rc=%d)", sid, errno);
    }
@@ -365,34 +313,67 @@
   /*-----------------------------------------------------------------*/
 
-
-
-
-int
-mBufInit ()
-{
-// initialize mBuffer (mark all entries as unused\empty)
-
-    //uint32_t actime = g_actTime + 50000000;
-
-   for (int i = 0; i < MAX_EVT * MAX_RUN; i++) {
-      evtCtrl[i].evNum = evtCtrl[i].nRoi = -1;
-      evtCtrl[i].runNum = 0;
-
-      //evtCtrl[i].mBuffer_idx = -1;
-      evtCtrl[i].evtStat = -1;
-   }
-
-   //actRun.FADhead = malloc (NBOARDS * sizeof (PEVNT_HEADER));
-
-   evtCtrl_frstPtr = 0;
-   evtCtrl_lastPtr = 0;
-
-   return 0;
-
-} /*-----------------------------------------------------------------*/
-
-int checkRoiConsistency(int i, int roi[]);
-
-int mBufEvt(int sk)
+int checkRoiConsistency(const CNV_FACT *rbuf, int roi[])
+{
+    int xjr = -1;
+    int xkr = -1;
+
+    //points to the very first roi
+    int roiPtr = sizeof(PEVNT_HEADER)/2 + 2;
+
+    roi[0] = ntohs(rbuf->S[roiPtr]);
+
+    for (int jr = 0; jr < 9; jr++)
+    {
+        roi[jr] = ntohs(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;
+            break;
+        }
+
+        // Check that the roi of all other DRS chips on boards are compatible
+        for (int kr = 1; kr < 4; kr++)
+        {
+            const int kroi = ntohs(rbuf->S[roiPtr]);
+            if (kroi != roi[jr])
+            {
+                xjr = jr;
+                xkr = kr;
+                break;
+            }
+            roiPtr += kroi+4;
+        }
+    }
+
+    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(rbuf->S[roiPtr]));
+
+        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;
+}
+
+int mBufEvt(const READ_STRUCT *rs)
 {
 // generate a new Event into mBuffer:   
@@ -404,24 +385,18 @@
 //        < 0    if no space left
 
-//   int evFree;
-//   int headmem = 0;
-//   size_t needmem = 0;
-
     int nRoi[9];
-    if (!checkRoiConsistency(sk, nRoi))
+    if (!checkRoiConsistency(rs->rBuf, nRoi))
         return -9999;
 
-    //const int b = sk / 7;
-
-    const int  evID   = rd[sk].evtID;
-    const uint runID  = rd[sk].runID;
-    const int  trgTyp = rd[sk].ftmTyp;
-    const int  trgNum = rd[sk].ftmID;
-    const int  fadNum = rd[sk].evtID;
-
-    int beg = (evtCtrl_lastPtr + MAX_EVT*MAX_RUN - 1) % (MAX_EVT*MAX_RUN);
-    int end = (evtCtrl_frstPtr + MAX_EVT*MAX_RUN - 1) % (MAX_EVT*MAX_RUN);
-
-    for (int k=beg; k!=end; k--, k += MAX_EVT*MAX_RUN, k %= MAX_EVT*MAX_RUN)
+    const int  evID   = rs->evtID;
+    const uint runID  = rs->runID;
+    const int  trgTyp = rs->ftmTyp;
+    const int  trgNum = rs->ftmID;
+    const int  fadNum = rs->evtID;
+
+    const int beg = (evtCtrl_lastPtr + MAX_EVT*MAX_RUN - 1) % (MAX_EVT*MAX_RUN);
+    const int end = (evtCtrl_frstPtr + MAX_EVT*MAX_RUN - 1) % (MAX_EVT*MAX_RUN);
+
+    for (int k=beg; k!=end; k=(k+MAX_EVT*MAX_RUN-1)%(MAX_EVT*MAX_RUN))
     {
         // If the run is different, go on searching.
@@ -432,9 +407,7 @@
             continue;
 
-        // The event in the control structure has an event id with
-        // a lower event id than the current one. All previous events
-        // should have an even lower event id, so there is no way it
-        // can be found in the structure.
-        if (evtCtrl[k].evNum < evID/* && runID == evtCtrl[k].runNum*/)
+        // If the ID of the new event if higher than the last one stored
+        // in that run, we have to assign a new slot (leave the loop)
+        if (evID > evtCtrl[k].evNum/* && runID == evtCtrl[k].runNum*/)
             break;
 
@@ -442,5 +415,6 @@
             continue;
 
-        // is it ok ????
+        // We have found an entry with the same runID and evtID
+        // Check if ROI is consistent
         if (evtCtrl[k].nRoi != nRoi[0] || evtCtrl[k].nRoiTM != nRoi[8])
         {
@@ -462,7 +436,6 @@
     }
 
-    //event does not yet exist; create it
-
-    if (end-beg==1 || (end==0 && beg==MAX_EVT*MAX_RUN-1)) //no space available in ctrl
+    // Check if the control structure still has space left
+    if (end-beg==1 || (end==0 && beg==MAX_EVT*MAX_RUN-1))
     {
         factPrintf(kError, 881, "No control slot to keep event %d (run %d) %d %d", evID, runID, beg, end);
@@ -522,5 +495,5 @@
         }
 
-        int evFree = jold;
+        const int evFree = jold;
 
         factPrintf(kInfo, 503, "New run %d (evID=%d, evFree=%d) registered with roi=%d and roi_tm=%d",
@@ -540,4 +513,5 @@
     }
 
+    // The new entry which is populated is the one lastPtr is pointing to
     const int k = evtCtrl_lastPtr;
 
@@ -569,5 +543,5 @@
     // in two instructions. Must be done only _after_ the contents
     // have been initialized
-    evtCtrl_lastPtr = (evtCtrl_lastPtr+1) % MAX_EVT * MAX_RUN;
+    evtCtrl_lastPtr = (evtCtrl_lastPtr+1) % (MAX_EVT*MAX_RUN);
 
     return k;
@@ -706,115 +680,25 @@
 }
 
-int checkRoiConsistency(int i, int roi[])
-{
-    int xjr = -1;
-    int xkr = -1;
-
-    //points to the very first roi
-    int roiPtr = sizeof(PEVNT_HEADER)/2 + 2;
-
-    roi[0] = ntohs(rd[i].rBuf->S[roiPtr]);
-
-    for (int jr = 0; jr < 9; jr++)
+// i == board
+void copyData(CNV_FACT *rbuf, int i, int evID)
+{
+    // swapEventHeaderBytes: End of the header. to channels now
+    int eStart = 36;
+    for (int ePatchesCount = 0; ePatchesCount<4*9; ePatchesCount++)
     {
-        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;
-            break;
-        }
-
-        // Check that the roi of all other DRS chips on boards are compatible
-        for (int kr = 1; kr < 4; kr++)
-        {
-            const int kroi = ntohs(rd[i].rBuf->S[roiPtr]);
-            if (kroi != roi[jr])
-            {
-                xjr = jr;
-                xkr = kr;
-                break;
-            }
-            roiPtr += kroi+4;
-        }
+        rbuf->S[eStart+0] = ntohs(rbuf->S[eStart+0]);//id
+        rbuf->S[eStart+1] = ntohs(rbuf->S[eStart+1]);//start_cell
+        rbuf->S[eStart+2] = ntohs(rbuf->S[eStart+2]);//roi
+        rbuf->S[eStart+3] = ntohs(rbuf->S[eStart+3]);//filling
+
+        eStart += 4+rbuf->S[eStart+2];//skip the pixel data
     }
 
-    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;
-}
-
-void swapEventHeaderBytes(int i)
-{
-    //End of the header. to channels now
-    int eStart = 36;
-    for (int ePatchesCount = 0; ePatchesCount<4*9;ePatchesCount++)
-    {
-        rd[i].rBuf->S[eStart+0] = ntohs(rd[i].rBuf->S[eStart+0]);//id
-        rd[i].rBuf->S[eStart+1] = ntohs(rd[i].rBuf->S[eStart+1]);//start_cell
-        rd[i].rBuf->S[eStart+2] = ntohs(rd[i].rBuf->S[eStart+2]);//roi
-        rd[i].rBuf->S[eStart+3] = ntohs(rd[i].rBuf->S[eStart+3]);//filling
-
-        eStart += 4+rd[i].rBuf->S[eStart+2];//skip the pixel data
-    }
-}
-
-void copyData(int i, int evID, /*int roi,*/ int boardId)
-{
-    swapEventHeaderBytes(i);
-
-    memcpy(&evtCtrl[evID].FADhead[boardId].start_package_flag,
-           &rd[i].rBuf->S[0], sizeof(PEVNT_HEADER));
+    memcpy(&evtCtrl[evID].FADhead[i], rbuf, sizeof(PEVNT_HEADER));
 
     int src = sizeof(PEVNT_HEADER) / 2;
 
     // consistency of ROIs have been checked already (is it all correct?)
-    const int roi = rd[i].rBuf->S[src+2];
+    const int roi = rbuf->S[src+2];
 
     // different sort in FAD board.....
@@ -826,9 +710,9 @@
             src++;
 
-            const int pixC = rd[i].rBuf->S[src++];    // start-cell
-            const int pixR = rd[i].rBuf->S[src++];    // roi
+            const int pixC = rbuf->S[src++];    // start-cell
+            const int pixR = rbuf->S[src++];    // roi
             //here we should check if pixH is correct ....
 
-            const int pixS = boardId * 36 + drs * 9 + px;
+            const int pixS = i * 36 + drs * 9 + px;
             src++;
 
@@ -836,6 +720,5 @@
 
             const int dest1 = pixS * roi;
-            memcpy(&evtCtrl[evID].fEvent->Adc_Data[dest1],
-                   &rd[i].rBuf->S[src], roi * 2);
+            memcpy(&evtCtrl[evID].fEvent->Adc_Data[dest1], &rbuf->S[src], roi * 2);
 
             src += pixR;
@@ -843,5 +726,5 @@
             if (px == 8)
             {
-                const int tmS = boardId * 4 + drs;
+                const int tmS = i * 4 + drs;
 
                 //and we have additional TM info
@@ -853,17 +736,9 @@
                     evtCtrl[evID].fEvent->StartTM[tmS] = (pixC + pixR - roi) % 1024;
 
-                    memcpy(&evtCtrl[evID].fEvent->Adc_Data[dest2],
-                           &rd[i].rBuf->S[srcT], roi * 2);
+                    memcpy(&evtCtrl[evID].fEvent->Adc_Data[dest2], &rbuf->S[srcT], roi * 2);
                 }
                 else
                 {
                     evtCtrl[evID].fEvent->StartTM[tmS] = -1;
-
-                    //ETIENNE because the TM channels are always processed during drs calib,
-                    //set them to zero if they are not present
-                    //I suspect that it may be more efficient to set all the allocated mem to
-                    //zero when allocating it
-                    //  dest = tmS*roi[0] + NPIX*roi[0];
-                    //  bzero(&mBuffer[evID].fEvent->Adc_Data[dest],roi[0]*2);
                 }
             }
@@ -873,26 +748,4 @@
 
 
-void
-initReadFAD ()
-{
-   return;
-} /*-----------------------------------------------------------------*/
-
-//struct rnd
-//{
-//    int val;
-//    int idx;
-//};
-//
-//struct rnd random_arr[MAX_SOCK];
-//
-//int compare(const void *f1, const void *f2)
-//{
-//    struct rnd *r1 = (struct rnd*)f1;
-//    struct rnd *r2 = (struct rnd*)f2;
-//    return r1->val - r2->val;
-//}
-
-
 void *readFAD (void *ptr)
 {
@@ -901,24 +754,10 @@
     factPrintf(kInfo, -1, "Start initializing (readFAD)");
 
-//   int cpu = 7;                 //read thread
-//   cpu_set_t mask;
-
-/* CPU_ZERO initializes all the bits in the mask to zero. */
-//   CPU_ZERO (&mask);
-/* CPU_SET sets only the bit corresponding to cpu. */
-//   cpu = 7;
-//   CPU_SET (cpu, &mask);
-
-/* sched_setaffinity returns 0 in success */
-//   if (sched_setaffinity (0, sizeof (mask), &mask) == -1) {
-//      snprintf (str, MXSTR, "W ---> can not create affinity to %d", cpu);
-//      factOut (kWarn, -1, str);
-//   }
-
+    READ_STRUCT rd[NBOARDS];       //buffer to read IP and afterwards store in mBuffer
 
    const int minLen = sizeof(PEVNT_HEADER);  //min #bytes needed to check header: full header for debug
 
-   start.S = 0xFB01;
-   stop.S = 0x04FE;
+   //start.S = 0xFB01;
+   //stop.S = 0x04FE;
 
 /* initialize run control logics */
@@ -944,5 +783,5 @@
    if (gi_resetS > 0) {
       //make sure all sockets are preallocated as 'not exist'
-      for (int i = 0; i < MAX_SOCK; i++) {
+      for (int i = 0; i < NBOARDS; i++) {
          rd[i].socket = -1;
          rd[i].sockStat = 99;
@@ -960,18 +799,22 @@
    }
 
-
-   if (gi_resetR > 0) {
-      //resetEvtStat ();
-      gj.bufTot = gj.maxEvt = gj.xxxEvt = 0;
-      gj.usdMem = gj.maxMem = gj.xxxMem = 0;
-      gj.totMem = tgb_memory;
-      gj.bufNew = gj.bufEvt = 0;
-      //gj.badRoiE = gj.badRoiR = gj.badRoiB = 0;
+   if (gi_resetR > 0)
+   {
+      gj.bufTot  = gj.maxEvt = gj.xxxEvt = 0;
+      gj.usdMem  = gj.maxMem = gj.xxxMem = 0;
+      gj.totMem  = tgb_memory;
+      gj.bufNew  = gj.bufEvt = 0;
       gj.evtSkip = gj.evtWrite = gj.evtErr = 0;
 
-      //for (int b = 0; b < NBOARDS; b++)
-      //   gj.badRoi[b] = 0;
-
-      mBufInit ();              //initialize buffers
+      // initialize mBuffer (mark all entries as unused\empty)
+      for (int i = 0; i < MAX_EVT * MAX_RUN; i++)
+      {
+          evtCtrl[i].evNum = evtCtrl[i].nRoi = -1;
+          evtCtrl[i].runNum = 0;
+          evtCtrl[i].evtStat = -1;
+      }
+
+      evtCtrl_frstPtr = 0;
+      evtCtrl_lastPtr = 0;
 
       factPrintf(kInfo, -1, "End   initializing (readFAD)");
@@ -1013,7 +856,5 @@
           const int p0 = s0==0 ? ntohs (g_port[b].sockAddr.sin_port) : 0;
 
-          int k = b * 7;
-          for (int p = p0 + 1; p < p0 + 8; p++, k++)
-              GenSock (s0, k, p, &g_port[b].sockAddr, &rd[k]); //generate address and socket
+          GenSock(s0, b, p0+1, &g_port[b].sockAddr, &rd[b]); //generate address and socket
 
           sockDef[b] = g_port[b].sockDef;
@@ -1026,32 +867,10 @@
               actBoards++;
 
-      //count number of succesfull actions
-//      int numok = 0;
-
-/*
-      for (i=0; i<MAX_SOCK/7; i++)
-      {
-          random_arr[i].val = rand();
-          random_arr[i].idx = i;
-      }
-
-      qsort(random_arr, MAX_SOCK/7, sizeof(struct rnd), compare);
-
-      for (int iii = 0; iii < MAX_SOCK/7; iii++) {  //check all sockets if something to read
-
-      b = random_arr[iii].idx;
-      i = b*7;
-      p = 0;
-      */
-
       //check all sockets if something to read
-      for (int i = 0; i < MAX_SOCK; i+=7)
+      for (int i = 0; i < NBOARDS; i++)
       {
           // Do not try to connect this socket
           if (rd[i].sockStat > 0)
               continue;
-
-          const int board = i / 7 ;
-          //const int p = i % 7 ;
 
           if (rd[i].sockStat == -1)
@@ -1071,5 +890,5 @@
               // Success (rd[i].sockStat == 0)
 
-              if (sockDef[board] > 0)
+              if (sockDef[i] > 0)
               {
                   rd[i].bufTyp = 0;                     // expect a header
@@ -1085,10 +904,8 @@
               rd[i].skip   = 0;  //  start empty
 
-              gi_NumConnect[board] += cntsock;
-
-              //gi.numConn[b]++;
-              gj.numConn[board]++;
-
-              factPrintf(kInfo, -1, "New connection %d (number of connections: %d)", board, gj.numConn[board]);
+              gi_NumConnect[i] += cntsock;
+              gj.numConn[i]++;
+
+              factPrintf(kInfo, -1, "New connection %d (number of connections: %d)", i, gj.numConn[i]);
           }
 
@@ -1125,12 +942,12 @@
                   factPrintf(kInfo, 441, "Socket %d closed by FAD", i);
 
-                  const int s0 = sockDef[board] > 0 ? +1 : -1;
+                  const int s0 = sockDef[i] > 0 ? +1 : -1;
                   GenSock(s0, i, 0, NULL, &rd[i]);
 
                   //gi.gotErr[b]++;
 
-                  gi_NumConnect[board]-= cntsock ;
+                  gi_NumConnect[i]-= cntsock ;
                   //gi.numConn[b]--;
-                  gj.numConn[board]--;
+                  gj.numConn[i]--;
 
                   continue;
@@ -1138,5 +955,5 @@
               // Success (jrd > 0)
 
-              gj.rateBytes[board] += jrd;
+              gj.rateBytes[i] += jrd;
 
               // are we skipping this board ...
@@ -1166,5 +983,6 @@
               for (k = 0; k < rd[i].bufPos - 1; k++)
               {
-                  if (rd[i].rBuf->B[k] == start.B[1] && rd[i].rBuf->B[k+1] == start.B[0])
+                  //start.S = 0xFB01;
+                  if (rd[i].rBuf->B[k] == 0xfb && rd[i].rBuf->B[k+1] == 0x01)
                       break;
               }
@@ -1228,5 +1046,5 @@
               rd[i].ftmID   = rd[i].rBuf->I[3];    //(FTMevt)
               rd[i].evtID   = rd[i].rBuf->I[4];    //(FADevt)
-              rd[i].runID   = rd[i].rBuf->I[11]==0 ? (int)g_actTime : rd[i].rBuf->I[11];
+              rd[i].runID   = rd[i].rBuf->I[11]==0 ? g_actTime : rd[i].rBuf->I[11];
               rd[i].bufTyp  = 1;  //ready to read full record
               rd[i].bufLen  = rd[i].fadLen - rd[i].bufPos;
@@ -1244,10 +1062,11 @@
               continue;
 
-          if (rd[i].rBuf->B[rd[i].fadLen - 1] != stop.B[0] ||
-              rd[i].rBuf->B[rd[i].fadLen - 2] != stop.B[1])
+          // stop.S = 0x04FE;
+          if (rd[i].rBuf->B[rd[i].fadLen - 1] != 0xfe ||
+              rd[i].rBuf->B[rd[i].fadLen - 2] != 0x04)
           {
               //gi.evtErr++;
-              factPrintf(kError, 301, "End-of-event flag wrong on socket %3d for event %4d (len=%5d), expected %3d %3d, got %3d %3d",
-                         i, rd[i].evtID, rd[i].fadLen, stop.B[0], stop.B[1],
+              factPrintf(kError, 301, "End-of-event flag wrong on socket %3d for event %4d (len=%5d), got %3d %3d",
+                         i, rd[i].evtID, rd[i].fadLen,
                          rd[i].rBuf->B[rd[i].fadLen - 1], rd[i].rBuf->B[rd[i].fadLen - 2]);
 
@@ -1267,5 +1086,5 @@
 
           //get index into mBuffer for this event (create if needed)
-          const int idx = mBufEvt(i);
+          const int idx = mBufEvt(&rd[i]);
 
           // no free entry in mBuffer, retry later
@@ -1316,14 +1135,14 @@
           const int fadCrate = fadBoard>>8;
 
-          if (board != (fadCrate * 10 + (fadBoard&0xff)))
+          if (i != (fadCrate * 10 + (fadBoard&0xff)))
           {
               factPrintf(kWarn, 301, "Board ID mismatch. Expected %d, got %d (C=%d, B=%d)",
-                         board, fadBoard, fadCrate, fadBoard&0xff);
+                         i, fadBoard, fadCrate, fadBoard&0xff);
           }
 
-          if (evtCtrl[idx].board[board] != -1)
+          if (evtCtrl[idx].board[i] != -1)
           {
               factPrintf(kWarn, 501, "Got event %5d from board %3d (i=%3d, len=%5d) twice: Starts with %3d %3d - ends with %3d %3d",
-                         evtCtrl[idx].evNum, board, i, rd[i].fadLen,
+                         evtCtrl[idx].evNum, i, i, rd[i].fadLen,
                          rd[i].rBuf->B[0], rd[i].rBuf->B[1],
                          rd[i].rBuf->B[rd[i].fadLen - 2],
@@ -1333,10 +1152,10 @@
 
           // Copy data from rd[i] to mBuffer[evID]
-          copyData(i, idx, board);
+          copyData(rd[i].rBuf, i, idx);
 
           // now we have stored a new board contents into Event structure
 
           evtCtrl[idx].fEvent->NumBoards++;
-          evtCtrl[idx].board[board] = board;
+          evtCtrl[idx].board[i] = i;
           evtCtrl[idx].nBoard++;
           evtCtrl[idx].evtStat = evtCtrl[idx].nBoard;
@@ -1392,15 +1211,17 @@
           continue;
       }
-
       gi_SecTime = g_actTime;
 
-      gj.bufNew = gj.bufEvt = 0;
+      gj.bufNew = 0;
 
       //loop over all active events and flag those older than read-timeout
       //delete those that are written to disk ....
+
+      const int count = (evtCtrl_lastPtr-evtCtrl_frstPtr+MAX_EVT*MAX_RUN)%(MAX_EVT*MAX_RUN);
+
       for (int k0=evtCtrl_frstPtr; k0!=evtCtrl_lastPtr; k0++, k0 %= MAX_EVT*MAX_RUN)
       {
           // Check the more likely case first: incomplete events
-          if (evtCtrl[k0].evtStat>0 && evtCtrl[k0].evtStat<92)
+          if (evtCtrl[k0].evtStat>=0 && evtCtrl[k0].evtStat<92)
           {
               gj.bufNew++;     //incomplete event in Buffer
@@ -1410,4 +1231,7 @@
                   continue;
 
+              // This will result in the emission of a dim service.
+              // It doesn't matter if that takes comparably long,
+              // because we have to stop the run anyway.
               reportIncomplete(k0);
 
@@ -1420,6 +1244,6 @@
 
           // complete event in Buffer
-          if (evtCtrl[k0].evtStat >= 95)
-              gj.bufEvt++;
+          //if (evtCtrl[k0].evtStat >= 95)
+          //    gj.bufEvt++;
 
           // Check the less likely case: 'useless' or 'delete'
@@ -1432,5 +1256,5 @@
 
               if (k0==evtCtrl_frstPtr)
-                  evtCtrl_frstPtr = (evtCtrl_frstPtr+1) % MAX_EVT * MAX_RUN;
+                  evtCtrl_frstPtr = (evtCtrl_frstPtr+1) % (MAX_EVT*MAX_RUN);
               else
                   factPrintf(kError, -1, "Freed a non-first slot");
@@ -1438,7 +1262,18 @@
               gj.evtWrite++;
               gj.rateWrite++;
+
+              continue;
           }
 
+          // The first events in the queue are either incomplete or
+          // can be deleted (processing finished). As soon as we reach the
+          // first complete events which processing is pending, we can stop.
+          // All other events (if everything works well) must have the same state.
+          break;
       }
+
+      // The number of complete events in the buffer is the total number of
+      // events in the buffer minus the number of incomplete events.
+      gj.bufEvt = count - gj.bufNew;
 
       gj.deltaT = 1000;      //temporary, must be improved
@@ -1455,5 +1290,5 @@
 
       factStat (gj);
-      factStatNew (gi);
+      //factStatNew (gi);
       gj.rateNew = gj.rateWrite = 0;
       gj.maxMem = gj.usdMem;
@@ -1494,5 +1329,5 @@
        factPrintf(kInfo, -1, "Close all sockets...");
 
-       for (int i = 0; i < MAX_SOCK; i++)
+       for (int i = 0; i < NBOARDS; i++)
        {
            if (rd[i].sockStat != 0)
@@ -1500,12 +1335,9 @@
 
            GenSock(-1, i, 0, NULL, &rd[i]);   //close and destroy open socket
-           if (i%7)
-               continue;
-
-           gi_NumConnect[i / 7]-= cntsock ;
-           //gi.numConn[i / 7]--;
-           gj.numConn[i / 7]--;
-           sockDef[i / 7] = 0;      //flag ro recreate the sockets ...
-           rd[i / 7].sockStat = -1; //and try to open asap
+
+           gi_NumConnect[i]-= cntsock ;
+           gj.numConn[i]--;
+           sockDef[i] = 0;      //flag ro recreate the sockets ...
+           rd[i].sockStat = -1; //and try to open asap
        }
    }
@@ -1514,54 +1346,23 @@
    if (gi_resetR > 0)
    {
-       //flag all events as 'read finished'
-      for (int k0=evtCtrl_frstPtr; k0!=evtCtrl_lastPtr; k0++, k0 %= MAX_EVT*MAX_RUN)
-      {
-           if (evtCtrl[k0].evtStat > 0 && evtCtrl[k0].evtStat < 90)
+       //and clear all buffers (might have to wait until all others are done)
+       while (evtCtrl_frstPtr!=evtCtrl_lastPtr)
+       {
+           const int k0=evtCtrl_frstPtr;
+
+           // flag incomplete events as 'read finished'
+           if (evtCtrl[k0].evtStat>0 && evtCtrl[k0].evtStat < 90)
+               evtCtrl[k0].evtStat = 91;
+
+           if (evtCtrl[k0].evtStat==0 || evtCtrl[k0].evtStat>900)
            {
-               evtCtrl[k0].evtStat = 91;
-               //gi.evtSkp++;
-               //gi.evtTot++;
+               mBufFree(k0);   //event written--> free memory
+               evtCtrl[k0].evtStat = -1;
+
+               evtCtrl_frstPtr = (evtCtrl_frstPtr+1) % (MAX_EVT*MAX_RUN);
            }
+
+           usleep(1);
        }
-
-      //and clear all buffers (might have to wait until all others are done)
-      // If minclear is 0, an event could be deleted while writing is still ongoing
-      /*
-      int minclear;
-      if (gi_resetR == 1) {
-         minclear = 900;
-         factPrintf(kInfo, -1, "Drain all buffers ...");
-      } else {
-         minclear = 0;
-         factPrintf(kInfo, -1, "Flush all buffers ...");
-      }*/
-      const int minclear = 900;
-
-      int numclear = 1;
-      while (numclear > 0)
-      {
-         numclear = 0;
-
-         for (int k0=evtCtrl_frstPtr; k0!=evtCtrl_lastPtr; k0++, k0 %= MAX_EVT*MAX_RUN)
-         {
-             if (evtCtrl[k0].evtStat==0 || evtCtrl[k0].evtStat > minclear)
-             {
-                 mBufFree(k0);   //event written--> free memory
-                 evtCtrl[k0].evtStat = -1;
-
-                 if (k0==evtCtrl_frstPtr)
-                     evtCtrl_frstPtr = (evtCtrl_frstPtr+1) % MAX_EVT * MAX_RUN;
-                 else
-                     factPrintf(kError, -1, "Freed a non-first slot");
-
-                 continue;
-             }
-
-             if (evtCtrl[k0].evtStat > 0)
-                 numclear++;      //writing is still ongoing...
-         }
-
-         usleep(1);
-      }
    }
 
@@ -1586,5 +1387,5 @@
    factPrintf(kInfo, -1, "Exit read Process...");
 
-   factPrintf(kInfo, -1, "%ld Bytes flaged as in-use.", tgb_inuse);
+   factPrintf(kInfo, -1, "%ld Bytes flagged as in-use.", tgb_inuse);
 
    gi_runStat = -99;
@@ -2015,8 +1816,6 @@
            }
 
-           const int id = k0;//evtCtrl[k0].mBuffer_idx;
-
-           const uint32_t irun = evtCtrl[id].runNum;
-           const int32_t  ievt = evtCtrl[id].evNum;
+           const uint32_t irun = evtCtrl[k0].runNum;
+           const int32_t  ievt = evtCtrl[k0].evNum;
 
            // Find entry in runCtrl which belongs to the event mBuffer[id]
@@ -2032,5 +1831,5 @@
                if (j>=MAX_RUN)
                {
-                   factPrintf(kFatal, 901, "writeEvt: Can not find run %d for event %d in %d", irun, ievt, id);
+                   factPrintf(kFatal, 901, "writeEvt: Can not find run %d for event %d in %d", irun, ievt, k0);
                    // FIXME: What is the right action?
                    continue;
@@ -2046,13 +1845,13 @@
                actRun.Version =  1;
                actRun.RunType = -1;  //to be adapted
-               actRun.Nroi    = evtCtrl[id].nRoi;     //runCtrl[lastRun].roi0;
-               actRun.NroiTM  = evtCtrl[id].nRoiTM;   //runCtrl[lastRun].roi8;
-               actRun.RunTime = evtCtrl[id].pcTime[0];//runCtrl[lastRun].firstTime;
-               actRun.RunUsec = evtCtrl[id].pcTime[1];//runCtrl[lastRun].firstUsec;
+               actRun.Nroi    = evtCtrl[k0].nRoi;     //runCtrl[lastRun].roi0;
+               actRun.NroiTM  = evtCtrl[k0].nRoiTM;   //runCtrl[lastRun].roi8;
+               actRun.RunTime = evtCtrl[k0].pcTime[0];//runCtrl[lastRun].firstTime;
+               actRun.RunUsec = evtCtrl[k0].pcTime[1];//runCtrl[lastRun].firstUsec;
                actRun.NBoard  = NBOARDS;
                actRun.NPix    = NPIX;
                actRun.NTm     = NTMARK;
 
-               memcpy(actRun.FADhead, evtCtrl[id].FADhead, NBOARDS * sizeof (PEVNT_HEADER));
+               memcpy(actRun.FADhead, evtCtrl[k0].FADhead, NBOARDS * sizeof (PEVNT_HEADER));
 
                runCtrl[lastRun].fileHd = runOpen (irun, &actRun, sizeof (actRun));
@@ -2084,6 +1883,6 @@
            if (runCtrl[lastRun].fileId==0)
            {
-               const int rc = runWrite(runCtrl[lastRun].fileHd, evtCtrl[id].fEvent,
-                                       sizeof (evtCtrl[id]));
+               const int rc = runWrite(runCtrl[lastRun].fileHd, evtCtrl[k0].fEvent,
+                                       0/*sizeof (evtCtrl[k0])*/);
                if (rc >= 0)
                {
