ATLAS Offline Software
Loading...
Searching...
No Matches
SystematicsSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8//
9// includes
10//
11
13
17#include <cassert>
18#include <cmath>
19#include <regex>
20#include <functional>
21
22//
23// method implementations
24//
25
26namespace CP
27{
28
29 StatusCode SystematicsSvc ::
30 initialize ()
31 {
32 if (!std::isfinite (m_sigmaRecommended) ||
34 {
35 ANA_MSG_ERROR ("invalid value for sigmaRecommended: " << m_sigmaRecommended);
36 return StatusCode::FAILURE;
37 }
38
39 if (m_sigmaRecommended != 0)
40 {
41 if (!m_systematicsList.empty())
42 {
43 ANA_MSG_ERROR ("can't specify both sigmaRecommended and systematicsList");
44 return StatusCode::FAILURE;
45 }
46 }
47 return StatusCode::SUCCESS;
48 }
49
50
51
52 std::vector<CP::SystematicSet> SystematicsSvc ::
53 makeSystematicsVector () const
54 {
55 std::lock_guard<std::mutex> lock (m_systematicsMutex);
56 std::vector<CP::SystematicSet> systematicsVector;
57
58 if (m_sigmaRecommended != 0)
59 {
60 assert (m_sigmaRecommended > 0);
61
63 sys.setSigma (m_sigmaRecommended);
64 sys.calc (m_recommendedSystematics);
65
66 std::regex expr (m_systematicsRegex.value());
67 for (const CP::SystematicSet& mysys : sys.result(""))
68 {
69 if (!regex_match (mysys.name(), expr))
70 {
71 ANA_MSG_DEBUG ("skipping systematic: " << mysys.name());
72 } else {
73 ANA_MSG_DEBUG ("configuring systematic: " << mysys.name());
74 systematicsVector.push_back (mysys);
75 }
76 }
77 } else if (m_systematicsList.empty())
78 {
79 // take an empty property as running just the central
80 // systematics set. implication is that you can't really run
81 // doing nothing, but that ought to be Ok.
82 systematicsVector.push_back (CP::SystematicSet ());
83 } else
84 {
85 for (const std::string& sysName : m_systematicsList)
86 systematicsVector.push_back (CP::SystematicSet (sysName));
87 }
88
89 assert (!systematicsVector.empty());
90 return systematicsVector;
91 }
92
93
94
95 StatusCode SystematicsSvc ::
96 addSystematics (const CP::SystematicSet& recommended,
97 const CP::SystematicSet& affecting) const
98 {
99 std::lock_guard<std::mutex> lock (m_systematicsMutex);
100
101 for (const CP::SystematicVariation& mysys : recommended)
102 {
103 if (affecting.find (mysys) == affecting.end())
104 {
105 ANA_MSG_ERROR ("systematic is only registered as recommended, not affecting: " << mysys);
106 return StatusCode::FAILURE;
107 }
108 }
109
110 m_affectingSystematics.insert (affecting);
111 m_recommendedSystematics.insert (recommended);
112 return StatusCode::SUCCESS;
113 }
114
115
116
117 CP::SystematicSet SystematicsSvc ::
118 getObjectSystematics (const std::string& name) const
119 {
120 std::lock_guard<std::mutex> lock (m_systematicsMutex);
121 auto iter = m_objectSystematics.find (name);
122 if (iter != m_objectSystematics.end())
123 return iter->second;
124 else
125 return CP::SystematicSet ();
126 }
127
128
129
130 StatusCode SystematicsSvc ::
131 setObjectSystematics (const std::string& name,
132 const CP::SystematicSet& systematics) const
133 {
134 auto mysystematics = systematics;
135 std::lock_guard<std::mutex> lock (m_systematicsMutex);
136 for (const CP::SystematicVariation& mysys : systematics)
137 {
138 if (m_affectingSystematics.find (mysys) == m_affectingSystematics.end())
139 {
140 ANA_MSG_ERROR ("systematic is set as object systematic, but not affecting: " << mysys);
141 return StatusCode::FAILURE;
142 }
143 }
144 m_objectSystematics[name] = std::move (mysystematics);
145 return StatusCode::SUCCESS;
146 }
147
148
149
150 CP::SystematicSet SystematicsSvc ::
151 getDecorSystematics (const std::string& objectName,
152 const std::string& decorName) const
153 {
154 const std::string name = objectName + "." + decorName;
155 std::unique_lock<std::mutex> lock (m_systematicsMutex);
156 auto iter = m_decorSystematics.find (name);
157 if (iter != m_decorSystematics.end())
158 return iter->second;
159 auto jter = m_copies.find (objectName);
160 if (jter != m_copies.end())
161 {
162 const std::string& copyName = jter->second;
163 lock.unlock();
164 return getDecorSystematics (copyName, decorName);
165 }
166 return CP::SystematicSet ();
167 }
168
169
170
171 StatusCode SystematicsSvc ::
172 setDecorSystematics (const std::string& objectName,
173 const std::string& decorName,
174 const CP::SystematicSet& systematics) const
175 {
176 const std::string name = objectName + "." + decorName;
177 auto mysystematics = systematics;
178 std::lock_guard<std::mutex> lock (m_systematicsMutex);
179 for (const CP::SystematicVariation& mysys : systematics)
180 {
181 if (m_affectingSystematics.find (mysys) == m_affectingSystematics.end())
182 {
183 ANA_MSG_ERROR ("systematic is set as object systematic, but not affecting: " << mysys);
184 return StatusCode::FAILURE;
185 }
186 }
187 m_decorSystematics[name] = std::move (mysystematics);
188 return StatusCode::SUCCESS;
189 }
190
191
192
193 StatusCode SystematicsSvc ::
194 registerCopy (const std::string& fromName,
195 const std::string& toName) const
196 {
197 std::lock_guard<std::mutex> lock (m_systematicsMutex);
198 auto emplace_result = m_copies.try_emplace (toName, fromName);
199 if (emplace_result.second == false)
200 {
201 ANA_MSG_ERROR ("duplicate copy registered for name " << toName);
202 return StatusCode::FAILURE;
203 }
204 return StatusCode::SUCCESS;
205 }
206
207
208
209 std::string SystematicsSvc ::
210 getCopySource (const std::string& toName) const
211 {
212 std::lock_guard<std::mutex> lock (m_systematicsMutex);
213 auto iter = m_copies.find (toName);
214 if (iter == m_copies.end())
215 return "";
216 else
217 return iter->second;
218 }
219
220
221
222 StatusCode SystematicsSvc ::
223 makeSystematicsName (std::string& result,
224 const std::string& name,
225 const CP::SystematicSet& sys) const
226 {
227 if (name.empty())
228 {
229 ANA_MSG_ERROR ("not allowed to make systematic name for empty string");
230 return StatusCode::FAILURE;
231 }
232
233 result = name;
234
235 const auto sysSplit = result.find ("%SYS%");
236 if (sysSplit == std::string::npos)
237 {
238 if (!sys.empty())
239 {
240 ANA_MSG_ERROR ("can't set systematics on name without \"%SYS%\": \"" << name << "\" sys=" << sys.name());
241 return StatusCode::FAILURE;
242 }
243 } else
244 {
245 std::string sysName = sys.name();
246 if (sysName.empty())
247 sysName = m_nominalSystematicsName;
248 result.replace (sysSplit, 5, sysName);
249 }
250
251 return StatusCode::SUCCESS;
252 }
253
254
255
256 StatusCode SystematicsSvc ::
257 finalize ()
258 {
259 if (m_systematicsList.empty()) {
260 ANA_MSG_INFO ("no systematics were run.");
261 }
262 else{
263 for (const CP::SystematicVariation& mysys : m_affectingSystematics)
264 {
265 // this logic checks whether a systematic is recommended and
266 // affecting, or only affecting. if it is only the later, it
267 // reports the systematic in parenthesis to set it apart.
268 if (m_recommendedSystematics.find (mysys) == m_recommendedSystematics.end())
269 ANA_MSG_INFO ("found systematic: (" << mysys << ")");
270 else
271 ANA_MSG_INFO ("found systematic: " << mysys);
272 }
273
274 if(m_systematicsRegex!=".*") {
275 ANA_MSG_INFO("Systematics regex '" << m_systematicsRegex << "' matched:");
276 for(const CP::SystematicSet& mysys : makeSystematicsVector()) {
277 ANA_MSG_INFO (" '" << mysys.name() << "'");
278 }
279 }
280 }
281 return StatusCode::SUCCESS;
282 }
283}
macros for messaging and checking status codes
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
static const std::vector< std::string > systematics
This class handles turning the list of systematics into the actual list of nuisance parameter points ...
Class to wrap a set of SystematicVariations.
const_iterator end() const
description: const iterator to the end of the set
iterator find(const SystematicVariation &sys) const
description: find an element in the set
Gaudi::Property< std::string > m_nominalSystematicsName
nominal systematics name
virtual std::vector< CP::SystematicSet > makeSystematicsVector() const override
Gaudi::Property< std::vector< std::string > > m_systematicsList
the names of the systematics to request
Gaudi::Property< float > m_sigmaRecommended
load all recommended systematics at the given number of sigmas
std::mutex m_systematicsMutex
a mutex for accessing the above mutable members
Gaudi::Property< std::string > m_systematicsRegex
the regular expression for filterinf systematics
virtual CP::SystematicSet getDecorSystematics(const std::string &objectName, const std::string &decorName) const override
Select isolated Photons, Electrons and Muons.