ATLAS Offline Software
Loading...
Searching...
No Matches
AlgHist.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7//
8// includes
9//
10
11#include <MultiDraw/AlgHist.h>
12
13#include <memory>
14#include <TH1.h>
15#include <TH2.h>
16#include <TH3.h>
17#include <TProfile.h>
19#include <EventLoop/IWorker.h>
20#include <MultiDraw/Formula.h>
24
25#include <stdexcept>
26
27//
28// method implementations
29//
30
32
33namespace MD
34{
35 void AlgHist ::
36 testInvariant () const
37 {
38 RCU_INVARIANT (this != 0);
39 if (m_hist != 0)
40 {
41 RCU_INVARIANT (m_hist->GetDirectory() == 0);
42 RCU_INVARIANT (m_formulas.size() == m_valnum + m_cut);
43 RCU_INVARIANT (m_values.size() == m_valnum + 1);
44 }
45 switch (m_type)
46 {
47 case -1:
48 RCU_INVARIANT (m_hist == 0);
49 break;
50 case 0:
51 RCU_INVARIANT (m_hist != 0);
52 RCU_INVARIANT (m_valnum == 1);
53 break;
54 case 1:
55 RCU_INVARIANT (dynamic_cast<TProfile*>(m_hist) != 0);
56 RCU_INVARIANT (m_valnum == 2);
57 break;
58 case 2:
59 RCU_INVARIANT (dynamic_cast<TH2*>(m_hist) != 0);
60 RCU_INVARIANT (m_valnum == 2);
61 break;
62 case 3:
63 RCU_INVARIANT (dynamic_cast<TH3*>(m_hist) != 0);
64 RCU_INVARIANT (m_valnum == 3);
65 break;
66 default:
67 RCU_INVARIANT0 ("invalid type");
68 }
69 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
70 RCU_INVARIANT (!m_formulas[form].empty());
71 if (m_hist2)
72 {
73 RCU_INVARIANT (m_index.size() == m_formulas.size());
74 RCU_INVARIANT (m_formSvc != 0);
75 } else
76 RCU_INVARIANT (m_index.empty());
77 }
78
79
80
81 AlgHist ::
82 AlgHist ()
83 : m_hist (0), m_type (-1), m_valnum (1), m_cut (false), m_hist2 (0)
84 {
85 RCU_NEW_INVARIANT (this);
86 }
87
88
89
90 AlgHist ::
91 AlgHist (TH1 *val_hist_swallow,
92 const std::string& val_value0,
93 const std::string& val_value1,
94 const std::string& val_value2,
95 const std::string& val_value3)
96 : m_hist (0), m_type (-1), m_valnum (1), m_cut (false), m_hist2 (0)
97 {
98 std::unique_ptr<TH1> hist (val_hist_swallow);
99
100 RCU_REQUIRE_SOFT (val_hist_swallow != 0);
101 RCU_REQUIRE_SOFT (!val_value0.empty());
102
103 m_formulas.push_back (val_value0);
104 if (!val_value1.empty())
105 m_formulas.push_back (val_value1);
106 if (!val_value2.empty())
107 m_formulas.push_back (val_value2);
108 if (!val_value3.empty())
109 m_formulas.push_back (val_value3);
110
111 m_hist = hist.release();
112 m_hist->SetDirectory (0);
113 if (dynamic_cast<TProfile*>(m_hist) != 0)
114 {
115 m_type = 1;
116 m_valnum = 2;
117 } else if (dynamic_cast<TH2*>(m_hist) != 0)
118 {
119 m_type = 2;
120 m_valnum = 2;
121 } else if (dynamic_cast<TH3*>(m_hist) != 0)
122 {
123 m_type = 3;
124 m_valnum = 3;
125 } else
126 {
127 m_type = 0;
128 m_valnum = 1;
129 }
130 m_values.resize (m_valnum + 1, 1);
131 if (m_valnum == m_formulas.size())
132 m_cut = false;
133 else if (m_valnum+1 == m_formulas.size())
134 m_cut = true;
135 else
136 throw std::runtime_error ("AlgHist: invalid number of formulas");
137
138 RCU_NEW_INVARIANT (this);
139 }
140
141
142 AlgHist ::
143 ~AlgHist ()
144 {
145 if (m_hist != nullptr) {
146 delete m_hist;
147 }
148 }
149
150
151
152 EL::StatusCode AlgHist ::
153 setupJob (EL::Job& job)
154 {
156 useFormulas (job);
157 return EL::StatusCode::SUCCESS;
158 }
159
160
161
162 EL::StatusCode AlgHist ::
163 initialize ()
164 {
166
167 try
168 {
169 m_formSvc = formulas (wk());
170 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
171 m_index.push_back (m_formSvc->addForm (m_formulas[form]));
172 m_hist2 = dynamic_cast<TH1*>(m_hist->Clone ());
173 RCU_ASSERT (m_hist2 != 0);
174 wk()->addOutput (m_hist2);
175 } catch (...)
176 {
177 m_index.clear ();
178 throw;
179 }
180 return EL::StatusCode::SUCCESS;
181 }
182
183
184
185 EL::StatusCode AlgHist ::
186 execute ()
187 {
189
190 RCU_ASSERT (m_formulas.size() == m_index.size());
191 RCU_ASSERT (m_formulas.size() <= m_values.size());
192
193 if (m_cut && m_index.back()->ndim() == 0 &&
194 (m_values.back() = m_index.back()->value (0)) == 0)
195 return EL::StatusCode::SUCCESS;
196
197 int ndim = 0;
198 std::size_t size = std::size_t (-1);
199 for (std::size_t form = 0; form != m_valnum; ++ form)
200 {
201 switch (m_index[form]->ndim())
202 {
203 case -1:
204 ATH_MSG_ERROR ("formula not valid: " << m_formulas[form]);
205 return EL::StatusCode::FAILURE;
206 case 0:
207 if (m_index[form]->ndata() > 0)
208 m_values[form] = m_index[form]->value (0);
209 else
210 size = 0;
211 break;
212 case 1:
213 ndim = 1;
214 if (size > m_index[form]->ndata())
215 size = m_index[form]->ndata();
216 break;
217 default:
218 ATH_MSG_ERROR ("unknown formula dimension: " << m_formulas[form]);
219 return StatusCode::FAILURE;
220 }
221 }
222
223 if (ndim == 0 && size > 1)
224 size = 1;
225 for (std::size_t iter = 0; iter != size; ++ iter)
226 {
227 if (ndim == 1)
228 {
229 if (m_cut && m_index.back()->ndim() == 1 &&
230 (m_values.back() = m_index.back()->value (iter)) == 0)
231 continue;
232
233 for (std::size_t form = 0; form != m_valnum; ++ form)
234 {
235 if (m_index[form]->ndim() == 1)
236 m_values[form] = m_index[form]->value (iter);
237 }
238 }
239
240 switch (m_type)
241 {
242 case 0:
243 m_hist2->Fill (m_values[0], m_values[1]);
244 break;
245 case 1:
246 static_cast<TProfile*>(m_hist2)->Fill (m_values[0], m_values[1], m_values[2]);
247 break;
248 case 2:
249 static_cast<TH2*>(m_hist2)->Fill (m_values[0], m_values[1], m_values[2]);
250 break;
251 case 3:
252 static_cast<TH3*>(m_hist2)->Fill (m_values[0], m_values[1], m_values[2], m_values[3]);
253 break;
254 default:
255 ATH_MSG_ERROR ("AlgHist: invalid number of values");
256 return StatusCode::FAILURE;
257 }
258 }
259 return EL::StatusCode::SUCCESS;
260 }
261}
ClassImp(MD::AlgHist) namespace MD
Definition AlgHist.cxx:31
#define RCU_INVARIANT0(y)
Definition Assert.h:193
#define RCU_INVARIANT(x)
Definition Assert.h:189
#define RCU_ASSERT(x)
Definition Assert.h:210
#define RCU_CHANGE_INVARIANT(x)
Definition Assert.h:219
#define RCU_NEW_INVARIANT(x)
Definition Assert.h:221
#define RCU_REQUIRE_SOFT(x)
Definition Assert.h:141
#define ATH_MSG_ERROR(x)
size_t size() const
Number of registered mappings.
static const Attributes_t empty
Definition Job.h:42
::StatusCode StatusCode
StatusCode definition for legacy code.
This module provides a lot of global definitions, forward declarations and includes that are used by ...
Definition AlgCFlow.h:22
FormulaSvc * formulas(EL::IWorker *worker)
returns: the formula service for this worker guarantee: strong failures: formula service not configur...
void useFormulas(EL::Job &job)
effects: register the formula service for this job guarantee: strong failures: out of memory I