diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx index 525bf22725dd6b84ecac7e223334e8aab9985565..9a002c42b2a973e2d5b6d01be79e5fbae137609f 100644 --- a/src/THcScalerEvtHandler.cxx +++ b/src/THcScalerEvtHandler.cxx @@ -68,8 +68,10 @@ 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), - fDelayedType(-1) + fDelayedType(-1), fOnlyBanks(kFALSE) { + fRocSet.clear(); + fModuleSet.clear(); } THcScalerEvtHandler::~THcScalerEvtHandler() @@ -180,13 +182,25 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) if((*p & 0xff00) == 0x1000) { // Bank Containing banks p++; // Now pointing to a bank in the bank } else if (((*p & 0xff00) == 0x100) && (*p != 0xC0000100)) { - // Bank containing integers. Look for scaler data + // Bank containing integers. Look for scalers + // This is either ROC bank containing integers or + // a bank within a ROC containing data from modules of a single type + // Look for scaler data // Assume that very first word is a scaler header // At any point in the bank where the word is not a matching // header, we stop. + UInt_t tag = (*p>>16) & 0xffff; UInt_t *pnext = p+*(p-1); // Next bank p++; // First data word + // Skip over banks that can't contain scalers + // If SetOnlyBanks(kTRUE) called, fRocSet will be empty + // so only bank tags matching module types will be considered. + if(fRocSet.find(tag)==fRocSet.end() + && fModuleSet.find(tag)==fModuleSet.end()) { + p = pnext; // Fall through to end of this else if + } + // Look for normalization scaler module first. if(fNormIdx >= 0) { UInt_t *psave = p; @@ -379,21 +393,33 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) switch (imodel) { case 560: scalers.push_back(new Scaler560(icrate, islot)); + if(!fOnlyBanks) fRocSet.insert(icrate); + fModuleSet.insert(imodel); break; case 1151: scalers.push_back(new Scaler1151(icrate, islot)); + if(!fOnlyBanks) fRocSet.insert(icrate); + fModuleSet.insert(imodel); break; case 3800: scalers.push_back(new Scaler3800(icrate, islot)); + if(!fOnlyBanks) fRocSet.insert(icrate); + fModuleSet.insert(imodel); break; case 3801: scalers.push_back(new Scaler3801(icrate, islot)); + if(!fOnlyBanks) fRocSet.insert(icrate); + fModuleSet.insert(imodel); break; case 9001: // TI Scalers scalers.push_back(new Scaler9001(icrate, islot)); + if(!fOnlyBanks) fRocSet.insert(icrate); + fModuleSet.insert(imodel); break; case 9250: // FADC250 Scalers scalers.push_back(new Scaler9250(icrate, islot)); + if(!fOnlyBanks) fRocSet.insert(icrate); + fModuleSet.insert(imodel); break; } if (scalers.size() > 0) { diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h index 2dad9a97f27fe2564b485ff23a041ff8f0a93937..c8753b9a809c35af899479585f2f2e528f0adff7 100644 --- a/src/THcScalerEvtHandler.h +++ b/src/THcScalerEvtHandler.h @@ -39,6 +39,7 @@ public: virtual Int_t End( THaRunBase* r=0 ); virtual void SetUseFirstEvent(Bool_t b = kFALSE) {fUseFirstEvent = b;} virtual void SetDelayedType(int evtype); + virtual void SetOnlyBanks(Bool_t b = kFALSE) {fOnlyBanks = b;fRocSet.clear();} private: @@ -55,7 +56,10 @@ private: TTree *fScalerTree; Bool_t fUseFirstEvent; Int_t fDelayedType; + Bool_t fOnlyBanks; std::vector<UInt_t*> fDelayedEvents; + std::set<UInt_t> fRocSet; + std::set<UInt_t> fModuleSet; THcScalerEvtHandler(const THcScalerEvtHandler& fh); THcScalerEvtHandler& operator=(const THcScalerEvtHandler& fh);