2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
5/// @author Nils Krumnack
12#include <AsgDataHandles/ReadHandle.h>
13#include <AsgMessaging/MessageCheck.h>
14#include <AsgMessaging/StatusCode.h>
15#include <SystematicsHandles/AthenaDependencyHelpers.h>
16#include <SystematicsHandles/ISystematicsSvc.h>
17#include <SystematicsHandles/SysListHandle.h>
20// method implementations
25 template<typename T> template<typename T2> SysReadHandle<T> ::
26 SysReadHandle (T2 *owner, const std::string& propertyName,
27 const std::string& propertyValue,
28 const std::string& propertyDescription)
29 : SysReadHandle (propertyValue, owner)
31 owner->declareProperty (propertyName, m_inputName, propertyDescription);
34 template<typename T> template<typename T2> SysReadHandle<T> ::
35 SysReadHandle (const std::string &inputName, T2 *owner)
36 : AsgMessagingForward (owner), m_inputName(inputName)
38#ifndef XAOD_STANDALONE
39 m_addAlgDependency = [owner](const DataObjID& id, Gaudi::DataHandle::Mode mode) {
40 owner->addDependency(id, mode);
46 template<typename T> bool SysReadHandle<T> ::
47 empty () const noexcept
49 return m_inputName.empty();
54 template<typename T> SysReadHandle<T> ::
55 operator bool () const noexcept
57 return !m_inputName.empty();
62 template<typename T> std::string SysReadHandle<T> ::
63 getNamePattern () const
70 template<typename T> StatusCode SysReadHandle<T> ::
71 initialize (SysListHandle& sysListHandle)
73 return sysListHandle.addHandle (*this);
78 template<typename T> StatusCode SysReadHandle<T> ::
79 initialize (SysListHandle& sysListHandle, SG::AllowEmptyEnum)
82 return initialize (sysListHandle);
84 return StatusCode::SUCCESS;
89 template<typename T> const std::string& SysReadHandle<T> ::
90 getName (const CP::SystematicSet& sys) const
92 return getReadHandle (sys).key();
97 template<typename T> ::StatusCode SysReadHandle<T> ::
98 retrieve (const T*& object, const CP::SystematicSet& sys,
99 const EventContext& ctx) const
101 SG::ReadHandle<T> handle (getReadHandle (sys), ctx);
102 object = handle.cptr();
103 if (object == nullptr)
104 return StatusCode::FAILURE;
105 return StatusCode::SUCCESS;
110 template<typename T> bool SysReadHandle<T> ::
111 isValid (const CP::SystematicSet& sys, const EventContext& ctx) const
113 SG::ReadHandle<T> handle (getReadHandle (sys), ctx);
114 return handle.isPresent();
119 template<typename T> CP::SystematicSet SysReadHandle<T> ::
120 getInputAffecting (const ISystematicsSvc& svc) const
122 return svc.getObjectSystematics (m_inputName);
127 template<typename T> StatusCode SysReadHandle<T> ::
128 fillSystematics (const ISystematicsSvc& svc,
129 const CP::SystematicSet& /*fullAffecting*/,
130 const std::vector<CP::SystematicSet>& sysList)
132 const CP::SystematicSet affecting = svc.getObjectSystematics (m_inputName);
133 for (auto& sys : sysList)
135 CP::SystematicSet inputSys;
136 ANA_CHECK (SystematicSet::filterForAffectingSystematics (sys, affecting, inputSys));
137 std::string inputName;
138 ANA_CHECK (svc.makeSystematicsName (inputName, m_inputName, inputSys));
139 SG::ReadHandleKey<T> readHandle (inputName);
140 ANA_CHECK (readHandle.initialize ());
141 m_sysData.emplace (sys, SysData{std::move (readHandle)});
144 ANA_CHECK (addDecorationDependency(svc, "", false));
146 return StatusCode::SUCCESS;
151 template<typename T> StatusCode SysReadHandle<T> ::
152 addDecorationDependency (const ISystematicsSvc& svc, const std::string& decoName, bool decoWrite)
154#ifdef XAOD_STANDALONE
158 return StatusCode::SUCCESS;
160 const CLID clid = detail::getClidForDependency<T>("", decoName, decoWrite);
161 ANA_CHECK (detail::addSysDependency(msg(), svc, m_addAlgDependency, clid, m_inputName, Gaudi::DataHandle::Reader, decoName, decoWrite));
162 return StatusCode::SUCCESS;
168 template<typename T> const SG::ReadHandleKey<T>& SysReadHandle<T> ::
169 getReadHandle (const CP::SystematicSet& sys) const
171 auto cache = m_sysData.find (sys);
172 if (cache == m_sysData.end())
174 if (m_sysData.empty())
175 throw std::logic_error ("uninitialized SysReadHandle (" + m_inputName + ")");
177 throw std::logic_error ("unsupported systematic in SysReadHandle (" + m_inputName + "): (" + sys.name() + ")");
179 return cache->second.readHandle;