#include "hldfilesourcebase.h"
#include "hrecevent.h"
#include "hldfilevt.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hmessagemgr.h"
#include <iostream>
#include <unistd.h>
#include <limits.h>
ClassImp(HldFileDesc)
ClassImp(HldFileSourceBase)
HldFileSourceBase::HldFileSourceBase() : HldSource() {
  
  iter=0;
  fCurrentFile=0;
  fEventNr = 0;
  iter = NULL;
  fEventLimit = INT_MAX;
}
HldFileSourceBase::~HldFileSourceBase(void) {
  
  if (fReadEvent)
  {
    delete fReadEvent;
    fReadEvent=0;
  }
  if (iter)
  {
    delete iter;
    iter = NULL;
  }
}
HldFileSourceBase::HldFileSourceBase(HldFileSourceBase &so) {
  fFileList.AddAll(&so.fFileList);
  if (so.fCurrentFile) {
    fCurrentFile=(HldFileDesc *)fFileList.FindObject(so.fCurrentFile->GetName());
    iter=0;
  }
  fReadEvent=so.fReadEvent; 
  fEventNr = 0;
  fEventLimit = INT_MAX;
}
Bool_t HldFileSourceBase::init(void)
{
  
  Bool_t r=kFALSE;
  if (!(*fEventAddr)) {
    (*fEventAddr) = new HRecEvent;
  }
  if (isDumped || isScanned)  return getNextFile();  
  iter=fUnpackerList->MakeIterator();
  if (initUnpacker()==kFALSE) return kFALSE;
  r=getNextFile();
  HldUnpack *unpacker;
  while ( (unpacker=(HldUnpack *)iter->Next()) != 0 ) {
    fReadEvent->appendSubEvtIdx( (*unpacker) );
  }
  INFO_msg(10,HMessageMgr::DET_ALL,"initailized");
  return r;
}
Int_t HldFileSourceBase::getCurrentRunId(void) {
  Int_t r=-1;
  HldFileDesc *file=(fCurrentFile)?fCurrentFile:(HldFileDesc *)fFileList.First();
  if (file) {
    r=file->getRunId();
  }
  return r;
}
Int_t HldFileSourceBase::getCurrentRefId(void) {
  Int_t r=-1;
  HldFileDesc *file=(fCurrentFile) ?
                    fCurrentFile : (HldFileDesc *)fFileList.First();
  if (file) {
    r=file->getRefId();
  } 
  return r;
}
EDsState HldFileSourceBase::getNextEvent(Bool_t doUnpack) {
  
  
  
  if(isDumped) {
    if (dumpEvt()==kDsError) {
      if (getNextFile()==kFALSE) return kDsEndData;
      else return kDsEndFile;
    }
    return kDsOk;
  }
  if (isScanned) {
    if (scanEvt()==kDsError) {
      if (getNextFile()==kFALSE) return kDsEndData;
      else return kDsEndFile;
    }
    return kDsOk; 
  }  
  fEventNr++;
  if ( !((HldFilEvt*)fReadEvent)->execute() || !(fEventNr<fEventLimit)) {
    
    fEventNr = 0;
    if (getNextFile()==kFALSE) return kDsEndData;
    else return kDsEndFile;
  }
  if(doUnpack) {
    decodeHeader((*fEventAddr)->getHeader());
    iter->Reset();
    HldUnpack *unpacker;
    while ( (unpacker=(HldUnpack *)iter->Next())!=NULL) {
	Int_t ret=unpacker->execute();
	if(!ret) return kDsError;
        if(ret==kDsSkip) return kDsSkip;
    }
  }
  return kDsOk;
}
 
void HldFileSourceBase::addFile(const Text_t *fileName,const Text_t *refFile) {
  Int_t r=-1;
  TString rf=fCurrentDir+"/";
  rf+=refFile;
  r=getRunId(rf.Data());
  if (r==-1) Error("addFile","File %s not found\n",rf.Data());
  else addFile(fileName,r);
}
Last change: Sat May 22 13:17:56 2010
Last generated: 2010-05-22 13:17
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.