ATLAS Offline Software
Loading...
Searching...
No Matches
SysReadDecorHandle.icc
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2018 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> 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)
28 {
29 owner->declareProperty (propertyName, m_decorName, propertyDescription);
30 }
31
32
33 template<typename T> template<typename T2> SysReadDecorHandle<T> ::
34 SysReadDecorHandle (const std::string& decorName, T2 *owner)
35 : AsgMessagingForward (owner), m_decorName(decorName)
36 {}
37
38
39
40 template<typename T> bool SysReadDecorHandle<T> ::
41 empty () const noexcept
42 {
43 return m_decorName.empty();
44 }
45
46
47
48 template<typename T> SysReadDecorHandle<T> ::
49 operator bool () const noexcept
50 {
51 return !m_decorName.empty();
52 }
53
54
55
56 template<typename T> StatusCode SysReadDecorHandle<T> ::
57 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle)
58 {
59 if (m_objectHandle != nullptr)
60 {
61 ANA_MSG_ERROR ("trying to initialize handle twice");
62 return StatusCode::FAILURE;
63 }
64 m_objectHandle = &objectHandle;
65 return sysListHandle.addHandle (*this);
66 }
67
68
69
70 template<typename T> StatusCode SysReadDecorHandle<T> ::
71 initialize (SysListHandle& sysListHandle, ISysObjectHandleBase& objectHandle, SG::AllowEmptyEnum)
72 {
73 if (!empty())
74 return initialize (sysListHandle, objectHandle);
75 else
76 return StatusCode::SUCCESS;
77 }
78
79
80
81 template<typename T> const std::string& SysReadDecorHandle<T> ::
82 getName (const CP::SystematicSet& sys) const
83 {
84 const auto& data = getData (sys);
85 return std::get<0> (data);
86 }
87
88
89
90 template<typename T> const T& SysReadDecorHandle<T> ::
91 get (const SG::AuxElement& object,
92 const CP::SystematicSet& sys) const
93 {
94 const auto& data = getData (sys);
95 return std::get<1> (data) (object);
96 }
97
98
99
100 template<typename T> CP::SystematicSet SysReadDecorHandle<T> ::
101 getInputAffecting (const ISystematicsSvc& svc) const
102 {
103 return svc.getDecorSystematics (m_objectHandle->getNamePattern(), m_decorName);
104 }
105
106
107
108 template<typename T> StatusCode SysReadDecorHandle<T> ::
109 fillSystematics (const ISystematicsSvc& svc,
110 const CP::SystematicSet& /*fullAffecting*/,
111 const std::vector<CP::SystematicSet>& sysList)
112 {
113 const CP::SystematicSet affecting
114 = svc.getDecorSystematics (m_objectHandle->getNamePattern(), m_decorName);
115 for (auto& sys : sysList)
116 {
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));
123 }
124 ANA_CHECK (m_objectHandle->addDecorationDependency (svc, m_decorName, false));
125 return StatusCode::SUCCESS;
126 }
127
128
129
130 template<typename T> const auto&
131 SysReadDecorHandle<T> ::
132 getData (const CP::SystematicSet& sys) const
133 {
134 auto cache = m_dataCache.find (sys);
135 if (cache == m_dataCache.end())
136 {
137 if (m_dataCache.empty())
138 throw std::logic_error ("uninitialized SysReadDecorHandle (" + m_decorName + ")");
139 else
140 throw std::logic_error ("unsupported systematic in SysReadDecorHandle (" + m_decorName + "): (" + sys.name() + ")");
141 }
142 return cache->second;
143 }
144}