#include "hldstacksource.h"
#include "hrecevent.h"
#include "hruntimedb.h"
#include "hldstackevt.h"
#include "hldsubevt.h"
#include "hldunpack.h"
#include "TDatime.h"
#include "Riostream.h"
ClassImp(HldStackSource)
HldStackSource::HldStackSource(): HldSource()
{
fReadEvent = new HldStackEvt();
event_already_read = false;
iter = 0;
iter = fUnpackerList->MakeIterator();
isDumped = kFALSE;
refId = -1;
runId = -1;
fileName = "no_yet_set";
fDummyMode = kFALSE;
}
HldStackSource::~HldStackSource(void) {
if (fUnpackerList) fUnpackerList->Delete();
fUnpackerList = 0;
if (fReadEvent) delete fReadEvent;
fReadEvent = 0;
if(iter) delete iter;
iter = 0;
}
void HldStackSource::setEvent(HRecEvent* ev)
{
if(ev){
runId = ev->getHeader()->getEventRunNumber();
}
}
Bool_t HldStackSource::init(void) {
if(fDummyMode) return kTRUE;
if (fEventAddr == 0) {
printf("HARD ERROR %p\n", fEventAddr);
exit(7);
}
printf("HldStackSource::init %p %p\n", fEventAddr, *fEventAddr);
if (!(*fEventAddr)) {
(*fEventAddr) = new HRecEvent;
}
if(isDumped || isScanned) return kTRUE;
iter = fUnpackerList->MakeIterator();
if (initUnpacker() == kFALSE) {
printf(" problem init unpacker \n");
return kFALSE;
}
HldUnpack* unpacker;
while ( (unpacker = (HldUnpack *)iter->Next()) != NULL) {
fReadEvent->appendSubEvtIdx(*unpacker);
}
return kTRUE;
}
Int_t HldStackSource::getCurrentRunId(void)
{
if (!fDummyMode&&runId == -1) {
if (fReadEvent == 0) {
printf("HARD ERROR\n");
exit(1);
}
fReadEvent->execute();
runId = fReadEvent->getRunNr();
event_already_read = true;
}
return runId;
}
EDsState HldStackSource::getNextEvent(Bool_t doUnpack) {
if(fDummyMode) {
fLastEventStatus = kDsOk;
return kDsOk;
}
if(isDumped) return dumpEvt();
if(isScanned) return scanEvt();
if ((fEventAddr == 0) || (*fEventAddr == 0)) {
printf("HldStackSource::getNextEvent(): HARD ERROR %p %p\n", fEventAddr, fEventAddr ? *fEventAddr : 0);
exit(7);
}
if (!fReadEvent) {
printf("HldStackSource::getNextEvent(): No ReadEvent!\n");
fLastEventStatus = kDsError;
return kDsError;
}
if (!event_already_read) {
fReadEvent->execute();
runId = fReadEvent->getRunNr();
}
event_already_read = false;
if (doUnpack) {
decodeHeader((*fEventAddr)->getHeader());
Int_t newId = (*fEventAddr)->getHeader()->getEventRunNumber();
if(runId < 0 || newId != runId ){
runId = newId;
TDatime time;
fileName = Form("%s_%i.hld",time.AsString(),runId);
fileName.ReplaceAll(" ","_");
}
iter->Reset();
HldUnpack *unpacker;
while ( (unpacker = (HldUnpack *)iter->Next()) != NULL) {
Int_t ret = unpacker->execute();
if(!ret){
printf("HldStackSource::getNextEvent(): unpacker %s return %i \n",unpacker->GetName(),ret );
fLastEventStatus = kDsError;
return kDsError;
}
if(ret == kDsSkip) {
fLastEventStatus = kDsSkip;
return kDsSkip;
}
}
}
fLastEventStatus = kDsOk;
return kDsOk;
}