#include "hldfilesource.h"
#include "hrecevent.h"
#include "hldfilevt.h"
#include "hades.h"
#include "hruntimedb.h"
#include <limits.h>
#include <unistd.h>
ClassImp(HldFileSource)
HldFileSource::HldFileSource(void)
: HldFileSourceBase()
{
fReadEvent=new HldFilEvt;
iter=0;
fCurrentFile=0;
fEventNr = 0;
fEventLimit = INT_MAX;
}
HldFileSource::~HldFileSource(void) {
if (fReadEvent) delete fReadEvent;
fReadEvent=0;
if (iter)
{
delete iter;
iter = NULL;
}
}
HldFileSource::HldFileSource(HldFileSource &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;
}
Int_t HldFileSource::getRunId(const Text_t *fileName) {
HldFilEvt evt;
Int_t r=-1;
if (fCurrentFile && strcmp(fileName,fCurrentFile->GetName())==0) {
r=fCurrentFile->getRunId();
} else {
if (!evt.setFile(fileName)) r=-1;
else {
evt.read();
r=evt.getRunNr();
}
}
return r;
}
EDsState HldFileSource::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;
}
Bool_t HldFileSource::getNextFile() {
if (!fCurrentFile) {
if (fFileList.IsEmpty()) return kFALSE;
else fCurrentFile=(HldFileDesc *)fFileList.First();
} else {
fCurrentFile=(HldFileDesc *)fFileList.After(fCurrentFile);
if (!fCurrentFile) return kFALSE;
}
((HldFilEvt *)fReadEvent)->setFile(fCurrentFile->GetName());
return kTRUE;
}
void HldFileSource::addFile(const Text_t *name,Int_t refId) {
HldFileDesc *desc=0;
HldFileDesc *newDesc=0;
TString fileName;
fileName=fCurrentDir+"/"+name;
desc=(HldFileDesc *)fFileList.FindObject(fileName);
if (desc) {
if (refId==-1)
newDesc=new HldFileDesc(fileName.Data(),desc->getRunId(),desc->getRefId());
else
newDesc=new HldFileDesc(fileName.Data(),desc->getRunId(),refId);
fFileList.Add(newDesc);
Warning("addFile","File %s added more than once\n",fileName.Data());
} else {
if (::access(fileName.Data(),F_OK)!=0) {
Error("addFile","File %s not found\n",fileName.Data());
} else {
newDesc=new HldFileDesc(fileName.Data(),getRunId(fileName),refId);
fFileList.Add(newDesc);
}
}
}
Bool_t HldFileSource::rewind() {
if (fFileList.IsEmpty()) return kFALSE;
else fCurrentFile=(HldFileDesc *)fFileList.First();
return ((HldFilEvt *)fReadEvent)->setFile(fCurrentFile->GetName());
}
Last change: Sat May 22 13:17:55 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.