2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
5/// @author Nils Krumnack
12#include <AsgMessaging/MessageCheck.h>
13#include <SystematicsHandles/AthenaDependencyHelpers.h>
16// method implementations
21 template<typename T,typename Aux> template<typename T2> SysWriteHandle<T,Aux> ::
22 SysWriteHandle (T2 *owner, const std::string& propertyName,
23 const std::string& propertyValue,
24 const std::string& propertyDescription)
25 : SysWriteHandle (propertyValue, owner)
27 owner->declareProperty (propertyName, m_outputName, propertyDescription);
28 owner->declareProperty (propertyName + "Type", m_outputType,
29 "an explicit type name for output dependencies");
33 template<typename T,typename Aux> template<typename T2> SysWriteHandle<T,Aux> ::
34 SysWriteHandle (const std::string &outputName, T2 *owner)
35 : AsgMessagingForward (owner), m_outputName (outputName)
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);
47 template<typename T,typename Aux> bool SysWriteHandle<T,Aux> ::
48 empty () const noexcept
50 return m_outputName.empty();
55 template<typename T,typename Aux> SysWriteHandle<T,Aux> ::
56 operator bool () const noexcept
58 return !m_outputName.empty();
63 template<typename T,typename Aux> std::string SysWriteHandle<T,Aux> ::
64 getNamePattern () const
71 template<typename T,typename Aux>
72 StatusCode SysWriteHandle<T,Aux> ::
73 initialize (SysListHandle& sysListHandle)
75 return sysListHandle.addHandle (*this);
80 template<typename T,typename Aux>
81 StatusCode SysWriteHandle<T,Aux> ::
82 initialize (SysListHandle& sysListHandle, SG::AllowEmptyEnum)
85 return initialize (sysListHandle);
87 return StatusCode::SUCCESS;
92 template<typename T,typename Aux>
93 const std::string& SysWriteHandle<T,Aux> ::
94 getName (const CP::SystematicSet& sys) const
96 auto cache = m_outputNameCache.find (sys);
97 if (cache == m_outputNameCache.end())
99 if (m_outputName.empty())
100 throw std::logic_error ("uninitialized SysWriteHandle(" + m_outputName + ")");
102 throw std::logic_error ("unknown systematic in SysWriteHandle(" + m_outputName + "): (" + sys.name() + ")");
104 return cache->second;
109 template<typename T,typename Aux>
110 template<typename,typename>
111 ::StatusCode SysWriteHandle<T,Aux> ::
112 record (std::unique_ptr<T> object, const CP::SystematicSet& sys) const
114 const std::string& name = getName (sys);
116 return m_evtStore->record (object.release(), name);
121 template<typename T,typename Aux>
122 template<typename,typename>
123 ::StatusCode SysWriteHandle<T,Aux> ::
124 record (std::unique_ptr<T> object, std::unique_ptr<Aux> aux,
125 const CP::SystematicSet& sys) const
127 auto cache = m_outputNameCache.find (sys);
128 if (cache == m_outputNameCache.end())
130 if (m_outputName.empty())
131 throw std::logic_error ("uninitialized SysWriteHandle(" + m_outputName + ")");
133 throw std::logic_error ("unknown systematic in SysWriteHandle(" + m_outputName + "): (" + sys.name() + ")");
136 if (m_evtStore->record (aux.release(), cache->second + "Aux.").isFailure())
137 return StatusCode::FAILURE;
138 if (m_evtStore->record (object.release(), cache->second).isFailure())
139 return StatusCode::FAILURE;
140 return StatusCode::SUCCESS;
145 template<typename T,typename Aux>
146 CP::SystematicSet SysWriteHandle<T,Aux> ::
147 getInputAffecting (const ISystematicsSvc& /*svc*/) const
149 return CP::SystematicSet ();
154 template<typename T,typename Aux>
155 StatusCode SysWriteHandle<T,Aux> ::
156 fillSystematics (const ISystematicsSvc& svc,
157 const CP::SystematicSet& fullAffecting,
158 const std::vector<CP::SystematicSet>& sysList)
161 m_evtStore = m_evtStoreGetter();
162 for (auto& sys : sysList)
165 ANA_CHECK (svc.makeSystematicsName (newName, m_outputName, sys));
166 ANA_MSG_DEBUG ("SysWriteHandle: " << newName << " (" << sys.name() << ")");
167 m_outputNameCache.emplace (sys, newName);
169 ANA_CHECK (svc.setObjectSystematics (m_outputName, fullAffecting));
171 ANA_CHECK (addDecorationDependency(svc, "", false));
173 return StatusCode::SUCCESS;
178 template<typename T,typename Aux>
179 StatusCode SysWriteHandle<T,Aux> ::
180 addDecorationDependency (const ISystematicsSvc& svc, const std::string& decoName, bool decoWrite)
182#ifdef XAOD_STANDALONE
186 return StatusCode::SUCCESS;
188 const CLID clid = detail::getClidForDependency<T>(m_outputType, decoName, decoWrite);
189 ANA_CHECK (detail::addSysDependency(msg(), svc, m_addAlgDependency, clid, m_outputName, Gaudi::DataHandle::Writer, decoName, decoWrite));
190 return StatusCode::SUCCESS;