32{
33 void AlgHist ::
34 testInvariant () const
35 {
37 if (m_hist != 0)
38 {
42 }
43 switch (m_type)
44 {
45 case -1:
47 break;
48 case 0:
51 break;
52 case 1:
55 break;
56 case 2:
59 break;
60 case 3:
63 break;
64 default:
66 }
67 for (std::size_t form = 0, end = m_formulas.size(); form != end; ++ form)
69 if (m_hist2)
70 {
73 } else
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 {
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
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
135
137 }
138
139
140 AlgHist ::
141 ~AlgHist ()
142 {
143 if (m_hist != nullptr) {
144 delete m_hist;
145 }
146 }
147
148
149
152 {
155 return EL::StatusCode::SUCCESS;
156 }
157
158
159
161 initialize ()
162 {
164
165 try
166 {
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 ());
172 wk()->addOutput (m_hist2);
173 } catch (...)
174 {
176 throw;
177 }
178 return EL::StatusCode::SUCCESS;
179 }
180
181
182
184 execute ()
185 {
187
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:
203 break;
204 case 0:
205 if (m_index[form]->ndata() > 0)
206 m_values[form] =
m_index[form]->value (0);
207 else
209 break;
210 case 1:
211 ndim = 1;
212 if (
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)
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:
253 }
254 }
255 return EL::StatusCode::SUCCESS;
256 }
257}
#define RCU_INVARIANT0(y)
#define RCU_CHANGE_INVARIANT(x)
#define RCU_NEW_INVARIANT(x)
#define RCU_REQUIRE_SOFT(x)
#define RCU_THROW_MSG(message)
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)