diff --git a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiCounter.icc b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiCounter.icc
index 6ab93e1740ebe82e9a45b6f9c135c18d4a3394d9..62e896698e63fa5773aaf77e534f2a469f973b58 100644
--- a/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiCounter.icc
+++ b/Tracking/TrkTools/TrkAmbiguityProcessor/src/AmbiCounter.icc
@@ -10,6 +10,7 @@
 #include "TrkTrack/Track.h"
 #include <stdexcept>
 #include <algorithm>
+#include <optional>
 
 template<class EnumType>
 class AmbiCounter {
@@ -24,8 +25,11 @@ public:
   };
   //
   AmbiCounter(const std::vector<float> &eta_bounds): m_etaBounds(eta_bounds){
-    const std::string errMsg = "eta_bounds size must be " + std::to_string(nRegions);
-    if (m_etaBounds.size()!=nRegions) throw std::out_of_range(errMsg);
+    const std::string errMsgPrefix = "In AmbiCounter.icc, eta_bounds size must be ";
+    if (m_etaBounds.size()!=nRegions) throw std::runtime_error(errMsgPrefix + std::to_string(nRegions) + " elements long.");
+    if (not std::is_sorted(m_etaBounds.begin(), m_etaBounds.end())){
+      throw std::runtime_error(errMsgPrefix + "in ascending order.");
+    }
   }
   
   //convert Category to array index
@@ -52,8 +56,11 @@ public:
   }
   // increment one bin
   void 
-  increment(Categories categoryIdx, unsigned int etaBinIdx) {
-    ++m_counter.at(idx(categoryIdx)).at(etaBinIdx);    
+  increment(Categories category, unsigned int etaBinIdx) {
+    if ((category>= Categories::kNCounter) or (etaBinIdx >=nRegions)){
+      throw std::out_of_range("in AmbiCounter.icc::increment()");
+    }
+    ++m_counter[idx(category)][etaBinIdx];    
   }
   //
   AmbiCounter<EnumType> & operator +=(const AmbiCounter<EnumType> &a) {
@@ -81,7 +88,9 @@ public:
       std::array<int, nRegions> &nTracks = m_counter.at(idx(categoryIdx));
       // @TODO make sure that list of track parameters is not empty
       const double absEta = std::abs(track->trackParameters()->front()->eta());
-      ++nTracks.at(etaBin(absEta));
+      if (const auto &possibleIdx{etaBin(absEta)}){//i.e. if it's within bounds
+        ++nTracks[possibleIdx.value()];
+      }
     }
   }
   //
@@ -94,7 +103,6 @@ public:
     const auto allRegionCounts  = std::accumulate(displayedArray.begin(), displayedArray.end(),0);
     out << std::setiosflags(std::ios::dec) << std::setw(iw) << allRegionCounts;
     for (unsigned int etaBinIdx=0; etaBinIdx < nRegions; ++etaBinIdx) {
-       assert( etaBinIdx < m_counter[idx(categoryIdx)].size() );
        out << std::setiosflags(std::ios::dec) << std::setw(iw) << m_counter[idx(categoryIdx)][etaBinIdx];
     }
     out << "\n";
@@ -110,14 +118,11 @@ private:
   std::array<std::array<int, nRegions>,static_cast<size_t>(Categories::kNCounter)> m_counter{};
   std::array<int,nGlobalCounters>                      m_globalCounter{};
   const std::vector<float>  &m_etaBounds;           //!< eta intervals for internal monitoring
-  size_t 
+  std::optional<size_t>
   etaBin(const double val){
-    size_t regionIdx{}; 
-    //eta *must be* in ascending order in the m_etaBounds vector
-    for (;regionIdx< nRegions; ++regionIdx){
-      if (val < m_etaBounds[regionIdx]) break;
-    }
-    return regionIdx;
+    auto pVal =  std::lower_bound(m_etaBounds.begin(), m_etaBounds.end(), val);
+    //if it's in bounds, return the value, otherwise return a nullopt
+    return (pVal!=m_etaBounds.end()) ? std::optional<size_t>(std::distance(m_etaBounds.begin(), pVal)):std::nullopt;
   }
 };