//_HADES_CLASS_DESCRIPTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //HLdStackSource // // This is a particular kind of "data source" (see HDataSource) which takes // the event's data directly from a stack. // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #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() { // test Server IO 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) { //Destructor for a remote data source 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) { //Calls the init() function for each unpacker. 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; } // test Server IO if(isDumped) return dumpEvt(); if(isScanned) return scanEvt(); // printf("HldStackSource::getNextEvent %p %p\n", fEventAddr, fEventAddr ? *fEventAddr : 0); 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) { //printf("HldStackSource::getNextEvent(): execute\n"); 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; }