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>
18// method implementations
23 template<typename T> template<typename T2> SysReadDecorHandle<T> ::
24 SysReadDecorHandle (T2 *owner, const std::string& propertyName,
25 const std::string& propertyValue,
26 const std::string& propertyDescription)
27 : AsgMessagingForward (owner), m_decorName (propertyValue)
29 owner->declareProperty (propertyName, m_decorName, propertyDescription);
33 template<typename T> template<typename T2> SysReadDecorHandle<T> ::
34 SysReadDecorHandle (const std::string& decorName, T2 *owner)
35 : AsgMessagingForward (owner), m_decorName(decorName)
40 template<typename T> bool SysReadDecorHandle<T> ::
41 empty () const noexcept
43 return m_decorName.empty();
48 template<typename T> SysReadDecorHandle<T> ::
49 operator bool () const noexcept
51 return !m_decorName.empty();
56 template<typename T> StatusCode SysReadDecorHandle<T> ::
57 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle)
59 if (m_objectHandle != nullptr)
61 ANA_MSG_ERROR ("trying to initialize handle twice");
62 return StatusCode::FAILURE;
64 m_objectHandle = &objectHandle;
65 return sysListHandle.addHandle (*this);
70 template<typename T> StatusCode SysReadDecorHandle<T> ::
71 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle, SG::AllowEmptyEnum)
74 return initialize (sysListHandle, objectHandle);
76 return StatusCode::SUCCESS;
81 template<typename T> const std::string& SysReadDecorHandle<T> ::
82 getName (const CP::SystematicSet& sys) const
84 const auto& data = getData (sys);
85 return std::get<0> (data);
90 template<typename T> const T& SysReadDecorHandle<T> ::
91 get (const SG::AuxElement& object,
92 const CP::SystematicSet& sys) const
94 const auto& data = getData (sys);
95 return std::get<1> (data) (object);
100 template<typename T> CP::SystematicSet SysReadDecorHandle<T> ::
101 getInputAffecting (const ISystematicsSvc& svc) const
103 return svc.getDecorSystematics (m_objectHandle->getNamePattern(), m_decorName);
108 template<typename T> StatusCode SysReadDecorHandle<T> ::
109 fillSystematics (const ISystematicsSvc& svc,
110 const CP::SystematicSet& /*fullAffecting*/,
111 const std::vector<CP::SystematicSet>& sysList)
113 const CP::SystematicSet affecting
114 = svc.getDecorSystematics (m_objectHandle->getNamePattern(), m_decorName);
115 for (auto& sys : sysList)
117 CP::SystematicSet inputSys;
118 ANA_CHECK (SystematicSet::filterForAffectingSystematics (sys, affecting, inputSys));
119 std::string decorName;
120 ANA_CHECK (svc.makeSystematicsName (decorName, m_decorName, inputSys));
121 ANA_MSG_DEBUG ("SysReadDecorHandle: " << decorName << " (" << sys.name() << ")");
122 m_dataCache.emplace (sys, std::make_tuple (decorName, decorName));
124 ANA_CHECK (m_objectHandle->addDecorationDependency (svc, m_decorName, false));
125 return StatusCode::SUCCESS;
130 template<typename T> const auto&
131 SysReadDecorHandle<T> ::
132 getData (const CP::SystematicSet& sys) const
134 auto cache = m_dataCache.find (sys);
135 if (cache == m_dataCache.end())
137 if (m_dataCache.empty())
138 throw std::logic_error ("uninitialized SysReadDecorHandle (" + m_decorName + ")");
140 throw std::logic_error ("unsupported systematic in SysReadDecorHandle (" + m_decorName + "): (" + sys.name() + ")");
142 return cache->second;