CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTBlockedROChannelsTest.cc
Go to the documentation of this file.
1 
2 /*
3  * \file DTBlockedROChannelsTest.cc
4  *
5  * \author G. Cerminara - University and INFN Torino
6  *
7  */
8 
10 
11 //Framework
20 #include <iostream>
21 #include <string>
22 
23 
24 using namespace std;
25 using namespace edm;
26 
27 
29  neventsPrev(0),
30  prevNLumiSegs(0),
31  prevTotalPerc(0),
32  hSystFractionVsLS(0)
33 {
34  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
35  << "[DTBlockedROChannelsTest]: Constructor";
36 
37  // prescale on the # of LS to update the test
38  prescaleFactor = ps.getUntrackedParameter<int>("diagnosticPrescale", 1);
39 
40  offlineMode = ps.getUntrackedParameter<bool>("offlineMode", true);
41 }
42 
43 
44 
46  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
47  << "DataIntegrityTest: analyzed " << nupdates << " updates";
48 }
49 
50 
51 
52 // book histos
54  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
55  << "[DTBlockedROChannelsTest]: BeginJob";
56 
57  nupdates = 0;
58  run=0;
59 
61 
62  // book the summary histogram
63  dbe->setCurrentFolder("DT/00-ROChannels");
64  summaryHisto = dbe->book2D("ROChannelSummary","Summary Blocked RO Channels",12,1,13,5,-2,3);
65  summaryHisto->setAxisTitle("Sector",1);
66  summaryHisto->setAxisTitle("Wheel",2);
67 
68  for(int wheel = -2; wheel != 3; ++wheel) {
69  stringstream namestream; namestream << "ROChannelSummary_W" << wheel;
70  stringstream titlestream; titlestream << "Blocked RO Channels (Wh " << wheel << ")";
71  wheelHitos[wheel] = dbe->book2D(namestream.str().c_str(),titlestream.str().c_str(),12,1,13,4,1,5);
72  wheelHitos[wheel]->setAxisTitle("Sector",1);
73  wheelHitos[wheel]->setBinLabel(1,"MB1",2);
74  wheelHitos[wheel]->setBinLabel(2,"MB2",2);
75  wheelHitos[wheel]->setBinLabel(3,"MB3",2);
76  wheelHitos[wheel]->setBinLabel(4,"MB4",2);
77  }
78 
79  if(!offlineMode) {
80  hSystFractionVsLS = new DTTimeEvolutionHisto(dbe, "EnabledROChannelsVsLS", "% RO channels",
81  500, 5, true, 3);
82  }
83 
84 }
85 
86 
87 
88 
89 void DTBlockedROChannelsTest::beginRun(const Run& run, const EventSetup& context) {
90  // get the RO mapping
91  context.get<DTReadOutMappingRcd>().get(mapping);
92 
93  // fill the map of the robs per chamber
94  for(int dduId = FEDNumbering::MINDTFEDID; dduId<=FEDNumbering::MAXDTFEDID; ++dduId) { //loop over DDUs
95  for(int ros = 1; ros != 13; ++ros) { // loop over ROSs
96  for(int rob = 1; rob != 26; ++rob) { // loop over ROBs
97  int wheel = 0;
98  int station = 0;
99  int sector = 0;
100  int dummy = 0;
101  if(!mapping->readOutToGeometry(dduId,ros,rob-1,0,2,wheel,station,sector,dummy,dummy,dummy) ||
102  !mapping->readOutToGeometry(dduId,ros,rob-1,0,16,wheel,station,sector,dummy,dummy,dummy)) {
103  DTChamberId chId(wheel, station, sector);
104  if(chamberMap.find(chId) == chamberMap.end()) {
105  chamberMap[chId] = DTRobBinsMap(dduId, ros, dbe);
106  chamberMap[chId].addRobBin(rob);
107  }
108  chamberMap[chId].addRobBin(rob);
109  } else {
110  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
111  << "[DTRobBinsMap] FED: " << dduId << " ROS " << ros << " ROB: " << rob-1
112  << " not in the mapping!" << endl;
113  }
114  }
115  }
116  }
117  // loop over all chambers and remove the init flag
118  for(map<DTChamberId, DTRobBinsMap>::iterator chAndRobs = chamberMap.begin();
119  chAndRobs != chamberMap.end(); ++chAndRobs) {
120  chAndRobs->second.init(false);
121  }
122 }
123 
124 
125 
127  EventSetup const& context) {
128  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
129  <<"[DTBlockedROChannelsTest]: Begin of LS transition";
130 
131  // Get the run number
132  run = lumiSeg.run();
133  nevents = 0;
134 
135  // // loop over all chambers and read the values at the beginning of the LS
136  // for(map<DTChamberId, DTRobBinsMap>::iterator chAndRobs = chamberMap.begin();
137  // chAndRobs != chamberMap.end(); ++chAndRobs) {
138  // (*chAndRobs).second.readNewValues();
139  // }
140 
141 }
142 
143 
144 
145 void DTBlockedROChannelsTest::analyze(const Event& e, const EventSetup& context){
146  // count the analyzed events
147  nevents++;
148  if(nevents%1000 == 0)
149  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
150  << "[DTBlockedROChannelsTest]: "<<nevents<<" events";
151 }
152 
153 
154 
156 
157  // counts number of lumiSegs
158  nLumiSegs = lumiSeg.id().luminosityBlock();
159 
160  // prescale factor
161  if (nLumiSegs%prescaleFactor != 0 || offlineMode) return;
162 
163  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
164  <<"[DTBlockedROChannelsTest]: End of LS " << nLumiSegs << ". Client called in online mode, performing client operations";
166 
167  // counts number of updats
168  nupdates++;
169 
170 }
171 
172 
174 
175  // skip empty LSs
176 
177  if(nevents == 0) { // hack to work also in offline DQM
178  MonitorElement *procEvt = dbe->get("DT/EventInfo/processedEvents");
179  if(procEvt != 0) {
180  int procEvents = procEvt->getIntValue();
181  nevents = procEvents - neventsPrev;
182  neventsPrev = procEvents;
183  }
184  }
185 
186  double totalPerc = prevTotalPerc;
187  // check again!
188  if(nevents != 0) { // skip the computation if no events in the last LS
189 
190  // reset the histos
191  summaryHisto->Reset();
192  for(int wheel = -2; wheel != 3; ++wheel) {
193  wheelHitos[wheel]->Reset();
194  }
195 
196  totalPerc = 0.;
197 
198  // loop over all chambers and fill the wheel plots
199  for(map<DTChamberId, DTRobBinsMap>::iterator chAndRobs = chamberMap.begin();
200  chAndRobs != chamberMap.end(); ++chAndRobs) {
201  DTChamberId chId = (*chAndRobs).first;
202  double scale = 1.;
203  int sectorForPlot = chId.sector();
204  if(sectorForPlot == 13 || (sectorForPlot == 4 && chId.station() ==4)) {
205  sectorForPlot = 4;
206  scale = 0.5;
207  } else if(sectorForPlot == 14 || (sectorForPlot == 10 && chId.station() ==4)) {
208  sectorForPlot = 10;
209  scale = 0.5;
210  }
211 
212  // NOTE: can be called only ONCE per event per each chamber
213  double chPercent = (*chAndRobs).second.getChamberPercentage();
214  wheelHitos[chId.wheel()]->Fill(sectorForPlot, chId.station(),
215  scale*chPercent);
216  totalPerc += chPercent*scale*1./240.; // CB has to be 240 as double stations are taken into account by scale factor
217  // if(chPercent != 1.) {
218  // cout << "Ch: " << (*chAndRobs).first << endl;
219  // cout << " perc: " << chPercent << endl;
220  // }
221  // Fill the summary
222  summaryHisto->Fill(sectorForPlot, chId.wheel(), 0.25*scale*chPercent);
223  }
224  }
225 
226  // commented out since trend plots need to be updated in by lumi certification
227  // // this part is executed even if no events were processed in order to include the last LS
228  // if(offlineMode) { // save the results in a map and draw them in the end-run
229  // if(resultsPerLumi.size() == 0) { // the first 2 LS are analyzed together
230  // // cout << "LS: " << nLumiSegs << " total %: " << totalPerc << endl;
231  // resultsPerLumi[nLumiSegs] = totalPerc;
232  // } else {
233  // // cout << "LS: " << nLumiSegs << " total %: " << prevTotalPerc << endl;
234  // resultsPerLumi[nLumiSegs] = prevTotalPerc;
235  // }
236  // prevTotalPerc = totalPerc;
237  // prevNLumiSegs = nLumiSegs;
238 
239  // } else { // directly fill the histo
240  // hSystFractionVsLS->accumulateValueTimeSlot(totalPerc);
241  // hSystFractionVsLS->updateTimeSlot(nLumiSegs, nevents);
242  // prevTotalPerc = totalPerc;
243  // }
244 
245  if(!offlineMode) { // fill trend histo only in online
248  prevTotalPerc = totalPerc;
249  }
250 
251 }
252 
253 
254 
256  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
257  <<"[DTBlockedROChannelsTest] endjob called!";
258 }
259 
260 
261 
262 
264 
265  if (offlineMode) {
266  LogTrace("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
267  <<"[DTBlockedROChannelsTest] endRun called. Client called in offline mode, performing operations.";
269  }
270  // commented out since trend plots need to be updated in by lumi certification
271  // if(offlineMode) {
272  // // fill a trend plot based on the results stored in the map
273  // float fBin = resultsPerLumi.begin()->first;
274  // float lBin = resultsPerLumi.rbegin()->first;
275  // dbe->setCurrentFolder("DT/00-ROChannels");
276 
277  // // MonitorElement* hSystFractionVsLS = dbe->book1D("EnabledROChannelsVsLS", "% RO channels vs LS", nBins,fBin,lBin);
278  // hSystFractionVsLS = new DTTimeEvolutionHisto(dbe, "EnabledROChannelsVsLS", "% RO channels",
279  // (int)lBin-(int)fBin, fBin, 1, false, 2);
280 
281  // for(map<int, double>::const_iterator bin = resultsPerLumi.begin();
282  // bin != resultsPerLumi.end(); ++bin) {
283  // hSystFractionVsLS->setTimeSlotValue((*bin).second, (*bin).first);
284  // }
285  // }
286 }
287 
288 
289 
290 int DTBlockedROChannelsTest::readOutToGeometry(int dduId, int ros, int& wheel, int& sector){
291 
292  int dummy;
293  return mapping->readOutToGeometry(dduId,ros,2,2,2,wheel,dummy,sector,dummy,dummy,dummy);
294 
295 }
296 
297 
298 
299 
300 
301 DTBlockedROChannelsTest::DTRobBinsMap::DTRobBinsMap(const int fed, const int ros, const DQMStore* dbe) : rosBin(ros),
302  init_(true),
303  rosValue(0)
304 {
305 
306  // get the pointer to the corresondig histo
307  stringstream mename; mename << "DT/00-DataIntegrity/FED" << fed << "/ROS" << ros
308  << "/FED" << fed << "_ROS" << ros << "_ROSError";
309  rosHName = mename.str();
310 
311  stringstream whname; whname << "DT/00-DataIntegrity/FED" << fed
312  << "/FED" << fed << "_ROSStatus";
313  dduHName = whname.str();
314 
315  meROS = dbe->get(rosHName);
316  meDDU = dbe->get(dduHName);
317 
318  theDbe = dbe;
319 }
320 
322  meROS(0),
323  meDDU(0){}
324 
326 
327 
328 
329  // add a rob to the set of robs
331  robsAndValues[robBin] = getValueRobBin(robBin);
332  }
333 
334 
335 
336 
338  if (init_)
339  return 0;
340  int value = 0;
341  if(meROS) {
342  value += (int)meROS->getBinContent(9,robBin);
343  value += (int)meROS->getBinContent(11,robBin);
344  }
345  return value;
346  }
347 
348 
349 
350 
352  int value = 0;
353  if(meDDU) {
354  value += (int)meDDU->getBinContent(2,rosBin);
355  value += (int)meDDU->getBinContent(10,rosBin);
356  }
357  return value;
358 }
359 
360 
361 
362 
364  // check that this is a valid ROB for this map (= it has been added!)
365  if(robsAndValues.find(robBin) == robsAndValues.end()) {
366  LogWarning("DTDQM|DTRawToDigi|DTMonitorClient|DTBlockedROChannelsTest")
367  << "[DTRobBinsMap]***Error: ROB: " << robBin << " is not valid" << endl;
368  return false;
369  }
370 
371  int newValue = getValueRobBin(robBin);
372  if(newValue > robsAndValues[robBin]) {
373  robsAndValues[robBin] = newValue;
374  return true;
375  }
376  return false;
377 }
378 
379 
380 
381 
383  meROS = theDbe->get(rosHName);
384  meDDU = theDbe->get(dduHName);
385  int nChangedROBs = 0;
386 
387  // check if ros status has changed
388  int newValue = getValueRos();
389  if(newValue > rosValue) {
390  rosValue= newValue;
391  return 0.;
392  }
393 
394  for(map<int, int>::const_iterator robAndValue = robsAndValues.begin();
395  robAndValue != robsAndValues.end(); ++robAndValue) {
396  if(robChanged((*robAndValue).first)) nChangedROBs++;
397  }
398  return 1.-((double)nChangedROBs/(double)robsAndValues.size());
399 }
400 
401 
403  meROS = theDbe->get(rosHName);
404  meDDU = theDbe->get(dduHName);
405 
406  rosValue = getValueRos();
407  for(map<int, int>::const_iterator robAndValue = robsAndValues.begin();
408  robAndValue != robsAndValues.end(); ++robAndValue) {
409  robChanged((*robAndValue).first);
410  }
411 }
412 
413 
414 
415 
416 // FIXME: move to SealModule
LuminosityBlockID id() const
T getUntrackedParameter(std::string const &, T const &) const
DTTimeEvolutionHisto * hSystFractionVsLS
void accumulateValueTimeSlot(float value)
void beginRun(const edm::Run &run, const edm::EventSetup &c)
BeginRun.
std::map< DTChamberId, DTRobBinsMap > chamberMap
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
void Fill(long long x)
std::map< int, MonitorElement * > wheelHitos
DTBlockedROChannelsTest(const edm::ParameterSet &ps)
Constructor.
RunNumber_t run() const
int nevents
MonitorElement * get(const std::string &path) const
get ME from full pathname (e.g. &quot;my/long/dir/my_histo&quot;)
Definition: DQMStore.cc:1623
int readOutToGeometry(int dduId, int rosNumber, int &wheel, int &sector)
edm::ESHandle< DTReadOutMapping > mapping
#define LogTrace(id)
int64_t getIntValue(void) const
const T & get() const
Definition: EventSetup.h:55
LuminosityBlockNumber_t luminosityBlock() const
void updateTimeSlot(int ls, int nEventsInLS)
void analyze(const edm::Event &e, const edm::EventSetup &c)
Analyze.
int sector() const
Definition: DTChamberId.h:61
void performClientDiagnostic()
DQM Client operations.
void endLuminosityBlock(edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &c)
DQM Client Diagnostic in online mode.
int station() const
Return the station number.
Definition: DTChamberId.h:51
MonitorElement * book2D(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Book 2D histogram.
Definition: DQMStore.cc:1000
void endRun(edm::Run const &run, edm::EventSetup const &eSetup)
DQM Client Diagnostic in offline mode.
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:45
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
void Reset(void)
reset ME (ie. contents, errors, etc)
void beginLuminosityBlock(edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &context)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:584
Definition: Run.h:41