36 testInvariant ()
const
42 RCU_INVARIANT (m_formulas.size() == std::size_t (m_hist->GetNbinsX()));
59 : m_hist (0), m_hist2 (0), m_formSvc (0)
67 AlgCFlow (TH1 *val_hist_swallow)
68 : m_hist (0), m_hist2 (0)
70 std::unique_ptr<TH1> hist (val_hist_swallow);
75 for (std::size_t form = 0, end = hist->GetNbinsX();
78 const std::string
label = hist->GetXaxis()->GetBinLabel(form+1);
81 m_axis.push_back (hist->GetXaxis()->GetBinCenter (form+1));
82 if (
split == std::string::npos)
84 m_formulas.push_back (
label);
85 m_back.push_back (form - 1);
88 m_formulas.push_back (
label.substr (0,
split));
89 const std::string back =
label.substr (
split+1);
90 m_back.push_back (form);
94 for (std::size_t form2 = 0; form2 != form; ++ form2)
96 if (m_formulas[form2] == back)
97 m_back.back() = form2;
99 if (m_back.back() == form)
100 throw std::runtime_error (
"unknown back formula: " + back);
105 m_hist = hist.release();
106 m_hist->SetDirectory (0);
108 m_values.resize (m_formulas.size());
120 return EL::StatusCode::SUCCESS;
133 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
135 if (!m_formulas[form].
empty())
136 m_index.push_back (m_formSvc->addForm (m_formulas[form]));
138 m_index.push_back (0);
140 m_hist2 =
dynamic_cast<TH1*
>(m_hist->Clone ());
142 wk()->addOutput (m_hist2);
148 return EL::StatusCode::SUCCESS;
161 std::size_t
size = std::size_t (-1);
162 for (std::size_t form = 0; form != m_formulas.size(); ++ form)
164 if (m_index[form])
switch (m_index[form]->ndim())
168 return EL::StatusCode::FAILURE;
170 if (m_index[form]->ndata() > 0)
171 m_values[form] = m_index[form]->value (0);
177 if (
size > m_index[form]->ndata())
178 size = m_index[form]->ndata();
181 ATH_MSG_ERROR (
"unknown formula dimension: " << m_formulas[form]);
182 return EL::StatusCode::FAILURE;
186 if (ndim == 0 &&
size > 1)
188 for (std::size_t iter = 0; iter !=
size; ++ iter)
190 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
194 if (m_back[form] < form)
195 weight = m_values[m_back[form]];
197 if (weight != 0 && !m_formulas[form].
empty())
199 if (m_index[form]->ndim() == 1)
200 weight *= m_index[form]->value (iter);
202 weight *= m_index[form]->value (0);
205 m_values[form] = weight;
206 m_hist2->Fill (m_axis[form], m_values[form]);
209 return EL::StatusCode::SUCCESS;