Index: /drsdaq/DAQReadout.cc
===================================================================
--- /drsdaq/DAQReadout.cc	(revision 43)
+++ /drsdaq/DAQReadout.cc	(revision 44)
@@ -74,5 +74,4 @@
   FirstBoard		= 0;
   LastBoard		= -1;
-  snprintf(Source,sizeof(Source),"DUMMY");
   
   // Read configuration file
@@ -206,5 +205,5 @@
 void DAQReadout::cmd_events() {
   if(daq_state != active) PrintMessage("DAQ not active.\n");
-  else PrintMessage("Current number of events: %d\n", NumEvents);
+  else PrintMessage("Current number of events: %d (of %d requested)\n", NumEvents, NumEventsRequested);
 } 
 
@@ -254,6 +253,7 @@
   if (NParam==4) {
     NumEventsRequested = atoi(Param[2]);
-    strcpy(Source, Param[3]);
-  }
+    strncpy(RHeader->Description, Param[3], sizeof(RHeader->Description));
+  }
+  else snprintf(RHeader->Description,sizeof(RHeader->Description),"DUMMY");
 
   // Determine new run number using the file RUN_NUM_FILE
@@ -463,5 +463,5 @@
  	        " DAQ: %s\n"
   	        " Run number: %d\n"
- 	        " Run type: %c\n"
+ 	        " Run type: %s\n"
 	        " Event: %d\n"
       	        " Requested events per run: %d\n"
@@ -472,5 +472,5 @@
 	        " Active CMC boards: %d\n",
       daq_state_str[daq_state], daq_state==active ? (int) RunNumber:-1,
-      daq_runtype_str[daq_runtype][0], NumEvents,
+      daq_runtype_str[daq_runtype], NumEvents,
       NumEventsRequested, fRawDataPath,
       CheckDisk(fRawDataPath), Socket==-1 ? "disconnected":"connected",
@@ -882,5 +882,5 @@
   // Generate filename
   snprintf(FileName,sizeof(FileName),"%s/%s/%s_%.8u_%s_%c_%d.raw", fRawDataPath, RunDate,
-    RunDate,RunNumber,Source,daq_runtype_str[daq_runtype][0],FileNumber);
+    RunDate,RunNumber,RHeader->Description,daq_runtype_str[daq_runtype][0],FileNumber);
  
   //  Open file with rwx right for owner and group, never overwrite file
@@ -896,34 +896,22 @@
 bool DAQReadout::WriteRunHeader() {
 
-  time_t time_now_secs;
-  struct tm *time_now;
+  struct timeval Time;
 
   RHeader->MagicNum = MAGICNUM_OPEN;
-  RHeader->DataFormat 	= DATA_FORMAT;
+  RHeader->DataFormat = DATA_FORMAT;
+  RHeader->SoftwareRevision = atoi(REVISION);
+
   RHeader->RunHeaderSize = sizeof(RunHeader);
   RHeader->EventHeaderSize = sizeof(EventHeader);
   RHeader->BoardStructureSize = sizeof(BoardStructure);
-  strcpy(RHeader->DAQVersion,   __DATE__);
-
-  strcpy(RHeader->Source,       Source);
-  RHeader->Type = daq_runtype_str[daq_runtype][0];
+
+  RHeader->Type = daq_runtype;
   RHeader->RunNumber  = RunNumber;
   RHeader->FileNumber = FileNumber;
 
-  time(&time_now_secs);
-  time_now = localtime(&time_now_secs);
-  
-  RHeader->StartYear   = 1900 + time_now->tm_year;
-  RHeader->StartMonth  = 1 + time_now->tm_mon;
-  RHeader->StartDay    = time_now->tm_mday;
-  RHeader->StartHour   = time_now->tm_hour;
-  RHeader->StartMinute = time_now->tm_min;
-  RHeader->StartSecond = time_now->tm_sec;
-  
-  RHeader->SourceRA     = -1;    
-  RHeader->SourceDEC    = -1;   
-  RHeader->TelescopeRA  = -1; 
-  RHeader->TelescopeDEC = -1;
-
+  gettimeofday(&Time, NULL);
+  RHeader->StartSecond = Time.tv_sec;
+  RHeader->StartMicrosecond = Time.tv_usec;
+  
   RHeader->NCMCBoards = NumCMCBoards==0 && daq_runtype==test ? 1 : (LastBoard - FirstBoard) + 1;  
   RHeader->NChips     = kNumberOfChips;
@@ -958,22 +946,15 @@
 }
 
