2 Copyright (C) 2002-2024 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> SysWriteDecorHandle<T> ::
24 SysWriteDecorHandle (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);
32 template<typename T> template<typename T2> SysWriteDecorHandle<T> ::
33 SysWriteDecorHandle (const std::string& decorName, T2 *owner)
34 : AsgMessagingForward (owner), m_decorName(decorName)
39 template<typename T> bool SysWriteDecorHandle<T> ::
40 empty () const noexcept
42 return m_decorName.empty();
47 template<typename T> SysWriteDecorHandle<T> ::
48 operator bool () const noexcept
50 return !m_decorName.empty();
55 template<typename T> StatusCode SysWriteDecorHandle<T> ::
56 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle)
58 if (m_objectHandle != nullptr)
60 ANA_MSG_ERROR ("trying to initialize handle twice");
61 return StatusCode::FAILURE;
63 m_objectHandle = &objectHandle;
64 return sysListHandle.addHandle (*this);
69 template<typename T> StatusCode SysWriteDecorHandle<T> ::
70 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle, SG::AllowEmptyEnum)
73 return initialize (sysListHandle, objectHandle);
75 return StatusCode::SUCCESS;
80 template<typename T> const std::string& SysWriteDecorHandle<T> ::
81 getName (const CP::SystematicSet& sys) const
83 const auto& data = getData (sys);
84 return std::get<0> (data);
89 template<typename T> const std::string& SysWriteDecorHandle<T> ::
90 getDecorName () const noexcept
97 template<typename T> void SysWriteDecorHandle<T> ::
98 set (const SG::AuxElement& object, const T& value,
99 const CP::SystematicSet& sys) const
101 const auto& data = getData (sys);
102 std::get<1> (data) (object) = value;
107 template<typename T> void SysWriteDecorHandle<T> ::
108 lock (const SG::AuxElement& object,
109 const CP::SystematicSet& sys) const
111 const auto& data = getData (sys);
112 SG::AuxVectorData* cont_nc ATLAS_THREAD_SAFE =
113 const_cast<SG::AuxVectorData*> (object.container());
114 cont_nc->lockDecoration (std::get<1> (data).auxid());
119 template<typename T> CP::SystematicSet SysWriteDecorHandle<T> ::
120 getInputAffecting (const ISystematicsSvc& /*svc*/) const
122 return CP::SystematicSet ();
127 template<typename T> StatusCode SysWriteDecorHandle<T> ::
128 fillSystematics (const ISystematicsSvc& svc,
129 const CP::SystematicSet& fullAffecting,
130 const std::vector<CP::SystematicSet>& sysList)
132 for (auto& sys : sysList)
135 ANA_CHECK (svc.makeSystematicsName (newName, m_decorName, sys));
136 ANA_MSG_DEBUG ("SysWriteDecorHandle: " << newName << " (" << sys.name() << ")");
137 m_dataCache.emplace (sys, std::make_tuple (newName, newName));
139 ANA_CHECK (svc.setDecorSystematics (m_objectHandle->getNamePattern(), m_decorName, fullAffecting));
140 ANA_CHECK (m_objectHandle->addDecorationDependency (svc, m_decorName, true));
141 return StatusCode::SUCCESS;
146 template<typename T> const auto&
147 SysWriteDecorHandle<T> ::
148 getData (const CP::SystematicSet& sys) const
150 auto cache = m_dataCache.find (sys);
151 if (cache == m_dataCache.end())
153 if (m_dataCache.empty())
154 throw std::logic_error ("uninitialized SysWriteDecorHandle (" + m_decorName + ")");
156 throw std::logic_error ("unsupported systematic in SysWriteDecorHandle (" + m_decorName + "): (" + sys.name() + ")");
158 return cache->second;