From 069a8f1918c556904f07841642da6e2f44dc9c00 Mon Sep 17 00:00:00 2001
From: Eric Torrence <eric.torrence@cern.ch>
Date: Fri, 13 Aug 2021 20:18:38 +0000
Subject: [PATCH] Cluster Limit

---
 .../src/EventInfoByteStreamAuxCnv.cxx         |  4 +--
 .../TrackerClusterFit/src/ClusterFitAlg.cxx   | 25 ++++++++++++++++++-
 .../TrackerClusterFit/src/ClusterFitAlg.h     |  7 +++++-
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx
index 341fa8d72..531e74c5a 100644
--- a/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx
+++ b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx
@@ -155,8 +155,8 @@ StatusCode EventInfoByteStreamAuxCnv::createObj(IOpaqueAddress* pAddr, DataObjec
   // Run Number
   int runNumber = re->run_number();
 
-  // Event Number
-  uint64_t eventNumber = re->event_id();
+  // Event Number (ordinal number of event in file)
+  uint64_t eventNumber = re->event_counter();
   
   // Time Stamp
   uint32_t bc_time_sec = re->timestamp()/1E6;  // timestamp is in usec
diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
index 6e955b6a2..c9dda9633 100644
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.cxx
@@ -99,6 +99,29 @@ StatusCode ClusterFitAlg::execute(const EventContext& ctx) const
 
   FaserSCT_ClusterContainer::const_iterator clusterCollections {clusterContainer->begin()};
   FaserSCT_ClusterContainer::const_iterator clusterCollectionsEnd {clusterContainer->end()};
+
+  // Make a first pass and count clusters
+  // Only if cluster limit is set to non-zero value
+  if (m_clusterLimit > 0) {
+    unsigned int n_clusters(0);
+    for (; clusterCollections != clusterCollectionsEnd; ++clusterCollections) 
+    {
+      const Tracker::FaserSCT_ClusterCollection* cl{*clusterCollections};
+      n_clusters += cl->size();
+    }
+
+    // Give up if too many clusters found
+    if (n_clusters > m_clusterLimit) {
+      m_numberOfSkippedEvents++;
+      ATH_MSG_WARNING("Skipping event with " << n_clusters << " clusters!");
+      ATH_CHECK(trackContainer.record(std::move(outputTracks)));
+      return StatusCode::SUCCESS;
+    }
+
+    // Reset begin pointer and tabulate cluster info by wafer
+    clusterCollections = clusterContainer->begin();
+  }
+
   for (; clusterCollections != clusterCollectionsEnd; ++clusterCollections) 
   {
     ++m_numberOfClusterCollection;      
@@ -352,11 +375,11 @@ StatusCode ClusterFitAlg::finalize()
   ATH_MSG_INFO("ClusterFitAlg::finalize()");
   ATH_MSG_INFO( m_numberOfEvents << " events processed" );
   ATH_MSG_INFO( m_numberOfTriggeredEvents << " triggered events processed" );
+  ATH_MSG_INFO( m_numberOfSkippedEvents << " events skipped for too many clusters" );
   ATH_MSG_INFO( m_numberOfClusterCollection<< " cluster collections processed" );
   ATH_MSG_INFO( m_numberOfCluster<< " cluster processed" );
   ATH_MSG_INFO( m_numberOfFits << " fits performed" );
 
-
   return StatusCode::SUCCESS;
 }
 
diff --git a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h
index 54868f69e..e36f458c2 100644
--- a/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h
+++ b/Tracker/TrackerRecAlgs/TrackerClusterFit/src/ClusterFitAlg.h
@@ -69,7 +69,6 @@ class ClusterFitAlg : public AthReentrantAlgorithm, AthHistogramming
     //@}
     const ServiceHandle<ITHistSvc>& histSvc() const;
 
-
   private:
     /**    @name Disallow default instantiation, copy, assignment */
     //@{
@@ -192,6 +191,11 @@ class ClusterFitAlg : public AthReentrantAlgorithm, AthHistogramming
 
     DoubleArrayProperty m_zCenter { this, "ZCenter", { -1452.2925, 47.7075 , 1237.7075, 2427.7075 }, "Global z position at which to reconstruct track parameters"};
     UnsignedIntegerProperty m_triggerMask { this, "TriggerMask", 0x0, "Trigger mask to analyze (0 = pass all)" };
+
+    // Add property to skip reconstruction if cluster multiplicity is too large
+    // Set to 0 for no limit
+    UnsignedIntegerProperty m_clusterLimit { this, "ClusterLimit", 200, "Limit on cluster multiplicity to run algorithm" };
+
 /// a handle on the Hist/TTree registration service
     ServiceHandle<ITHistSvc> m_histSvc;
 
@@ -209,6 +213,7 @@ class ClusterFitAlg : public AthReentrantAlgorithm, AthHistogramming
     mutable std::atomic<int> m_numberOfClusterCollection{0};
     mutable std::atomic<int> m_numberOfCluster{0};
     mutable std::atomic<int> m_numberOfFits{0};
+    mutable std::atomic<int> m_numberOfSkippedEvents{0};
 };
 
 // For the THistSvc
-- 
GitLab