Ignore:
Timestamp:
04/22/04 19:40:02 (21 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mraw/MRawFileRead.cc

    r3568 r3800  
    2424
    2525//////////////////////////////////////////////////////////////////////////////
    26 //                                                                          //
    27 //  MRawFileRead                                                            //
    28 //                                                                          //
    29 //  This tasks reads the raw binary file like specified in the TDAS???      //
    30 //  and writes the data in the corresponding containers which are           //
    31 //  either retrieved from the parameter list or created and added.          //
    32 //                                                                          //
    33 //  Input Containers:                                                       //
    34 //   -/-                                                                    //
    35 //                                                                          //
    36 //  Output Containers:                                                      //
    37 //   MRawRunHeader, MRawEvtHeader, MRawEvtData, MRawCrateArray, MRawEvtTime //
    38 //                                                                          //
     26//
     27//  MRawFileRead
     28//
     29//  This tasks reads the raw binary file like specified in the TDAS???
     30//  and writes the data in the corresponding containers which are
     31//  either retrieved from the parameter list or created and added.
     32//
     33//  Use SetInterleave() if you don't want to read all events, eg
     34//    SetInterleave(5) reads only each 5th event.
     35//
     36//  Input Containers:
     37//   -/-
     38//
     39//  Output Containers:
     40//   MRawRunHeader, MRawEvtHeader, MRawEvtData, MRawCrateArray, MRawEvtTime
     41//
    3942//////////////////////////////////////////////////////////////////////////////
    4043#include "MRawFileRead.h"
     
    4346#include <fstream>
    4447
     48#include <TSystem.h>
     49
    4550#include "MLog.h"
    4651#include "MLogManip.h"
     
    4853#include "MTime.h"
    4954#include "MParList.h"
     55
    5056#include "MRawRunHeader.h"
    5157#include "MRawEvtHeader.h"
     
    95101//
    96102MRawFileRead::MRawFileRead(const char *fname, const char *name, const char *title)
    97     : fFileName(fname), fIn(NULL)
     103    : fFileNames(NULL), fNumFile(0), fIn(NULL), fParList(NULL), fInterleave(1)
    98104{
    99105    fName  = name  ? name  : "MRawFileRead";
    100106    fTitle = title ? title : "Read task to read DAQ binary files";
    101107
    102     fIn = new ifstream;
     108    fFileNames = new TList;
     109    fFileNames->SetOwner();
     110
     111    AddFile(fname);
    103112}
    104113
     
    109118MRawFileRead::~MRawFileRead()
    110119{
    111     delete fIn;
     120    delete fFileNames;
     121    if (fIn)
     122        delete fIn;
     123}
     124
     125// --------------------------------------------------------------------------
     126//
     127// Add a new file to a list of files to be processed, Returns the number
     128// of files added. (We can enhance this with a existance chack and
     129// wildcard support)
     130//
     131Int_t MRawFileRead::AddFile(const char *fname)
     132{
     133    TNamed *name = new TNamed(fname, "");
     134    fFileNames->AddLast(name);
     135    return 1;
     136
     137}
     138
     139// --------------------------------------------------------------------------
     140//
     141// This opens the next file in the list and deletes its name from the list.
     142//
     143Bool_t MRawFileRead::OpenNextFile()
     144{
     145    //
     146    // open the input stream and check if it is really open (file exists?)
     147    //
     148    if (fIn)
     149        delete fIn;
     150    fIn = NULL;
     151
     152    //
     153    // Check for the existance of a next file to read
     154    //
     155    TObject *file = fFileNames->At(fNumFile);
     156    if (!file)
     157        return kFALSE;
     158
     159    //
     160    // open the file which is the first one in the chain
     161    //
     162    const char *name = file->GetName();
     163
     164    const char *expname = gSystem->ExpandPathName(name);
     165    fIn = new ifstream(expname);
     166
     167    const Bool_t noexist = !(*fIn);
     168    if (noexist)
     169    {
     170        *fLog << err << "Cannot open file " << expname << ": ";
     171        *fLog << strerror(errno) << endl;
     172    }
     173    else
     174        *fLog << inf << "Open file: '" << name << "'" << endl;
     175
     176    delete [] expname;
     177
     178    if (noexist)
     179        return kFALSE;
     180
     181    fNumFile++;
     182
     183    //
     184    // Read RUN HEADER (see specification) from input stream
     185    //
     186    if (!fRawRunHeader->ReadEvt(*fIn))
     187        return kFALSE;
     188
     189    if (!(*fIn))
     190    {
     191        *fLog << err << "Error: Accessing file '" << name << "'" << endl;
     192        return kFALSE;
     193    }
     194
     195    //
     196    // Print Run Header
     197    //
     198    fRawRunHeader->Print();
     199    *fRawEvtTime = fRawRunHeader->GetRunStart();
     200
     201    fNumEvents += fRawRunHeader->GetNumEvents();
     202
     203    //
     204    // Give the run header information to the 'sub-classes'
     205    // Run header must be valid!
     206    //
     207    fRawEvtHeader->Init(fRawRunHeader, fRawEvtTime);
     208    fRawEvtData  ->Init(fRawRunHeader, fRawCrateArray);
     209
     210    //
     211    // Search for MTaskList
     212    //
     213    MTask *tlist = (MTask*)fParList->FindObject("MTaskList");
     214    if (!tlist)
     215    {
     216        *fLog << err << dbginf << "MTaskList not found... abort." << endl;
     217        return kFALSE;
     218    }
     219
     220    //
     221    // A new file has been opened and new headers have been read.
     222    //  --> ReInit tasklist
     223    //
     224    return tlist->ReInit(fParList);
     225}
     226
     227// --------------------------------------------------------------------------
     228//
     229// Return file name of current file.
     230//
     231const TString MRawFileRead::GetFileName() const
     232{
     233    const TObject *file = fFileNames->At(fNumFile-1);
     234    return file ? file->GetName() : "";
     235}
     236
     237// --------------------------------------------------------------------------
     238//
     239// Restart with the first file
     240//
     241Bool_t MRawFileRead::Rewind()
     242{
     243    fNumFile=0;
     244    fNumEvents=0;
     245    return OpenNextFile();
    112246}
    113247
     
    130264Int_t MRawFileRead::PreProcess(MParList *pList)
    131265{
     266    fParList = pList;
     267
    132268    //
    133269    // open the input stream
     
    135271    // successfull
    136272    //
    137     fIn->open(fFileName);
    138     if (!(*fIn))
    139     {
    140         *fLog << err << "Cannot open file " << fFileName << ": ";
    141         *fLog << strerror(errno) << endl;
    142         return kFALSE;
    143     }
    144 
    145273    if (!MRawRead::PreProcess(pList))
    146274        return kFALSE;
    147275
    148276    //
    149     // Read RUN HEADER (see specification) from input stream
    150     //
    151     if (!fRawRunHeader->ReadEvt(*fIn))
    152         return kFALSE;
    153 
    154     if (!(*fIn))
    155     {
    156         *fLog << err << "Error: Accessing file '" << fFileName << "'" << endl;
    157         return kFALSE;
    158     }
    159     //if (fRawRunHeader->GetMagicNumber()!=kMagicNumber)
    160     //    return kFALSE;
    161 
    162     fRawRunHeader->Print();
    163 
    164     *fRawEvtTime = fRawRunHeader->GetRunStart();
    165 
    166     //
    167     // Give the run header information to the 'sub-classes'
    168     // Run header must be valid!
    169     //
    170     fRawEvtHeader->Init(fRawRunHeader, fRawEvtTime);
    171     fRawEvtData  ->Init(fRawRunHeader, fRawCrateArray);
     277    // Now open next (first) file
     278    //
     279    if (!Rewind())
     280        return kFALSE;
    172281
    173282    return kTRUE;
     
    184293Int_t MRawFileRead::Process()
    185294{
    186     return ReadEvent(*fIn);
     295    while (1)
     296    {
     297        //
     298        // skip events if requested
     299        //
     300        if (fInterleave>1 && GetNumExecutions()%fInterleave>0 && fIn->peek()!=EOF)
     301        {
     302            SkipEvent(*fIn);
     303            return kCONTINUE;
     304        }
     305
     306        //
     307        // Read a single event from file
     308        //
     309        const Bool_t rc = ReadEvent(*fIn);
     310        if (rc!=kFALSE)
     311            return rc;
     312
     313        //
     314        // If an event could not be read from file try to open new file
     315        //
     316        if (!OpenNextFile())
     317            return kFALSE;
     318    }
     319    return kTRUE;
    187320}
    188321
     
    195328Int_t MRawFileRead::PostProcess()
    196329{
    197     fIn->close();
    198 
    199330    //
    200331    // Sanity check for the number of events
    201332    //
    202     if (fRawRunHeader->GetNumEvents()==GetNumExecutions()-1 || GetNumExecutions()==0)
     333    if (fNumEvents==GetNumExecutions()-1 || GetNumExecutions()==0)
    203334        return kTRUE;
    204335
    205336    *fLog << warn << dec;
    206337    *fLog << "Warning - number of read events (" << GetNumExecutions()-1;
    207     *fLog << ") doesn't match number in run header (";
    208     *fLog << fRawRunHeader->GetNumEvents() << ")." << endl;
     338    *fLog << ") doesn't match number in run header(s) (";
     339    *fLog << fNumEvents << ")." << endl;
    209340
    210341    return kTRUE;
Note: See TracChangeset for help on using the changeset viewer.