ATLAS Offline Software
Loading...
Searching...
No Matches
AlgHist.cxx File Reference
#include <MultiDraw/AlgHist.h>
#include <memory>
#include <TH1.h>
#include <TH2.h>
#include <TH3.h>
#include <TProfile.h>
#include <EventLoop/StatusCode.h>
#include <EventLoop/IWorker.h>
#include <MultiDraw/Formula.h>
#include <MultiDraw/FormulaSvc.h>
#include <RootCoreUtils/Assert.h>
#include <AsgMessaging/MsgStreamMacros.h>
#include <stdexcept>

Go to the source code of this file.

Functions

 ClassImp (MD::AlgHist) namespace MD

Function Documentation

◆ ClassImp()

ClassImp ( MD::AlgHist )
Author
Nils Krumnack

Definition at line 31 of file AlgHist.cxx.

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