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 
52  binning::AxisSpecs xaxis;
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);
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 
89  void MESetTrend::fill(DetId const &_id, double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
90  if (!active_)
91  return;
92 
93  unsigned iME(binning::findPlotIndex(otype_, _id));
94  checkME_(iME);
95 
96  if (shift_(unsigned(_t)))
97  fill_(iME, _t + 0.5, _wy, _w);
98  }
99 
100  void MESetTrend::fill(EcalElectronicsId const &_id, double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
101  if (!active_)
102  return;
103 
104  unsigned iME(binning::findPlotIndex(otype_, _id));
105  checkME_(iME);
106 
107  if (shift_(unsigned(_t)))
108  fill_(iME, _t + 0.5, _wy, _w);
109  }
110 
111  void MESetTrend::fill(int _dcctccid, double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
112  if (!active_)
113  return;
114 
115  unsigned iME(binning::findPlotIndex(otype_, _dcctccid, btype_));
116  checkME_(iME);
117 
118  if (shift_(unsigned(_t)))
119  fill_(iME, _t + 0.5, _wy, _w);
120  }
121 
122  void MESetTrend::fill(double _t, double _wy /* = 1.*/, double _w /* = 1.*/) {
123  if (!active_)
124  return;
125  if (mes_.size() != 1)
126  throw_("MESet type incompatible");
127 
128  if (shift_(unsigned(_t)))
129  fill_(0, _t + 0.5, _wy, _w);
130  }
131 
132  int MESetTrend::findBin(DetId const &_id, double _t, double _y /* = 0.*/) const {
133  if (!active_)
134  return -1;
135 
136  unsigned iME(binning::findPlotIndex(otype_, _id));
137  checkME_(iME);
138 
139  return mes_[iME]->getTH1()->FindBin(_t + 0.5, _y);
140  }
141 
142  int MESetTrend::findBin(EcalElectronicsId const &_id, double _t, double _y /* = 0.*/) const {
143  if (!active_)
144  return -1;
145 
146  unsigned iME(binning::findPlotIndex(otype_, _id));
147  checkME_(iME);
148 
149  return mes_[iME]->getTH1()->FindBin(_t + 0.5, _y);
150  }
151 
152  int MESetTrend::findBin(int _dcctccid, double _t, double _y /* = 0.*/) const {
153  if (!active_)
154  return -1;
155 
156  unsigned iME(binning::findPlotIndex(otype_, _dcctccid, btype_));
157  checkME_(iME);
158 
159  return mes_[iME]->getTH1()->FindBin(_t + 0.5, _y);
160  }
161 
162  int MESetTrend::findBin(double _t, double _y /* = 0.*/) const {
163  if (!active_)
164  return -1;
165  if (mes_.size() != 1)
166  throw_("MESet type incompatible");
167 
168  return mes_[0]->getTH1()->FindBin(_t + 0.5, _y);
169  }
170 
173  throw_("Cumulative flag set for a profile plot");
174  currentBin_ = 1;
175  }
176 
177  bool MESetTrend::shift_(unsigned _t) {
178  TAxis *tAxis(mes_[0]->getTH1()->GetXaxis());
179  int nbinsX(tAxis->GetNbins());
180  unsigned tLow(tAxis->GetBinLowEdge(1));
181  unsigned tHigh(tAxis->GetBinUpEdge(nbinsX));
182 
183  if (!shiftAxis_)
184  return _t >= tLow && _t < tHigh;
185 
186  int dBin(0);
187  int unitsPerBin((tHigh - tLow) / nbinsX);
188 
189  if (_t >= tLow && _t < tHigh) {
190  if (currentBin_ > 0) {
191  int thisBin(tAxis->FindBin(_t + 0.5));
192  if (thisBin < currentBin_)
193  return false;
194  else if (thisBin > currentBin_) {
195  for (unsigned iME(0); iME < mes_.size(); iME++) {
196  MonitorElement *me(mes_[iME]);
197  int nbinsY(me->getTH1()->GetNbinsY());
198  for (int iy(1); iy <= nbinsY; ++iy) {
199  int orig(me->getTH1()->GetBin(currentBin_, iy));
200  double currentContent(me->getBinContent(orig));
201  double currentError(me->getBinError(orig));
202  for (int ix(currentBin_); ix <= thisBin; ++ix) {
203  int dest(me->getTH1()->GetBin(ix, iy));
204  me->setBinContent(dest, currentContent);
205  me->setBinError(dest, currentError);
206  }
207  }
208  }
209  }
210  }
211 
212  return true;
213  } else if (_t >= tHigh) {
214  dBin = (_t - tHigh) / unitsPerBin + 1;
215  if (currentBin_ > 0)
216  currentBin_ = nbinsX;
217  } else if (_t < tLow) {
218  if (currentBin_ > 0)
219  return false; // no going back in time in case of cumulative history
220 
221  int maxBin(0);
222 
223  for (unsigned iME(0); iME < mes_.size(); iME++) {
224  MonitorElement *me(mes_[iME]);
225 
226  bool filled(false);
227  int iMax(nbinsX + 1);
228  while (--iMax > 0 && !filled) {
229  switch (kind_) {
231  if (me->getBinContent(iMax) != 0)
232  filled = true;
233  break;
235  if (me->getBinEntries(iMax) != 0)
236  filled = true;
237  break;
239  for (int iy(1); iy <= me->getNbinsY(); iy++) {
240  if (me->getBinContent(me->getTH1()->GetBin(iMax, iy)) != 0) {
241  filled = true;
242  break;
243  }
244  }
245  break;
247  for (int iy(1); iy <= me->getNbinsY(); iy++) {
248  if (me->getBinEntries(me->getTH1()->GetBin(iMax, iy)) != 0) {
249  filled = true;
250  break;
251  }
252  }
253  break;
254  default:
255  break;
256  }
257  }
258 
259  if (iMax > maxBin)
260  maxBin = iMax;
261  }
262 
263  if (_t < tLow - (nbinsX - maxBin) * unitsPerBin)
264  return false;
265 
266  dBin = (_t - tLow) / unitsPerBin - 1;
267  }
268 
269  int start(dBin > 0 ? dBin + 1 : nbinsX + dBin);
270  int end(dBin > 0 ? nbinsX + 1 : 0);
271  int step(dBin > 0 ? 1 : -1);
272 
273  tLow += dBin * unitsPerBin;
274  tHigh += dBin * unitsPerBin;
275 
276  for (unsigned iME(0); iME < mes_.size(); iME++) {
277  MonitorElement *me(mes_[iME]);
278 
279  me->getTH1()->GetXaxis()->SetLimits(tLow, tHigh);
280 
281  if ((end - start) / step < 0) {
282  me->Reset();
283  continue;
284  }
285 
286  me->setEntries(0.);
287  double entries(0.);
288 
289  switch (kind_) {
291  int ix(start);
292  for (; ix != end; ix += step) {
293  double binContent(me->getBinContent(ix));
294  entries += binContent;
295  me->setBinContent(ix - dBin, binContent);
296  me->setBinError(ix - dBin, me->getBinError(ix));
297  }
298  ix = end - dBin - 1 * step;
299  double lastContent(currentBin_ > 0 ? me->getBinContent(ix) : 0.);
300  double lastError(currentBin_ > 0 ? me->getBinContent(ix) : 0.);
301  for (ix += step; ix != end; ix += step) {
302  me->setBinContent(ix, lastContent);
303  me->setBinError(ix, lastError);
304  }
305  } break;
307  int ix(start);
308  for (; ix != end; ix += step) {
309  double binEntries(me->getBinEntries(ix));
310  double binContent(me->getBinContent(ix));
311  entries += binEntries;
312  me->setBinEntries(ix - dBin, binEntries);
313  me->setBinContent(ix - dBin, binContent * binEntries);
314  if (binEntries > 0) {
315  double rms(me->getBinError(ix) * std::sqrt(binEntries));
316  double sumw2((rms * rms + binContent * binContent) * binEntries);
317  me->setBinError(ix - dBin, std::sqrt(sumw2));
318  } else
319  me->setBinError(ix - dBin, 0.);
320  }
321  ix = end - dBin;
322  for (; ix != end; ix += step) {
323  me->setBinEntries(ix, 0.);
324  me->setBinContent(ix, 0.);
325  me->setBinError(ix, 0.);
326  }
327  } break;
329  int ix(start);
330  int nbinsY(me->getNbinsY());
331  for (; ix != end; ix += step) {
332  for (int iy(1); iy <= nbinsY; iy++) {
333  int orig(me->getTH1()->GetBin(ix, iy));
334  int dest(me->getTH1()->GetBin(ix - dBin, iy));
335  double binContent(me->getBinContent(orig));
336  entries += binContent;
337  me->setBinContent(dest, binContent);
338  me->setBinError(dest, me->getBinError(orig));
339 
340  me->setBinContent(orig, 0.);
341  me->setBinError(orig, 0.);
342  }
343  }
344  ix = end - dBin - 1 * step;
345  std::vector<double> lastContent;
346  std::vector<double> lastError;
347  for (int iy(1); iy <= nbinsY; iy++) {
348  lastContent.push_back(currentBin_ > 0 ? me->getBinContent(ix, iy) : 0.);
349  lastError.push_back(currentBin_ > 0 ? me->getBinError(ix, iy) : 0.);
350  }
351  for (ix += step; ix != end; ix += step) {
352  for (int iy(1); iy <= nbinsY; iy++) {
353  int bin(me->getTH1()->GetBin(ix, iy));
354  me->setBinContent(bin, lastContent[iy - 1]);
355  me->setBinError(bin, lastError[iy - 1]);
356  }
357  }
358  } break;
360  int ix(start);
361  int nbinsY(me->getNbinsY());
362  for (; ix != end; ix += step) {
363  for (int iy(1); iy <= nbinsY; iy++) {
364  int orig(me->getTH1()->GetBin(ix, iy));
365  int dest(me->getTH1()->GetBin(ix - dBin, iy));
366  double binEntries(me->getBinEntries(orig));
367  double binContent(me->getBinContent(orig));
368  entries += binEntries;
369  me->setBinEntries(dest, binEntries);
370  me->setBinContent(dest, binContent * binEntries);
371  if (binEntries > 0) {
372  double rms(me->getBinError(orig) * std::sqrt(binEntries));
373  double sumw2((rms * rms + binContent * binContent) * binEntries);
374  me->setBinError(dest, std::sqrt(sumw2));
375  } else
376  me->setBinError(dest, 0.);
377  }
378  }
379  ix = end - dBin;
380  for (; ix != end; ix += step) {
381  for (int iy(1); iy <= nbinsY; iy++) {
382  int bin(me->getTH1()->GetBin(ix, iy));
383  me->setBinEntries(bin, 0.);
384  me->setBinContent(bin, 0.);
385  me->setBinError(bin, 0.);
386  }
387  }
388  } break;
389  default:
390  break;
391  }
392 
393  me->setEntries(entries);
394  }
395 
396  return true;
397  }
398 
399 } // namespace ecaldqm
MonitorElement::Kind kind_
Definition: MESet.h:129
void setBinContent(int binx, double content)
set content of bin (1-D)
virtual void setAxisTitle(std::string const &, int=1)
Definition: MESet.cc:89
int findBin(DetId const &, double, double=0.) const override
Definition: MESetTrend.cc:132
MESet & operator=(MESet const &) override
Definition: MESetEcal.cc:40
MESetTrend(std::string const &, binning::ObjectType, binning::BinningType, MonitorElement::Kind, binning::AxisSpecs const *=0, binning::AxisSpecs const *=0)
Definition: MESetTrend.cc:7
def copy(args, dbName)
virtual void checkME_(unsigned _iME) const
Definition: MESet.h:114
Ecal readout channel identification [32:20] Unused (so far) [19:13] DCC id [12:6] tower [5:3] strip [...
TH1 * getTH1() const
bool shift_(unsigned)
Definition: MESetTrend.cc:177
void fill(DetId const &, double, double=1., double=1.) override
Definition: MESetTrend.cc:89
void throw_(std::string const &_message) const
Definition: MESet.h:122
T sqrt(T t)
Definition: SSEVec.h:18
void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
void setEntries(double nentries)
set # of entries
void Reset()
reset ME (ie. contents, errors, etc)
virtual void fill_(unsigned, int, double)
Definition: MESet.cc:266
bin
set the eta bin as selection string.
Definition: DetId.h:18
MESet * clone(std::string const &="") const override
Definition: MESetTrend.cc:42
unsigned findPlotIndex(ObjectType, DetId const &)
double getBinError(int binx) const
get uncertainty on content of bin (1-D) - See TH1::GetBinError for details
int getNbinsY() const
get # of bins in Y-axis
bool active_
Definition: MESet.h:134
double getBinContent(int binx) const
get content of bin (1-D)
void book(DQMStore::IBooker &) override
Definition: MESetTrend.cc:51
double getBinEntries(int bin) const
get # of bin entries (for profiles)
MESet & operator=(MESet const &) override
Definition: MESetTrend.cc:31
binning::ObjectType otype_
Definition: MESet.h:127
virtual const_iterator end() const
Definition: MESet.h:322
step
Definition: StallMonitor.cc:94
binning::AxisSpecs const * xaxis_
Definition: MESetEcal.h:74
binning::BinningType btype_
Definition: MESet.h:128
std::string path_
Definition: MESet.h:126
void setBinEntries(int bin, double nentries)
set # of bin entries (to be used for profiles)
std::vector< MonitorElement * > mes_
Definition: MESet.h:124
void book(DQMStore::IBooker &) override
Definition: MESetEcal.cc:70