From fbc96a81e5df5648132a2707cdfdb412df746054 Mon Sep 17 00:00:00 2001
From: Peter Hansen <hansenph@lxplus054.cern.ch>
Date: Tue, 26 Jun 2018 20:32:38 +0200
Subject: [PATCH] Remove beginRun incidents and IOVCALLBACKs

---
 .../TRT_CalibAlgs/share/CollisionTemplate.py  |   4 +-
 .../TRT_CalibAlgs/share/ESDCalibTemplate.py   |   3 +-
 .../TRT_CalibAlgs/share/ESDTemplate.py        |   3 +-
 .../TRT_CalibAlgs/share/joboptionsFullReco.py |   8 +
 .../share/joboptionsRefitting.py              |   3 +-
 .../share/InDetDxAOD.py                       |   7 +
 .../share/ConfiguredInDetPreProcessingTRT.py  |  12 +-
 .../share/InDetMonitoringTRT.py               |   6 +
 .../share/InDetRecConditionsAccess.py         |   5 +-
 .../share/InDetRecLoadTools.py                |  10 +
 .../python/InDetTrigCommonTools.py            |  21 +-
 .../python/InDetTrigConfigConditions.py       |   9 +-
 .../ITRT_DriftFunctionTool.h                  |   4 +-
 .../TRT_DriftFunctionTool.h                   |  31 +-
 .../src/TRT_DriftFunctionTool.cxx             | 296 +++++++-----------
 .../python/EMBremCollectionBuilder.py         |  12 +-
 16 files changed, 210 insertions(+), 224 deletions(-)

diff --git a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/CollisionTemplate.py b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/CollisionTemplate.py
index 9ecf0a2894b..e8687aaa900 100644
--- a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/CollisionTemplate.py
+++ b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/CollisionTemplate.py
@@ -222,9 +222,11 @@ from TRT_ConditionsServices.TRT_ConditionsServicesConf import TRT_CalDbSvc
 TRTCalibDBSvc=TRT_CalDbSvc()
 ServiceMgr += TRTCalibDBSvc
 
+
 from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
 InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTRT_DriftFunctionTool",
-                                                   TRTCalDbTool=TRTCalibDBSvc           )
+                                                   TRTCalDbTool=TRTCalibDBSvc,
+                                                   IsMC=(globalflags.DataSource == 'geant4'))
 
 ToolSvc += InDetTRT_DriftFunctionTool
 print InDetTRT_DriftFunctionTool
diff --git a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDCalibTemplate.py b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDCalibTemplate.py
index 0f6b04163ff..dba6aed353b 100644
--- a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDCalibTemplate.py
+++ b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDCalibTemplate.py
@@ -241,7 +241,8 @@ from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionToo
 InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTRT_DriftFunctionTool",
                                                    AllowDataMCOverride = True,
                                                    TRTCalDbTool=TRTCalSvc,
-                                                   ForceData = True)
+                                                   ForceData = True,
+                                                   IsMC=(globalflags.DataSource == 'geant4'))
 
 ToolSvc += InDetTRT_DriftFunctionTool
 print InDetTRT_DriftFunctionTool
diff --git a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDTemplate.py b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDTemplate.py
index 1c77bf70406..e31436751c9 100644
--- a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDTemplate.py
+++ b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/ESDTemplate.py
@@ -296,7 +296,8 @@ from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionToo
 InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTRT_DriftFunctionTool",
                                                    AllowDataMCOverride = True,
                                                    TRTCalDbTool=TRTCalSvc,
-                                                   ForceData = True)
+                                                   ForceData = True,
+                                                   IsMC=(globalflags.DataSource == 'geant4'))
 
 ToolSvc += InDetTRT_DriftFunctionTool
 print InDetTRT_DriftFunctionTool
diff --git a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsFullReco.py b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsFullReco.py
index fa7162ef210..f47740da292 100755
--- a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsFullReco.py
+++ b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsFullReco.py
@@ -234,6 +234,14 @@ FillAlignTrkInfo = FillAlignTrkInfo ( name = 'FillAlignTrkInfo',
 ToolSvc += FillAlignTrkInfo
 print      FillAlignTrkInfo
 
+from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
+InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTRT_DriftFunctionTool",
+                                                   TRTCalDbTool=TRTCalibDBSvc,
+                                                   IsMC=(globalflags.DataSource == 'geant4'))
+
+ToolSvc += InDetTRT_DriftFunctionTool
+print InDetTRT_DriftFunctionTool
+
 from TRT_CalibTools.TRT_CalibToolsConf import FillAlignTRTHits 
 FillAlignTRTHits = FillAlignTRTHits (   name = 'FillAlignTRTHits',
                                         minTimebinsOverThreshold=0, 
diff --git a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsRefitting.py b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsRefitting.py
index 4de2facdd7d..b6727028a5e 100644
--- a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsRefitting.py
+++ b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/share/joboptionsRefitting.py
@@ -208,7 +208,8 @@ ServiceMgr += TRTCalibDBSvc
 
 from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
 InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTRT_DriftFunctionTool",
-                                                   TRTCalDbTool=TRTCalibDBSvc           )
+                                                   TRTCalDbTool=TRTCalibDBSvc,
+                                                   IsMC=(globalflags.DataSource == 'geant4'))
 
 ToolSvc += InDetTRT_DriftFunctionTool
 print InDetTRT_DriftFunctionTool
diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py
index 58b7eceedce..2b65c65247d 100644
--- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py
+++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/share/InDetDxAOD.py
@@ -341,9 +341,16 @@ if DRAWZSel:
 #################
 
 if dumpTrtInfo:
+
+    from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
+    InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTRT_DriftFunctionTool",
+                                                       IsMC = isIdTrkDxAODSimulation)
+
     from InDetPrepRawDataToxAOD.InDetPrepRawDataToxAODConf import TRT_PrepDataToxAOD
     xAOD_TRT_PrepDataToxAOD = TRT_PrepDataToxAOD( name = "xAOD_TRT_PrepDataToxAOD")
+
     ## Content steering Properties (default value shown as comment)
+    xAOD_TRT_PrepDataToxAOD.TRTDriftFunctionTool = InDetTRT_DriftFunctionTool
     xAOD_TRT_PrepDataToxAOD.OutputLevel=INFO
     xAOD_TRT_PrepDataToxAOD.UseTruthInfo = dumpTruthInfo
     #xAOD_TRT_PrepDataToxAOD.WriteSDOs    = True
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredInDetPreProcessingTRT.py b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredInDetPreProcessingTRT.py
index bd2b994de89..48146a3c538 100644
--- a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredInDetPreProcessingTRT.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredInDetPreProcessingTRT.py
@@ -40,6 +40,8 @@ class ConfiguredInDetPreProcessingTRT:
          #
          # --- TRT_DriftFunctionTool
          #
+
+
          from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
          InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name                = prefix+"DriftFunctionTool",
                                                             TRTCalDbTool        = InDetTRTCalDbSvc)
@@ -47,6 +49,13 @@ class ConfiguredInDetPreProcessingTRT:
          if (not useTimeInfo) or InDetFlags.noTRTTiming():
             InDetTRT_DriftFunctionTool.DummyMode      = True
             InDetTRT_DriftFunctionTool.UniversalError = 1.15
+
+         # --- set Data/MC flag
+         if(globalflags.DataSource != 'geant4') :
+             InDetTRT_DriftFunctionTool.IsMC = False
+         else :
+             InDetTRT_DriftFunctionTool.IsMC = True
+
          # --- overwrite for calibration of MC
          if usePhase and jobproperties.Beam.beamType()=='cosmics' and globalflags.DataSource == "geant4":
             InDetTRT_DriftFunctionTool.AllowDigiVersionOverride = True
@@ -154,7 +163,8 @@ class ConfiguredInDetPreProcessingTRT:
          if InDetFlags.doTRTGlobalOccupancy():
           from TRT_ElectronPidTools.TRT_ElectronPidToolsConf import InDet__TRT_LocalOccupancy
           InDetTRT_LocalOccupancy = InDet__TRT_LocalOccupancy(  name 		= "InDet_TRT_LocalOccupancy",
-								isTrigger	= False
+								isTrigger	= False,
+                                                                TRTDriftFunctionTool = InDetTRT_DriftFunctionTool
 	  )
 
           ToolSvc += InDetTRT_LocalOccupancy
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/InDetMonitoringTRT.py b/InnerDetector/InDetExample/InDetRecExample/share/InDetMonitoringTRT.py
index 293e278eb60..d76b4f72ba6 100644
--- a/InnerDetector/InDetExample/InDetRecExample/share/InDetMonitoringTRT.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/InDetMonitoringTRT.py
@@ -3,6 +3,7 @@
 #--------------------------------------------------------------
 from AthenaMonitoring.DQMonFlags import DQMonFlags
 from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
+from AthenaCommon.GlobalFlags           import globalflags
 from AthenaCommon.AppMgr import ServiceMgr as svcMgr
 from AthenaCommon.BeamFlags import jobproperties
 from AthenaCommon.DetFlags import DetFlags
@@ -29,11 +30,16 @@ else: # no track quality cuts for cosmics or single beams
 #-------------------------------------------------------------
 # Barrel Monitoring
 #-------------------------------------------------------------
