From eb22c01272712e196c46884da34a4d6e469c50d0 Mon Sep 17 00:00:00 2001
From: "Stephen A. Wood" <saw@jlab.org>
Date: Thu, 14 Sep 2017 13:22:50 -0400
Subject: [PATCH] Only look for scalers in banks that might contain them.  
 When the db file is read, a list of crate #s and a list of   module types is
 made.  The tag of each bank searched for scalers   must have a tag that is in
 one of these lists.   If all scalers are in banks tagged with the module
 type, then,   SetOnlyBanks(kTRUE) should be called in which case bank tags
 will   be compared only against this list of module types.

---
 src/THcScalerEvtHandler.cxx | 30 ++++++++++++++++++++++++++++--
 src/THcScalerEvtHandler.h   |  4 ++++
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx
index 525bf22..9a002c4 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 2dad9a9..c8753b9 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);
-- 
GitLab