CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DTDigiTask.cc
Go to the documentation of this file.
1 /*
2  * \file DTDigiTask.cc
3  *
4  * $Date: 2011/11/23 14:23:15 $
5  * $Revision: 1.69 $
6  * \author M. Zanetti - INFN Padova
7  *
8  */
9 
11 
12 // Framework
14 
15 // Digis
21 
22 // Geometry
27 
28 // T0s
33 
36 
40 
41 #include <sstream>
42 #include <math.h>
43 
44 using namespace edm;
45 using namespace std;
46 
47 
48 
49 // Contructor
51  // switch for the verbosity
52  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "[DTDigiTask]: Constructor" << endl;
53 
54  // The label to retrieve the digis
55  dtDigiLabel = ps.getParameter<InputTag>("dtDigiLabel");
56  // Read the configuration parameters
57  maxTDCHits = ps.getUntrackedParameter<int>("maxTDCHitsPerChamber",30000);
58  // Set to true to read the ttrig from DB (useful to determine in-time and out-of-time hits)
59  readTTrigDB = ps.getUntrackedParameter<bool>("readDB", false);
60  // Set to true to subtract t0 from test pulses
61  subtractT0 = ps.getParameter<bool>("performPerWireT0Calibration");
62  // Tmax value (TDC counts)
63  defaultTmax = ps.getParameter<int>("defaultTmax");
64  // Switch from static to dinamic histo booking
65  doStaticBooking = ps.getUntrackedParameter<bool>("staticBooking", true);
66  // Switch for local/global runs
67  isLocalRun = ps.getUntrackedParameter<bool>("localrun", true);
68  // Setting for the reset of the ME after n (= ResetCycle) luminosity sections
69  resetCycle = ps.getUntrackedParameter<int>("ResetCycle", 3);
70  // Check the DB of noisy channels
71  checkNoisyChannels = ps.getUntrackedParameter<bool>("checkNoisyChannels",false);
72  // Default TTrig to be used when not reading the TTrig DB
73  defaultTTrig = ps.getParameter<int>("defaultTtrig");
74  inTimeHitsLowerBound = ps.getParameter<int>("inTimeHitsLowerBound");
75  inTimeHitsUpperBound = ps.getParameter<int>("inTimeHitsUpperBound");
76  timeBoxGranularity = ps.getUntrackedParameter<int>("timeBoxGranularity",4);
77  maxTDCCounts = ps.getUntrackedParameter<int>("maxTDCCounts", 6400);
78 
79  doAllHitsOccupancies = ps.getUntrackedParameter<bool>("doAllHitsOccupancies", true);
80  doNoiseOccupancies = ps.getUntrackedParameter<bool>("doNoiseOccupancies", false);
81  doInTimeOccupancies = ps.getUntrackedParameter<bool>("doInTimeOccupancies", false);
82 
83  // switch on the mode for running on test pulses (different top folder)
84  tpMode = ps.getUntrackedParameter<bool>("testPulseMode", false);
85  // switch on/off the filtering of synchronous noise events (cutting on the # of digis)
86  // time-boxes and occupancy plots are not filled and summary plots are created to report the problem
87  filterSyncNoise = ps.getUntrackedParameter<bool>("filterSyncNoise", false);
88  // look for synch noisy events, produce histograms but do not filter them
89  lookForSyncNoise = ps.getUntrackedParameter<bool>("lookForSyncNoise", false);
90  // switch on production of time-boxes with layer granularity
91  doLayerTimeBoxes = ps.getUntrackedParameter<bool>("doLayerTimeBoxes", false);
92 
93  dbe = edm::Service<DQMStore>().operator->();
94 
95  syncNumTot = 0;
96  syncNum = 0;
97 
98 }
99 
100 
101 
102 // destructor
104  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "DTDigiTask: analyzed " << nevents << " events" << endl;
105 
106 }
107 
108 
109 
110 
112  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") <<"[DTDigiTask] endjob called!"<<endl;
113 
114 }
115 
116 
117 
118 
120  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") <<"[DTDigiTask]: BeginJob"<<endl;
121 
122  nevents = 0;
123 }
124 
125 
126 void DTDigiTask::beginRun(const edm::Run& run, const edm::EventSetup& context) {
127  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "[DTDigiTask]: begin run" << endl;
128 
129  // Get the geometry
130  context.get<MuonGeometryRecord>().get(muonGeom);
131 
132  // map of the channels
133  context.get<DTReadOutMappingRcd>().get(mapping);
134 
135  // tTrig
136  if (readTTrigDB)
137  context.get<DTTtrigRcd>().get(tTrigMap);
138  // t0s
139  if (subtractT0)
140  context.get<DTT0Rcd>().get(t0Map);
141  // FIXME: tMax (not yet from the DB)
142  tMax = defaultTmax;
143 
144  // ----------------------------------------------------------------------
145  if(doStaticBooking) { // Static histo booking
146  // book the event counter
147  dbe->setCurrentFolder("DT/EventInfo/Counters");
148  nEventMonitor = dbe->bookFloat(tpMode ? "nProcessedEventsDigiTP" : "nProcessedEventsDigi" );
149  dbe->setCurrentFolder(topFolder());
150  for(int wh = -2; wh <= 2; ++wh) { // loop over wheels
151  if(doAllHitsOccupancies) bookHistos(wh,string("Occupancies"),"OccupancyAllHits");
152  if(doNoiseOccupancies) bookHistos(wh,string("Occupancies"),"OccupancyNoiseHits");
153  if(doInTimeOccupancies) bookHistos(wh,string("Occupancies"),"OccupancyInTimeHits");
154 
155  if(lookForSyncNoise || filterSyncNoise) {
156  bookHistos(wh,string("SynchNoise"),"SyncNoiseEvents");
157  bookHistos(wh,string("SynchNoise"),"SyncNoiseChambs");
158  }
159 
160  for(int st = 1; st <= 4; ++st) { // loop over stations
161  for(int sect = 1; sect <= 14; ++sect) { // loop over sectors
162  if((sect == 13 || sect == 14) && st != 4) continue;
163  // Get the chamber ID
164  const DTChamberId dtChId(wh,st,sect);
165 
166  // Occupancies
167  if (doAllHitsOccupancies) {
168  bookHistos(dtChId,string("Occupancies"),"OccupancyAllHits_perCh");
169  // set channel mapping
170  channelsMap(dtChId, "OccupancyAllHits_perCh");
171  }
172  if(doNoiseOccupancies)
173  bookHistos(dtChId,string("Occupancies"),"OccupancyNoise_perCh");
174  if(doInTimeOccupancies)
175  bookHistos(dtChId,string("Occupancies"),"OccupancyInTimeHits_perCh");
176 
177 
178 
179 
180  for(int sl = 1; sl <= 3; ++sl) { // Loop over SLs
181  if(st == 4 && sl == 2) continue;
182  const DTSuperLayerId dtSLId(wh,st,sect,sl);
183  if(isLocalRun) {
184  bookHistos(dtSLId,string("TimeBoxes"),"TimeBox");
185  } else {
186  // TimeBoxes for different triggers
187  bookHistos(dtSLId,string("TimeBoxes"),"TimeBoxDTonly");
188  bookHistos(dtSLId,string("TimeBoxes"),"TimeBoxNoDT");
189  bookHistos(dtSLId,string("TimeBoxes"),"TimeBoxDTalso");
190  }
191  }
192  }
193  }
194  }
195  }
196 }
197 
198 
199 
200 
201 void DTDigiTask::beginLuminosityBlock(LuminosityBlock const& lumiSeg, EventSetup const& context) {
202 
203  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "[DTDigiTask]: Begin of LS transition" << endl;
204 
205  // Reset the MonitorElements every n (= ResetCycle) Lumi Blocks
206  int lumiBlock = lumiSeg.id().luminosityBlock();
207  if(lumiBlock % resetCycle == 0) {
208  LogVerbatim("DTDQM|DTMonitorModule|DTDigiTask")
209  <<"[DTDigiTask]: Reset at the LS transition : "
210  << lumiBlock << endl;
211  // Loop over all ME
212  map<string,map<uint32_t,MonitorElement*> >::const_iterator histosIt = digiHistos.begin();
213  map<string,map<uint32_t,MonitorElement*> >::const_iterator histosEnd = digiHistos.end();
214  for(;histosIt != histosEnd ; ++histosIt) {
215  map<uint32_t,MonitorElement*>::const_iterator histoIt = (*histosIt).second.begin();
216  map<uint32_t,MonitorElement*>::const_iterator histoEnd = (*histosIt).second.end();
217  for(;histoIt != histoEnd; ++histoIt) { (*histoIt).second->Reset(); }
218  }
219 
220  // re-set mapping for not real channels in the occupancyHits per chamber
221  for(int wh=-2; wh<=2; wh++) {
222  for(int sect=1; sect<=14; sect++) {
223  for(int st=1; st<=4; st++) {
224  if( (sect == 13 || sect == 14) && st != 4 ) {continue;}
225  const DTChamberId dtChId(wh,st,sect);
226  channelsMap(dtChId, "OccupancyAllHits_perCh");
227  }
228  }
229  }
230 
231  // loop over wheel summaries
232  map<string,map<int,MonitorElement*> >::const_iterator whHistosIt = wheelHistos.begin();
233  map<string,map<int,MonitorElement*> >::const_iterator whHistosEnd = wheelHistos.end();
234  for(; whHistosIt != whHistosEnd ; ++whHistosIt) {
235  if ((*whHistosIt).first.find("Sync") == string::npos) { // FIXME skips synch noise plots
236  map<int,MonitorElement*>::const_iterator histoIt = (*whHistosIt).second.begin();
237  map<int,MonitorElement*>::const_iterator histoEnd = (*whHistosIt).second.end();
238  for(;histoIt != histoEnd; ++histoIt) { (*histoIt).second->Reset(); }
239  }
240  }
241  }
242 
243 }
244 
245 
246 
247 
248 void DTDigiTask::bookHistos(const DTSuperLayerId& dtSL, string folder, string histoTag) {
249  // set the folder
250  stringstream wheel; wheel << dtSL.wheel();
251  stringstream station; station << dtSL.station();
252  stringstream sector; sector << dtSL.sector();
253  stringstream superLayer; superLayer << dtSL.superlayer();
254  dbe->setCurrentFolder(topFolder() + "Wheel" + wheel.str() +
255  "/Sector" + sector.str() +
256  "/Station" + station.str());
257 
258  // Build the histo name
259  string histoName = histoTag
260  + "_W" + wheel.str()
261  + "_St" + station.str()
262  + "_Sec" + sector.str()
263  + "_SL" + superLayer.str();
264 
265  LogTrace("DTDQM|DTMonitorModule|DTDigiTask")
266  << "[DTDigiTask]: booking SL histo:" << histoName
267  << " (tag: " << histoTag
268  << ") folder: " << topFolder() + "Wheel" + wheel.str() +
269  "/Station" + station.str() +
270  "/Sector" + sector.str() + "/" + folder << endl;
271 
272 
273  // ttrig and rms are TDC counts
274  if ( readTTrigDB )
275  tTrigMap->get(dtSL, tTrig, tTrigRMS, kFactor, DTTimeUnits::counts);
276  else tTrig = defaultTTrig;
277 
278 
279  if ( folder == "TimeBoxes") {
280  string histoTitle = histoName + " (TDC Counts)";
281 
282  if (!readTTrigDB) {
283  (digiHistos[histoTag])[dtSL.rawId()] =
284  dbe->book1D(histoName,histoTitle, maxTDCCounts/timeBoxGranularity, 0, maxTDCCounts);
285  if(doLayerTimeBoxes) { // Book TimeBoxes per layer
286  for(int layer = 1; layer != 5; ++layer) {
287  DTLayerId layerId(dtSL, layer);
288  stringstream layerHistoName; layerHistoName << histoName << "_L" << layer;
289  (digiHistos[histoTag])[layerId.rawId()] =
290  dbe->book1D(layerHistoName.str(),layerHistoName.str(), maxTDCCounts/timeBoxGranularity, 0, maxTDCCounts);
291  }
292  }
293  }
294  else {
295  (digiHistos[histoTag])[dtSL.rawId()] =
296  dbe->book1D(histoName,histoTitle, 3*tMax/timeBoxGranularity, tTrig-tMax, tTrig+2*tMax);
297  if(doLayerTimeBoxes) {
298  // Book TimeBoxes per layer
299  for(int layer = 1; layer != 5; ++layer) {
300  DTLayerId layerId(dtSL, layer);
301  stringstream layerHistoName; layerHistoName << histoName << "_L" << layer;
302  (digiHistos[histoTag])[layerId.rawId()] =
303  dbe->book1D(layerHistoName.str(),layerHistoName.str(), 3*tMax/timeBoxGranularity, tTrig-tMax, tTrig+2*tMax);
304  }
305  }
306  }
307  }
308 
309  if ( folder == "CathodPhotoPeaks" ) {
310  dbe->setCurrentFolder(topFolder() + "Wheel" + wheel.str() +
311  "/Sector" + sector.str() +
312  "/Station" + station.str() + "/" + folder);
313  (digiHistos[histoTag])[dtSL.rawId()] = dbe->book1D(histoName,histoName,500,0,1000);
314  }
315 
316 }
317 
318 
319 
320 
321 void DTDigiTask::bookHistos(const DTChamberId& dtCh, string folder, string histoTag) {
322  // set the current folder
323  stringstream wheel; wheel << dtCh.wheel();
324  stringstream station; station << dtCh.station();
325  stringstream sector; sector << dtCh.sector();
326  dbe->setCurrentFolder(topFolder() + "Wheel" + wheel.str() +
327  "/Sector" + sector.str() +
328  "/Station" + station.str());
329 
330  // build the histo name
331  string histoName = histoTag
332  + "_W" + wheel.str()
333  + "_St" + station.str()
334  + "_Sec" + sector.str();
335 
336 
337  LogTrace("DTDQM|DTMonitorModule|DTDigiTask")
338  << "[DTDigiTask]: booking chamber histo:"
339  << " (tag: " << histoTag
340  << ") folder: " << topFolder() + "Wheel" + wheel.str() +
341  "/Station" + station.str() +
342  "/Sector" + sector.str() << endl;
343 
344 
345  if (folder == "Occupancies") {
346 
347  const DTChamber* dtchamber = muonGeom->chamber(dtCh);
348  const std::vector<const DTSuperLayer*> dtSupLylist = dtchamber->superLayers();
349  std::vector<const DTSuperLayer*>::const_iterator suly = dtSupLylist.begin();
350  std::vector<const DTSuperLayer*>::const_iterator sulyend = dtSupLylist.end();
351 
352  int nWires = 0;
353  int firstWire = 0;
354  int nWires_max = 0;
355 
356  while(suly != sulyend) {
357  const std::vector<const DTLayer*> dtLyList = (*suly)->layers();
358  std::vector<const DTLayer*>::const_iterator ly = dtLyList.begin();
359  std::vector<const DTLayer*>::const_iterator lyend = dtLyList.end();
360  stringstream superLayer; superLayer << (*suly)->id().superlayer();
361 
362  while(ly != lyend) {
363  nWires = muonGeom->layer((*ly)->id())->specificTopology().channels();
364  firstWire = muonGeom->layer((*ly)->id())->specificTopology().firstChannel();
365  stringstream layer; layer << (*ly)->id().layer();
366  string histoName_layer = histoName + "_SL" + superLayer.str() + "_L" + layer.str();
367  if(histoTag == "OccupancyAllHits_perL"
368  || histoTag == "OccupancyNoise_perL"
369  || histoTag == "OccupancyInTimeHits_perL")
370  (digiHistos[histoTag])[(*ly)->id().rawId()] = dbe->book1D(histoName_layer,histoName_layer,nWires,firstWire,nWires+firstWire);
371  ++ly;
372  if((nWires+firstWire) > nWires_max) nWires_max = (nWires+firstWire);
373 
374  }
375  ++suly;
376  }
377 
378  if(histoTag != "OccupancyAllHits_perL"
379  && histoTag != "OccupancyNoise_perL"
380  && histoTag != "OccupancyInTimeHits_perL"){
381  // Set the title to show the time interval used (only if unique == not from DB)
382  string histoTitle = histoName;
383  if(!readTTrigDB && histoTag == "OccupancyInTimeHits_perCh") {
384  stringstream title;
385  int inTimeHitsLowerBoundCorr = int(round(defaultTTrig)) - inTimeHitsLowerBound;
386  int inTimeHitsUpperBoundCorr = int(round(defaultTTrig)) + defaultTmax + inTimeHitsUpperBound;
387  title << "Occ. digis in time [" << inTimeHitsLowerBoundCorr << ", "
388  << inTimeHitsUpperBoundCorr << "] (TDC counts)";
389  histoTitle = title.str();
390  }
391  (digiHistos[histoTag])[dtCh.rawId()] = dbe->book2D(histoName,histoTitle,nWires_max,1,nWires_max+1,12,0,12);
392 
393  for(int i=1;i<=12;i++) {
394  if(i<5){
395  stringstream layer;
396  string layer_name;
397  layer<<i;
398  layer>>layer_name;
399  string label="SL1: L"+layer_name;
400  (digiHistos[histoTag])[dtCh.rawId()]->setBinLabel(i,label,2);
401  }
402  else if(i>4 && i<9){
403  stringstream layer;
404  string layer_name;
405  layer<<(i-4);
406  layer>>layer_name;
407  string label="SL2: L"+layer_name;
408  (digiHistos[histoTag])[dtCh.rawId()]->setBinLabel(i,label,2);
409  }
410  else if(i>8 && i<13){
411  stringstream layer;
412  string layer_name;
413  layer<<(i-8);
414  layer>>layer_name;
415  string label="SL3: L"+layer_name;
416  (digiHistos[histoTag])[dtCh.rawId()]->setBinLabel(i,label,2);
417  }
418  }
419  }
420  }
421 }
422 
423 
424 
425 
426 void DTDigiTask::bookHistos(const int wheelId, string folder, string histoTag) {
427  // Set the current folder
428  stringstream wheel; wheel << wheelId;
429 
430 
431  // build the histo name
432  string histoName = histoTag + "_W" + wheel.str();
433 
434 
435  LogTrace("DTDQM|DTMonitorModule|DTDigiTask")
436  << "[DTDigiTask]: booking wheel histo:" << histoName
437  << " (tag: " << histoTag
438  << ") folder: " << topFolder() + "Wheel" + wheel.str() + "/" <<endl;
439 
440  if(folder == "Occupancies") {
441  dbe->setCurrentFolder(topFolder() + "Wheel" + wheel.str());
442  string histoTitle = "# of digis per chamber WHEEL: "+wheel.str();
443  (wheelHistos[histoTag])[wheelId] = dbe->book2D(histoName,histoTitle,12,1,13,4,1,5);
444  (wheelHistos[histoTag])[wheelId]->setBinLabel(1,"MB1",2);
445  (wheelHistos[histoTag])[wheelId]->setBinLabel(2,"MB2",2);
446  (wheelHistos[histoTag])[wheelId]->setBinLabel(3,"MB3",2);
447  (wheelHistos[histoTag])[wheelId]->setBinLabel(4,"MB4",2);
448  (wheelHistos[histoTag])[wheelId]->setAxisTitle("sector",1);
449  } else if(folder == "SynchNoise") {
450  dbe->setCurrentFolder("DT/05-Noise/SynchNoise");
451  if (histoTag== "SyncNoiseEvents") {
452  string histoTitle = "# of Syncronous-noise events WHEEL: "+wheel.str();
453  (wheelHistos[histoTag])[wheelId] = dbe->book2D(histoName,histoTitle,12,1,13,4,1,5);
454  (wheelHistos[histoTag])[wheelId]->setBinLabel(1,"MB1",2);
455  (wheelHistos[histoTag])[wheelId]->setBinLabel(2,"MB2",2);
456  (wheelHistos[histoTag])[wheelId]->setBinLabel(3,"MB3",2);
457  (wheelHistos[histoTag])[wheelId]->setBinLabel(4,"MB4",2);
458  (wheelHistos[histoTag])[wheelId]->setAxisTitle("sector",1);
459  } else if (histoTag== "SyncNoiseChambs") {
460  string histoTitle = "# of Synchornous-noise chamb per evt. WHEEL: "+wheel.str();
461  (wheelHistos[histoTag])[wheelId] = dbe->book1D(histoName,histoTitle,50,0.5,50.5);
462  (wheelHistos[histoTag])[wheelId]->setAxisTitle("# of noisy chambs.",1);
463  (wheelHistos[histoTag])[wheelId]->setAxisTitle("# of evts.",2);
464  }
465  }
466 
467 }
468 
469 
470 
471 // does the real job
473  nevents++;
474  nEventMonitor->Fill(nevents);
475  if (nevents%1000 == 0) {
476  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "[DTDigiTask] Analyze #Run: " << event.id().run()
477  << " #Event: " << event.id().event() << endl;
478  }
479 
480  // Get the ingredients from the event
481 
482  // Digi collection
484  event.getByLabel(dtDigiLabel, dtdigis);
485 
486  // LTC digis
487  if (!isLocalRun) event.getByType(ltcdigis);
488 
489  // Status map (for noisy channels)
491  if(checkNoisyChannels) {
492  // Get the map of noisy channels
493  c.get<DTStatusFlagRcd>().get(statusMap);
494  }
495 
496  string histoTag;
497 
498 
499  // Check if the digi container is empty
500  if(dtdigis->begin() == dtdigis->end()) {
501  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "Event " << nevents << " empty." << endl;
502  }
503 
504  if (lookForSyncNoise || filterSyncNoise) { // dosync
505  // Count the # of digis per chamber
507  for (dtLayerId_It=dtdigis->begin(); dtLayerId_It!=dtdigis->end(); dtLayerId_It++) {
508  DTChamberId chId = ((*dtLayerId_It).first).chamberId();
509  if(hitMap.find(chId) == hitMap.end()) {// new chamber
510  hitMap[chId] = 0;
511  }
512  hitMap[chId] += (((*dtLayerId_It).second).second - ((*dtLayerId_It).second).first);
513  }
514 
515 
516 
517  // check chamber with # of digis above threshold and flag them as noisy
518  map<DTChamberId,int>::const_iterator hitMapIt = hitMap.begin();
519  map<DTChamberId,int>::const_iterator hitMapEnd = hitMap.end();
520 
521  map<int,int> chMap;
522 
523  for (; hitMapIt != hitMapEnd; ++hitMapIt) {
524  if((hitMapIt->second) > maxTDCHits) {
525 
526  DTChamberId chId = hitMapIt->first;
527  int wh = chId.wheel();
528 
529  LogTrace("DTDQM|DTMonitorModule|DTDigiTask") << "[DTDigiTask] Synch noise in chamber: " << chId
530  << " with # digis: " << hitMapIt->second << endl;
531 
532  if(chMap.find(wh) == chMap.end()) { chMap[wh] = 0; }
533  chMap[wh]++ ;
534 
535  syncNoisyChambers.insert(chId);
536 
537  wheelHistos["SyncNoiseEvents"][wh]->Fill(chId.sector(),chId.station());
538 
539  // Only needed in case of ratio map not used right now
540  // FIXME check and optimize
541  // nSynchNoiseEvents[iter->first]++;
542  // FIXME: should update all chambers each event
543  // wheelHistos["SyncNoiseEvents"][(*iter).first.wheel()]->setBinContent((*iter).first.sector(),(*iter).first.station(),
544  // (double)nSynchNoiseEvents[iter->first]/(double)nevents);
545 
546  }
547  }
548 
549  // fill # of noisy ch per wheel plot
550  map<int,int>::const_iterator chMapIt = chMap.begin();
551  map<int,int>::const_iterator chMapEnd = chMap.end();
552  for (; chMapIt != chMapEnd; ++chMapIt) {
553  wheelHistos["SyncNoiseChambs"][(*chMapIt).first]->Fill((*chMapIt).second);
554  }
555 
556  // clear the map of # of digis per chamber: not needed anymore
557  hitMap.clear();
558 
559  if (syncNoisyChambers.size() != 0) {
560  LogVerbatim("DTDQM|DTMonitorModule|DTDigiTask") << "[DTDigiTask] Synch Noise in event: " << nevents;
561  if(filterSyncNoise) LogVerbatim("DTDQM|DTMonitorModule|DTDigiTask") << "\tnoisy time-boxes and occupancy will not be filled!" << endl;
562  syncNumTot++;
563  syncNum++;
564  }
565 
566  // Logging of "large" synch Noisy events in private DQM
567  if (syncNoisyChambers.size() > 3) {
568  time_t eventTime = time_t(event.time().value()>>32);
569 
570  LogVerbatim("DTDQM|DTMonitorModule|DTDigiTask|DTSynchNoise")
571  << "[DTDigiTask] At least 4 Synch Noisy chambers in Run : " << event.id().run()
572  << " Lumi : " << event.id().luminosityBlock()
573  << " Event : " << event.id().event()
574  << " at time : " << ctime(&eventTime) << endl;
575 
576  set<DTChamberId>::const_iterator chIt = syncNoisyChambers.begin();
577  set<DTChamberId>::const_iterator chEnd = syncNoisyChambers.end();
578 
579  stringstream synchNoisyCh;
580  for (;chIt!=chEnd;++chIt) { synchNoisyCh << " " << (*chIt); }
581  LogVerbatim("DTDQM|DTMonitorModule|DTDigiTask|DTSynchNoise") <<
582  "[DTDigiTask] Chamber List :" << synchNoisyCh.str() << endl;
583 
584  }
585 
586 
587  if (nevents%1000 == 0) {
588  LogVerbatim("DTDQM|DTMonitorModule|DTDigiTask") << (syncNumTot*100./nevents) << "% sync noise events since the beginning \n"
589  << (syncNum*0.1) << "% sync noise events in the last 1000 events " << endl;
590  syncNum = 0;
591  }
592  }
593 
594  bool isSyncNoisy = false;
595 
597  for (dtLayerId_It=dtdigis->begin(); dtLayerId_It!=dtdigis->end(); ++dtLayerId_It) { // Loop over layers
598  isSyncNoisy = false;
599  // check if chamber labeled as synch noisy
600  if (filterSyncNoise) {
601  DTChamberId chId = ((*dtLayerId_It).first).chamberId();
602  if(syncNoisyChambers.find(chId) != syncNoisyChambers.end()) {
603  isSyncNoisy = true;
604  }
605  }
606 
607  for (DTDigiCollection::const_iterator digiIt = ((*dtLayerId_It).second).first;
608  digiIt!=((*dtLayerId_It).second).second; ++digiIt) { // Loop over all digis
609 
610  bool isNoisy = false;
611  bool isFEMasked = false;
612  bool isTDCMasked = false;
613  bool isTrigMask = false;
614  bool isDead = false;
615  bool isNohv = false;
616  if(checkNoisyChannels) {
617  const DTWireId wireId(((*dtLayerId_It).first), (*digiIt).wire());
618  statusMap->cellStatus(wireId, isNoisy, isFEMasked, isTDCMasked, isTrigMask, isDead, isNohv);
619  }
620 
621 
622 
623  // Get the useful IDs
624  const DTSuperLayerId dtSLId = ((*dtLayerId_It).first).superlayerId();
625  uint32_t indexSL = dtSLId.rawId();
626  const DTChamberId dtChId = dtSLId.chamberId();
627  uint32_t indexCh = dtChId.rawId();
628  int layer_number=((*dtLayerId_It).first).layer();
629  int superlayer_number=dtSLId.superlayer();
630 
631  // Read the ttrig DB or set a rough value from config
632  // ttrig and rms are TDC counts
633  if (readTTrigDB)
634  tTrigMap->get( ((*dtLayerId_It).first).superlayerId(),
635  tTrig, tTrigRMS, kFactor, DTTimeUnits::counts);
636  else tTrig = defaultTTrig;
637 
638  int inTimeHitsLowerBoundCorr = int(round(tTrig)) - inTimeHitsLowerBound;
639  int inTimeHitsUpperBoundCorr = int(round(tTrig)) + tMax + inTimeHitsUpperBound;
640 
641  float t0; float t0RMS;
642  int tdcTime = (*digiIt).countsTDC();
643 
644  if (subtractT0) {
645  const DTWireId dtWireId(((*dtLayerId_It).first), (*digiIt).wire());
646  // t0s and rms are TDC counts
647  t0Map->get(dtWireId, t0, t0RMS, DTTimeUnits::counts) ;
648  tdcTime += int(round(t0));
649  }
650 
651 
652 
653  // Fill Time-Boxes
654  // NOTE: avoid to fill TB and PhotoPeak with noise. Occupancy are filled anyway
655  if (( !isNoisy ) && (!isSyncNoisy)) { // Discard noisy channels
656  // TimeBoxes per SL
657  histoTag = "TimeBox" + triggerSource();
658  if (digiHistos[histoTag].find(indexSL) == digiHistos[histoTag].end())
659  bookHistos( dtSLId, string("TimeBoxes"), histoTag );
660  (digiHistos.find(histoTag)->second).find(indexSL)->second->Fill(tdcTime);
661  if(doLayerTimeBoxes)
662  (digiHistos.find(histoTag)->second).find((*dtLayerId_It).first.rawId())->second->Fill(tdcTime);
663  // FIXME: remove the time distribution for the after-pulses
664  // 2nd - 1st (CathodPhotoPeak) per SL
665  // if ( (*digiIt).number() == 1 ) {
666 
667  // DTDigiCollection::const_iterator firstDigiIt = digiIt;
668  // firstDigiIt--;
669 
670  // histoTag = "CathodPhotoPeak";
671  // if (digiHistos[histoTag].find(indexSL) == digiHistos[histoTag].end())
672  // bookHistos( dtSLId, string("CathodPhotoPeaks"), histoTag );
673  // (digiHistos.find(histoTag)->second).find(indexSL)->second->Fill((*digiIt).countsTDC()-
674  // (*firstDigiIt).countsTDC());
675  // }
676  }
677 
678  // Fill Occupancies
679  if (!isSyncNoisy) { // Discard synch noisy channels
680 
681  if (doAllHitsOccupancies) { // fill occupancies for all hits
682  //Occupancies per chamber & layer
683  histoTag = "OccupancyAllHits_perCh";
684  map<uint32_t, MonitorElement*>::const_iterator mappedHisto =
685  digiHistos[histoTag].find(indexCh);
686  if (mappedHisto == digiHistos[histoTag].end()) { // dynamic booking
687  bookHistos(dtChId, string("Occupancies"), histoTag);
688  mappedHisto = digiHistos[histoTag].find(indexCh);
689  }
690  mappedHisto->second->Fill((*digiIt).wire(),(layer_number+(superlayer_number-1)*4)-1);
691 
692 
693  // Fill the chamber occupancy
694  histoTag = "OccupancyAllHits";
695  map<int, MonitorElement*>::const_iterator histoPerWheel =
696  wheelHistos[histoTag].find(dtChId.wheel());
697  if(histoPerWheel == wheelHistos[histoTag].end()) { // dynamic booking
698  bookHistos(dtChId.wheel(), string("Occupancies"), histoTag);
699  histoPerWheel = wheelHistos[histoTag].find(dtChId.wheel());
700  }
701  histoPerWheel->second->Fill(dtChId.sector(),dtChId.station()); // FIXME: normalize to # of layers
702 
703 
704  }
705 
706  if(doNoiseOccupancies) { // fill occupancies for hits before the ttrig
707  if (tdcTime < inTimeHitsLowerBoundCorr ) {
708  // FIXME: what about tdcTime > inTimeHitsUpperBoundCorr ???
709 
710  // Noise: Before tTrig
711  //Occupancies Noise per chamber & layer
712  histoTag = "OccupancyNoise_perCh";
713  map<uint32_t, MonitorElement*>::const_iterator mappedHisto =
714  digiHistos[histoTag].find(indexCh);
715  if(mappedHisto == digiHistos[histoTag].end()) {
716  bookHistos(dtChId, string("Occupancies"), histoTag);
717  mappedHisto = digiHistos[histoTag].find(indexCh);
718  }
719  mappedHisto->second->Fill((*digiIt).wire(),
720  (layer_number+(superlayer_number-1)*4)-1);
721 
722  // Fill the chamber occupancy
723  histoTag = "OccupancyNoise";
724  map<int, MonitorElement*>::const_iterator histoPerWheel =
725  wheelHistos[histoTag].find(dtChId.wheel());
726  if(histoPerWheel == wheelHistos[histoTag].end()) { // dynamic booking
727  bookHistos(dtChId.wheel(), string("Occupancies"), histoTag);
728  histoPerWheel = wheelHistos[histoTag].find(dtChId.wheel());
729  }
730  histoPerWheel->second->Fill(dtChId.sector(),dtChId.station()); // FIXME: normalize to # of layers
731 
732  }
733  }
734 
735  if(doInTimeOccupancies) { // fill occpunacies for in-time hits only
736  if (tdcTime > inTimeHitsLowerBoundCorr && tdcTime < inTimeHitsUpperBoundCorr) {
737  // Physical hits: within the time window
738 
739  //Occupancies Signal per chamber & layer
740  histoTag = "OccupancyInTimeHits_perCh";
741  map<uint32_t, MonitorElement*>::const_iterator mappedHisto =
742  digiHistos[histoTag].find(indexCh);
743  if(mappedHisto == digiHistos[histoTag].end()) {
744  bookHistos(dtChId, string("Occupancies"), histoTag);
745  mappedHisto = digiHistos[histoTag].find(indexCh);
746  }
747  mappedHisto->second->Fill((*digiIt).wire(),
748  (layer_number+(superlayer_number-1)*4)-1);
749 
750  // Fill the chamber occupancy
751  histoTag = "OccupancyInTimeHits";
752  map<int, MonitorElement*>::const_iterator histoPerWheel =
753  wheelHistos[histoTag].find(dtChId.wheel());
754  if(histoPerWheel == wheelHistos[histoTag].end()) { // dynamic booking
755  bookHistos(dtChId.wheel(), string("Occupancies"), histoTag);
756  histoPerWheel = wheelHistos[histoTag].find(dtChId.wheel());
757  }
758  histoPerWheel->second->Fill(dtChId.sector(),dtChId.station()); // FIXME: normalize to # of layers
759 
760  }
761  }
762  }
763  }
764  }
765 
766  syncNoisyChambers.clear();
767 }
768 
769 
771 
772  string l1ASource;
773  if (isLocalRun)
774  return l1ASource;
775 
776  for (std::vector<LTCDigi>::const_iterator ltc_it = ltcdigis->begin(); ltc_it != ltcdigis->end(); ltc_it++){
777  size_t otherTriggerSum=0;
778  for (size_t i = 1; i < 6; i++)
779  otherTriggerSum += size_t((*ltc_it).HasTriggered(i));
780 
781  if ((*ltc_it).HasTriggered(0) && otherTriggerSum == 0)
782  l1ASource = "DTonly";
783  else if (!(*ltc_it).HasTriggered(0))
784  l1ASource = "NoDT";
785  else if ((*ltc_it).HasTriggered(0) && otherTriggerSum > 0)
786  l1ASource = "DTalso";
787  }
788 
789  return l1ASource;
790 
791 }
792 
793 
794 string DTDigiTask::topFolder() const {
795 
796  if(tpMode) return string("DT/10-TestPulses/");
797  return string("DT/01-Digi/");
798 
799 }
800 
801 
802 
803 
805 
806  // To be used for ratio plots not used right now
807  // Update all histos for SynchNoise if needed
808  // if(lookForSyncNoise || filterSyncNoise) {
809  // //loop over chambers with synch noise events and update their entries in the histos
810  // for(map<DTChamberId, int>::const_iterator nEvPerch = nSynchNoiseEvents.begin();
811  // nEvPerch != nSynchNoiseEvents.end(); ++nEvPerch) {
812  // DTChamberId chId = (*nEvPerch).first;
813  // wheelHistos["SyncNoiseEvents"][chId.wheel()]->setBinContent(chId.sector(),chId.station(),
814  // (double)nSynchNoiseEvents[chId]/(double)nevents);
815  // }
816  // }
817 
818 }
819 
820 void DTDigiTask::channelsMap(const DTChamberId &dtCh, string histoTag) {
821 
822  // n max channels
823  int nWires_max = (digiHistos[histoTag])[dtCh.rawId()] -> getNbinsX();
824 
825  // set bin content = -1 for each not real channel. For visualization purposes
826  for(int sl=1; sl<=3; sl++) {
827  for(int ly=1; ly<=4; ly++) {
828  for(int ch=1; ch<=nWires_max; ch++) {
829 
830  int dduId = -1, rosId = -1, robId = -1, tdcId = -1, channelId = -1;
831  int realCh = mapping->geometryToReadOut(dtCh.wheel(),dtCh.station(),dtCh.sector(),sl,ly,ch,dduId,rosId,robId,tdcId,channelId);
832 
833  // realCh = 0 if the channel exists, while realCh = 1 if it does not exist
834  if( realCh ) {
835 
836  int lybin = (4*sl - 4) + ly;
837  (digiHistos[histoTag])[dtCh.rawId()] -> setBinContent(ch,lybin,-1.);
838 
839  }
840 
841  }
842  }
843  }
844 
845 }
LuminosityBlockID id() const
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
void beginRun(const edm::Run &, const edm::EventSetup &)
Definition: DTDigiTask.cc:126
void analyze(const edm::Event &e, const edm::EventSetup &c)
Analyze.
Definition: DTDigiTask.cc:472
void endLuminosityBlock(const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &setup)
Definition: DTDigiTask.cc:804
void channelsMap(const DTChamberId &dtCh, std::string histoTag)
To map real channels.
Definition: DTDigiTask.cc:820
DTChamberId chamberId() const
Return the corresponding ChamberId.
std::string topFolder() const
Definition: DTDigiTask.cc:794
void beginLuminosityBlock(edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &context)
To reset the MEs.
Definition: DTDigiTask.cc:201
void endJob()
Endjob.
Definition: DTDigiTask.cc:111
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
void bookHistos()
Definition: Histogram.h:33
DTDigiTask(const edm::ParameterSet &ps)
Constructor.
Definition: DTDigiTask.cc:50
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
U second(std::pair< T, U > const &p)
void bookHistos(const DTSuperLayerId &dtSL, std::string folder, std::string histoTag)
Book the ME.
const std::vector< const DTSuperLayer * > & superLayers() const
Return the superlayers in the chamber.
Definition: DTChamber.cc:62
int nevents
#define end
Definition: vmac.h:38
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
#define LogTrace(id)
virtual ~DTDigiTask()
Destructor.
Definition: DTDigiTask.cc:103
int superlayer() const
Return the superlayer number (deprecated method name)
TimeValue_t value() const
Definition: Timestamp.cc:72
const T & get() const
Definition: EventSetup.h:55
LuminosityBlockNumber_t luminosityBlock() const
std::vector< DigiType >::const_iterator const_iterator
Definition: DTT0Rcd.h:9
int sector() const
Definition: DTChamberId.h:63
void beginJob()
BeginJob.
Definition: DTDigiTask.cc:119
int station() const
Return the station number.
Definition: DTChamberId.h:53
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:47
std::string triggerSource()
get the L1A source
Definition: DTDigiTask.cc:770
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
edm::Timestamp time() const
Definition: EventBase.h:57
Definition: Run.h:33