+from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
+InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name                = "InDetTRT_DriftFunctionTool",
+                                                   IsMC      = (globalflags.DataSource == 'geant4'))
+
 from TRT_Monitoring.TRT_MonitoringConf import TRT_Monitoring_Tool
 InDetTRT_Monitoring_Tool = TRT_Monitoring_Tool (name                         = "TRT_Monitoring_Tool",
                                                 TRTRawDataObjectName         = InDetKeys.TRT_RDOs(),
                                                 NumberOfEvents               = -1,
                                                 TRTTracksObjectName          = InDetKeys.UnslimmedTracks(),
+                                                DriftFunctionTool            = InDetTRT_DriftFunctionTool,
                                                 TrkSummaryTool               = InDetTrackSummaryTool,
                                                 Map_Path                     = "../maps/", # obsolete
                                                 LE_TimeWindow_MIN            = 0,   # can be 0,1,or 2
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py b/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py
index edf3c492405..3cb69cd9134 100644
--- a/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/InDetRecConditionsAccess.py
@@ -404,10 +404,11 @@ if DetFlags.haveRIO.TRT_on():
         TRTSlopesFolder = conddb.addFolderSplitOnline ("TRT","/TRT/Onl/Calib/slopes","/TRT/Calib/slopes",className='TRTCond::RtRelationMultChanContainer')
 
     if not conddb.folderRequested('/TRT/Calib/ToTCalib'):
-        conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/ToTCalib","/TRT/Calib/ToTCalib")
+        conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/ToTCalib","/TRT/Calib/ToTCalib",className='CondAttrListCollection')
 
     if not conddb.folderRequested('/TRT/Calib/HTCalib'):
-      conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/HTCalib","/TRT/Calib/HTCalib")
+      conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/HTCalib","/TRT/Calib/HTCalib",className='CondAttrListCollection')
+
 
     # Calibration DB Service
     from TRT_ConditionsServices.TRT_ConditionsServicesConf import TRT_CalDbSvc
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/InDetRecLoadTools.py b/InnerDetector/InDetExample/InDetRecExample/share/InDetRecLoadTools.py
index 79407bab96e..7b4aab95c85 100755
--- a/InnerDetector/InDetExample/InDetRecExample/share/InDetRecLoadTools.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/InDetRecLoadTools.py
@@ -902,9 +902,19 @@ if InDetFlags.loadSummaryTool():
     if DetFlags.haveRIO.TRT_on() and not InDetFlags.doSLHC() and not InDetFlags.doHighPileup() \
             and not InDetFlags.useExistingTracksAsInput(): # TRT_RDOs (used byt the TRT_LocalOccupancy tool) are not present in ESD
 
+        isMC = False
+        if globalflags.DataSource == "geant4" :
+            isMC = True
+
+        from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
+        InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(       name   = "InDetTRT_DriftFunctionTool",
+                                                                  IsMC   = isMC )
+        ToolSvc += InDetTRT_DriftFunctionTool
+
         from TRT_ElectronPidTools.TRT_ElectronPidToolsConf import InDet__TRT_LocalOccupancy
         InDetTRT_LocalOccupancy = InDet__TRT_LocalOccupancy(	  name 				="InDet_TRT_LocalOccupancy",
                                                                   isTrigger			= False, 
+                                                                  TRTDriftFunctionTool          = InDetTRT_DriftFunctionTool
         )
         ToolSvc += InDetTRT_LocalOccupancy
         if (InDetFlags.doPrintConfigurables()):
diff --git a/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigCommonTools.py b/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigCommonTools.py
index de73afab5a8..ef65af23e24 100644
--- a/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigCommonTools.py
+++ b/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigCommonTools.py
@@ -11,23 +11,30 @@ ___version___ = "$Id: $"
 
 from InDetTrigRecExample.InDetTrigConditionsAccess import TRT_ConditionsSetup
 from AthenaCommon.AppMgr import ToolSvc
+from AthenaCommon.GlobalFlags import globalflags
+
+# TRT_DriftFunctionTool
+isMC = False
+if globalflags.DataSource == "geant4" :
+    isMC = True
 
 from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
+
 InDetTrigTRT_DriftFunctionTool = TRT_DriftFunctionTool(name = "InDetTrigTRT_DriftFunctionTool",
                                                        AllowDataMCOverride = True,
-                                                       ForceData = True )
+                                                       ForceData = True,
+                                                       IsMC = isMC,
+                                                       TRTCalDbTool = "TRT_CalDbSvc/TRT_CalDbSvc" )
 
-#
+ToolSvc += InDetTrigTRT_DriftFunctionTool
+
+# TRT_RodDecoder
 from TRT_RawDataByteStreamCnv.TRT_RawDataByteStreamCnvConf import TRT_RodDecoder
-from AthenaCommon.GlobalFlags import globalflags
+
 InDetTrigTRTRodDecoder = TRT_RodDecoder(name = "InDetTrigTRTRodDecoder",
                                         LoadCompressTableDB = (globalflags.DataSource() != 'geant4'))
 ToolSvc += InDetTrigTRTRodDecoder
 
-#InDetTrigTRT_DriftFunctionTool.TRTCalDbTool='TRT_CalDbSvc/'+TRT_ConditionsSetup.instanceName("TRT_CalDbSvc")
-InDetTrigTRT_DriftFunctionTool.TRTCalDbTool='TRT_CalDbSvc/TRT_CalDbSvc'
-ToolSvc += InDetTrigTRT_DriftFunctionTool
-
 # TRT_DriftCircleTool
 from TRT_DriftCircleTool.TRT_DriftCircleToolConf import InDet__TRT_DriftCircleTool
 #these settings offline keeps for MC
