From e9ad69c36491eeabddddcd724d32fb3d9fd80494 Mon Sep 17 00:00:00 2001
From: scott snyder <snyder@bnl.gov>
Date: Thu, 3 Dec 2020 04:12:03 +0100
Subject: [PATCH] LArRecUtils: Use EL variant to addUniqueCellNoKine.

Use the ElementLink variant of addUniqueCellNoKine to try to reduce
lock contention.
---
 .../src/LArFCalTowerBuilderTool.cxx           | 19 ++++++++++---------
 .../LArRecUtils/src/LArFCalTowerBuilderTool.h |  6 +++---
 2 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.cxx b/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.cxx
index 16111c89338..60a29da2467 100644
--- a/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.cxx
+++ b/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.cxx
@@ -60,7 +60,7 @@ StatusCode LArFCalTowerBuilderTool::initializeTool(){
 inline
 void
 LArFCalTowerBuilderTool::addTower (const tower_iterator& t,
-                                   const CaloCellContainer* cells,
+                                   const ElementLink<CaloCellContainer>& cellsEL,
                                    CaloTower* tower) const
 {
   LArFCalTowerStore::cell_iterator firstC = m_cellStore.firstCellofTower(t);
@@ -68,6 +68,7 @@ LArFCalTowerBuilderTool::addTower (const tower_iterator& t,
   // here get needed size of this vector and use it to reserve tower size.
   int ts=  m_cellStore.towerSize(t);
   double wsumE = tower->getBasicEnergy(); // this is not 0 since some towers already have cells from other calos.
+  const CaloCellContainer* cells = cellsEL.getDataPtr();
   for (; firstC != lastC; ++firstC) {
 
     unsigned int ci = firstC->first;
@@ -79,7 +80,7 @@ LArFCalTowerBuilderTool::addTower (const tower_iterator& t,
     // get weights
     if (cellPtr) {
       wsumE += weightC * cellPtr->e();					// Summ up weighted energies .
-      tower->addUniqueCellNoKine(cells, cndx, weightC, ts); // add cells to tower.
+      tower->addUniqueCellNoKine(cellsEL, cndx, weightC, ts); // add cells to tower.
     }
   }
   tower->setE(wsumE);  // update tower kinematics.
@@ -89,7 +90,7 @@ LArFCalTowerBuilderTool::addTower (const tower_iterator& t,
 inline
 void
 LArFCalTowerBuilderTool::iterateFull (CaloTowerContainer* towers,
-                                      const CaloCellContainer* cells) const
+                                      const ElementLink<CaloCellContainer>& cellsEL) const
 {
   size_t sz = towers->size();
   assert(m_cellStore.size() ==  sz);
@@ -97,7 +98,7 @@ LArFCalTowerBuilderTool::iterateFull (CaloTowerContainer* towers,
 
   for (unsigned int t = 0; t < sz; ++t, ++tower_it) {
     CaloTower* aTower = towers->getTower(t);
-    addTower (tower_it, cells, aTower);
+    addTower (tower_it, cellsEL, aTower);
   }
 }
 
@@ -105,7 +106,7 @@ LArFCalTowerBuilderTool::iterateFull (CaloTowerContainer* towers,
 inline
 void
 LArFCalTowerBuilderTool::iterateSubSeg (CaloTowerContainer* towers,
-                                        const CaloCellContainer* cells,
+                                        const ElementLink<CaloCellContainer>& cellsEL,
                                         const CaloTowerSeg::SubSeg* subseg) const
 {
   size_t sz = towers->size();
@@ -114,7 +115,7 @@ LArFCalTowerBuilderTool::iterateSubSeg (CaloTowerContainer* towers,
 
   for (unsigned int t = 0; t < sz; ++t, ++tower_it) {
     CaloTower* aTower = towers->getTower(tower_it.itower());
-    addTower (tower_it, cells, aTower);
+    addTower (tower_it, cellsEL, aTower);
   }
 }
 
@@ -154,11 +155,11 @@ LArFCalTowerBuilderTool::execute(CaloTowerContainer* theTowers,
   // register this calorimeter
   theTowers->setCalo(m_caloIndex);
 
-  
+  const ElementLink<CaloCellContainer> cellsEL (*theCells, 0);
   if (subseg)
-    iterateSubSeg (theTowers, theCells, subseg);
+    iterateSubSeg (theTowers, cellsEL, subseg);
   else
-    iterateFull (theTowers, theCells);
+    iterateFull (theTowers, cellsEL);
 
   return StatusCode::SUCCESS;
 }
diff --git a/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.h b/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.h
index b15765434b1..306a3f0bd73 100644
--- a/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.h
+++ b/LArCalorimeter/LArRecUtils/src/LArFCalTowerBuilderTool.h
@@ -72,12 +72,12 @@ private:
   typedef LArFCalTowerStore::tower_iterator tower_iterator;
 
   void addTower (const tower_iterator& t,
-                 const CaloCellContainer* cells,
+                 const ElementLink<CaloCellContainer>& cellsEL,
                  CaloTower* tower) const;
   void iterateFull (CaloTowerContainer* towers,
-                    const CaloCellContainer* cells) const;
+                    const ElementLink<CaloCellContainer>& cellsEL) const;
   void iterateSubSeg (CaloTowerContainer* towers,
-                      const CaloCellContainer* cells,
+                      const ElementLink<CaloCellContainer>& cellsEL,
                       const CaloTowerSeg::SubSeg* subseg) const;
 
 
-- 
GitLab