From 43e20c4b4f0a3d6214783e9d7cfe62d9dfa7d89c Mon Sep 17 00:00:00 2001
From: Alexander MAZUROV <alexander.mazurov@gmail.com>
Date: Sun, 18 Jun 2017 20:23:20 +0200
Subject: [PATCH] Fix overflow behaviour for SystemEnergy.

Former-commit-id: f153c7b0ca69edffd9284f7e5b7c04a203c73d88
---
 .../TrigT1CaloUtils/src/SystemEnergy.cxx      | 31 ++++++++++---------
 1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/Trigger/TrigT1/TrigT1CaloUtils/src/SystemEnergy.cxx b/Trigger/TrigT1/TrigT1CaloUtils/src/SystemEnergy.cxx
index bf55b67a4df..61ab9e6b05d 100755
--- a/Trigger/TrigT1/TrigT1CaloUtils/src/SystemEnergy.cxx
+++ b/Trigger/TrigT1/TrigT1CaloUtils/src/SystemEnergy.cxx
@@ -43,6 +43,8 @@ SystemEnergy::SystemEnergy(const DataVector<CrateEnergy> *crates, ServiceHandle<
                                                                                                                     m_debug(false)
 {
 
+  int xyMax = 1 << (m_sumBits - 1);
+
   /** Get Ex, Ey, ET sums from crates and form global sums <br>
       Propagate overflows and test for new ones <br> */
 
@@ -62,14 +64,8 @@ SystemEnergy::SystemEnergy(const DataVector<CrateEnergy> *crates, ServiceHandle<
       m_systemEt += (*it)->et();
     }
     
-    // In the current implementation we could not trust to
-    // overflow errors for restricted sums:
-    // m_overflowX = m_overflowX | (*it)->exOverflow();
-    // m_overflowY = m_overflowY | (*it)->eyOverflow();
-    // m_overflowT = m_overflowT | (*it)->etOverflow();
-    
-    m_overflowX = m_overflowX | ((*it)->ex() == -(m_maxEtSumThr + 1));
-    m_overflowY = m_overflowY | ((*it)->ey() == -(m_maxEtSumThr + 1));
+    m_overflowX = m_overflowX | ((*it)->ex() == -xyMax);
+    m_overflowY = m_overflowY | ((*it)->ey() == -xyMax);
     m_overflowT = m_overflowT | ((*it)->et() == m_maxEtSumThr);
 
     if ((*it)->restricted())
@@ -81,18 +77,18 @@ SystemEnergy::SystemEnergy(const DataVector<CrateEnergy> *crates, ServiceHandle<
     m_systemEt = m_etSumOverflow;
   }
     
-  /** Check for overflow of Ex, Ey sums */
-  int xyMax = 1 << (m_sumBits - 1);
 
-  if ((abs(m_systemEx) > xyMax) || m_overflowX)
+
+  if ((abs(m_systemEx) >= xyMax) || m_overflowX)
   {
     m_overflowX = 1;
-    m_systemEx = xyMax;
+    m_systemEx = -xyMax;
   }
-  if ((abs(m_systemEy) > xyMax) || m_overflowY)
+
+  if ((abs(m_systemEy) >= xyMax) || m_overflowY)
   {
     m_overflowY = 1;
-    m_systemEy = xyMax;
+    m_systemEy = -xyMax;
   }
 
   if (m_debug)
@@ -125,9 +121,16 @@ SystemEnergy::SystemEnergy(unsigned int et, unsigned int exTC, unsigned int eyTC
                                                                              m_metSigHits(0),
                                                                              m_debug(false)
 {
+
   m_systemEx = decodeTC(exTC);
   m_systemEy = decodeTC(eyTC);
 
+  int xyMax = 1 << (m_sumBits - 1);
+
+  m_overflowT = m_systemEt == m_etSumOverflow;
+  m_overflowX = m_systemEx == -xyMax;
+  m_overflowY = m_systemEy == -xyMax;
+
   if (m_debug)
   {
     std::cout << "SystemEnergy results: " << std::endl
-- 
GitLab