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//
26// method implementations
27//
28
30
31namespace MD
32{
33 void AlgHist ::
34 testInvariant () const
35 {
36 RCU_INVARIANT (this != 0);
37 if (m_hist != 0)
38 {
39 RCU_INVARIANT (m_hist->GetDirectory() == 0);
40 RCU_INVARIANT (m_formulas.size() == m_valnum + m_cut);
41 RCU_INVARIANT (m_values.size() == m_valnum + 1);
42 }
43 switch (m_type)
44 {
45 case -1:
46 RCU_INVARIANT (m_hist == 0);
47 break;
48 case 0:
49 RCU_INVARIANT (m_hist != 0);
50 RCU_INVARIANT (m_valnum == 1);
51 break;
52 case 1:
53 RCU_INVARIANT (dynamic_cast<TProfile*>(m_hist) != 0);
54 RCU_INVARIANT (m_valnum == 2);
55 break;
56 case 2:
57 RCU_INVARIANT (dynamic_cast<TH2*>(m_hist) != 0);
58 RCU_INVARIANT (m_valnum == 2);
59 break;
60 case 3:
61 RCU_INVARIANT (dynamic_cast<TH3*>(m_hist) != 0);
62 RCU_INVARIANT (m_valnum == 3);
63 break;
64 default:
65 RCU_INVARIANT0 ("invalid type");
66 }
67 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
68 RCU_INVARIANT (!m_formulas[form].empty());
69 if (m_hist2)
70 {
71 RCU_INVARIANT (m_index.size() == m_formulas.size());
72 RCU_INVARIANT (m_formSvc != 0);
73 } else
74 RCU_INVARIANT (m_index.empty());
75 }
76
77
78
79 AlgHist ::
80 AlgHist ()
81 : m_hist (0), m_type (-1), m_valnum (1), m_cut (false), m_hist2 (0)
82 {
83 RCU_NEW_INVARIANT (this);
84 }
85
86
87
88 AlgHist ::
89 AlgHist (TH1 *val_hist_swallow,
90 const std::string& val_value0,
91 const std::string& val_value1,
92 const std::string& val_value2,
93 const std::string& val_value3)
94 : m_hist (0), m_type (-1), m_valnum (1), m_cut (false), m_hist2 (0)
95 {
96 std::unique_ptr<TH1> hist (val_hist_swallow);
97
98 RCU_REQUIRE_SOFT (val_hist_swallow != 0);
99 RCU_REQUIRE_SOFT (!val_value0.empty());
100
101 m_formulas.push_back (val_value0);
102 if (!val_value1.empty())
103 m_formulas.push_back (val_value1);
104 if (!val_value2.empty())
105 m_formulas.push_back (val_value2);
106 if (!val_value3.empty())
107 m_formulas.push_back (val_value3);
108
109 m_hist = hist.release();
110 m_hist->SetDirectory (0);
111 if (dynamic_cast<TProfile*>(m_hist) != 0)
112 {
113 m_type = 1;
114 m_valnum = 2;
115 } else if (dynamic_cast<TH2*>(m_hist) != 0)
116 {
117 m_type = 2;
118 m_valnum = 2;
119 } else if (dynamic_cast<TH3*>(m_hist) != 0)
120 {
121 m_type = 3;
122 m_valnum = 3;
123 } else
124 {
125 m_type = 0;
126 m_valnum = 1;
127 }
128 m_values.resize (m_valnum + 1, 1);
129 if (m_valnum == m_formulas.size())
130 m_cut = false;
131 else if (m_valnum+1 == m_formulas.size())
132 m_cut = true;
133 else
134 RCU_THROW_MSG ("invalid number of formulas");
135
136 RCU_NEW_INVARIANT (this);
137 }
138
139
140 AlgHist ::
141 ~AlgHist ()
142 {
143 if (m_hist != nullptr) {
144 delete m_hist;
145 }
146 }
147
148
149
150 EL::StatusCode AlgHist ::
151 setupJob (EL::Job& job)
152 {
154 useFormulas (job);
155 return EL::StatusCode::SUCCESS;
156 }
157
158
159
160 EL::StatusCode AlgHist ::
161 initialize ()
162 {
164
165 try
166 {
167 m_formSvc = formulas (wk());
168 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
169 m_index.push_back (m_formSvc->addForm (m_formulas[form]));
170 m_hist2 = dynamic_cast<TH1*>(m_hist->Clone ());
171 RCU_ASSERT (m_hist2 != 0);
172 wk()->addOutput (m_hist2);
173 } catch (...)
174 {
175 m_index.clear ();
176 throw;
177 }
178 return EL::StatusCode::SUCCESS;
179 }
180
181
182
183 EL::StatusCode AlgHist ::
184 execute ()
185 {
187
188 RCU_ASSERT (m_formulas.size() == m_index.size());
189 RCU_ASSERT (m_formulas.size() <= m_values.size());
190
191 if (m_cut && m_index.back()->ndim() == 0 &&
192 (m_values.back() = m_index.back()->value (0)) == 0)
193 return EL::StatusCode::SUCCESS;
194
195 int ndim = 0;
196 std::size_t size = std::size_t (-1);
197 for (std::size_t form = 0; form != m_valnum; ++ form)
198 {
199 switch (m_index[form]->ndim())
200 {
201 case -1:
202 RCU_THROW_MSG ("formula not valid: " + m_formulas[form]);
203 break;
204 case 0:
205 if (m_index[form]->ndata() > 0)
206 m_values[form] = m_index[form]->value (0);
207 else
208 size = 0;
209 break;
210 case 1:
211 ndim = 1;
212 if (size > m_index[form]->ndata())
213 size = m_index[form]->ndata();
214 break;
215 default:
216 RCU_THROW_MSG ("unknown formula dimension: " + m_formulas[form]);
217 }
218 }
219
220 if (ndim == 0 && size > 1)
221 size = 1;
222 for (std::size_t iter = 0; iter != size; ++ iter)
223 {
224 if (ndim == 1)
225 {
226 if (m_cut && m_index.back()->ndim() == 1 &&
227 (m_values.back() = m_index.back()->value (iter)) == 0)
228 continue;
229
230 for (std::size_t form = 0; form != m_valnum; ++ form)
231 {
232 if (m_index[form]->ndim() == 1)
233 m_values[form] = m_index[form]->value (iter);
234 }
235 }
236
237 switch (m_type)
238 {
239 case 0:
240 m_hist2->Fill (m_values[0], m_values[1]);
241 break;
242 case 1:
243 static_cast<TProfile*>(m_hist2)->Fill (m_values[0], m_values[1], m_values[2]);
244 break;
245 case 2:
246 static_cast<TH2*>(m_hist2)->Fill (m_values[0], m_values[1], m_values[2]);
247 break;
248 case 3:
249 static_cast<TH3*>(m_hist2)->Fill (m_values[0], m_values[1], m_values[2], m_values[3]);
250 break;
251 default:
252 RCU_THROW_MSG ("invalid number of values");
253 }
254 }
255 return EL::StatusCode::SUCCESS;
256 }
257}
ClassImp(MD::AlgHist) namespace MD
Definition AlgHist.cxx:29
#define RCU_INVARIANT0(y)
Definition Assert.h:200
#define RCU_INVARIANT(x)
Definition Assert.h:196
#define RCU_ASSERT(x)
Definition Assert.h:217
#define RCU_CHANGE_INVARIANT(x)
Definition Assert.h:226
#define RCU_NEW_INVARIANT(x)
Definition Assert.h:228
#define RCU_REQUIRE_SOFT(x)
Definition Assert.h:148
#define RCU_THROW_MSG(message)
Definition PrintMsg.h:53
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