ATLAS Offline Software
Loading...
Searching...
No Matches
SysWriteDecorHandle.icc
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5/// @author Nils Krumnack
6
7
8//
9// includes
10//
11
12#include <AsgMessaging/MessageCheck.h>
13#include <AsgMessaging/StatusCode.h>
14
15#include <regex>
16
17//
18// method implementations
19//
20
21namespace CP
22{
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)
28 {
29 owner->declareProperty (propertyName, m_decorName, propertyDescription);
30 }
31
32 template<typename T> template<typename T2> SysWriteDecorHandle<T> ::
33 SysWriteDecorHandle (const std::string& decorName, T2 *owner)
34 : AsgMessagingForward (owner), m_decorName(decorName)
35 {}
36
37
38
39 template<typename T> bool SysWriteDecorHandle<T> ::
40 empty () const noexcept
41 {
42 return m_decorName.empty();
43 }
44
45
46
47 template<typename T> SysWriteDecorHandle<T> ::
48 operator bool () const noexcept
49 {
50 return !m_decorName.empty();
51 }
52
53
54
55 template<typename T> StatusCode SysWriteDecorHandle<T> ::
56 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle)
57 {
58 if (m_objectHandle != nullptr)
59 {
60 ANA_MSG_ERROR ("trying to initialize handle twice");
61 return StatusCode::FAILURE;
62 }
63 m_objectHandle = &objectHandle;
64 return sysListHandle.addHandle (*this);
65 }
66
67
68
69 template<typename T> StatusCode SysWriteDecorHandle<T> ::
70 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle, SG::AllowEmptyEnum)
71 {
72 if (!empty())
73 return initialize (sysListHandle, objectHandle);
74 else
75 return StatusCode::SUCCESS;
76 }
77
78
79
80 template<typename T> const std::string& SysWriteDecorHandle<T> ::
81 getName (const CP::SystematicSet& sys) const
82 {
83 const auto& data = getData (sys);
84 return std::get<0> (data);
85 }
86
87
88
89 template<typename T> const std::string& SysWriteDecorHandle<T> ::
90 getDecorName () const noexcept
91 {
92 return m_decorName;
93 }
94
95
96
97 template<typename T> void SysWriteDecorHandle<T> ::
98 set (const SG::AuxElement& object, const T& value,
99 const CP::SystematicSet& sys) const
100 {
101 const auto& data = getData (sys);
102 std::get<1> (data) (object) = value;
103 }
104
105
106
107 template<typename T> void SysWriteDecorHandle<T> ::
108 lock (const SG::AuxElement& object,
109 const CP::SystematicSet& sys) const
110 {
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());
115 }
116
117
118
119 template<typename T> CP::SystematicSet SysWriteDecorHandle<T> ::
120 getInputAffecting (const ISystematicsSvc& /*svc*/) const
121 {
122 return CP::SystematicSet ();
123 }
124
125
126
127 template<typename T> StatusCode SysWriteDecorHandle<T> ::
128 fillSystematics (const ISystematicsSvc& svc,
129 const CP::SystematicSet& fullAffecting,
130 const std::vector<CP::SystematicSet>& sysList)
131 {
132 for (auto& sys : sysList)
133 {
134 std::string newName;
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));
138 }
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;
142 }
143
144
145
146 template<typename T> const auto&
147 SysWriteDecorHandle<T> ::
148 getData (const CP::SystematicSet& sys) const
149 {
150 auto cache = m_dataCache.find (sys);
151 if (cache == m_dataCache.end())
152 {
153 if (m_dataCache.empty())
154 throw std::logic_error ("uninitialized SysWriteDecorHandle (" + m_decorName + ")");
155 else
156 throw std::logic_error ("unsupported systematic in SysWriteDecorHandle (" + m_decorName + "): (" + sys.name() + ")");
157 }
158 return cache->second;
159 }
160}