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