CMS 3D CMS Logo

DTTimeEvolutionHisto.cc
Go to the documentation of this file.
1 
2 /*
3  * See header file for a description of this class.
4  *
5  * \author G. Cerminara - INFN Torino
6  */
7 
9 
12 
13 using namespace std;
14 using namespace edm;
15 
17  const string& name,
18  const string& title,
19  int nbins,
20  int lsPrescale,
21  bool sliding,
22  int mode)
23  : DTTimeEvolutionHisto(ibooker, name, title, nbins, 1, lsPrescale, sliding, mode) {
24  nBookedBins = histo->getNbinsX();
25 }
26 
28  const string& name,
29  const string& title,
30  int nbins,
31  int firstLS,
32  int lsPrescale,
33  bool sliding,
34  int mode)
35  : valueLastTimeSlot(0), theFirstLS(firstLS), theLSPrescale(lsPrescale), doSlide(sliding), theMode(mode) {
36  // set the number of bins to be booked
37  nBookedBins = nbins;
38  binLabelCounter = -1;
39  if (sliding)
40  nBookedBins++;
41  if (!sliding && theMode == 0)
42  LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
43  << "[DTTimeEvolutionHisto]***Error: wrong configuration" << endl;
44 
45  stringstream realTitle;
46  realTitle << title << "/" << theLSPrescale << " LS";
47 
48  // book the ME
49 
50  histo = ibooker.book1D(name, realTitle.str(), nBookedBins, (float)theFirstLS, nBookedBins + 1.);
51 
52  // set the axis label
53  if (sliding) {
54  histo->setBinLabel(1, "avg. previous", 1);
55  } else {
56  // loop over bins and
57 
58  for (int bin = 1; bin != nBookedBins + 1; ++bin) {
59  stringstream label;
60  if (theLSPrescale > 1) {
61  label << "LS " << ((bin - 1) * theLSPrescale) + theFirstLS << "-" << bin * theLSPrescale + theFirstLS;
62  } else {
63  label << "LS " << ((bin - 1) * theLSPrescale) + theFirstLS;
64  }
65  if (bin % (2 * (int)theLSPrescale) == 0)
66  histo->setBinLabel(bin, label.str(), 1); //JF to allow easy reading of x-axis
67  }
68  }
69 }
70 
71 //FR changed previous constructor with 2 arguments:
72 //no igetter here!! so I get the histo from the client and just instanciate here a DTTimeEvolutionHisto
73 
75  : valueLastTimeSlot(0),
76  theFirstLS(1),
77  theLSPrescale(-1),
78  doSlide(false),
79  theMode(0) { // FIXME: set other memebers to sensible values
80  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
81  << "[DTTimeEvolutionHisto] Retrieve ME with name: "
82  << " " << endl;
83  histo = histoGot;
84 }
85 
87 
88 void DTTimeEvolutionHisto::setTimeSlotValue(float value, int timeSlot) {
89  if (!doSlide) {
90  histo->Fill(timeSlot, value);
91  } else {
92  for (int bin = 1; bin != nBookedBins; ++bin) {
93  float value = histo->getBinContent(bin);
94 
95  if (bin == 1) { // average of previous time slots (fixme)
97  } else if (bin != nBookedBins) {
100  histo->setBinLabel(bin, histo->getTH1F()->GetXaxis()->GetBinLabel(bin + 1), 1); //slide to left
101  histo->setBinLabel(bin + 1, "", 1); //delete old label to avoid duplication
102  }
103  }
105  }
106 }
107 
109 
110 void DTTimeEvolutionHisto::updateTimeSlot(int ls, int nEventsInLS) {
111  if (doSlide) { // sliding bins
112  // count LS in this time-slot
113  if (nEventsInLastTimeSlot.find(ls) != nEventsInLastTimeSlot.end()) {
114  nEventsInLastTimeSlot[ls] += nEventsInLS;
116  } else {
117  nEventsInLastTimeSlot[ls] = nEventsInLS;
119  }
120 
121  if (!nEventsInLastTimeSlot.empty() &&
122  nEventsInLastTimeSlot.size() % theLSPrescale == 0) { // update the value of the slot and reset the counters
123  int firstLSinTimeSlot = nEventsInLastTimeSlot.begin()->first;
124  int lastLSinTimeSlot = nEventsInLastTimeSlot.rbegin()->first;
125 
126  map<int, int>::const_iterator nEventsIt = nEventsInLastTimeSlot.begin();
127  map<int, int>::const_iterator nEventsEnd = nEventsInLastTimeSlot.end();
128 
129  int nEvents = 0;
130  for (; nEventsIt != nEventsEnd; ++nEventsIt)
131  nEvents += nEventsIt->second;
132 
133  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
134  << "[DTTimeEvolutionHisto] Update time-slot, # entries: " << valueLastTimeSlot << " # events: " << nEvents
135  << endl;
136  // set the bin content
137 
138  float value = 0;
139  if (theMode == 0) {
140  if (nEvents != 0)
142  } else if (theMode == 1) {
144  } else if (theMode == 2) {
145  value = nEvents;
146  } else if (theMode == 3) {
147  map<int, int>::const_iterator nLumiTrIt = nLumiTrInLastTimeSlot.begin();
148  map<int, int>::const_iterator nLumiTrEnd = nLumiTrInLastTimeSlot.end();
149 
150  float nLumiTr = 0.;
151  for (; nLumiTrIt != nLumiTrEnd; ++nLumiTrIt)
152  nLumiTr += nLumiTrIt->second;
153 
154  value = valueLastTimeSlot / nLumiTr;
155  }
157  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
158  << " updated value: " << histo->getBinContent(nBookedBins) << endl;
159 
160  // set the bin label
161  stringstream binLabel;
162  binLabel << "LS " << firstLSinTimeSlot;
163  if (nEventsInLastTimeSlot.size() > 1) {
164  binLabel << "-" << lastLSinTimeSlot;
165  binLabelCounter++;
166  }
167 
168  // Set only labels which can be seen in the plot without zooming
169  if (binLabelCounter % ((int)(nBookedBins / 25)) == 0) //around 25 labels fit in a full size hist
170  histo->setBinLabel(nBookedBins, binLabel.str(), 1);
171  //first label, LS=1 ideally, is guaranteed by setting binLabelCounter=-1 in constructor
172 
173  // reset the counters for the time slot
174  nEventsInLastTimeSlot.clear();
175  nLumiTrInLastTimeSlot.clear();
176  valueLastTimeSlot = 0;
177  }
178 
179  } else {
180  int binN = (int)ls - (theFirstLS - 1) / (int)theLSPrescale;
181  // set the bin content
182  float value = 0;
183  if (theMode == 1) {
185  } else if (theMode == 2) {
186  value = nEventsInLS;
187  } else if (theMode == 3) {
189  }
190  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
191  << "[DTTimeEvolutionHisto] Update time-slot: " << binN << " with value: " << value << endl;
192  setTimeSlotValue(value, binN);
193  }
194 }
195 
197  if (histo == nullptr) {
198  LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
199  << "[DTTimeEvolutionHisto]***Error: pointer to ME is NULL" << endl;
200  return;
201  }
202  int nBins = histo->getNbinsX();
203  if (histForNorm->getNbinsX() != nBins) {
204  LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
205  << "[DTTimeEvolutionHisto]***Error: normalizing histos with != # of bins" << endl;
206  return;
207  }
208  for (int bin = 1; bin <= nBins; ++bin) { // loop over bins
209  if (histForNorm->getBinContent(bin) != 0) {
210  double normValue = histo->getBinContent(bin) / histForNorm->getBinContent(bin);
211  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
212  << "[DTTimeEvolutionHisto] Normalizing bin: " << bin << " to: " << histo->getBinContent(bin) << " / "
213  << histForNorm->getBinContent(bin) << " = " << normValue << endl;
214  histo->setBinContent(bin, normValue);
215  } else {
216  histo->setBinContent(bin, 0);
217  }
218  }
219 }
220 
221 // Local Variables:
222 // show-trailing-whitespace: t
223 // truncate-lines: t
224 // End:
Log< level::Info, true > LogVerbatim
void accumulateValueTimeSlot(float value)
std::map< int, int > nLumiTrInLastTimeSlot
DTTimeEvolutionHisto(DQMStore::IBooker &ibooker, const std::string &name, const std::string &title, int nbins, int lsPrescale, bool sliding, int mode=0)
void setTimeSlotValue(float value, int timeSlot)
void Fill(long long x)
char const * label
virtual ~DTTimeEvolutionHisto()
Destructor.
Definition: value.py:1
virtual void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
def ls(path, rec=False)
Definition: eostools.py:349
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
virtual TH1F * getTH1F() const
void normalizeTo(const MonitorElement *histForNorm)
void updateTimeSlot(int ls, int nEventsInLS)
HLT enums.
std::map< int, int > nEventsInLastTimeSlot
virtual int getNbinsX() const
get # of bins in X-axis
virtual double getBinError(int binx) const
get uncertainty on content of bin (1-D) - See TH1::GetBinError for details
virtual void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
virtual double getBinContent(int binx) const
get content of bin (1-D)