diff --git a/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigConfigConditions.py b/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigConfigConditions.py
index 27271e0e57b..979617ef773 100644
--- a/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigConfigConditions.py
+++ b/InnerDetector/InDetExample/InDetTrigRecExample/python/InDetTrigConfigConditions.py
@@ -551,11 +551,12 @@ class TRTConditionsServicesSetup:
       conddb.addFolderSplitOnline ("TRT","/TRT/Onl/Calib/errors","/TRT/Calib/errors",className='TRTCond::RtRelationMultChanContainer')
       # not needed anymore conddb.addOverride('/TRT/Onl/Calib/errors','TrtCalibErrorsOnl-ErrorVal-00-00')
 
-    if not (conddb.folderRequested('/TRT/Calib/ToTCalib') or conddb.folderRequested('/TRT/Onl/Calib/ToTCalib')):
-      conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/ToTCalib","/TRT/Calib/ToTCalib")
+    if not conddb.folderRequested('/TRT/Calib/ToTCalib'):
+        conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/ToTCalib","/TRT/Calib/ToTCalib",className='CondAttrListCollection')
+
+    if not conddb.folderRequested('/TRT/Calib/HTCalib'):
+      conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/HTCalib","/TRT/Calib/HTCalib",className='CondAttrListCollection')
 
-    if not (conddb.folderRequested('/TRT/Calib/HTCalib') or conddb.folderRequested('/TRT/Onl/Calib/HTCalib')):
-      conddb.addFolderSplitOnline("TRT","/TRT/Onl/Calib/HTCalib","/TRT/Calib/HTCalib")
 
     # Calibration DB Service
     from AthenaCommon.AppMgr import ServiceMgr
diff --git a/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/ITRT_DriftFunctionTool.h b/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/ITRT_DriftFunctionTool.h
index 5fa1d42faac..00a8e0f702f 100755
--- a/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/ITRT_DriftFunctionTool.h
+++ b/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/ITRT_DriftFunctionTool.h
@@ -37,9 +37,9 @@ class ITRT_DriftFunctionTool : virtual public IAlgTool {
 
   virtual double errorOfDriftRadius(double drifttime, Identifier id, float mu = -10, unsigned int word=0) const = 0;  
 
-  virtual double driftTimeToTCorrection(double tot, Identifier id) const = 0;
+  virtual double driftTimeToTCorrection(double tot, Identifier id) = 0;
 
-  virtual double driftTimeHTCorrection(Identifier id) const = 0;
+  virtual double driftTimeHTCorrection(Identifier id) = 0;
 
 
 };
diff --git a/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/TRT_DriftFunctionTool.h b/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/TRT_DriftFunctionTool.h
index 3befff3330d..63b14710885 100755
--- a/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/TRT_DriftFunctionTool.h
+++ b/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/TRT_DriftFunctionTool/TRT_DriftFunctionTool.h
@@ -21,11 +21,18 @@
 
 class ITRT_CalDbSvc;
 class TRT_ID;
-class IIncidentSvc;
+
 
 #include "InDetReadoutGeometry/TRT_DetectorManager.h"
-#include "GaudiKernel/IIncidentListener.h"
 #include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/ICondSvc.h"
+#include "StoreGate/ReadCondHandleKey.h"
+#include "StoreGate/DataHandle.h"
+// AttributeList
+#include "CoralBase/Attribute.h"
+#include "CoralBase/AttributeListSpecification.h"
+#include "AthenaPoolUtilities/AthenaAttributeList.h"
+#include "AthenaPoolUtilities/CondAttrListCollection.h"
 /**
  @class TRT_DriftFunctionTool
   
@@ -34,8 +41,7 @@ class IIncidentSvc;
 
 */
 class TRT_DriftFunctionTool: public AthAlgTool, 
