From a7a771e43f4006e1feb0cb68089df02b9af7dad1 Mon Sep 17 00:00:00 2001
From: Tadej Novak <tadej.novak@cern.ch>
Date: Wed, 19 Aug 2020 12:51:16 +0200
Subject: [PATCH] Add BeamSpotFixerAlg for non-MT pile-up digi

---
 Control/PileUpComps/src/PileUpToolsAlg.cxx    | 12 ++-
 Control/PileUpComps/src/PileUpToolsAlg.h      | 13 ++--
 .../share/ConfiguredOverlay_jobOptions.py     |  5 +-
 .../share/OverlayOutputItemList_jobOptions.py |  2 +-
 .../BeamEffects/python/BeamEffectsConfig.py   | 14 +++-
 .../BeamEffects/python/BeamEffectsConfigDb.py |  3 +-
 .../BeamEffects/src/BeamSpotFixerAlg.cxx      | 76 +++++++++++++++++++
 Simulation/BeamEffects/src/BeamSpotFixerAlg.h | 50 ++++++++++++
 .../src/components/BeamEffects_entries.cxx    |  4 +-
 .../Digitization/python/DigiAlgConfig.py      |  5 ++
 Simulation/Digitization/python/DigiOutput.py  |  6 +-
 .../Digitization/python/PileUpConfig.py       |  5 +-
 Simulation/Digitization/share/BeamSpot.py     | 21 +++++
 .../share/DetectorDigitization.py             |  4 +
 .../test/test_MC16a_Digi_tf_configuration.py  | 12 +--
 .../share/skeleton_LegacyOverlay.py           |  3 +
 16 files changed, 211 insertions(+), 24 deletions(-)
 create mode 100644 Simulation/BeamEffects/src/BeamSpotFixerAlg.cxx
 create mode 100644 Simulation/BeamEffects/src/BeamSpotFixerAlg.h
 create mode 100644 Simulation/Digitization/share/BeamSpot.py

diff --git a/Control/PileUpComps/src/PileUpToolsAlg.cxx b/Control/PileUpComps/src/PileUpToolsAlg.cxx
index 8517c60abdf..38d571797a7 100644
--- a/Control/PileUpComps/src/PileUpToolsAlg.cxx
+++ b/Control/PileUpComps/src/PileUpToolsAlg.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 // Class header
@@ -20,6 +20,8 @@ StatusCode PileUpToolsAlg::initialize()
   ATH_MSG_DEBUG ("Initializing " << name() << " - package version " << PACKAGE_VERSION);
   //locate the pu tools and initialize them
   ATH_CHECK(m_puTools.retrieve());
+  // initialise read handle keys
+  ATH_CHECK(m_eventInfoKey.initialize());
   return StatusCode::SUCCESS;
 }
 
@@ -38,8 +40,12 @@ StatusCode PileUpToolsAlg::execute()
   /////////////////////////////////////////////////////////////////////
   // Get the overlaid event header, print out event and run number
 
-  const xAOD::EventInfo *evt(nullptr); //FIXME should we use a read-handle here?
-  ATH_CHECK_RECOVERABLE(evtStore()->retrieve(evt));
+  SG::ReadHandle<xAOD::EventInfo> evt(m_eventInfoKey);
+  if (!evt.isValid()) {
+    ATH_MSG_ERROR("Could not get xAOD::EventInfo " << evt.name() << " from store " << evt.store());
+    return StatusCode::FAILURE;
+  }
+
   ATH_MSG_INFO ("Hard-scatter xAOD::EventInfo : " << " event: " << evt->eventNumber() << " run: " << evt->runNumber());
 
   // access the sub events...
diff --git a/Control/PileUpComps/src/PileUpToolsAlg.h b/Control/PileUpComps/src/PileUpToolsAlg.h
index 86b2e63bad6..0cf68bb442b 100644
--- a/Control/PileUpComps/src/PileUpToolsAlg.h
+++ b/Control/PileUpComps/src/PileUpToolsAlg.h
@@ -1,7 +1,7 @@
 /* -*- C++ -*- */
 
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PILEUPCOMPS_PILEUPTOOLSALG_H
@@ -22,17 +22,20 @@
 
 /////////////////////////////////////////////////////////////////////////////
 
