ATLAS Offline Software
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 
26 namespace CP
27 {
28 
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 ::
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 
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 
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 
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 
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 
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 
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 
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())
248  result.replace (sysSplit, 5, sysName);
249  }
250 
251  return StatusCode::SUCCESS;
252  }
253 
254 
255 
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 }
CP::SystematicsSvc::makeSystematicsName
virtual StatusCode makeSystematicsName(std::string &result, const std::string &name, const CP::SystematicSet &sys) const override
Definition: SystematicsSvc.cxx:223
CaloCondBlobAlgs_fillNoiseFromASCII.sysName
sysName
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:93
CP::SystematicsSvc::finalize
virtual StatusCode finalize() override
Definition: SystematicsSvc.cxx:257
CP::MakeSystematicsVector
This class handles turning the list of systematics into the actual list of nuisance parameter points ...
Definition: MakeSystematicsVector.h:34
get_generator_info.result
result
Definition: get_generator_info.py:21
CP::SystematicsSvc::getDecorSystematics
virtual CP::SystematicSet getDecorSystematics(const std::string &objectName, const std::string &decorName) const override
Definition: SystematicsSvc.cxx:151
CP::SystematicsSvc::m_systematicsMutex
std::mutex m_systematicsMutex
a mutex for accessing the above mutable members
Definition: SystematicsSvc.h:111
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
ANA_MSG_ERROR
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:294
CP::SystematicsSvc::setObjectSystematics
virtual StatusCode setObjectSystematics(const std::string &name, const CP::SystematicSet &systematics) const override
Definition: SystematicsSvc.cxx:131
CP::SystematicVariation
Definition: SystematicVariation.h:47
CP::SystematicsSvc::m_systematicsList
Gaudi::Property< std::vector< std::string > > m_systematicsList
the names of the systematics to request
Definition: SystematicsSvc.h:69
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:49
StringUtil.h
CP::SystematicsSvc::initialize
virtual StatusCode initialize() override
Definition: SystematicsSvc.cxx:30
mapkey::sys
@ sys
Definition: TElectronEfficiencyCorrectionTool.cxx:42
PrepareReferenceFile.regex
regex
Definition: PrepareReferenceFile.py:43
CP::SystematicsSvc::addSystematics
virtual StatusCode addSystematics(const CP::SystematicSet &recommended, const CP::SystematicSet &affecting) const override
Definition: SystematicsSvc.cxx:96
CP::SystematicsSvc::getObjectSystematics
virtual CP::SystematicSet getObjectSystematics(const std::string &name) const override
Definition: SystematicsSvc.cxx:118
CP::SystematicsSvc::registerCopy
virtual StatusCode registerCopy(const std::string &fromName, const std::string &toName) const override
Definition: SystematicsSvc.cxx:194
CP::SystematicsSvc::m_sigmaRecommended
Gaudi::Property< float > m_sigmaRecommended
load all recommended systematics at the given number of sigmas
Definition: SystematicsSvc.h:82
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ANA_MSG_INFO
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:290
MessageCheck.h
macros for messaging and checking status codes
CP::SystematicSet::end
const_iterator end() const
description: const iterator to the end of the set
Definition: SystematicSet.h:59
CP::SystematicsSvc::makeSystematicsVector
virtual std::vector< CP::SystematicSet > makeSystematicsVector() const override
Definition: SystematicsSvc.cxx:53
CP::SystematicsSvc::getCopySource
virtual std::string getCopySource(const std::string &toName) const override
Definition: SystematicsSvc.cxx:210
MakeSystematicsVector.h
CheckAppliedSFs.systematics
def systematics
Definition: CheckAppliedSFs.py:231
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
CP::SystematicSet::find
iterator find(const SystematicVariation &sys) const
description: find an element in the set
Definition: SystematicSet.h:63
CP::SystematicsSvc::m_nominalSystematicsName
Gaudi::Property< std::string > m_nominalSystematicsName
nominal systematics name
Definition: SystematicsSvc.h:86
CP::SystematicsSvc::setDecorSystematics
virtual StatusCode setDecorSystematics(const std::string &objectName, const std::string &decorName, const CP::SystematicSet &systematics) const override
Definition: SystematicsSvc.cxx:172
SystematicsSvc.h
CP::SystematicsSvc::m_systematicsRegex
Gaudi::Property< std::string > m_systematicsRegex
the regular expression for filterinf systematics
Definition: SystematicsSvc.h:73
ANA_MSG_DEBUG
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:288