diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx index a84380c3e5a765004fb016e2bc856ace048128f3..cf1ddcd05e26d949e4911b5d51d9fda6caa1882c 100644 --- a/src/THcScalerEvtHandler.cxx +++ b/src/THcScalerEvtHandler.cxx @@ -65,7 +65,8 @@ static const UInt_t defaultDT = 4; THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* description) : THaEvtTypeHandler(name,description), evcount(0), ifound(0), fNormIdx(-1), - dvars(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kFALSE) + dvars(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kFALSE), + fDelayedType(-1) { } @@ -78,10 +79,30 @@ THcScalerEvtHandler::~THcScalerEvtHandler() Int_t THcScalerEvtHandler::End( THaRunBase* r) { + // Process any delayed events in order received + + cout << "THcScalerEvtHandler::End Analyzing " << fDelayedEvents.size() << " delayed scaler events" << endl; + for(UInt_t* rdata : fDelayedEvents) { + AnalyzeBuffer(rdata); + } + fDelayedEvents.clear(); // Does this free the arrays? + if (fScalerTree) fScalerTree->Write(); return 0; } +void THcScalerEvtHandler::SetDelayedType(int evtype) { + /** + * \brief Delay analysis of this event type to end. + * + * Final scaler events generated in readout list end routines may not + * come in order in the data stream. If the event type of a end routine + * scaler event is set, then the event contents will be saved and analyzed + * at the end of the analysis so that time ordering of scaler events is preserved. + */ + fDelayedType = evtype; +} + Int_t THcScalerEvtHandler::Analyze(THaEvData *evdata) { Int_t lfirst=1; @@ -124,13 +145,26 @@ Int_t THcScalerEvtHandler::Analyze(THaEvData *evdata) } // if (lfirst && !fScalerTree) - - // Parse the data, load local data arrays. - UInt_t *rdata = (UInt_t*) evdata->GetRawDataBuffer(); - if (fDebugFile) *fDebugFile<<"\n\nTHcScalerEvtHandler :: Debugging event type "<<dec<<evdata->GetEvType()<<endl<<endl; + if( evdata->GetEvType() == fDelayedType) { // Save this event for processing later + Int_t evlen = evdata->GetEvLength(); + UInt_t *datacopy = new UInt_t[evlen]; + fDelayedEvents.push_back(datacopy); + for(Int_t i=0;i<evlen;i++) { + datacopy[i] = rdata[i]; + } + return 1; + } else { // A normal event + if (fDebugFile) *fDebugFile<<"\n\nTHcScalerEvtHandler :: Debugging event type "<<dec<<evdata->GetEvType()<<endl<<endl; + return AnalyzeBuffer(rdata); + } +} +Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) +{ + + // Parse the data, load local data arrays. UInt_t *p = (UInt_t*) rdata; UInt_t *plast = p+*p; // Index to last word in the bank @@ -271,6 +305,8 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) fStatus = kOK; fNormIdx = -1; + fDelayedEvents.clear(); + cout << "Howdy ! We are initializing THcScalerEvtHandler !! name = " << fName << endl; diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h index c4c0c44c52e25126118ded40175470793577b798..2dad9a97f27fe2564b485ff23a041ff8f0a93937 100644 --- a/src/THcScalerEvtHandler.h +++ b/src/THcScalerEvtHandler.h @@ -34,9 +34,11 @@ public: virtual ~THcScalerEvtHandler(); Int_t Analyze(THaEvData *evdata); + Int_t AnalyzeBuffer(UInt_t *rdata); virtual EStatus Init( const TDatime& run_time); virtual Int_t End( THaRunBase* r=0 ); virtual void SetUseFirstEvent(Bool_t b = kFALSE) {fUseFirstEvent = b;} + virtual void SetDelayedType(int evtype); private: @@ -47,12 +49,13 @@ private: std::vector<Decoder::GenScaler*> scalers; std::vector<HCScalerLoc*> scalerloc; Double_t evcount; - std::vector<Int_t> index; Int_t Nvars, ifound, fNormIdx, nscalers; Double_t *dvars; Double_t *dvarsFirst; TTree *fScalerTree; Bool_t fUseFirstEvent; + Int_t fDelayedType; + std::vector<UInt_t*> fDelayedEvents; THcScalerEvtHandler(const THcScalerEvtHandler& fh); THcScalerEvtHandler& operator=(const THcScalerEvtHandler& fh);