-			     virtual public ITRT_DriftFunctionTool,
-			     virtual public IIncidentListener {
+			     virtual public ITRT_DriftFunctionTool{
 
 public:
   /** Constructor                           */
@@ -82,34 +88,34 @@ public:
   double errorOfDriftRadius(double drifttime, Identifier id, float mu = -10, unsigned int word=0) const;  
 
   /** Returns time over threshold correction to the drift time (ns) */
-  double driftTimeToTCorrection(double tot, Identifier id) const;
+  double driftTimeToTCorrection(double tot, Identifier id);
   
   /** Returns high threshold correction to the drift time (ns) */
-  double driftTimeHTCorrection(Identifier id) const;
+  double driftTimeHTCorrection(Identifier id);
   
   /** Initialise Rt relation in data */
   void setupRtRelationData();
   /** Initialise Rt relation in MC */
   void setupRtRelationMC();
 
-  /** handle BeginRun incidents */
-  void handle(const Incident& inc);
 
 private:
-  // Update of database entries.
-  StatusCode update( IOVSVC_CALLBACK_ARGS );
   
   /** Tool to fetch data from database */
   ServiceHandle< ITRT_CalDbSvc >   m_TRTCalDbSvc;
   ServiceHandle< ITRT_CalDbSvc >   m_TRTCalDbSvc2;
 
-  /** Service to report incidents (begin run, begin event) */
-  ServiceHandle< IIncidentSvc > m_IncidentSvc;
 
   /** DetectorManager and helper */
   const InDetDD::TRT_DetectorManager* m_manager;
   const TRT_ID* m_trtid;
 
+  bool m_setupToT;                     //!< true at first call
+  bool m_setupHT;                      //!< true at first call
+  //  ReadHandle  keys
+  SG::ReadCondHandleKey<CondAttrListCollection> m_ToTkey{this,"ToTKeyName","/TRT/Calib/ToTCalib","ToTCalib in-key"};
+  SG::ReadCondHandleKey<CondAttrListCollection> m_HTkey{this,"HTKeyName","/TRT/Calib/HTCalib","HTCalib in-key"};
+
   double m_drifttimeperbin;            //!< 3.125ns
   double m_error;                      //!< universal error
   
@@ -145,6 +151,7 @@ private:
   double m_t0_shift;                   //!< digiversion dependent t0 shift
   float m_tot_corrections[2][20];      //!< ToT corrections for 20 ToT bins in barrel and endcap
   double m_ht_corrections[2];  	       //!< HT corrections for barrel and endcap
+  mutable std::mutex m_cacheMutex;
 };
 
 inline bool TRT_DriftFunctionTool::isValidTime(double drifttime) const
diff --git a/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/src/TRT_DriftFunctionTool.cxx b/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/src/TRT_DriftFunctionTool.cxx
index 102121dd4d5..3f21e776150 100755
--- a/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/src/TRT_DriftFunctionTool.cxx
+++ b/InnerDetector/InDetRecTools/TRT_DriftFunctionTool/src/TRT_DriftFunctionTool.cxx
@@ -14,19 +14,15 @@
 
 #include "TRT_DriftFunctionTool/TRT_DriftFunctionTool.h"
 
+#include "StoreGate/StoreGateSvc.h"
+#include "GaudiKernel/IToolSvc.h"
 #include "GeoModelInterfaces/IGeoModelSvc.h"
 #include "GeoModelUtilities/DecodeVersionKey.h"
 #include "InDetIdentifier/TRT_ID.h"
 #include "InDetReadoutGeometry/TRT_DetectorManager.h"
 #include "InDetReadoutGeometry/TRT_Numerology.h"
 #include "InDetReadoutGeometry/Version.h"
-
-
-#include "GaudiKernel/IIncidentSvc.h"
-#include "EventInfo/EventIncident.h"
-#include "EventInfo/EventInfo.h"
-#include "EventInfo/EventType.h"
-
+#include "StoreGate/ReadCondHandle.h"
 #include "TRT_ConditionsServices/ITRT_CalDbSvc.h"
 
 #include "CLHEP/Units/SystemOfUnits.h"
@@ -41,10 +37,13 @@
 TRT_DriftFunctionTool::TRT_DriftFunctionTool(const std::string& type,
 				     const std::string& name,
 				     const IInterface* parent)
-  :  AthAlgTool(type, name, parent),
+  : AthAlgTool(type, name, parent),
     m_TRTCalDbSvc("TRT_CalDbSvc",name),
     m_TRTCalDbSvc2("",name),
-    m_IncidentSvc("IncidentSvc",name),
+    m_setupToT(true),
+    m_setupHT(true),
+    m_ToTkey("/TRT/Calib/ToTCalib"),
+    m_HTkey("/TRT/Calib/HTCalib"),
     m_drifttimeperbin(3.125 * CLHEP::ns),
     m_error(0.17),
     m_drifttimeperhalfbin(0.), // set later
@@ -67,9 +66,8 @@ TRT_DriftFunctionTool::TRT_DriftFunctionTool(const std::string& type,
 
 {
   declareInterface<ITRT_DriftFunctionTool>(this);
-  declareProperty("IncidentService",m_IncidentSvc);
   m_drifttimeperhalfbin = m_drifttimeperbin/2.;
-  declareProperty("TRT_Calibration",m_isdata);
+  declareProperty("IsMC",m_ismc);
   declareProperty("AllowDigiVersionOverride",m_allow_digi_version_override);
   declareProperty("ForcedDigiVersion",m_forced_digiversion);
   declareProperty("AllowDataMCOverride",m_allow_data_mc_override);
@@ -165,16 +163,6 @@ StatusCode TRT_DriftFunctionTool::initialize()
     ATH_MSG_INFO(" Drift time information ignored ");
   }
 
-  //Incident service (to check for MC/data and setup accordingly)
-  if ( m_IncidentSvc.retrieve().isFailure() ) {
-    ATH_MSG_FATAL("Failed to retrieve service " << m_IncidentSvc);
-    return StatusCode::FAILURE;
-  } else 
-    ATH_MSG_DEBUG("Retrieved service " << m_IncidentSvc);
-
-  // call handle in case of BeginRun
-  m_IncidentSvc->addListener( this, std::string("BeginRun"));
-
   // Retrieve TRT_DetectorManager and helper
   sc = AthAlgTool::detStore()->retrieve(m_manager, m_trt_mgr_location);
   if (sc.isFailure() || !m_manager)
@@ -208,21 +196,52 @@ StatusCode TRT_DriftFunctionTool::initialize()
   DecodeVersionKey versionKey(geomodel,"TRT");
   m_key=versionKey.tag();
 
+  ATH_CHECK( m_ToTkey.initialize() );
+  ATH_CHECK( m_HTkey.initialize() );
+
+  int numB = m_manager->getNumerology()->getNBarrelPhi();
+  ATH_MSG_DEBUG(" Number of Barrel elements "<< numB);      
+      
+  if (numB==2) {
+      m_istestbeam = true;
+  } else {
+      m_istestbeam = false;
+  }
 
-  // Register callback function for cache updates - ToT:
-  const DataHandle<CondAttrListCollection> aptr;
-  if (StatusCode::SUCCESS == detStore()->regFcn(&TRT_DriftFunctionTool::update,this, aptr, "/TRT/Calib/ToTCalib" )) {
-    ATH_MSG_INFO ("Registered callback for TRT_DriftFunctionTool - ToT Correction.");
+
+  bool choosedata = false;
+  bool choosemc = false;
+
+  if(m_ismc) {
+    ATH_MSG_INFO(" TRT_DriftFunctionTool initialized for simulation");
+    choosemc = true;
+    m_isdata=false;
   } else {
-    ATH_MSG_ERROR ("Callback registration failed for TRT_DriftFunctionTool - ToT!  Using default correction values.");
+    ATH_MSG_INFO("  TRT_DriftFunctionTool initialized for data");
+    choosedata = true;
+    m_isdata=true;
+  }
+
+  if(m_allow_data_mc_override) { 
+    choosedata = false;
+    choosemc = false;
+    if (m_forcedata) {
+      ATH_MSG_INFO(" Constants will be read from conddb ");
+      choosedata=true;
+    } else {
+      ATH_MSG_INFO(" Constants will be read from code ");
+      choosemc=true;
+    }
   }
 
-  // Register callback function for cache updates - HT:
-  const DataHandle<CondAttrListCollection> aptrHT;
-  if (StatusCode::SUCCESS == detStore()->regFcn(&TRT_DriftFunctionTool::update,this, aptrHT, "/TRT/Calib/HTCalib" )) {
-    ATH_MSG_INFO ("Registered callback for TRT_DriftFunctionTool - HT Correction.");
+  if(choosemc&&choosedata) ATH_MSG_FATAL("Trying to init MC and data setup both!");
+  if(!choosemc&&!choosedata) ATH_MSG_FATAL("Neither MC nor data setup selected!");
+  if(choosemc) {
+    m_isdata=false;
+    setupRtRelationMC();
   } else {
-    ATH_MSG_ERROR ("Callback registration failed for TRT_DriftFunctionTool - HT!  Using default correction values.");
+    m_isdata=true;
+    setupRtRelationData();
   }
 
   return sc;
@@ -236,78 +255,6 @@ StatusCode TRT_DriftFunctionTool::finalize()
   return sc;
 }
 
-//
-// handle BeginRun incidents------------------------------------------------
-void TRT_DriftFunctionTool::handle(const Incident& inc)
-{
-
-  //Find out what type of run
-  if (inc.type() == "BeginRun") 
-    {
-      const EventInfo* pevt = 0; // pointer for the event
-      StatusCode status = evtStore()->retrieve(pevt); // retrieve the pointer to the event
-      if(!status.isSuccess() || pevt==0) {
-	ATH_MSG_FATAL("Couldn't get EventInfo object from StoreGate");
-        return;
-      }
-
-      int numB = m_manager->getNumerology()->getNBarrelPhi();
-      ATH_MSG_DEBUG(" Number of Barrel elements "<< numB);      
-      
-      if (numB==2) {
-          m_istestbeam = true;
-        } else {
-          m_istestbeam = false;
-        }
-
-      if(pevt->event_type()->test(EventType::IS_CALIBRATION))
-	{
-	  ATH_MSG_DEBUG("Run reports itself as calibration");
-	} else {
-  	  ATH_MSG_DEBUG("Run reports itself as physics");
-	}
-
-      bool choosedata = false;
-      bool choosemc = false;
-
-      if(pevt->event_type()->test(EventType::IS_SIMULATION))
-	{
-	  ATH_MSG_DEBUG("Run reports itself as simulation");
-	  choosemc = true;
-          m_ismc=true;
-	} else {
-	ATH_MSG_DEBUG("Run reports itself as data");
-	  choosedata = true;
-          m_ismc=false;
-	}
-
-      if(m_allow_data_mc_override)
-	{ 
-	  choosedata = false;
-	  choosemc = false;
-	  if (m_forcedata)
-	    {
-	      ATH_MSG_INFO(" Constants will be read from conddb ");
-	      choosedata=true;
-	    } else {
-	    ATH_MSG_INFO(" Constants will be read from code ");
-	      choosemc=true;
-	    }
-	}
-
-      if(choosemc&&choosedata) ATH_MSG_FATAL("Trying to init MC and data setup both!");
-      if(!choosemc&&!choosedata) ATH_MSG_FATAL("Neither MC nor data setup selected!");
-      if(choosemc)
-	{
-	  m_isdata=false;
-          setupRtRelationMC();
-	} else {
-	  m_isdata=true;
-          setupRtRelationData();
-	}
-    }
-  return;
-}
 // Drift time in ns for any non negative drift radius; Not calibrated for
 // individual straws and run range, but otherwise adapted to any
 // setup.
@@ -479,9 +426,37 @@ double TRT_DriftFunctionTool::errorOfDriftRadius(double drifttime, Identifier id
 
 //
 // returns the time over threshold correction in ns 
-double TRT_DriftFunctionTool::driftTimeToTCorrection(double tot, Identifier id) const
+double TRT_DriftFunctionTool::driftTimeToTCorrection(double tot, Identifier id)
 {
 
+  if(m_setupToT) {
+    std::lock_guard<std::mutex> lock(m_cacheMutex);
+    const CondAttrListCollection* atrlistcol;
+    SG::ReadCondHandle<CondAttrListCollection> rch(m_ToTkey);
+    atrlistcol=*rch;
+    if(!atrlistcol) ATH_MSG_ERROR ("Problem reading condDB ToT correction constants.");
+    int channel;
+    std::ostringstream var_name;
+    for (CondAttrListCollection::const_iterator citr=atrlistcol->begin();
+          citr!=atrlistcol->end();++citr) {
+
+       //get Barrel (1) or Endcap (2)
+       channel = citr->first;
+
+       if ((channel == 1) || (channel == 2)) {
+          const coral::AttributeList& atrlist = citr->second;
+
+	  for (int i = 0; i < 20; ++i ) {
+       	    var_name << "TRT_ToT_" << std::dec << i;
+	    m_tot_corrections[channel-1][i] = atrlist[var_name.str()].data<float>();
+	    var_name.str("");
+	  }	 
+       } 
+    }
+    m_setupToT=false;	
+  }
+
+
   int tot_index = tot/3.125;
   if (tot_index < 0) tot_index = 0;
   if (tot_index > 19) tot_index = 19;
@@ -492,9 +467,34 @@ double TRT_DriftFunctionTool::driftTimeToTCorrection(double tot, Identifier id)
 }
 
 // Returns high threshold correction to the drift time (ns) 
-double TRT_DriftFunctionTool::driftTimeHTCorrection(Identifier id) const 
+double TRT_DriftFunctionTool::driftTimeHTCorrection(Identifier id)
 {
 
+  if(m_setupHT) {
+    std::lock_guard<std::mutex> lock(m_cacheMutex);
+    const CondAttrListCollection* atrlistcol;
+    SG::ReadCondHandle<CondAttrListCollection> rch(m_HTkey);
+    atrlistcol=*rch;
+    if(!atrlistcol) ATH_MSG_ERROR ("Problem reading condDB HT correction constants.");
+    int channel;
+    std::ostringstream var_name;
+    for (CondAttrListCollection::const_iterator citr=atrlistcol->begin();
+          citr!=atrlistcol->end();++citr) {
+
+	   channel = citr->first;
+	   if (channel == 1) {
+             const coral::AttributeList& atrlist = citr->second;
+
+	     for (int i = 0; i < 2; ++i ) {
+	       var_name << "TRT_HT_" << std::dec << i;
+       	       m_ht_corrections[i] = atrlist[var_name.str()].data<float>();
+	       var_name.str("");
+	     }	 
+	   } 
+    }
+    m_setupHT=false;	
+  }
+
   int bec_index = abs(m_trtid->barrel_ec(id)) - 1;
   
   return m_ht_corrections[bec_index];
@@ -900,89 +900,3 @@ void TRT_DriftFunctionTool::setupRtRelationMC()
 
         }
 }
-
-/* ----------------------------------------------------------------------------------- */
-// Callback function to update constants from database: 
-/* ----------------------------------------------------------------------------------- */
-StatusCode TRT_DriftFunctionTool::update( IOVSVC_CALLBACK_ARGS_P(I,keys) ) {
-
-  ATH_MSG_INFO ("Updating constants for the TRT_DriftFunctionTool! ");
-
- // Callback function to update Drift Time Correction parameters when condDB data changes:
-  for(std::list<std::string>::const_iterator key=keys.begin(); key != keys.end(); ++key)
-   ATH_MSG_DEBUG("IOVCALLBACK for key " << *key << " number " << I);
-
-  StatusCode status = StatusCode::SUCCESS;
-  
-  for(std::list<std::string>::const_iterator key=keys.begin(); key != keys.end(); ++key) {
-
-    const CondAttrListCollection* atrlistcol;
-    
-    if (*key == "/TRT/Calib/ToTCalib") {
-      ATH_MSG_INFO ("Updating ToT constants for the TRT_DriftFunctionTool! ");
-
-      // Read the ToT Correction parameters:
-      // ----------------------------------------------------------------------------------- //
-      if (StatusCode::SUCCESS == detStore()->retrieve(atrlistcol, "/TRT/Calib/ToTCalib" ) && atrlistcol != 0) {
-
-	 int channel;
-	 std::ostringstream var_name;
-	 for (CondAttrListCollection::const_iterator citr=atrlistcol->begin();
-              citr!=atrlistcol->end();++citr) {
-
-	    //get Barrel (1) or Endcap (2)
-	   channel = citr->first;
-
-	   if ((channel == 1) || (channel == 2)) {
-             const coral::AttributeList& atrlist = citr->second;
-
-	     for (int i = 0; i < 20; ++i ) {
-       	       var_name << "TRT_ToT_" << std::dec << i;
-	       m_tot_corrections[channel-1][i] = atrlist[var_name.str()].data<float>();
-	       var_name.str("");
-	     }	 
-	   } 
-	 }
-	
-      } else {
-	ATH_MSG_ERROR ("Problem reading condDB object for ToT correction constants.");
-	status = StatusCode::FAILURE;
-      }
-    }
-    
-    
-    if (*key == "/TRT/Calib/HTCalib") {
-      ATH_MSG_INFO ("Updating HT constants for the TRT_DriftFunctionTool! ");
-
-      // Read the HT Correction parameters:
-      // ----------------------------------------------------------------------------------- //
-      if (StatusCode::SUCCESS == detStore()->retrieve(atrlistcol, "/TRT/Calib/HTCalib" ) && atrlistcol != 0) {
-
-	 int channel;
-	 std::ostringstream var_name;
-	 for (CondAttrListCollection::const_iterator citr=atrlistcol->begin();
-              citr!=atrlistcol->end();++citr) {
-	      
-	   channel = citr->first;
-
-	   if (channel == 1) {
-             const coral::AttributeList& atrlist = citr->second;
-
-	     for (int i = 0; i < 2; ++i ) {
-	       var_name << "TRT_HT_" << std::dec << i;
-       	       m_ht_corrections[i] = atrlist[var_name.str()].data<float>();
-	       var_name.str("");
-	     }	 
-	   } 
-	 }
-
-       } else {
-	 ATH_MSG_ERROR ("Problem reading condDB object for HT correction constants.");
-	 status = StatusCode::FAILURE;
-       }
-    }
-   
-  }
-  
-  return status;
-}
diff --git a/Reconstruction/egamma/egammaAlgs/python/EMBremCollectionBuilder.py b/Reconstruction/egamma/egammaAlgs/python/EMBremCollectionBuilder.py
index c673273bbcb..36cbb889099 100644
--- a/Reconstruction/egamma/egammaAlgs/python/EMBremCollectionBuilder.py
+++ b/Reconstruction/egamma/egammaAlgs/python/EMBremCollectionBuilder.py
@@ -86,9 +86,19 @@ class egammaBremCollectionBuilder ( egammaAlgsConf.EMBremCollectionBuilder ) :
         #
         GSFBuildTRT_ElectronPidTool = None
         if DetFlags.haveRIO.TRT_on() and not InDetFlags.doSLHC() and not InDetFlags.doHighPileup() :
+         
+            isMC = False
+            if globalflags.DataSource == "geant4" :
+                isMC = True
+            from TRT_DriftFunctionTool.TRT_DriftFunctionToolConf import TRT_DriftFunctionTool
+            InDetTRT_DriftFunctionTool = TRT_DriftFunctionTool(name      = "InDetTRT_DriftFunctionTool",
+                                                               IsMC      = isMC)
+            ToolSvc += InDetTRT_DriftFunctionTool
             
+   
             from TRT_ElectronPidTools.TRT_ElectronPidToolsConf import InDet__TRT_LocalOccupancy
-            GSFBuildTRT_LocalOccupancy = InDet__TRT_LocalOccupancy(name ="GSF_TRT_LocalOccupancy")
+            GSFBuildTRT_LocalOccupancy = InDet__TRT_LocalOccupancy(name ="GSF_TRT_LocalOccupancy",
+                                                                   TRTDriftFunctionTool = InDetTRT_DriftFunctionTool)
             ToolSvc += GSFBuildTRT_LocalOccupancy
                 
             from TRT_ElectronPidTools.TRT_ElectronPidToolsConf import InDet__TRT_ElectronPidToolRun2
-- 
GitLab