-class PileUpToolsAlg: public AthAlgorithm {
+class PileUpToolsAlg : public AthAlgorithm
+{
 public:
   PileUpToolsAlg(const std::string& name, ISvcLocator* pSvcLocator);
-  StatusCode initialize();
-  StatusCode execute();
-  StatusCode finalize();
+  virtual StatusCode initialize() override;
+  virtual StatusCode execute() override;
+  virtual StatusCode finalize() override;
 
 private:
   StatusCode clearXing(SubEventIterator& fEvt,
                        const SubEventIterator& lEvt);
   ToolHandleArray<IPileUpTool> m_puTools{this,"PileUpTools",{},"IPileUpTools to be run for each event"};
+
+  SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey{ this, "EventInfoKey", "EventInfo", "ReadHandleKey for xAOD::EventInfo" };
 };
 
 
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py
index c948168df05..5da0e56c03d 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/ConfiguredOverlay_jobOptions.py
@@ -13,6 +13,9 @@ topSequence = job
 if not overlayFlags.isDataOverlay():
     job += CfgGetter.getAlgorithm("CopyTimings")
 
+# Always schedule beam spot conditions for overlay
+include( "Digitization/BeamSpot.py" )
+
 #=======================================================================
 from AthenaCommon.AppMgr import ServiceMgr
 from PileUpComps.PileUpCompsConf import PileUpEventLoopMgr
@@ -25,7 +28,7 @@ from StoreGate.StoreGateConf import StoreGateSvc
 from Digitization.DigitizationFlags import digitizationFlags
 from OverlayCommonAlgs.OverlayFlags import overlayFlags
 
-pileUpEventLoopMgr = PileUpEventLoopMgr()
+pileUpEventLoopMgr = PileUpEventLoopMgr(EventInfoName="Input_EventInfo")
 pileUpEventLoopMgr.OutStreamType = "AthenaOutputStream"
 
 printfunc ("================  DetFlags  ================ ")
diff --git a/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py b/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py
index 249880a477c..4d6d45eb66c 100644
--- a/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py
+++ b/Event/EventOverlay/EventOverlayJobTransforms/share/OverlayOutputItemList_jobOptions.py
@@ -12,7 +12,7 @@ outStream = AthenaPoolOutputStream( "StreamRDO", athenaCommonFlags.PoolRDOOutput
 outStream.Store = ServiceMgr.StoreGateSvc
 
 # overlay output stream
-outStream.ItemList += [ "xAOD::EventInfo#*", "xAOD::EventAuxInfo#*" ]
+outStream.ItemList += [ "xAOD::EventInfo#EventInfo", "xAOD::EventAuxInfo#EventInfoAux." ]
 outStream.ItemList += [ "xAOD::EventInfoContainer#*", "xAOD::EventInfoAuxContainer#*" ]
 outStream.ItemList += [ "LumiBlockCollection#*" ]
 
diff --git a/Simulation/BeamEffects/python/BeamEffectsConfig.py b/Simulation/BeamEffects/python/BeamEffectsConfig.py
index 23a6f351f7e..c8faecaff5d 100644
--- a/Simulation/BeamEffects/python/BeamEffectsConfig.py
+++ b/Simulation/BeamEffects/python/BeamEffectsConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 """
 Configurations for classes in BeamEffects package
@@ -135,3 +135,15 @@ def getBeamEffectsAlg(name="BeamEffectsAlg", **kwargs):
             manipulatorList += ["GenEventBeamEffectBooster"]
     kwargs.setdefault("GenEventManipulators", manipulatorList)
     return CfgMgr.Simulation__BeamEffectsAlg(name, **kwargs)
+
+def getBeamSpotFixerAlg(name="BeamSpotFixerAlg", **kwargs):
+    kwargs.setdefault('InputKey', 'Input_EventInfo')
+
+    from Digitization.DigitizationFlags import digitizationFlags
+    if digitizationFlags.PileUpPremixing and 'OverlayMT' in digitizationFlags.experimentalDigi():
+        from OverlayCommonAlgs.OverlayFlags import overlayFlags
+        kwargs.setdefault('OutputKey', overlayFlags.bkgPrefix() + 'EventInfo')
+    else:
+        kwargs.setdefault('OutputKey', 'EventInfo')
+
+    return CfgMgr.Simulation__BeamSpotFixerAlg(name, **kwargs)
diff --git a/Simulation/BeamEffects/python/BeamEffectsConfigDb.py b/Simulation/BeamEffects/python/BeamEffectsConfigDb.py
index 5ccdb068257..2456328eb71 100644
--- a/Simulation/BeamEffects/python/BeamEffectsConfigDb.py
+++ b/Simulation/BeamEffects/python/BeamEffectsConfigDb.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 from AthenaCommon.CfgGetter import addTool, addAlgorithm
 ## Lorentz Vector Generators
@@ -14,4 +14,5 @@ addTool("BeamEffects.BeamEffectsConfig.getGenEventBeamEffectBooster",         "G
 addTool("BeamEffects.BeamEffectsConfig.getGenEventRotator",                   "GenEventRotator")
 ## Algorithms
 addAlgorithm("BeamEffects.BeamEffectsConfig.getBeamEffectsAlg",               "BeamEffectsAlg")
+addAlgorithm("BeamEffects.BeamEffectsConfig.getBeamSpotFixerAlg",             "BeamSpotFixerAlg")
 
diff --git a/Simulation/BeamEffects/src/BeamSpotFixerAlg.cxx b/Simulation/BeamEffects/src/BeamSpotFixerAlg.cxx
new file mode 100644
index 00000000000..8c8e0cd28cc
--- /dev/null
+++ b/Simulation/BeamEffects/src/BeamSpotFixerAlg.cxx
@@ -0,0 +1,76 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+/// @author Tadej Novak <tadej@cern.ch>
+
+#include <StoreGate/ReadCondHandle.h>
+#include <StoreGate/ReadHandle.h>
+#include <StoreGate/WriteHandle.h>
+#include <xAODEventInfo/EventAuxInfo.h>
+
+#include "BeamSpotFixerAlg.h"
+
+namespace Simulation
+{
+
+  BeamSpotFixerAlg::BeamSpotFixerAlg( const std::string& name, ISvcLocator* pSvcLocator )
+    : AthReentrantAlgorithm( name, pSvcLocator )
+  {
+  }
+
+  /** Athena algorithm's interface method initialize() */
+  StatusCode BeamSpotFixerAlg::initialize()
+  {
+    ATH_CHECK(m_beamSpotKey.initialize());
+
+    ATH_CHECK( m_inputKey.initialize() );
+    ATH_MSG_VERBOSE("Initialized ReadHandleKey: " << m_inputKey);
+    ATH_CHECK( m_outputKey.initialize() );
+    ATH_MSG_VERBOSE("Initialized WriteHandleKey: " << m_outputKey);
+
+    return StatusCode::SUCCESS;
+  }
+
+  StatusCode BeamSpotFixerAlg::execute(const EventContext& ctx) const
+  {
+    SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx };
+    if (!beamSpotHandle.isValid()) {
+      ATH_MSG_ERROR("Beam spot information not valid");
+      return StatusCode::FAILURE;
+    }
+
+    SG::ReadHandle<xAOD::EventInfo> inputEventInfo(m_inputKey, ctx);
+    if (!inputEventInfo.isValid()) {
+      ATH_MSG_ERROR("Could not get input xAOD::EventInfo " << inputEventInfo.name() << " from store " << inputEventInfo.store());
+      return StatusCode::FAILURE;
+    }
+    ATH_MSG_DEBUG("Found input xAOD::EventInfo " << inputEventInfo.name() << " in store " << inputEventInfo.store());
+
+    SG::WriteHandle<xAOD::EventInfo> eventInfo(m_outputKey, ctx);
+    ATH_CHECK(eventInfo.record(std::make_unique<xAOD::EventInfo>(), std::make_unique<xAOD::EventAuxInfo>()));
+    if (!eventInfo.isValid()) {
+      ATH_MSG_ERROR("Could not record output xAOD::EventInfo " << eventInfo.name() << " to store " << eventInfo.store());
+      return StatusCode::FAILURE;
+    }
+    ATH_MSG_DEBUG("Recorded output xAOD::EventInfo " << eventInfo.name() << " in store " << eventInfo.store());
+
+    // Copy the eventInfo data
+    *eventInfo = *inputEventInfo;
+
+    // Copy the beamspot info
+    eventInfo->setBeamPos( beamSpotHandle->beamPos()[ Amg::x ],
+                           beamSpotHandle->beamPos()[ Amg::y ],
+                           beamSpotHandle->beamPos()[ Amg::z ] );
+    eventInfo->setBeamPosSigma( beamSpotHandle->beamSigma( 0 ),
+                                beamSpotHandle->beamSigma( 1 ),
+                                beamSpotHandle->beamSigma( 2 ) );
+    eventInfo->setBeamPosSigmaXY( beamSpotHandle->beamSigmaXY() );
+    eventInfo->setBeamTiltXZ( beamSpotHandle->beamTilt( 0 ) );
+    eventInfo->setBeamTiltYZ( beamSpotHandle->beamTilt( 1 ) );
+    eventInfo->setBeamStatus( beamSpotHandle->beamStatus() );
+
+    return StatusCode::SUCCESS;
+  }
+
+} // namespace Simulation
diff --git a/Simulation/BeamEffects/src/BeamSpotFixerAlg.h b/Simulation/BeamEffects/src/BeamSpotFixerAlg.h
new file mode 100644
index 00000000000..522ce986f2e
--- /dev/null
+++ b/Simulation/BeamEffects/src/BeamSpotFixerAlg.h
@@ -0,0 +1,50 @@
+// Dear emacs, this is -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+/// @author Tadej Novak <tadej@cern.ch>
+
+#ifndef BEAMEFFECTS_BEAMSPOTFIXERALG_H
+#define BEAMEFFECTS_BEAMSPOTFIXERALG_H
+
+#include <AthenaBaseComps/AthReentrantAlgorithm.h>
+#include <StoreGate/ReadCondHandleKey.h>
+#include <StoreGate/ReadHandleKey.h>
+#include <StoreGate/WriteHandleKey.h>
+
+#include <BeamSpotConditionsData/BeamSpotData.h>
+#include <xAODEventInfo/EventInfo.h>
+
+namespace Simulation
+{
+
+  /** @class BeamSpotFixerAlg
+    An algorithm to fix beam spot information in xAOD::EventInfo
+  */
+  class BeamSpotFixerAlg : public AthReentrantAlgorithm
+  {
+  public:
+    //** Constructor with parameters */
+    BeamSpotFixerAlg( const std::string& name, ISvcLocator* pSvcLocator );
+
+    /** Destructor */
+    virtual ~BeamSpotFixerAlg() = default;
+
+    /** Athena algorithm's interface method initialize() */
+    virtual StatusCode initialize() override final;
+
+    /** Athena algorithm's interface method execute() */
+    virtual StatusCode execute(const EventContext& ctx) const override final;
+
+  private:
+    SG::ReadCondHandleKey<InDet::BeamSpotData> m_beamSpotKey { this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot" };
+
+    SG::ReadHandleKey<xAOD::EventInfo> m_inputKey{ this, "InputKey", "Input_EventInfo", "ReadHandleKey for Input xAOD::EventInfo" };
+    SG::WriteHandleKey<xAOD::EventInfo> m_outputKey{ this, "OutputKey", "EventInfo", "WriteHandleKey for Output xAOD::EventInfo" };
+  };
+
+}
+
+#endif // BEAMEFFECTS_BEAMSPOTFIXERALG_H
diff --git a/Simulation/BeamEffects/src/components/BeamEffects_entries.cxx b/Simulation/BeamEffects/src/components/BeamEffects_entries.cxx
index 9ed156c684d..3ed6c64863f 100644
--- a/Simulation/BeamEffects/src/components/BeamEffects_entries.cxx
+++ b/Simulation/BeamEffects/src/components/BeamEffects_entries.cxx
@@ -8,7 +8,9 @@
 #include "../GenEventBeamEffectBooster.h"
 #include "../GenEventRotator.h"
 #include "../BeamEffectsAlg.h"
+#include "../BeamSpotFixerAlg.h"
 #include "../BeamSpotReweightingAlg.h"
+
 DECLARE_COMPONENT( Simulation::ZeroLifetimePositioner )
 DECLARE_COMPONENT( Simulation::GenEventValidityChecker )
 DECLARE_COMPONENT( Simulation::GenEventVertexPositioner )
@@ -19,5 +21,5 @@ DECLARE_COMPONENT( Simulation::VertexPositionFromFile )
 DECLARE_COMPONENT( Simulation::GenEventBeamEffectBooster )
 DECLARE_COMPONENT( Simulation::GenEventRotator )
 DECLARE_COMPONENT( Simulation::BeamEffectsAlg )
+DECLARE_COMPONENT( Simulation::BeamSpotFixerAlg )
 DECLARE_COMPONENT( Simulation::BeamSpotReweightingAlg )
-
diff --git a/Simulation/Digitization/python/DigiAlgConfig.py b/Simulation/Digitization/python/DigiAlgConfig.py
index 561a10c8fb8..f40254bc552 100644
--- a/Simulation/Digitization/python/DigiAlgConfig.py
+++ b/Simulation/Digitization/python/DigiAlgConfig.py
@@ -481,6 +481,11 @@ def getStandardPileUpToolsAlg(name="StandardPileUpToolsAlg", **kwargs):
     kwargs.setdefault('ExtraInputs', [('xAOD::EventInfo', 'EventInfo')])
     from Digitization.DigitizationFlags import digitizationFlags
     if digitizationFlags.doXingByXingPileUp():
+        if digitizationFlags.PileUpPremixing and 'OverlayMT' in digitizationFlags.experimentalDigi():
+            from OverlayCommonAlgs.OverlayFlags import overlayFlags
+            kwargs.setdefault('EventInfoKey', overlayFlags.bkgPrefix() + 'EventInfo')
+        else:
+            kwargs.setdefault('EventInfoKey', 'EventInfo')
         return CfgMgr.PileUpToolsAlg(name, **kwargs)
     else:
         return CfgMgr.DigitizationAlg(name, **kwargs)
diff --git a/Simulation/Digitization/python/DigiOutput.py b/Simulation/Digitization/python/DigiOutput.py
index 92e67613c8a..262ed87cc51 100644
--- a/Simulation/Digitization/python/DigiOutput.py
+++ b/Simulation/Digitization/python/DigiOutput.py
@@ -64,8 +64,12 @@ def getStreamRDO_ItemList(log):
 
     if DetFlags.pileup.any_on() or digitizationFlags.doXingByXingPileUp():
         if DetFlags.writeRDOPool.any_on():
+            outputKey = 'EventInfo'
+            if digitizationFlags.PileUpPremixing and 'OverlayMT' in digitizationFlags.experimentalDigi():
+                from OverlayCommonAlgs.OverlayFlags import overlayFlags
+                outputKey = overlayFlags.bkgPrefix() + 'EventInfo'
             #add to output stream
-            StreamRDO_ItemList += [ "xAOD::EventInfo#*", "xAOD::EventAuxInfo#*" ]
+            StreamRDO_ItemList += [ "xAOD::EventInfo#" + outputKey, "xAOD::EventAuxInfo#" + outputKey + "Aux."]
             StreamRDO_ItemList += [ "xAOD::EventInfoContainer#*", "xAOD::EventInfoAuxContainer#*"]
     # Set up for cosmics digitization
     from AthenaCommon.BeamFlags import jobproperties
diff --git a/Simulation/Digitization/python/PileUpConfig.py b/Simulation/Digitization/python/PileUpConfig.py
index acfe41b7ac2..5afe5d8744f 100644
--- a/Simulation/Digitization/python/PileUpConfig.py
+++ b/Simulation/Digitization/python/PileUpConfig.py
@@ -258,9 +258,6 @@ def getPileUpEventLoopMgr(name="PileUpEventLoopMgr", **kwargs):
         kwargs.setdefault('BeamLuminosity', noProfileSvc)
         ServiceMgr += noProfileSvc
 
-    # Special case for pre-mixing
-    if digitizationFlags.PileUpPremixing and 'OverlayMT' in digitizationFlags.experimentalDigi():
-        from OverlayCommonAlgs.OverlayFlags import overlayFlags
-        kwargs.setdefault('EventInfoName', overlayFlags.bkgPrefix() + 'EventInfo')
+    kwargs.setdefault('EventInfoName', 'Input_EventInfo')  # for beam spot fix
 
     return CfgMgr.PileUpEventLoopMgr(name, **kwargs)
diff --git a/Simulation/Digitization/share/BeamSpot.py b/Simulation/Digitization/share/BeamSpot.py
new file mode 100644
index 00000000000..45cb1457939
--- /dev/null
+++ b/Simulation/Digitization/share/BeamSpot.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+# Always schedule beam spot conditions for digi
+from AthenaCommon.AlgSequence import AthSequencer
+condSeq = AthSequencer("AthCondSeq")
+if not hasattr(condSeq, "BeamSpotCondAlg"):
+    from IOVDbSvc.CondDB import conddb
+    conddb.addFolderSplitOnline("INDET", "/Indet/Onl/Beampos", "/Indet/Beampos", className="AthenaAttributeList")
+    from BeamSpotConditions.BeamSpotConditionsConf import BeamSpotCondAlg
+    condSeq += BeamSpotCondAlg("BeamSpotCondAlg")
+
+# Add beam spot fixer
+from AthenaCommon import CfgGetter
+from AthenaCommon.DetFlags import DetFlags
+from AthenaCommon.GlobalFlags import globalflags
+from Digitization.DigitizationFlags import digitizationFlags
+from OverlayCommonAlgs.OverlayFlags import overlayFlags
+if (DetFlags.pileup.any_on() or digitizationFlags.doXingByXingPileUp()) or (globalflags.isOverlay() and not overlayFlags.isOverlayMT()):
+    from AthenaCommon.AlgSequence import AlgSequence
+    job = AlgSequence()
+    job += CfgGetter.getAlgorithm("BeamSpotFixerAlg")
diff --git a/Simulation/Digitization/share/DetectorDigitization.py b/Simulation/Digitization/share/DetectorDigitization.py
index 820e1b04ac2..c801261154a 100755
--- a/Simulation/Digitization/share/DetectorDigitization.py
+++ b/Simulation/Digitization/share/DetectorDigitization.py
@@ -41,6 +41,10 @@ if 'LegacyEventInfo' in digitizationFlags.experimentalDigi() and \
     from xAODEventInfoCnv.xAODEventInfoCnvAlgDefault import xAODEventInfoCnvAlgDefault
     xAODEventInfoCnvAlgDefault (sequence = job)
 
+# Beam spot
+include( "Digitization/BeamSpot.py" )
+
+# Configure main algorithm
 job += CfgGetter.getAlgorithm(digitizationFlags.digiSteeringConf.get_Value(), tryDefaultConfigurable=True)
 if 'doFastPixelDigi' in digitizationFlags.experimentalDigi() or 'doFastSCT_Digi' in digitizationFlags.experimentalDigi() or 'doFastTRT_Digi' in digitizationFlags.experimentalDigi():
     print ("WARNING  Setting doFastPixelDigi ,doFastSCT_Digi or doFastTRT_Digi in digitizationFlags.experimentalDigi no longer overrides digitizationFlags.digiSteeringConf.")
diff --git a/Simulation/Digitization/test/test_MC16a_Digi_tf_configuration.py b/Simulation/Digitization/test/test_MC16a_Digi_tf_configuration.py
index 850c6f54371..99c84a4c704 100755
--- a/Simulation/Digitization/test/test_MC16a_Digi_tf_configuration.py
+++ b/Simulation/Digitization/test/test_MC16a_Digi_tf_configuration.py
@@ -155,18 +155,18 @@ class TestDigitizationMC16a(unittest.TestCase):
                 expected_Property)
 
 
-    def test___PileUpToolsAlg_is_second_in_AthAlgSeq(self):
-        expected_AlgSequence = ['TimingAlg/DigiTimerBegin', 'PileUpToolsAlg/StandardSignalOnlyTruthPileUpToolsAlg', 'LArRawChannelBuilderAlg/LArRawChannelBuilder', 'LArDigitThinner/LArDigitThinner', 'TileDigitsMaker/TileDigitsMaker', 'TileDQstatusAlg/TileDQstatusAlg', 'TileRawChannelMaker/TileRChMaker', 'TileRawChannelToL2/TileRawChannelToL2', 'CscDigitToCscRDO/CscDigitToCscRDO', 'MdtDigitToMdtRDO/MdtDigitToMdtRDO', 'RpcDigitToRpcRDO/RpcDigitToRpcRDO', 'TgcDigitToTgcRDO/TgcDigitToTgcRDO', 'LArTTL1Maker/LArTTL1Maker', 'TileHitToTTL1/TileHitToTTL1', 'TilePulseForTileMuonReceiver/TilePulseForTileMuonReceiver', 'TileMuonReceiverDecision/TileMuonReceiverDecision']
+    def test___PileUpToolsAlg_is_third_in_AthAlgSeq(self):
+        expected_AlgSequence = ['TimingAlg/DigiTimerBegin', 'Simulation::BeamSpotFixerAlg/BeamSpotFixerAlg', 'PileUpToolsAlg/StandardSignalOnlyTruthPileUpToolsAlg', 'LArRawChannelBuilderAlg/LArRawChannelBuilder', 'LArDigitThinner/LArDigitThinner', 'TileDigitsMaker/TileDigitsMaker', 'TileDQstatusAlg/TileDQstatusAlg', 'TileRawChannelMaker/TileRChMaker', 'TileRawChannelToL2/TileRawChannelToL2', 'CscDigitToCscRDO/CscDigitToCscRDO', 'MdtDigitToMdtRDO/MdtDigitToMdtRDO', 'RpcDigitToRpcRDO/RpcDigitToRpcRDO', 'TgcDigitToTgcRDO/TgcDigitToTgcRDO', 'LArTTL1Maker/LArTTL1Maker', 'TileHitToTTL1/TileHitToTTL1', 'TilePulseForTileMuonReceiver/TilePulseForTileMuonReceiver', 'TileMuonReceiverDecision/TileMuonReceiverDecision']
         ignore_Algs = ['EventInfoTagBuilder/EventInfoTagBuilder']
         ath_alg_seqence_as_str = self._job_config_dict['AthAlgSeq']['Members']
         # need to evaluate to obtain actual Python object
         ath_alg_seqence_list = [ alg for alg in eval(ath_alg_seqence_as_str) if alg not in ignore_Algs ]
 
-        actual_2nd_ath_alg_sequence_entry = ath_alg_seqence_list[1]
+        actual_3rd_ath_alg_sequence_entry = ath_alg_seqence_list[2]
         print(ath_alg_seqence_list)
-        expected_2nd_ath_alg_sequence_entry = "PileUpToolsAlg/StandardSignalOnlyTruthPileUpToolsAlg"
-        self.assertEqual(expected_2nd_ath_alg_sequence_entry,
-                         actual_2nd_ath_alg_sequence_entry)
+        expected_3rd_ath_alg_sequence_entry = "PileUpToolsAlg/StandardSignalOnlyTruthPileUpToolsAlg"
+        self.assertEqual(expected_3rd_ath_alg_sequence_entry,
+                         actual_3rd_ath_alg_sequence_entry)
         self.assertEqual(expected_AlgSequence, ath_alg_seqence_list)
 
 
diff --git a/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py b/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py
index 63e701386fd..f9ccd52afcc 100644
--- a/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py
+++ b/Simulation/Overlay/OverlayConfiguration/share/skeleton_LegacyOverlay.py
@@ -216,6 +216,9 @@ include('EventOverlayJobTransforms/ConfiguredOverlayMT_jobOptions.py')  # noqa F
 # load the input properly
 include('EventOverlayJobTransforms/OverlayInput_jobOptions.py')  # noqa F821
 
+# Always schedule beam spot conditions for overlay
+include('Digitization/BeamSpot.py')  # noqa F821
+
 if DetFlags.overlay.Truth_on():
     include('EventOverlayJobTransforms/TruthOverlay_jobOptions.py')  # noqa F821
 
-- 
GitLab