/* ======================================================================== *\ ! ! * ! * 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 ! ! Copyright: MAGIC Software Development, 2000-2004 ! ! \* ======================================================================== */ ////////////////////////////////////////////////////////////////////////////// // // // MRawFileRead // // // // 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 "MRawFileRead.h" #include #include "MLog.h" #include "MLogManip.h" #include "MTime.h" #include "MParList.h" #include "MRawRunHeader.h" #include "MRawEvtHeader.h" #include "MRawEvtData.h" #include "MRawCrateData.h" #include "MRawCrateArray.h" ClassImp(MRawFileRead); using namespace std; /* ----------- please don't delete and don't care about (Thomas) ------------ #define kBUFSZ 64 //1024*1024*64 #include class bifstream : public istream, public streambuf { private: char fBuffer[kBUFSZ]; //! FILE *fd; int sync() { memset(fBuffer, 0, kBUFSZ); return 0; } int underflow() { int sz=fread(fBuffer, kBUFSZ, 1, fd); //int sz=fread(fBuffer, 1, kBUFSZ, fd); setg(fBuffer, fBuffer, fBuffer+kBUFSZ); return sz==1 ? *(unsigned char*)fBuffer : EOF;//EOF; //return sz==kBUFSZ ? *(unsigned char*)fBuffer : EOF;//EOF; } public: bifstream(const char *name) : istream(this) { fd = fopen(name, "rb"); setbuf(fBuffer, kBUFSZ); } }; */ // -------------------------------------------------------------------------- // // Default constructor. It tries to open the given file. // MRawFileRead::MRawFileRead(const char *fname, const char *name, const char *title) : fFileName(fname), fIn(NULL) { fName = name ? name : "MRawFileRead"; fTitle = title ? title : "Read task to read DAQ binary files"; fIn = new ifstream; } // -------------------------------------------------------------------------- // // Destructor. Delete input stream. // MRawFileRead::~MRawFileRead() { delete fIn; } // -------------------------------------------------------------------------- // // The PreProcess of this task checks for the following containers in the // list: // MRawRunHeader if not found it is created // MRawEvtHeader if not found it is created // MRawEvtData if not found it is created // MRawCrateArray if not found it is created // MRawEvtTime 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 MRawFileRead::PreProcess(MParList *pList) { // // open the input stream // first of all check if opening the file in the constructor was // successfull // fIn->open(fFileName); if (!(*fIn)) { *fLog << err << "Error: Cannot open file '" << fFileName << "'" << endl; return kFALSE; } if (!MRawRead::PreProcess(pList)) return kFALSE; // // Read RUN HEADER (see specification) from input stream // if (!fRawRunHeader->ReadEvt(*fIn)) return kFALSE; if (!(*fIn)) { *fLog << err << "Error: Accessing file '" << fFileName << "'" << endl; return kFALSE; } //if (fRawRunHeader->GetMagicNumber()!=kMagicNumber) // return kFALSE; fRawRunHeader->Print(); *fRawEvtTime = fRawRunHeader->GetRunStart(); // // Give the run header information to the 'sub-classes' // Run header must be valid! // fRawEvtHeader->Init(fRawRunHeader, fRawEvtTime); fRawEvtData ->Init(fRawRunHeader, fRawCrateArray); 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 MRawFileRead::Process() { return ReadEvent(*fIn); } // -------------------------------------------------------------------------- // // Close the file. Check whether the number of read events differs from // the number the file should containe (MRawRunHeader). Prints a warning // if it doesn't match. // Int_t MRawFileRead::PostProcess() { fIn->close(); // // Sanity check for the number of events // if (fRawRunHeader->GetNumEvents()==GetNumExecutions()-1 || GetNumExecutions()==0) return kTRUE; *fLog << warn << dec; *fLog << "Warning - number of read events (" << GetNumExecutions()-1; *fLog << ") doesn't match number in run header ("; *fLog << fRawRunHeader->GetNumEvents() << ")." << endl; return kTRUE; }