34{
35 void AlgHist ::
36 testInvariant () const
37 {
39 if (m_hist != 0)
40 {
44 }
45 switch (m_type)
46 {
47 case -1:
49 break;
50 case 0:
53 break;
54 case 1:
57 break;
58 case 2:
61 break;
62 case 3:
65 break;
66 default:
68 }
69 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
71 if (m_hist2)
72 {
75 } else
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 {
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
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
139 }
140
141
142 AlgHist ::
143 ~AlgHist ()
144 {
145 if (m_hist != nullptr) {
146 delete m_hist;
147 }
148 }
149
150
151
154 {
157 return EL::StatusCode::SUCCESS;
158 }
159
160
161
163 initialize ()
164 {
166
167 try
168 {
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 ());
174 wk()->addOutput (m_hist2);
175 } catch (...)
176 {
178 throw;
179 }
180 return EL::StatusCode::SUCCESS;
181 }
182
183
184
186 execute ()
187 {
189
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:
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
211 break;
212 case 1:
213 ndim = 1;
214 if (
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)
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:
256 return StatusCode::FAILURE;
257 }
258 }
259 return EL::StatusCode::SUCCESS;
260 }
261}
#define RCU_INVARIANT0(y)
#define RCU_CHANGE_INVARIANT(x)
#define RCU_NEW_INVARIANT(x)
#define RCU_REQUIRE_SOFT(x)
size_t size() const
Number of registered mappings.
static const Attributes_t empty
::StatusCode StatusCode
StatusCode definition for legacy code.
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
size_t m_index
The index of this element within its container. Should be 0 if this object is not within a container.
TProfile(*args, **kwargs)