Index: trunk/MagicSoft/Mars/mraw/MRawEvtHeader.cc
===================================================================
--- trunk/MagicSoft/Mars/mraw/MRawEvtHeader.cc	(revision 2372)
+++ trunk/MagicSoft/Mars/mraw/MRawEvtHeader.cc	(revision 2386)
@@ -237,8 +237,8 @@
 int MRawEvtHeader::ReadEvt(istream &fin)
 {
-    fin.read((char*)&fDAQEvtNumber, 4);
+    fin.read((char*)&fDAQEvtNumber, 4);  // Total=4
 
     UInt_t fAbsTime[2];
-    fin.read((char*)fAbsTime,       8);
+    fin.read((char*)fAbsTime,       8);  // Total=12
 
     //
@@ -246,9 +246,9 @@
     //
     const Double_t mhz = 9.375;                          // [1e6 ticks/s]
-    const Double_t t   = (Double_t)fAbsTime[0]/mhz*1e-3; // [ns]
-    const UShort_t ns  = (UShort_t)fmod(t, 1e9);
-    const Byte_t s     = (Byte_t)fmod(t/1e9, 60);
-    const Byte_t m     = (Byte_t)fmod(t/60e9, 60);
-    const Byte_t h     = (Byte_t)(t/3600e9);
+    const Double_t t   = (Double_t)fAbsTime[0]/mhz;      // [ns]
+    const UShort_t ns  = (UShort_t)fmod(t*1e-3, 1e9);
+    const Byte_t s     = (Byte_t)fmod(t/1e12, 60);
+    const Byte_t m     = (Byte_t)fmod(t/60e12, 60);
+    const Byte_t h     = (Byte_t)(t/3600e12);
 
     fTime->SetTime(h, m, s, ns);
@@ -257,9 +257,9 @@
     Byte_t dummy[4];
 
-    fin.read((char*)&fNumTrigLvl1,  4);
-    fin.read((char*)&fNumTrigLvl2,  4);
-    fin.read((char*)fTrigPattern,   8);
-    fin.read((char*)&fTrigType,     2);
-    fin.read((char*)dummy,          2); // was fAllLoGainOn
+    fin.read((char*)&fNumTrigLvl1,  4);  // Total=16
+    fin.read((char*)&fNumTrigLvl2,  4);  // Total=20
+    fin.read((char*)fTrigPattern,   8);  // Total=28
+    fin.read((char*)&fTrigType,     2);  // Total=30
+    fin.read((char*)dummy,          2);  // Total=32, was fAllLoGainOn
     fin.read((char*)fPixLoGainOn->GetArray(), fPixLoGainOn->GetSize());
 
Index: trunk/MagicSoft/Mars/mraw/MRawRunHeader.cc
===================================================================
--- trunk/MagicSoft/Mars/mraw/MRawRunHeader.cc	(revision 2372)
+++ trunk/MagicSoft/Mars/mraw/MRawRunHeader.cc	(revision 2386)
@@ -94,5 +94,7 @@
     // read one RUN HEADER from the input stream
     //
-    fin.read((char*)&fMagicNumber, 2);
+    fMagicNumber = 0;
+
+    fin.read((char*)&fMagicNumber, 2);          // Total=2
 
     //
@@ -101,32 +103,32 @@
     if (fMagicNumber != kMagicNumber && fMagicNumber != kMagicNumber+1)
     {
-        *fLog << err << "Error: Wrong Magic Number: Not a Magic File!" << endl;
+        *fLog << err << "Error: Wrong Magic Number (0x" << hex << fMagicNumber << "): Not a Magic File!" << endl;
         return;
     }
 
-    if (fMagicNumber == kMagicNumber && fMagicNumber != kMagicNumber+1)
+    if (fMagicNumber == kMagicNumber+1)
         *fLog << warn << "WARNING - This file maybe broken (0xc0c1) - DAQ didn't close it correctly!" << endl;
 
     Byte_t dummy[16];
 
-    fin.read((char*)&fFormatVersion,    2);
-    fin.read((char*)&fSoftVersion,      2);
-    fin.read((char*)&fRunType,          2);
-    fin.read((char*)&fRunNumber,        4);
-    fin.read((char*)&fProjectName,     22);
-    fin.read((char*)&fSourceName,      12);
+    fin.read((char*)&fFormatVersion,    2);     // Total=4
+    fin.read((char*)&fSoftVersion,      2);     // Total=6
+    fin.read((char*)&fRunType,          2);     // Total=8
+    fin.read((char*)&fRunNumber,        4);     // Total=12
+    fin.read((char*)&fProjectName,     22);     // Total=34
+    fin.read((char*)&fSourceName,      12);     // Total=46
     fin.read((char*)dummy,              4); // was RA  (moved to tracking system)
     fin.read((char*)dummy,              4); // was DEC (moved to tracking system)
-    fin.read((char*)&fSourceEpochChar,  2);
-    fin.read((char*)&fSourceEpochDate,  2);
-    fin.read((char*)&fMJD,              4);
-    fin.read((char*)&fDateYear,         2);
-    fin.read((char*)&fDateMonth,        2);
-    fin.read((char*)&fDateDay,          2);
-    fin.read((char*)&fNumCrates,        2);
-    fin.read((char*)&fNumPixInCrate,    2);
-    fin.read((char*)&fNumSamplesLoGain, 2);
-    fin.read((char*)&fNumSamplesHiGain, 2);
-    fin.read((char*)&fNumEvents,        4);
+    fin.read((char*)&fSourceEpochChar,  2);     // Total=56
+    fin.read((char*)&fSourceEpochDate,  2);     // Total=58
+    fin.read((char*)&fMJD,              4);     // Total=62
+    fin.read((char*)&fDateYear,         2);     // Total=64
+    fin.read((char*)&fDateMonth,        2);     // Total=66
+    fin.read((char*)&fDateDay,          2);     // Total=68
+    fin.read((char*)&fNumCrates,        2);     // Total=70
+    fin.read((char*)&fNumPixInCrate,    2);     // Total=72
+    fin.read((char*)&fNumSamplesLoGain, 2);     // Total=74
+    fin.read((char*)&fNumSamplesHiGain, 2);     // Total=76
+    fin.read((char*)&fNumEvents,        4);     // Total=80
 
 
@@ -148,5 +150,12 @@
 {
     *fLog << all << endl;
-    *fLog << "MagicNumber:  0x" << hex << fMagicNumber << " - " << (fMagicNumber==kMagicNumber?"OK":"Wrong!") << endl;
+    *fLog << "MagicNumber:  0x" << hex << fMagicNumber << " - ";
+    switch (fMagicNumber)
+    {
+    case kMagicNumber:   *fLog << "OK";               break;
+    case kMagicNumber+1: *fLog << "File not closed!"; break;
+    default:             *fLog << "Wrong!";           break;
+    }
+    *fLog << endl;
     *fLog << "Version:      " << dec << "Format=" << fFormatVersion << "  ";
     *fLog << "Software=" << fSoftVersion << endl;
@@ -213,2 +222,13 @@
     return fPixAssignment->GetSize();
 }
+
+// --------------------------------------------------------------------------
+//
+// Returns absolute size in bytes of the run header as read from a raw file.
+// This must be done _after_ the header is read, because the header doesn't
+// have a fixed size (used in MRawSocketRead)
+//
+Int_t MRawRunHeader::GetNumTotalBytes() const
+{
+    return 80+fNumCrates*fNumPixInCrate*2+16;
+}
Index: trunk/MagicSoft/Mars/mraw/MRawRunHeader.h
===================================================================
--- trunk/MagicSoft/Mars/mraw/MRawRunHeader.h	(revision 2372)
+++ trunk/MagicSoft/Mars/mraw/MRawRunHeader.h	(revision 2386)
@@ -104,4 +104,5 @@
 
     UShort_t GetNumPixel() const;
+    Int_t GetNumTotalBytes() const;
 
     void Print(Option_t *t=NULL) const;
Index: trunk/MagicSoft/Mars/mraw/MRawSocketRead.cc
===================================================================
--- trunk/MagicSoft/Mars/mraw/MRawSocketRead.cc	(revision 2386)
+++ trunk/MagicSoft/Mars/mraw/MRawSocketRead.cc	(revision 2386)
@@ -0,0 +1,290 @@
+/* ======================================================================== *\
+!
+! *
+! * This file is part of MARS, the MAGIC Analysis and Reconstruction
+! * Software. It is distributed to you in the hope that it can be a useful
+! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
+! * It is distributed WITHOUT ANY WARRANTY.
+! *
+! * Permission to use, copy, modify and distribute this software and its
+! * documentation for any purpose is hereby granted without fee,
+! * provided that the above copyright notice appear in all copies and
+! * that both that copyright notice and this permission notice appear
+! * in supporting documentation. It is provided "as is" without express
+! * or implied warranty.
+! *
+!
+!
+!   Author(s): Thomas Bretz  12/2000 <mailto:tbretz@uni-sw.gwdg.de>
+!
+!   Copyright: MAGIC Software Development, 2000-2001
+!
+!
+\* ======================================================================== */
+
+//////////////////////////////////////////////////////////////////////////////
+//                                                                          //
+//  MRawSocketRead                                                            //
+//                                                                          //
+//  This tasks reads the raw binary file like specified in the TDAS???      //
+//  and writes the data in the corresponding containers which are           //
+//  either retrieved from the parameter list or created and added.          //
+//                                                                          //
+//  Input Containers:                                                       //
+//   -/-                                                                    //
+//                                                                          //
+//  Output Containers:                                                      //
+//   MRawRunHeader, MRawEvtHeader, MRawEvtData, MRawCrateArray, MRawEvtTime //
+//                                                                          //
+//////////////////////////////////////////////////////////////////////////////
+#include "MRawSocketRead.h"
+
+#include <TMutex.h>
+
+#include "MReadSocket.h"
+
+#include "MLog.h"
+#include "MLogManip.h"
+
+#include "MParList.h"
+#include "MTaskList.h"
+#include "MEvtLoop.h"
+
+#include "MTime.h"
+#include "MRawRunHeader.h"
+#include "MRawEvtHeader.h"
+#include "MRawEvtData.h"
+#include "MRawCrateData.h"
+#include "MRawCrateArray.h"
+
+ClassImp(MRawSocketRead);
+
+using namespace std;
+
+// --------------------------------------------------------------------------
+//
+// Default constructor. It tries to open the given file.
+//
+MRawSocketRead::MRawSocketRead(const char *name, const char *title)
+    : fIn(NULL)
+{
+    fName  = name  ? name  : "MRawSocketRead";
+    fTitle = title ? title : "Task to read DAQ binary data from tcp/ip socket";
+
+    fIn = new MReadSocket(7000);
+    fMutex = new TMutex;
+}
+
+// --------------------------------------------------------------------------
+//
+// Destructor. Delete input stream.
+//
+MRawSocketRead::~MRawSocketRead()
+{
+    delete fMutex;
+    delete fIn;
+}
+
+// --------------------------------------------------------------------------
+//
+// The PreProcess of this task checks for the following containers in the
+// list:
+//   MRawRunHeader <output>   if not found it is created
+//   MRawEvtHeader <output>   if not found it is created
+//   MRawEvtData <output>     if not found it is created
+//   MRawCrateArray <output>  if not found it is created
+//   MRawEvtTime <output>     if not found it is created (MTime)
+//
+// If all containers are found or created the run header is read from the
+// binary file and printed.  If the Magic-Number (file identification)
+// doesn't match we stop the eventloop.
+//
+// Now the EvtHeader and EvtData containers are initialized.
+//
+Int_t MRawSocketRead::PreProcess(MParList *pList)
+{
+    //
+    //  check if all necessary containers exist in the Parameter list.
+    //  if not create one and add them to the list
+    //
+    fRawRunHeader = (MRawRunHeader*)pList->FindCreateObj("MRawRunHeader");
+    if (!fRawRunHeader)
+        return kFALSE;
+
+    fRawEvtHeader = (MRawEvtHeader*)pList->FindCreateObj("MRawEvtHeader");
+    if (!fRawEvtHeader)
+        return kFALSE;
+
+    fRawEvtData = (MRawEvtData*)pList->FindCreateObj("MRawEvtData");
+    if (!fRawEvtData)
+        return kFALSE;
+
+    fRawCrateArray = (MRawCrateArray*)pList->FindCreateObj("MRawCrateArray");
+    if (!fRawCrateArray)
+        return kFALSE;
+
+    fRawEvtTime = (MTime*)pList->FindCreateObj("MTime", "MRawEvtTime");
+    if (!fRawEvtTime)
+        return kTRUE;
+
+    fParList = pList;
+    fRunNumber = (UInt_t)-1;
+    fEvtNumber = (UInt_t)-1;
+
+    /*
+    MEvtLoop *loop=(MEvtLoop*)pList->FindObject("Evtloop");
+    if (loop)
+        loop->SetProgressBar((TGProgressBar*)NULL);
+     */
+    return kTRUE;
+}
+
+Int_t MRawSocketRead::Do()
+{
+    /*
+    sprintf(report_str, " %8.8d %8.8d %6.6d",
+    run_header->RunNumber, run.event_number,
+    time.tv_sec - run.time_start_secs);
+    if (send(sd, report_str, strlen(report_str), flags) == -1) {
+    return -1;
+    }
+
+    sprintf(report_str, " %6.1f %6.1f %6.6d %7.4f %8.8d %6.6d ",
+    trigrate_hz, storerate_hz, storerate_kbps, gammarate_hz,
+    diskspace_kb, remtime_sec);
+    if (send(sd, report_str, strlen(report_str), flags) == -1) {
+    return -1;
+    }
+    */
+    char dummy[126];
+    fIn->read(dummy, 4);   // \nEVT
+
+    if (!(dummy[0]=='\n' && dummy[1]=='E' && dummy[2]=='V' &&dummy[3]=='T'))
+    {
+        *fLog << warn << "EVT tag not found. Stream out of sync. Please try to restart..." << endl;
+        // FIXME: Synchronization missing...
+        return kFALSE;
+    }
+
+    char size[6] = {0,0,0,0,0,0};
+    fIn->read(size, 5);
+    fIn->read(dummy, 126); //00000[CC-DATA]\n
+
+    /*
+    int numevt;
+    sscanf(dummy,  "%*s %*d %*d %*d %*d %*d %*d %*d "
+           "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d "
+           "%d %*d %*f %*f %*d %*f %*d %*d", &numevt);
+    */
+
+    //
+    // Read RUN HEADER (see specification) from input stream
+    //
+    fLog->SetNullOutput();
+    fRawRunHeader->ReadEvt(*fIn);
+    fLog->SetNullOutput(kFALSE);
+
+    if (fRawRunHeader->GetMagicNumber()!=kMagicNumber && fRawRunHeader->GetMagicNumber()!=kMagicNumber+1)
+    {
+        *fLog << err << "Error: Wrong Magic Number (0x" << hex << fRawRunHeader->GetMagicNumber() << "): Not a Magic File!" << endl;
+        return kFALSE;
+    }
+
+    if (fRunNumber!=fRawRunHeader->GetRunNumber())
+    {
+        fRawRunHeader->Print();
+
+        MTaskList *tlist = (MTaskList*)fParList->FindObject("MTaskList");
+        if (!tlist)
+        {
+            *fLog << err << dbginf << "ERROR - Task List not found in Parameter List." << endl;
+            return kFALSE;
+        }
+
+        if (!tlist->ReInit())
+            return kFALSE;
+
+        fRunNumber = fRawRunHeader->GetRunNumber();
+    }
+
+    if (atoi(size)==fRawRunHeader->GetNumTotalBytes())
+        return kCONTINUE;
+
+    //
+    // Give the run header information to the 'sub-classes'
+    //
+    fRawEvtHeader->Init(fRawRunHeader, fRawEvtTime);
+    fRawEvtData  ->Init(fRawRunHeader);
+
+    //
+    //  Read in the next EVENT HEADER (see specification),
+    // if there is no next event anymore stop eventloop
+    //
+    if (!fRawEvtHeader->ReadEvt(*fIn))
+        return kFALSE;
+
+    //
+    //  Get number of crates from the run header
+    //
+    const UShort_t nc = fRawRunHeader->GetNumCrates();
+
+    //
+    // Delete arrays which stores the pixel information (time slices)
+    //
+    fRawEvtData->ResetPixels();
+
+    //
+    // clear the TClonesArray which stores the Crate Information
+    // and create a new array of the correct size
+    //
+    fRawCrateArray->SetSize(nc);
+
+    //
+    // read the CRATE DATA (see specification) from file
+    //
+    for (int i=0; i<nc; i++)
+    {
+        fRawCrateArray->GetEntry(i)->ReadEvt(*fIn);
+        if (!*fIn)
+            return kFALSE;
+
+        fRawEvtData->ReadEvt(*fIn);
+        if (!*fIn)
+            return kFALSE;
+    }
+
+    if (fEvtNumber==fRawEvtHeader->GetDAQEvtNumber())
+        return kCONTINUE;
+
+    fEvtNumber=fRawEvtHeader->GetDAQEvtNumber();
+
+    //*fLog << dbg << "Evt " << fRawEvtHeader->GetDAQEvtNumber() << endl;
+
+    return kTRUE;
+}
+
+// --------------------------------------------------------------------------
+//
+// The Process reads one event from the binary file:
+//  - The event header is read
+//  - the run header is read
+//  - all crate information is read
+//  - the raw data information of one event is read
+//
+Int_t MRawSocketRead::Process()
+{
+    Lock();
+    Int_t rc = Do();
+    UnLock();
+    return rc;
+}
+
+Int_t MRawSocketRead::Lock()
+{
+    return fMutex->Lock();
+}
+
+Int_t MRawSocketRead::UnLock()
+{
+    return fMutex->UnLock();
+}
Index: trunk/MagicSoft/Mars/mraw/MRawSocketRead.h
===================================================================
--- trunk/MagicSoft/Mars/mraw/MRawSocketRead.h	(revision 2386)
+++ trunk/MagicSoft/Mars/mraw/MRawSocketRead.h	(revision 2386)
@@ -0,0 +1,53 @@
+#ifndef MARS_MRawSocketRead
+#define MARS_MRawSocketRead
+
+#ifndef MARS_MTask
+#include "MTask.h"
+#endif
+
+// gcc 3.2
+//class ifstream;
+#include <iosfwd>
+
+class MTime;
+class MParList;
+class MRawRunHeader;
+class MRawEvtHeader;
+class MRawEvtData;
+class MRawCrateArray;
+class MReadSocket;
+class TMutex;
+
+class MRawSocketRead : public MTask
+{
+private:
+    MRawRunHeader  *fRawRunHeader;  // run header information container to fill from file
+    MRawEvtHeader  *fRawEvtHeader;  // event header information container to fill from file
+    MRawEvtData    *fRawEvtData;    // raw evt header infomation container to fill from file
+    MRawCrateArray *fRawCrateArray; // crate information array container to fill from file
+    MTime          *fRawEvtTime;    // raw evt time information container to fill from file
+
+    TMutex *fMutex;
+
+    MReadSocket    *fIn;            //! buffered input stream (file to read from)
+    MParList       *fParList;       //!
+
+    UInt_t          fRunNumber;     //!
+    UInt_t          fEvtNumber;     //!
+
+    Int_t Do();
+
+    Int_t PreProcess(MParList *pList);
+    Int_t Process();
+
+public:
+    MRawSocketRead(const char *name=NULL, const char *title=NULL);
+    ~MRawSocketRead();
+
+    Int_t Lock();
+    Int_t UnLock();
+
+    ClassDef(MRawSocketRead, 0)	//Task to read DAQ binary data from tcp/ip socket
+};
+
+#endif
Index: trunk/MagicSoft/Mars/mraw/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mraw/Makefile	(revision 2372)
+++ trunk/MagicSoft/Mars/mraw/Makefile	(revision 2386)
@@ -34,6 +34,7 @@
 	   MRawCrateArray.cc \
 	   MRawCrateData.cc \
+           MRawFileWrite.cc \
            MRawFileRead.cc \
-           MRawFileWrite.cc
+           MRawSocketRead.cc
 
 SRCS    = $(SRCFILES)
Index: trunk/MagicSoft/Mars/mraw/RawLinkDef.h
===================================================================
--- trunk/MagicSoft/Mars/mraw/RawLinkDef.h	(revision 2372)
+++ trunk/MagicSoft/Mars/mraw/RawLinkDef.h	(revision 2386)
@@ -14,4 +14,5 @@
 #pragma link C++ class MRawCrateData+;
 
+#pragma link C++ class MRawSocketRead+;
 #pragma link C++ class MRawFileRead+;
 #pragma link C++ class MRawFileWrite+;
