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 
13 
14 using namespace std;
15 using namespace edm;
16 
17 
19  const string& title,
20  int nbins,
21  int lsPrescale,
22  bool sliding,
23  int mode) :
24  DTTimeEvolutionHisto(ibooker, name, title, nbins, 1, lsPrescale, sliding, mode) {
25 
26  nBookedBins = histo->getNbinsX();
27 }
28 
29 
31  const string& title,
32  int nbins,
33  int firstLS,
34  int lsPrescale,
35  bool sliding,
36  int mode) : valueLastTimeSlot(0),
37  theFirstLS(firstLS),
38  theLSPrescale(lsPrescale),
39  doSlide(sliding),
40  theMode(mode) {
41  // set the number of bins to be booked
42  nBookedBins = nbins;
43  if(sliding) nBookedBins++;
44  if(!sliding && theMode == 0)
45  LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
46  << "[DTTimeEvolutionHisto]***Error: wrong configuration" << endl;
47 
48  stringstream realTitle; realTitle << title << "/" << theLSPrescale << " LS";
49 
50  // book the ME
51 
52  histo = ibooker.book1D(name, realTitle.str(), nBookedBins, (float)theFirstLS, nBookedBins+1.);
53 
54  // set the axis label
55  if(sliding) {
56  histo->setBinLabel(1,"avg. previous",1);
57  } else {
58  // loop over bins and
59 
60  for(int bin =1; bin != nBookedBins+1; ++bin) {
61  stringstream label;
62  if(theLSPrescale > 1) {
63  label << "LS " << ((bin-1)*theLSPrescale)+theFirstLS << "-" << bin*theLSPrescale+theFirstLS;
64  } else {
65  label << "LS " << ((bin-1)*theLSPrescale)+theFirstLS;
66  }
67  if (bin%(2*(int)theLSPrescale)==0) histo->setBinLabel(bin, label.str(),1); //JF to allow easy reading of x-axis
68  }
69  }
70 }
71 
72 //FR changed previous constructor with 2 arguments:
73 //no igetter here!! so I get the histo from the client and just instanciate here a DTTimeEvolutionHisto
74 
75 DTTimeEvolutionHisto::DTTimeEvolutionHisto(MonitorElement* histoGot) : valueLastTimeSlot(0), theFirstLS(1),
76  theLSPrescale(-1),
77  doSlide(false),
78  theMode(0) { // FIXME: set other memebers to sensible values
79  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
80  << "[DTTimeEvolutionHisto] Retrieve ME with name: " << " "<< endl;
81  histo = histoGot;
82 }
83 
84 
86 
87 
88 
89 void DTTimeEvolutionHisto::setTimeSlotValue(float value, int timeSlot) {
90 
91  if(!doSlide) {
92 
93  histo->Fill(timeSlot,value);
94  } else {
95  for(int bin = 1; bin != nBookedBins; ++bin) {
96  float value = histo->getBinContent(bin);
97 
98  if(bin == 1) { // average of previous time slots (fixme)
99  histo->setBinContent(bin, (value + histo->getBinContent(bin+1))/2.);
100  } else if(bin != nBookedBins) {
103  //JF to allow easy reading of x-axis
104  if (bin%(2*(int)theLSPrescale)==0){ histo->setBinLabel(bin, histo->getTH1F()->GetXaxis()->GetBinLabel(bin+1),1); }
105  else histo->setBinLabel(bin,"");
106  }
107  }
109  }
110 }
111 
112 
115 }
116 
117 
118 
119 void DTTimeEvolutionHisto::updateTimeSlot(int ls, int nEventsInLS) {
120 
121  if(doSlide) { // sliding bins
122  // count LS in this time-slot
123  if (nEventsInLastTimeSlot.find(ls) != nEventsInLastTimeSlot.end()) {
124  nEventsInLastTimeSlot[ls] += nEventsInLS;
126  } else {
127  nEventsInLastTimeSlot[ls] = nEventsInLS;
129  }
130 
131 
132  if(!nEventsInLastTimeSlot.empty() && nEventsInLastTimeSlot.size()%theLSPrescale==0) { // update the value of the slot and reset the counters
133  int firstLSinTimeSlot = nEventsInLastTimeSlot.begin()->first;
134  int lastLSinTimeSlot = nEventsInLastTimeSlot.rbegin()->first;
135 
136  map<int,int>::const_iterator nEventsIt = nEventsInLastTimeSlot.begin();
137  map<int,int>::const_iterator nEventsEnd = nEventsInLastTimeSlot.end();
138 
139  int nEvents = 0;
140  for (;nEventsIt!=nEventsEnd;++nEventsIt)
141  nEvents+=nEventsIt->second;
142 
143  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
144  << "[DTTimeEvolutionHisto] Update time-slot, # entries: " << valueLastTimeSlot
145  << " # events: " << nEvents << endl;
146  // set the bin content
147 
148  float value = 0;
149  if(theMode == 0) {
150  if(nEvents != 0) value = valueLastTimeSlot/(float)nEvents;
151  } else if(theMode == 1) {
152  value = valueLastTimeSlot;
153  } else if(theMode == 2) {
154  value = nEvents;
155  } else if(theMode == 3) {
156  map<int,int>::const_iterator nLumiTrIt = nLumiTrInLastTimeSlot.begin();
157  map<int,int>::const_iterator nLumiTrEnd = nLumiTrInLastTimeSlot.end();
158 
159  float nLumiTr = 0.;
160  for (;nLumiTrIt!=nLumiTrEnd;++nLumiTrIt)
161  nLumiTr+=nLumiTrIt->second;
162 
163  value = valueLastTimeSlot/nLumiTr;
164  }
166  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
167  << " updated value: " << histo->getBinContent(nBookedBins) << endl;
168 
169  // set the bin label
170  stringstream binLabel;
171  binLabel << "LS " << firstLSinTimeSlot;
172  if(nEventsInLastTimeSlot.size() > 1)
173  binLabel << "-" << lastLSinTimeSlot;
174 
175  //if(nBookedBins%(int)theLSPrescale==0)
176  histo->setBinLabel(nBookedBins,binLabel.str(),1);
177 
178  // reset the counters for the time slot
179  nEventsInLastTimeSlot.clear();
180  nLumiTrInLastTimeSlot.clear();
181  valueLastTimeSlot = 0;
182  }
183 
184 
185  } else {
186  int binN = (int)ls-(theFirstLS-1)/(int)theLSPrescale;
187  // set the bin content
188  float value = 0;
189  if(theMode == 1) {
190  value = valueLastTimeSlot;
191  } else if(theMode == 2) {
192  value = nEventsInLS;
193  } else if(theMode == 3) {
195  }
196  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
197  << "[DTTimeEvolutionHisto] Update time-slot: "<< binN << " with value: " << value << endl;
198  setTimeSlotValue(value,binN);
199  }
200 }
201 
202 
203 
204 
206  if(histo == nullptr) {
207  LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
208  << "[DTTimeEvolutionHisto]***Error: pointer to ME is NULL" << endl;
209  return;
210  }
211  int nBins = histo->getNbinsX();
212  if(histForNorm->getNbinsX() != nBins) {
213  LogWarning("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
214  << "[DTTimeEvolutionHisto]***Error: normalizing histos with != # of bins" << endl;
215  return;
216  }
217  for(int bin = 1; bin <= nBins; ++bin) { // loop over bins
218  if(histForNorm->getBinContent(bin) != 0) {
219  double normValue = histo->getBinContent(bin)/histForNorm->getBinContent(bin);
220  LogVerbatim("DTDQM|DTMonitorModule|DTMonitorClient|DTTimeEvolutionHisto")
221  << "[DTTimeEvolutionHisto] Normalizing bin: " << bin << " to: " << histo->getBinContent(bin) << " / " << histForNorm->getBinContent(bin)
222  << " = " << normValue << endl;
223  histo->setBinContent(bin, normValue);
224  } else {
225  histo->setBinContent(bin, 0);
226  }
227  }
228 }
229 
230 // Local Variables:
231 // show-trailing-whitespace: t
232 // truncate-lines: t
233 // End:
void setBinContent(int binx, double content)
set content of bin (1-D)
void accumulateValueTimeSlot(float value)
std::map< int, int > nLumiTrInLastTimeSlot
TH1F * getTH1F() const
DTTimeEvolutionHisto(DQMStore::IBooker &ibooker, const std::string &name, const std::string &title, int nbins, int lsPrescale, bool sliding, int mode=0)
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)
void Fill(long long x)
void setTimeSlotValue(float value, int timeSlot)
std::map< int, int > nEventsInLastTimeSlot
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:118
virtual ~DTTimeEvolutionHisto()
Destructor.
void setBinError(int binx, double error)
set uncertainty on content of bin (1-D)
Definition: value.py:1
bin
set the eta bin as selection string.
def ls(path, rec=False)
Definition: eostools.py:348
double getBinError(int binx) const
get uncertainty on content of bin (1-D) - See TH1::GetBinError for details
void normalizeTo(const MonitorElement *histForNorm)
void updateTimeSlot(int ls, int nEventsInLS)
double getBinContent(int binx) const
get content of bin (1-D)
HLT enums.
int getNbinsX() const
get # of bins in X-axis
UInt_t nEvents
Definition: hcalCalib.cc:42