// modified 3-12-1998 D.B // modified 15/3/99 by R. Holzmann // modified 23/3/99 by D.B // Modified 20/5/14 by S.L //_HADES_CLASS_DESCRIPTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //HLdStreamSource // // This is a particular kind of "data source" (see HDataSource) which takes // the event's data directly from a DABC stream server. // // The data are accessed via a hadaq/api.h interface. // Unpacking data is then similar to other data source.(see HldSource). ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "hldstreamsource.h" #include "hldstreamevt.h" #include "hrecevent.h" #include "hruntimedb.h" #include "hldevt.h" #include "hldsubevt.h" #include "hldunpack.h" #include "TDatime.h" #include "Riostream.h" ClassImp(HldStreamSource) HldStreamSource::HldStreamSource(void): HldSource() { fReadEvent = 0; refId = -1; runId = -1; fileName = "no_yet_set"; event_already_read = false; } HldStreamSource::HldStreamSource(const Text_t *nodeName, Double_t maxage): HldSource() { // test Server IO fReadEvent = new HldStreamEvt(nodeName, maxage); event_already_read = false; printf("Create event %p name %s \n", fReadEvent, nodeName); currNodeName = nodeName; iter = 0; iter = fUnpackerList->MakeIterator(); isDumped = kFALSE; refId = -1; runId = -1; fileName = "no_yet_set"; } HldStreamSource::~HldStreamSource(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; } Bool_t HldStreamSource::init(void) { //Calls the init() function for each unpacker. if (fEventAddr == 0) { printf("HARD ERROR %p\n", fEventAddr); exit(7); } printf("HldStreamSource::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 HldStreamSource::getCurrentRunId(void) { if (runId == -1) { if (fReadEvent == 0) { printf("HARD ERROR\n"); exit(1); } fReadEvent->execute(); runId = fReadEvent->getRunNr(); event_already_read = true; } return runId; } EDsState HldStreamSource::getNextEvent(Bool_t doUnpack) { // test Server IO if(isDumped) return dumpEvt(); if(isScanned) return scanEvt(); // printf("HldStreamSource::getNextEvent %p %p\n", fEventAddr, fEventAddr ? *fEventAddr : 0); if ((fEventAddr == 0) || (*fEventAddr == 0)) { printf("HARD ERROR %p %p\n", fEventAddr, fEventAddr ? *fEventAddr : 0); exit(7); } if (!fReadEvent) { fLastEventStatus = kDsError; return kDsError; } if (!event_already_read) { if(!fReadEvent->execute()) { fLastEventStatus = kDsSkip; return kDsSkip; // JAM2018 } 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) { fLastEventStatus = kDsError; return kDsError; } if(ret == kDsSkip) { fLastEventStatus = kDsSkip; return kDsSkip; } } } fLastEventStatus = kDsOk; return kDsOk; }