CMS 3D CMS Logo

MESetTrend.cc
Go to the documentation of this file.
2 
3 #include <ctime>
4 
5 namespace ecaldqm {
6 
8  binning::ObjectType _otype,
11  binning::AxisSpecs const *_xaxis /* = 0*/,
12  binning::AxisSpecs const *_yaxis /* = 0*/)
13  : MESetEcal(_fullPath, _otype, _btype, _kind, 1, _xaxis, _yaxis),
14  minutely_(false),
15  shiftAxis_(false),
16  currentBin_(-1) {
17  switch (kind_) {
22  break;
23  default:
24  throw_("Unsupported MonitorElement kind");
25  }
26  }
27 
29  : MESetEcal(_orig), minutely_(_orig.minutely_), shiftAxis_(_orig.shiftAxis_), currentBin_(_orig.currentBin_) {}
30 
32  MESetTrend const *pRhs(dynamic_cast<MESetTrend const *>(&_rhs));
33  if (pRhs) {
34  minutely_ = pRhs->minutely_;
35  shiftAxis_ = pRhs->shiftAxis_;
36  currentBin_ = pRhs->currentBin_;
37  }
38 
39  return MESetEcal::operator=(_rhs);
40  }
41 
42  MESet *MESetTrend::clone(std::string const &_path /* = ""*/) const {
44  if (!_path.empty())
45  path_ = _path;
46  MESet *copy(new MESetTrend(*this));
47  path_ = path;
48  return copy;
49  }
50 
51  void MESetTrend::book(DQMStore::IBooker &_ibooker, EcalElectronicsMapping const *electronicsMap) {
53  if (xaxis_)
54  xaxis = *xaxis_;
55  else {
56  xaxis.nbins = 200;
57  xaxis.low = 0.;
58  xaxis.high = 2000.;
59  }
60 
61  if (minutely_) {
62  time_t localTime(time(nullptr));
63  struct tm timeBuffer;
64  gmtime_r(&localTime, &timeBuffer); // gmtime() is not thread safe
65  unsigned utcTime(mktime(&timeBuffer));
66 
67  xaxis.low = utcTime;
68  if (xaxis_)
69  xaxis.high = utcTime + xaxis_->high - xaxis_->low;
70  else
71  xaxis.high = xaxis.low + 200 * 60.;
72  }
73 
74  binning::AxisSpecs const *xaxisTemp(xaxis_);
75  xaxis_ = &xaxis;
76 
77  MESetEcal::book(_ibooker, electronicsMap);
78 
79  xaxis_ = xaxisTemp;
80 
81  if (minutely_) {
82  for (unsigned iME(0); iME < mes_.size(); ++iME)
83  mes_[iME]->getTH1()->GetXaxis()->SetTimeDisplay(1);
84  setAxisTitle("UTC");
85  } else
86  setAxisTitle("LumiSections");
87  }
88 
90  EcalDQMSetupObjects const edso, DetId const &_id, double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
91  if (!active_)
92  return;
93 
94  unsigned iME(binning::findPlotIndex(edso.electronicsMap, otype_, _id));
95  checkME_(iME);
96 
97  if (shift_(unsigned(_t)))
98  fill_(iME, _t + 0.5, _wy, _w);
99  }
100 
102  EcalElectronicsId const &_id,
103  double _t,
104  double _wy /* = 1.*/,
105  double _w /* = 1.*/) {
106  if (!active_)
107  return;
108 
109  unsigned iME(binning::findPlotIndex(edso.electronicsMap, otype_, _id));
110  checkME_(iME);
111 
112  if (shift_(unsigned(_t)))
113  fill_(iME, _t + 0.5, _wy, _w);
114  }
115 
117  EcalDQMSetupObjects const edso, int _dcctccid, double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
118  if (!active_)
119  return;
120 
121  unsigned iME(binning::findPlotIndex(edso.electronicsMap, otype_, _dcctccid, btype_));
122  checkME_(iME);
123 
124  if (shift_(unsigned(_t)))
125  fill_(iME, _t + 0.5, _wy, _w);
126  }
127 
128  void MESetTrend::fill(EcalDQMSetupObjects const edso, double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
129  if (!active_)
130  return;
131  if (mes_.size() != 1)
132  throw_("MESet type incompatible");
133 
134  if (shift_(unsigned(_t)))
135  fill_(0, _t + 0.5, _wy, _w);
136  }
137 
138  int MESetTrend::findBin(EcalDQMSetupObjects const edso, DetId const &_id, double _t, double _y /* = 0.*/) const {
139  if (!active_)
140  return -1;
141 
142  unsigned iME(binning::findPlotIndex(edso.electronicsMap, otype_, _id));
143  checkME_(iME);
144 
145  return mes_[iME]->getTH1()->FindBin(_t + 0.5, _y);
146  }
147 
149  EcalElectronicsId const &_id,
150  double _t,
151  double _y /* = 0.*/) const {
152  if (!active_)
153  return -1;
154 
155  unsigned iME(binning::findPlotIndex(edso.electronicsMap, otype_, _id));
156  checkME_(iME);
157 
158  return mes_[iME]->getTH1()->FindBin(_t + 0.5, _y);
159  }
160 
161  int MESetTrend::findBin(EcalDQMSetupObjects const edso, int _dcctccid, double _t, double _y /* = 0.*/) const {
162  if (!active_)
163  return -1;
164 
165  unsigned iME(binning::findPlotIndex(edso.electronicsMap, otype_, _dcctccid, btype_));
166  checkME_(iME);
167 
168  return mes_[iME]->getTH1()->FindBin(_t + 0.5, _y);
169  }
170 
171  int MESetTrend::findBin(EcalDQMSetupObjects const edso, double _t, double _y /* = 0.*/) const {
172  if (!active_)
173  return -1;
174  if (mes_.size() != 1)
175  throw_("MESet type incompatible");
176 
177  return mes_[0]->getTH1()->FindBin(_t + 0.5, _y);
178  }
179 
182  throw_("Cumulative flag set for a profile plot");
183  currentBin_ = 1;
184  }
185 
186  bool MESetTrend::shift_(unsigned _t) {
187  TAxis *tAxis(mes_[0]->getTH1()->GetXaxis());
188  int nbinsX(tAxis->GetNbins());
189  unsigned tLow(tAxis->GetBinLowEdge(1));
190  unsigned tHigh(tAxis->GetBinUpEdge(nbinsX));
191 
192  if (!shiftAxis_)
193  return _t >= tLow && _t < tHigh;
194 
195  int dBin(0);
196  int unitsPerBin((tHigh - tLow) / nbinsX);
197 
198  if (_t >= tLow && _t < tHigh) {
199  if (currentBin_ > 0) {
200  int thisBin(tAxis->FindBin(_t + 0.5));
201  if (thisBin < currentBin_)
202  return false;
203  else if (thisBin > currentBin_) {
204  for (unsigned iME(0); iME < mes_.size(); iME++) {
205  MonitorElement *me(mes_[iME]);
206  int nbinsY(me->getTH1()->GetNbinsY());
207  for (int iy(1); iy <= nbinsY; ++iy) {
208  int orig(me->getTH1()->GetBin(currentBin_, iy));
209  double currentContent(me->getBinContent(orig));
210  double currentError(me->getBinError(orig));
211  for (int ix(currentBin_); ix <= thisBin; ++ix) {
212  int dest(me->getTH1()->GetBin(ix, iy));
213  me->setBinContent(dest, currentContent);
214  me->setBinError(dest, currentError);
215  }
216  }
217  }
218  }
219  }
220 
221  return true;
222  } else if (_t >= tHigh) {
223  dBin = (_t - tHigh) / unitsPerBin + 1;
224  if (currentBin_ > 0)
226  } else if (_t < tLow) {
227  if (currentBin_ > 0)
228  return false; // no going back in time in case of cumulative history
229 
230  int maxBin(0);
231 
232  for (unsigned iME(0); iME < mes_.size(); iME++) {
233  MonitorElement *me(mes_[iME]);
234 
235  bool filled(false);
236  int iMax(nbinsX + 1);
237  while (--iMax > 0 && !filled) {
238  switch (kind_) {
240  if (me->getBinContent(iMax) != 0)
241  filled = true;
242  break;
244  if (me->getBinEntries(iMax) != 0)
245  filled = true;
246  break;
248  for (int iy(1); iy <= me->getNbinsY(); iy++) {
249  if (me->getBinContent(me->getTH1()->GetBin(iMax, iy)) != 0) {
250  filled = true;
251  break;
252  }
253  }
254  break;
256  for (int iy(1); iy <= me->getNbinsY(); iy++) {
257  if (me->getBinEntries(me->getTH1()->GetBin(iMax, iy)) != 0) {
258  filled = true;
259  break;
260  }
261  }
262  break;
263  default:
264  break;
265  }
266  }
267 
268  if (iMax > maxBin)
269  maxBin = iMax;
270  }
271 
272  if (_t < tLow - (nbinsX - maxBin) * unitsPerBin)
273  return false;
274 
275  dBin = (_t - tLow) / unitsPerBin - 1;
276  }
277 
278  int start(dBin > 0 ? dBin + 1 : nbinsX + dBin);
279  int end(dBin > 0 ? nbinsX + 1 : 0);
280  int step(dBin > 0 ? 1 : -1);
281 
282  tLow += dBin * unitsPerBin;
283  tHigh += dBin * unitsPerBin;
284 
285  for (unsigned iME(0); iME < mes_.size(); iME++) {
286  MonitorElement *me(mes_[iME]);
287 
288  me->getTH1()->GetXaxis()->SetLimits(tLow, tHigh);
289 
290  if ((end - start) / step < 0) {
291  me->Reset();
292  continue;
293  }
294 
295  me->setEntries(0.);
296  double entries(0.);
297 
298  switch (kind_) {
300  int ix(start);
301  for (; ix != end; ix += step) {
302  double binContent(me->getBinContent(ix));
303  entries += binContent;
304  me->setBinContent(ix - dBin, binContent);
305  me->setBinError(ix - dBin, me->getBinError(ix));
306  }
307  ix = end - dBin - 1 * step;
308  double lastContent(currentBin_ > 0 ? me->getBinContent(ix) : 0.);
309  double lastError(currentBin_ > 0 ? me->getBinContent(ix) : 0.);
310  for (ix += step; ix != end; ix += step) {
311  me->setBinContent(ix, lastContent);
312  me->setBinError(ix, lastError);
313  }
314  } break;
316  int ix(start);
317  for (; ix != end; ix += step) {
318  double binEntries(me->getBinEntries(ix));
319  double binContent(me->getBinContent(ix));
320  entries += binEntries;
321  me->setBinEntries(ix - dBin, binEntries);
322  me->setBinContent(ix - dBin, binContent * binEntries);
323  if (binEntries > 0) {
324  double rms(me->getBinError(ix) * std::sqrt(binEntries));
325  double sumw2((rms * rms + binContent * binContent) * binEntries);
326  me->setBinError(ix - dBin, std::sqrt(sumw2));
327  } else
328  me->setBinError(ix - dBin, 0.);
329  }
330  ix = end - dBin;
331  for (; ix != end; ix += step) {
332  me->setBinEntries(ix, 0.);
333  me->setBinContent(ix, 0.);
334  me->setBinError(ix, 0.);
335  }
336  } break;
338  int ix(start);
339  int nbinsY(me->getNbinsY());
340  for (; ix != end; ix += step) {
341  for (int iy(1); iy <= nbinsY; iy++) {
342  int orig(me->getTH1()->GetBin(ix, iy));
343  int dest(me->getTH1()->GetBin(ix - dBin, iy));
344  double binContent(me->getBinContent(orig));
345  entries += binContent;
346  me->setBinContent(dest, binContent);
347  me->setBinError(dest, me->getBinError(orig));
348 
349  me->setBinContent(orig, 0.);
350  me->setBinError(orig, 0.);
351  }
352  }
353  ix = end - dBin - 1 * step;
354  std::vector<double> lastContent;
355  std::vector<double> lastError;
356  for (int iy(1); iy <= nbinsY; iy++) {
357  lastContent.push_back(currentBin_ > 0 ? me->getBinContent(ix, iy) : 0.);
358  lastError.push_back(currentBin_ > 0 ? me->getBinError(ix, iy) : 0.);
359  }
360  for (ix += step; ix != end; ix += step) {
361  for (int iy(1); iy <= nbinsY; iy++) {
362  int bin(me->getTH1()->GetBin(ix, iy));
363  me->setBinContent(bin, lastContent[iy - 1]);
364  me->setBinError(bin, lastError[iy - 1]);
365  }
366  }
367  } break;
369  int ix(start);
370  int nbinsY(me->getNbinsY());
371  for (; ix != end; ix += step) {
372  for (int iy(1); iy <= nbinsY; iy++) {
373  int orig(me->getTH1()->GetBin(ix, iy));
374  int dest(me->getTH1()->GetBin(ix - dBin, iy));
375  double binEntries(me->getBinEntries(orig));
376  double binContent(me->getBinContent(orig));
377  entries += binEntries;
378  me->setBinEntries(dest, binEntries);
379  me->setBinContent(dest, binContent * binEntries);
380  if (binEntries > 0) {
381  double rms(me->getBinError(orig) * std::sqrt(binEntries));
382  double sumw2((rms * rms + binContent * binContent) * binEntries);
383  me->setBinError(dest, std::sqrt(sumw2));
384  } else
385  me->setBinError(dest, 0.);
386  }
387  }
388  ix = end - dBin;
389  for (; ix != end; ix += step) {
390  for (int iy(1); iy <= nbinsY; iy++) {
391  int bin(me->getTH1()->GetBin(ix, iy));
392  me->setBinEntries(bin, 0.);
393  me->setBinContent(bin, 0.);
394  me->setBinError(bin, 0.);
395  }
396  }
397  } break;
398  default:
399  break;
400  }
401 
402  me->setEntries(entries);
403  }
404 
405  return true;
406  }
407 
408 } // namespace ecaldqm
virtual const_iterator end(EcalElectronicsMapping const *electronicsMap) const
Definition: MESet.h:354
Definition: start.py:1
MonitorElement::Kind kind_
Definition: MESet.h:156
virtual void setAxisTitle(std::string const &, int=1)
Definition: MESet.cc:89
MESet & operator=(MESet const &) override
Definition: MESetEcal.cc:40
MESet * clone(std::string const &="") const override
Definition: MESetTrend.cc:42
constexpr unsigned int maxBin
Ecal readout channel identification [32:20] Unused (so far) [19:13] DCC id [12:6] tower [5:3] strip [...
void throw_(std::string const &_message) const
Definition: MESet.h:149
bool shift_(unsigned)
Definition: MESetTrend.cc:186
void fill(EcalDQMSetupObjects const, DetId const &, double, double=1., double=1.) override
Definition: MESetTrend.cc:89
int findBin(EcalDQMSetupObjects const, DetId const &, double, double=0.) const override
Definition: MESetTrend.cc:138
T sqrt(T t)
Definition: SSEVec.h:23
EcalElectronicsMapping const * electronicsMap
Definition: MESet.h:34
void book(DQMStore::IBooker &, EcalElectronicsMapping const *) override
Definition: MESetEcal.cc:70
virtual void checkME_(unsigned _iME) const
Definition: MESet.h:141
virtual void fill_(unsigned, int, double)
Definition: MESet.cc:252
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id)
Definition: DetId.h:17
unsigned findPlotIndex(EcalElectronicsMapping const *, ObjectType, DetId const &)
MESetTrend(std::string const &, binning::ObjectType, binning::BinningType, MonitorElement::Kind, binning::AxisSpecs const *=nullptr, binning::AxisSpecs const *=nullptr)
Definition: MESetTrend.cc:7
bool active_
Definition: MESet.h:161
MESet & operator=(MESet const &) override
Definition: MESetTrend.cc:31
void book(DQMStore::IBooker &, EcalElectronicsMapping const *) override
Definition: MESetTrend.cc:51
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id)
binning::ObjectType otype_
Definition: MESet.h:154
step
Definition: StallMonitor.cc:83
binning::AxisSpecs const * xaxis_
Definition: MESetEcal.h:74
binning::BinningType btype_
Definition: MESet.h:155
std::string path_
Definition: MESet.h:153
std::vector< MonitorElement * > mes_
Definition: MESet.h:151