-// Update the run header
+// Update the run header before closing file
 bool DAQReadout::UpdateRunHeader(unsigned int Events, bool Error) {
 
-  time_t time_now_secs;
-  struct tm *time_now;
+  struct timeval Time;
   
   RHeader->MagicNum = Error==false ? MAGICNUM_CLOSED:MAGICNUM_ERROR;
   RHeader->Events   = Events;
 
-  time(&time_now_secs);
-  time_now = localtime(&time_now_secs);
-  
-  RHeader->EndYear     = 1900 + time_now->tm_year;
-  RHeader->EndMonth    = 1 + time_now->tm_mon;
-  RHeader->EndDay      = time_now->tm_mday;
-  RHeader->EndHour     = time_now->tm_hour;
-  RHeader->EndMinute   = time_now->tm_min;
-  RHeader->EndSecond   = time_now->tm_sec;
+  gettimeofday(&Time, NULL);
+  RHeader->EndSecond = Time.tv_sec;
+  RHeader->EndMicrosecond = Time.tv_usec;
 
   if(lseek(Rawfile,0,SEEK_SET)==-1) {
@@ -996,8 +977,9 @@
   gettimeofday(&Time, NULL);
   
-  strcpy(EHeader->Name,"EVTH");
   EHeader->EventNumber = NumEvents;
-  EHeader->TriggerType = 0XFFFF;
-  EHeader->TimeSec = Time.tv_sec + (float) Time.tv_usec/1000000.;
+  EHeader->TriggerType = 0x0;
+  EHeader->Seconds = Time.tv_sec;
+  EHeader->Microseconds = Time.tv_usec;
+  EHeader->EventSize = sizeof(short)*RHeader->NCMCBoards*RHeader->NChips*RHeader->NChannels*RHeader->Samples;
 
   if(write(Rawfile, EHeader, sizeof(EventHeader)) != sizeof(EventHeader)) {
@@ -1173,5 +1155,5 @@
   gettimeofday(&StartTime, NULL);
 
-  m->PrintMessage("\rStarting run #%d (%s) on \"%s\" with %u event(s)\n",m->RunNumber,daq_runtype_str[m->daq_runtype],m->Source,m->NumEventsRequested);
+  m->PrintMessage("\rStarting run #%d (%s) on \"%s\" with %u event(s)\n",m->RunNumber,daq_runtype_str[m->daq_runtype],m->RHeader->Description,m->NumEventsRequested);
   do {
     // Check if enough disk space is left
@@ -1253,5 +1235,5 @@
     m->PrintMessage("\rRun #%d (%s) %s, %d events\n",m->RunNumber,daq_runtype_str[m->daq_runtype],(m->NumEvents == m->NumEventsRequested) ? "completed":"stopped",m->NumEvents);
     m->SlowDataClass->NewEntry("Runinfo");
-    m->SlowDataClass->AddToEntry("%d %s %s %d",m->RunNumber,daq_runtype_str[m->daq_runtype],m->Source,m->NumEvents);
+    m->SlowDataClass->AddToEntry("%d %s %s %d %d",m->RunNumber,daq_runtype_str[m->daq_runtype],m->RHeader->Description,m->NumEvents,m->FileNumber);
   }
   else m->PrintMessage("\rRun #%d (%s) aborted due to error after %d events\n",m->RunNumber,daq_runtype_str[m->daq_runtype],m->NumEvents);
Index: /drsdaq/DAQReadout.h
===================================================================
--- /drsdaq/DAQReadout.h	(revision 43)
+++ /drsdaq/DAQReadout.h	(revision 44)
@@ -80,5 +80,4 @@
     unsigned int NumEventsRequested;	// Number of events requested
     unsigned int RunNumber, FileNumber; 
-    char Source[32];
     char FileName[MAX_PATH];
 
Index: /drsdaq/HVFeedback.cc
===================================================================
--- /drsdaq/HVFeedback.cc	(revision 43)
+++ /drsdaq/HVFeedback.cc	(revision 44)
@@ -55,5 +55,5 @@
   PrintConfig();
 
-  // Initialise
+  // Initialise with zero content
   Average    = new float [m->NumCMCBoards][kNumberOfChips][kNumberOfChannels]();
   Sigma      = new float [m->NumCMCBoards][kNumberOfChips][kNumberOfChannels]();
@@ -62,11 +62,4 @@
   Buffer     = new float [m->NumCMCBoards][kNumberOfChips][kNumberOfChannels]();  
 
-/*   for (int i=m->FirstBoard; i<=m->LastBoard; i++)
-    for (int j=0; j<kNumberOfChips; j++)
-      for (int k=0; k<kNumberOfChannels; k++) {
-        Response[i][j][k] = 0.0;
-    	Target[i][j][k] = 0.0;
-      } 
- */
   Gain = 1;
   SetFBMode(FB_Off);
Index: /drsdaq/History.txt
===================================================================
--- /drsdaq/History.txt	(revision 43)
+++ /drsdaq/History.txt	(revision 44)
@@ -24,2 +24,6 @@
 	    will let run go until stopped manually. Feedback writes slow data.
 29/4/2009   DAQ writes run summary to slow data file.
+14/5/2009   Streamlined raw data format.
+18/5/2009   Included some version and size checking in RawDataCTX.cc.
+19/5/2009   Subversion revision number included in run header. Added human readable
+    	    date and time to slow data. 
Index: /drsdaq/Makefile
===================================================================
--- /drsdaq/Makefile	(revision 43)
+++ /drsdaq/Makefile	(revision 44)
@@ -12,6 +12,7 @@
 SOURCES = HVFeedback.cc DAQReadout.cc RawDataCTX.cc SlowData.cc ../pixelmap/Pixel.cc ../pixelmap/PixelMap.cc DRS/DRS.cc DRS/mxml.c DRS/strlcpy.c drsdaq.cpp
 OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
+INCDIRS   = -I. -IDRS -I../pixelmap
 
-INCDIRS   = -I. -IDRS -I../pixelmap
+REVISION = $(shell svnversion -n)
 
 ifeq ($(VMECTRL),-DCT_VME)
@@ -24,6 +25,5 @@
 endif
 
-CFLAGS = -pipe -fthread-jumps -funroll-all-loops -O3 -Wall -DOS_LINUX
-CPPFLAGS = -pipe -fPIC -fthread-jumps -funroll-all-loops -O3 -Wall -DOS_LINUX $(VMECTRL)
+CPPFLAGS = -DREVISION='"$(REVISION)"' -O3 -Wall $(VMECTRL)
 LIBS = -lstdc++ -lz -lpthread -lutil -lfl $(VMELIB)
 
@@ -41,5 +41,5 @@
 
 %.o : %.c
-	$(CC) $(CFLAGS) $(INCDIRS) -c -o $@ $<
+	$(CC) $(CPPFLAGS) $(INCDIRS) -c -o $@ $<
 %.o : %.cc
 	$(CC) $(CPPFLAGS) $(INCDIRS) -c -o $@ $<
Index: /drsdaq/RawDataCTX.cc
===================================================================
--- /drsdaq/RawDataCTX.cc	(revision 43)
+++ /drsdaq/RawDataCTX.cc	(revision 44)
@@ -48,11 +48,26 @@
     return CTX_RHEADER;  
   }
+  // Check if version of this software is not older than raw data format
+  if (RHeader->DataFormat > DATA_FORMAT) {
+    if(!Silent) printf("Error: Data format too new, incompatible with this read-out routine\n");
+    fclose(Rawfile);
+    return CTX_VERSION;  
+  }  
+  // Check if allocated headers are long enough
+  if (RHeader->RunHeaderSize>sizeof(RunHeader) || RHeader->BoardStructureSize>sizeof(BoardStructure) || RHeader->EventHeaderSize>sizeof(EventHeader)) {
+    if(!Silent) printf("Error: Header size(s) too long (there must be a problem with the data version!)\n");
+    fclose(Rawfile);
+    return CTX_VERSION;  
+  }
+  
   // Read board structures
   BStruct = new BoardStructure [RHeader->NCMCBoards];
-  if(fread(BStruct, sizeof(BoardStructure), RHeader->NCMCBoards, Rawfile) != RHeader->NCMCBoards) {
-    if(!Silent) printf("Error: Could not read (all) board structures\n");
-    fclose(Rawfile);
-    delete[] BStruct;
-    return CTX_BSTRUCT;
+  for(unsigned int i=0; i<RHeader->NCMCBoards; i++) {
+    if(fread(&BStruct[i], RHeader->BoardStructureSize, 1, Rawfile) != 1) {
+      if(!Silent) printf("Error: Could not read board structure of board number %d\n",i+1);
+      fclose(Rawfile);
+      delete[] BStruct;
+      return CTX_BSTRUCT;
+    }
   }
   // Allocate memory for event data
@@ -63,14 +78,16 @@
   if(fptr != NULL) {
     fprintf(fptr, "Magic number          %x (%s)\n", RHeader->MagicNum, RHeader->MagicNum==MAGICNUM_CLOSED?"OK":(RHeader->MagicNum==MAGICNUM_OPEN?"File not closed":"Error"));
-    fprintf(fptr, "Data format:          %d\n", RHeader->DataFormat);
+    fprintf(fptr, "Data format:          %u\n", RHeader->DataFormat);
+    fprintf(fptr, "Software revision:    %u\n", RHeader->SoftwareRevision);         
+
     fprintf(fptr, "Run header size:      %d\n", RHeader->RunHeaderSize);
     fprintf(fptr, "Event header size:    %d\n", RHeader->EventHeaderSize);
     fprintf(fptr, "Board structure size: %d\n", RHeader->BoardStructureSize);
-   
-    fprintf(fptr, "DAQ compilation:  %s\n", RHeader->DAQVersion);         
-    fprintf(fptr, "Source:           %s\n", RHeader->Source);
-    fprintf(fptr, "Run type:         %c\n", RHeader->Type);
+
+    fprintf(fptr, "Description:      %s\n", RHeader->Description);
+    fprintf(fptr, "Run type:         %u\n", RHeader->Type);
     fprintf(fptr, "Run number:       %u\n", RHeader->RunNumber);
     fprintf(fptr, "File number:      %u\n", RHeader->FileNumber);
+    
     fprintf(fptr, "Events:           %u\n", RHeader->Events);
     fprintf(fptr, "CMC Boards:       %u\n", RHeader->NCMCBoards);
@@ -78,23 +95,10 @@
     fprintf(fptr, "Channels/chip:    %u\n", RHeader->NChannels);
     fprintf(fptr, "Samples:          %u\n", RHeader->Samples);
-    fprintf(fptr, "Offset:           %d\n", RHeader->Offset);
+    fprintf(fptr, "Offset:           %u\n", RHeader->Offset);
 
-    fprintf(fptr, "Source RA:        %f\n", RHeader->SourceRA);
-    fprintf(fptr, "Source DEC:       %f\n", RHeader->SourceDEC);
-    fprintf(fptr, "Telescope RA:     %f\n", RHeader->TelescopeRA);
-    fprintf(fptr, "Telescope DEC:    %f\n", RHeader->TelescopeDEC);
-
-    fprintf(fptr, "Start year:       %u\n", RHeader->StartYear);
-    fprintf(fptr, "Start month:      %u\n", RHeader->StartMonth);
-    fprintf(fptr, "Start day:        %u\n", RHeader->StartDay);
-    fprintf(fptr, "Start hour:       %u\n", RHeader->StartHour);
-    fprintf(fptr, "Start minute:     %u\n", RHeader->StartMinute);
-    fprintf(fptr, "Start second:     %u\n", RHeader->StartSecond);
-    fprintf(fptr, "End year:         %u\n", RHeader->EndYear);
-    fprintf(fptr, "End month:        %u\n", RHeader->EndMonth);
-    fprintf(fptr, "End day:          %u\n", RHeader->EndDay);
-    fprintf(fptr, "End hour:         %u\n", RHeader->EndHour);
-    fprintf(fptr, "End minute:       %u\n", RHeader->EndMinute);
-    fprintf(fptr, "End second:       %u\n", RHeader->EndSecond);
+    fprintf(fptr, "Start second:     %u - UTC %s", RHeader->StartSecond, asctime(gmtime((time_t *) &RHeader->StartSecond)));
+    fprintf(fptr, "  microsecond:    %u\n", RHeader->StartMicrosecond);
+    fprintf(fptr, "End second:       %u - UTC %s", RHeader->EndSecond, asctime(gmtime((time_t *) &RHeader->EndSecond)));
+    fprintf(fptr, "  microsecond:    %u\n", RHeader->EndMicrosecond);
 
     for (unsigned int i=0; i<RHeader->NCMCBoards; i++) {
@@ -127,29 +131,45 @@
 
 // *** Read next event from file
-CTX_ErrCode RawDataCTX::ReadEvent(int EventNo, FILE *fptr) {
+CTX_ErrCode RawDataCTX::ReadEvent(unsigned int EventNo, FILE *fptr) {
     
-  if(!FileOpen) {
+  if (!FileOpen) {
     if(!Silent) printf("Error: No data file open.\n");
     return CTX_NOTOPEN;
   }
   
-  // Move file pointer to desired event header (if zero read next event)
-  if(EventNo!=0 && fseek(Rawfile, sizeof(RunHeader)+sizeof(BoardStructure)*RHeader->NCMCBoards+(EventNo-1)*(sizeof(EventHeader)+RHeader->NCMCBoards*RHeader->NChips*
+/*   // Move file pointer to desired event header (if zero read next event)
+  if(EventNo!=0 && fseek(Rawfile, RHeader->RunHeaderSize+RHeader->BoardStructureSize*RHeader->NCMCBoards+(EventNo-1)*(RHeader->EventHeaderSize+RHeader->NCMCBoards*RHeader->NChips*
       RHeader->NChannels*RHeader->Samples*sizeof(short)), SEEK_SET)!=0) {
     if(!Silent) printf("Error: Could not move to requested event\n");
     return CTX_SEEK;
   }
+ */
 
+  // Move file pointer to desired event header (if zero read next event)
+  if (EventNo != 0) {
+    bool SEEK_OK=true;
+    if (fseek(Rawfile, RHeader->RunHeaderSize+RHeader->BoardStructureSize*RHeader->NCMCBoards, SEEK_SET) != 0) SEEK_OK=false;
+    while(SEEK_OK) {
+      if (fread(EHeader, RHeader->EventHeaderSize, 1, Rawfile) != 0) SEEK_OK = false;
+      else {
+        if (EHeader->EventNumber==EventNo) break;
+        if (fseek(Rawfile, EHeader->EventSize, SEEK_CUR) != 0) SEEK_OK = false;
+      }
+    }
+    if(!SEEK_OK) {
+      if(!Silent) printf("Error: Could not move to requested event\n");
+      return CTX_SEEK;
+    }
+  }
   // Read event header
-  if (fread(EHeader, sizeof(EventHeader), 1, Rawfile) != 1) {
-    if(feof(Rawfile)==0) {
-      if(!Silent) printf("Error: Could not read event header\n");
+  else if (fread(EHeader, RHeader->EventHeaderSize, 1, Rawfile) != 1) {
+    if (feof(Rawfile)==0) {
+      if (!Silent) printf("Error: Could not read event header\n");
       return CTX_EHEADER;
     }
     else return CTX_EOF;  
   }
-  if(fread(Data, sizeof(short), RHeader->NCMCBoards*RHeader->NChips*RHeader->NChannels*RHeader->Samples, Rawfile)
-	  != RHeader->NCMCBoards*RHeader->NChips*RHeader->NChannels*RHeader->Samples) {
-    if(!Silent) printf("Error: Could not read (all) data\n");
+  if(fread(Data, 1, EHeader->EventSize, Rawfile) != EHeader->EventSize) {
+    if(!Silent) printf("Error: Could not read (all) event data\n");
     return CTX_DATA;    
   }
@@ -157,8 +177,9 @@
   // If requested, print event header to file 
   if(fptr != NULL) {
-    fprintf(fptr, "Name:            %s\n",    EHeader->Name);
-    fprintf(fptr, "Event number:    %u\n",    EHeader->EventNumber);
-    fprintf(fptr, "Time [s]:        %f\n",    EHeader->TimeSec);
-    fprintf(fptr, "Trigger type:    0X%0X\n", EHeader->TriggerType);
+    fprintf(fptr, "Event number:    %u\n",        EHeader->EventNumber);
+    fprintf(fptr, "Time [sec]:      %u - UTC %s", EHeader->Seconds, asctime(gmtime((time_t *) &EHeader->Seconds)));
+    fprintf(fptr, "Time [usec]:     %u\n",        EHeader->Microseconds);
+    fprintf(fptr, "Trigger type:    0x%0X\n",     EHeader->TriggerType);
+    fprintf(fptr, "Size [byte]:     %u\n",        EHeader->EventSize);
   }
   
Index: /drsdaq/RawDataCTX.h
===================================================================
--- /drsdaq/RawDataCTX.h	(revision 43)
+++ /drsdaq/RawDataCTX.h	(revision 44)
@@ -11,4 +11,8 @@
   Structures are defined using #pragma pack (1) to not include any padding. Note that
   using the gcc attribute __attribute__((__packed__)) is incompatible with root.
+
+
+  The convention for the header structure is that exisitng structure entries
+  should never be deleted. New items may only be added at the end.
 */
 
@@ -17,4 +21,5 @@
 
 #include <stdio.h>
+#include <time.h>
 
 #define DATA_FORMAT 1
@@ -34,5 +39,5 @@
 // Error codes
 enum CTX_ErrCode {CTX_OK, CTX_FOPEN, CTX_FCLOSE, CTX_NOTOPEN, CTX_RHEADER,
-    	    	  CTX_BSTRUCT, CTX_EHEADER, CTX_DATA, CTX_SEEK, CTX_EOF};
+    	    	  CTX_BSTRUCT, CTX_EHEADER, CTX_DATA, CTX_SEEK, CTX_EOF, CTX_VERSION};
 
 #pragma pack (1)  // Switch padding off
@@ -41,5 +46,6 @@
 typedef struct {
   U32 MagicNum;
-  U32 DataFormat;       // Increasing whenever header format changes
+  U32 DataFormat;       // Increasing whenever format changes
+  U32 SoftwareRevision;	// Subversion revision number
 
   U32 RunHeaderSize;
@@ -47,53 +53,38 @@
   U32 BoardStructureSize;
 
-  I8  DAQVersion[12]; 	// contains result of __DATE__ macro
-
-  I8  Source[16];
-  I8  Type;          // run type (char): pedestal, data, ...
+  I8  Description[48];
+  U32 Type;          	// Run type: 0=pedestal, 1=data, 2=test
 
   U32 RunNumber;
   U32 FileNumber;
-  
-  U32 StartYear;
-  U32 StartMonth;
-  U32 StartDay;
-  U32 StartHour;
-  U32 StartMinute;
-  U32 StartSecond;
-  
-  U32 EndYear;
-  U32 EndMonth;
-  U32 EndDay;
-  U32 EndHour;
-  U32 EndMinute;
+    
+  U32 Events;           // Number of events in the file 
+  U32 NCMCBoards;       // Number of used mezzanine boards
+  U32 NChips;		// Number of DRS chips per board
+  U32 NChannels;	// Number of channels per chip
+  U32 Samples;          // Number of samples
+  U32 Offset;           // Offset from first sample
+
+  U32 StartSecond;  	// Opening and closing time of the file
+  U32 StartMicrosecond;
   U32 EndSecond;
-
-  F32 SourceRA;
-  F32 SourceDEC;
-  F32 TelescopeRA;
-  F32 TelescopeDEC;
-  
-  U32 Events;                     // Number of events in the file 
-  U32 NCMCBoards;                 // Number of used boards
-  U32 NChips;			  // Number of DRS chips per board
-  U32 NChannels;		  // Number of channels per chip
-  U32 Samples;                    // Number of samples
-  I32 Offset;                     // Offset from first sample
+  U32 EndMicrosecond;
 } RunHeader;
 
 // Board structure
 typedef struct {
-  I32 SerialNo;    // Board serial number
-  F32 NomFreq;     // Nominal sampling frequency [GHz]
-  F32 BoardTemp;   // Board temperature [deg C]
-  F32 ScaleFactor; // Factor for conversion to mV 
+  I32 SerialNo;     // Board serial number
+  F32 NomFreq;	    // Nominal sampling frequency [GHz]
+  F32 BoardTemp;    // Board temperature [deg C]
+  F32 ScaleFactor;  // Factor for conversion to mV
 } BoardStructure;
 
 // Event header
 typedef struct {
-  I8  Name[5];          // "EVTH", NULL-terminated
   U32 EventNumber;
-  F32 TimeSec;          // event time stamp in seconds, ms precision
-  U16 TriggerType;
+  U32 Seconds;          // Event time stamp (result of gettimeofday())
+  U32 Microseconds;
+  U32 TriggerType;
+  U32 EventSize; 	// Size of following data in bytes
 } EventHeader;
 
@@ -104,5 +95,5 @@
     FILE *Rawfile;
     bool FileOpen;
-    bool Silent;
+    bool Silent;    	// No textual output if true
     
   public:
@@ -117,5 +108,5 @@
     CTX_ErrCode OpenDataFile(char*, FILE* = NULL);
     CTX_ErrCode CloseDataFile();
-    CTX_ErrCode ReadEvent(int = 0, FILE* = NULL);
+    CTX_ErrCode ReadEvent(unsigned int = 0, FILE* = NULL);
     bool IsFileOpen();
 };
Index: /drsdaq/SlowData.cc
===================================================================
--- /drsdaq/SlowData.cc	(revision 43)
+++ /drsdaq/SlowData.cc	(revision 44)
@@ -47,9 +47,13 @@
 bool SlowData::NewEntry(char *Variable) {
 
+  time_t RawTime;
+  struct tm *TM;
   struct timeval Time;
 
+  time(&RawTime);
+  TM = localtime(&RawTime);
   gettimeofday(&Time, NULL);
   InternalCall = true;
-  NewEntryCalled = AddToEntry("\n%s %s %lu %lu ", Issuer, Variable, Time.tv_sec, Time.tv_usec);
+  NewEntryCalled = AddToEntry("\n%s-%s %lu %lu %d-%d-%dT%d:%d:%d ", Issuer, Variable, Time.tv_sec, Time.tv_usec, TM->tm_year+1900,TM->tm_mon+1,TM->tm_mday,TM->tm_hour,TM->tm_min,TM->tm_sec);
   InternalCall = false;
   return NewEntryCalled;
Index: /drsdaq/drsdaq.cpp
===================================================================
--- /drsdaq/drsdaq.cpp	(revision 43)
+++ /drsdaq/drsdaq.cpp	(revision 44)
@@ -62,5 +62,5 @@
   
   system("clear");
-  printf("\n************* DRS readout built %s, %s\n\n",__DATE__,__TIME__);
+  printf("\n*** DRS readout built %s, %s (revision %s) *** \n\n",__DATE__, __TIME__, REVISION);
 
   // Set signal handlers
@@ -170,5 +170,10 @@
     return;
   }
- 
+  // Allows immediate reuse of socket after closing (circumvents TIME_WAIT)
+  int Value=1;
+  if (setsockopt(ServerSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &Value, sizeof (Value)) == -1) {
+    m->PrintMessage("Warning: Could not set server socket option SO_REUSEADDR (%s)\n", strerror(errno));
+  }
+
   SocketAddress.sin_family = PF_INET;
   SocketAddress.sin_port = htons((unsigned short) m->fCCPort);
