2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
5/// @author Nils Krumnack
12#include <AsgMessaging/MessageCheck.h>
13#include <AsgMessaging/StatusCode.h>
14#include <SystematicsHandles/AthenaDependencyHelpers.h>
15#include <SystematicsHandles/ISystematicsSvc.h>
16#include <SystematicsHandles/SysListHandle.h>
19// method implementations
24 template<typename T> template<typename T2> SysReadHandle<T> ::
25 SysReadHandle (T2 *owner, const std::string& propertyName,
26 const std::string& propertyValue,
27 const std::string& propertyDescription)
28 : SysReadHandle (propertyValue, owner)
30 owner->declareProperty (propertyName, m_inputName, propertyDescription);
33 template<typename T> template<typename T2> SysReadHandle<T> ::
34 SysReadHandle (const std::string &inputName, T2 *owner)
35 : AsgMessagingForward (owner), m_inputName(inputName)
36 , m_evtStoreGetter ([owner] () {return &*owner->evtStore();})
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 auto cache = m_inputNameCache.find (sys);
93 if (cache == m_inputNameCache.end())
95 if (m_inputNameCache.empty())
96 throw std::logic_error ("uninitialized SysReadHandle (" + m_inputName + ")");
98 throw std::logic_error ("unsupported systematic in SysReadHandle (" + m_inputName + "): (" + sys.name() + ")");
100 return cache->second;
105 template<typename T> ::StatusCode SysReadHandle<T> ::
106 retrieve (const T*& object, const CP::SystematicSet& sys) const
108 const std::string& name = getName (sys);
110 return m_evtStore->retrieve (object, name);
115 template<typename T> bool SysReadHandle<T> ::
116 isValid (const CP::SystematicSet& sys) const
118 const std::string& name = getName (sys);
120 return m_evtStore->contains<T> (name);
125 template<typename T> CP::SystematicSet SysReadHandle<T> ::
126 getInputAffecting (const ISystematicsSvc& svc) const
128 return svc.getObjectSystematics (m_inputName);
133 template<typename T> StatusCode SysReadHandle<T> ::
134 fillSystematics (const ISystematicsSvc& svc,
135 const CP::SystematicSet& /*fullAffecting*/,
136 const std::vector<CP::SystematicSet>& sysList)
138 const CP::SystematicSet affecting = svc.getObjectSystematics (m_inputName);
139 for (auto& sys : sysList)
141 CP::SystematicSet inputSys;
142 ANA_CHECK (SystematicSet::filterForAffectingSystematics (sys, affecting, inputSys));
143 std::string inputName;
144 ANA_CHECK (svc.makeSystematicsName (inputName, m_inputName, inputSys));
145 m_inputNameCache.emplace (sys, inputName);
148 // retrieving this here, just so it exists
150 m_evtStore = m_evtStoreGetter();
152 ANA_CHECK (addDecorationDependency(svc, "", false));
154 return StatusCode::SUCCESS;
159 template<typename T> StatusCode SysReadHandle<T> ::
160 addDecorationDependency (const ISystematicsSvc& svc, const std::string& decoName, bool decoWrite)
162#ifdef XAOD_STANDALONE
166 return StatusCode::SUCCESS;
168 const CLID clid = detail::getClidForDependency<T>("", decoName, decoWrite);
169 ANA_CHECK (detail::addSysDependency(msg(), svc, m_addAlgDependency, clid, m_inputName, Gaudi::DataHandle::Reader, decoName, decoWrite));
170 return StatusCode::SUCCESS;