CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalDeadCellMonitor.cc
Go to the documentation of this file.
4 
6 {
7  Online_ = ps.getUntrackedParameter<bool>("online",false);
8  mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns",false);
9  enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup",false);
10  debug_ = ps.getUntrackedParameter<int>("debug",0);
11  makeDiagnostics_ = ps.getUntrackedParameter<bool>("makeDiagnostics",false);
12  prefixME_ = ps.getUntrackedParameter<std::string>("subSystemFolder","Hcal/");
13  if (prefixME_.substr(prefixME_.size()-1,prefixME_.size())!="/")
14  prefixME_.append("/");
15  subdir_ = ps.getUntrackedParameter<std::string>("TaskFolder","DeadCellMonitor_Hcal"); // DeadCellMonitor_Hcal
16  if (subdir_.size()>0 && subdir_.substr(subdir_.size()-1,subdir_.size())!="/")
17  subdir_.append("/");
18  subdir_=prefixME_+subdir_;
19  AllowedCalibTypes_ = ps.getUntrackedParameter<std::vector<int> > ("AllowedCalibTypes");
20  skipOutOfOrderLS_ = ps.getUntrackedParameter<bool>("skipOutOfOrderLS",true);
21  NLumiBlocks_ = ps.getUntrackedParameter<int>("NLumiBlocks",4000);
22 
23  badChannelStatusMask_ = ps.getUntrackedParameter<int>("BadChannelStatusMask",
24  ps.getUntrackedParameter<int>("BadChannelStatusMask",
25  (1<<HcalChannelStatus::HcalCellDead))); // identify channel status values to mask
26  // DeadCell-specific parameters
27 
28  // Collection type info
30  hbheRechitLabel_ = ps.getUntrackedParameter<edm::InputTag>("hbheRechitLabel");
31  hoRechitLabel_ = ps.getUntrackedParameter<edm::InputTag>("hoRechitLabel");
32  hfRechitLabel_ = ps.getUntrackedParameter<edm::InputTag>("hfRechitLabel");
33 
34  // minimum number of events required for lumi section-based dead cell checks
35  minDeadEventCount_ = ps.getUntrackedParameter<int>("minDeadEventCount",1000);
36  excludeHORing2_ = ps.getUntrackedParameter<bool>("excludeHORing2",false);
37  excludeHO1P02_ = ps.getUntrackedParameter<bool>("excludeHO1P02",false);
38  endLumiProcessed_ = false;
39 
40  // Set which dead cell checks will be performed
41  /* Dead cells can be defined in the following ways:
42  1) never present digi -- digi is never present in run
43  2) digis -- digi is absent for one or more lumi section
44  3) never present rechit -- rechit > threshold energy never present (NOT redundant, since it requires not just that a rechit be present, but that it be above threshold as well. )
45  4) rechits -- rechit is present, but rechit energy below threshold for one or more lumi sections
46 
47  Of these tests, never-present digis are always checked.
48  Occasional digis are checked only if deadmon_test_digis_ is true,
49  and both rechit tests are made only if deadmon_test_rechits_ is true
50  */
51 
52  deadmon_test_digis_ = ps.getUntrackedParameter<bool>("test_digis",true);
53  deadmon_test_rechits_ = ps.getUntrackedParameter<bool>("test_rechits",false);
54 
55  // rechit energy test -- cell must be below threshold value for a number of consecutive events to be considered dead
56  energyThreshold_ = ps.getUntrackedParameter<double>("MissingRechitEnergyThreshold",0);
57  HBenergyThreshold_ = ps.getUntrackedParameter<double>("HB_energyThreshold",energyThreshold_);
58  HEenergyThreshold_ = ps.getUntrackedParameter<double>("HE_energyThreshold",energyThreshold_);
59  HOenergyThreshold_ = ps.getUntrackedParameter<double>("HO_energyThreshold",energyThreshold_);
60  HFenergyThreshold_ = ps.getUntrackedParameter<double>("HF_energyThreshold",energyThreshold_);
61 
62  needLogicalMap_=true;
63  setupDone_=false;
64 
65  // register for data access
66  tok_dcs_ = consumes<DcsStatusCollection>(edm::InputTag("scalersRawToDigi"));
67  tok_hbhedigi_ = consumes<HBHEDigiCollection>(digiLabel_);
68  tok_hodigi_ = consumes<HODigiCollection>(digiLabel_);
69  tok_hfdigi_ = consumes<HFDigiCollection>(digiLabel_);
70  tok_hbhe_ = consumes<HBHERecHitCollection>(hbheRechitLabel_);
71  tok_ho_ = consumes<HORecHitCollection>(hoRechitLabel_);
72  tok_hf_ = consumes<HFRecHitCollection>(hfRechitLabel_);
73  tok_gtEvm_ = consumes<L1GlobalTriggerEvmReadoutRecord>(edm::InputTag("gtEvmDigis"));
74 
75 
76 } //constructor
77 
79 {
80 } //destructor
81 
82 
83 /* ------------------------------------ */
84 
86 {
87  if (setupDone_)
88  {
89  // Always do a zeroing/resetting so that empty histograms/counter
90  // will always appear.
91  zeroCounters(1); // make sure arrays are set up
92  this->reset();
93 
94  return;
95  }
96  else
97  setupDone_=true;
98 
100  if (debug_>0)
101  std::cout <<"<HcalDeadCellMonitor::setup> Setting up histograms"<<std::endl;
102 
103  if (!dbe_) return;
104 
106  MonitorElement* excludeHO2=dbe_->bookInt("ExcludeHOring2");
107  // Fill with 0 if ring is not to be excluded; fill with 1 if it is to be excluded
108  if (excludeHO2) excludeHO2->Fill(excludeHORing2_==true ? 1 : 0);
109 
110  Nevents = dbe_->book1D("NumberOfDeadCellEvents","Number of Events Seen by DeadCellMonitor",2,0,2);
111  Nevents->setBinLabel(1,"allEvents");
112  Nevents->setBinLabel(2,"lumiCheck");
113  // 1D plots count number of bad cells vs. luminosity block
114  ProblemsVsLB=dbe_->bookProfile("TotalDeadCells_HCAL_vs_LS",
115  "Total Number of Dead Hcal Cells (excluding known problems) vs LS;Lumi Section;Dead Cells",
116  NLumiBlocks_,0.5,NLumiBlocks_+0.5,
117  100,0,10000);
118  ProblemsVsLB_HB=dbe_->bookProfile("TotalDeadCells_HB_vs_LS",
119  "Total Number of Dead HB Cells (excluding known problems) vs LS;Lumi Section;Dead Cells",
120  NLumiBlocks_,0.5,NLumiBlocks_+0.5,
121  100,0,10000);
122  ProblemsVsLB_HE=dbe_->bookProfile("TotalDeadCells_HE_vs_LS",
123  "Total Number of Dead HE Cells (excluding known problems) vs LS;Lumi Section;Dead Cells",
124  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
125  ProblemsVsLB_HO=dbe_->bookProfile("TotalDeadCells_HO_vs_LS",
126  "Total Number of Dead HO Cells Ring 0,1 |ieta|<=10 (excluding known problems) vs LS;Lumi Section;Dead Cells",
127  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
128  ProblemsVsLB_HO2=dbe_->bookProfile("TotalDeadCells_HO2_vs_LS",
129  "Total Number of Dead HO Cells Ring 2 |ieta|>10 (excluding known problems) vs LS;Lumi Section;Dead Cells",
130  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
131  ProblemsVsLB_HF=dbe_->bookProfile("TotalDeadCells_HF_vs_LS",
132  "Total Number of Dead HF Cells (excluding known problems) vs LS;Lumi Section;Dead Cells",
133  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
134  ProblemsVsLB_HBHEHF=dbe_->bookProfile("TotalDeadCells_HBHEHF_vs_LS",
135  "Total Number of Dead HBHEHF Cells (excluding known problems) vs LS;Lumi Section;Dead Cells",
136  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
137 
138  (ProblemsVsLB->getTProfile())->SetMarkerStyle(20);
139  (ProblemsVsLB_HB->getTProfile())->SetMarkerStyle(20);
140  (ProblemsVsLB_HE->getTProfile())->SetMarkerStyle(20);
141  (ProblemsVsLB_HO->getTProfile())->SetMarkerStyle(20);
142  (ProblemsVsLB_HO2->getTProfile())->SetMarkerStyle(20);
143  (ProblemsVsLB_HF->getTProfile())->SetMarkerStyle(20);
144  (ProblemsVsLB_HBHEHF->getTProfile())->SetMarkerStyle(20);
145 
146  RBX_loss_VS_LB=dbe_->book2D("RBX_loss_VS_LB",
147  "RBX loss vs LS; Lumi Section; Index of lost RBX",
148  NLumiBlocks_,0.5,NLumiBlocks_+0.5,156,0,156);
149 
150  ProblemsInLastNLB_HBHEHF_alarm=dbe_->book1D("ProblemsInLastNLB_HBHEHF_alarm",
151  "Total Number of Dead HBHEHF Cells in last 10 LS. Last bin contains OverFlow",
152  100,0,100);
153  ProblemsInLastNLB_HO01_alarm=dbe_->book1D("ProblemsInLastNLB_HO01_alarm",
154  "Total Number of Dead Cells Ring 0,1 (abs(ieta)<=10) in last 10 LS. Last bin contains OverFlow",
155  100,0,100);
156 
157 
158  dbe_->setCurrentFolder(subdir_+"dead_cell_parameters");
159  MonitorElement* me=dbe_->bookInt("Test_NeverPresent_Digis");
160  me->Fill(1);
161  me=dbe_->bookInt("Test_DigiMissing_Periodic_Lumi_Check");
163  me->Fill(1);
164  else
165  me->Fill(0);
166  me=dbe_->bookInt("Min_Events_Required_Periodic_Lumi_Check");
168  me=dbe_->bookInt("Test_NeverPresent_RecHits");
169  deadmon_test_rechits_>0 ? me->Fill(1) : me->Fill(0);
170  me=dbe_->bookFloat("HBMinimumRecHitEnergy");
172  me=dbe_->bookFloat("HEMinimumRecHitEnergy");
174  me=dbe_->bookFloat("HOMinimumRecHitEnergy");
176  me=dbe_->bookFloat("HFMinimumRecHitEnergy");
178  me=dbe_->bookInt("Test_RecHitsMissing_Periodic_Lumi_Check");
179  deadmon_test_rechits_>0 ? me->Fill(1) : me->Fill(0);
180 
181  // ProblemCells plots are in HcalDeadCellClient!
182 
183  // Set up plots for each failure mode of dead cells
184  std::stringstream units; // We'll need to set the titles individually, rather than passing units to SetupEtaPhiHists (since this also would affect the name of the histograms)
185  std::stringstream name;
186 
187  // Never-present test will always be called, by definition of dead cell
188 
189  dbe_->setCurrentFolder(subdir_+"dead_digi_never_present");
191  "Digi Present At Least Once","");
192  // 1D plots count number of bad cells
193  NumberOfNeverPresentDigis=dbe_->bookProfile("Problem_NeverPresentDigis_HCAL_vs_LS",
194  "Total Number of Never-Present Hcal Cells vs LS;Lumi Section;Dead Cells",
195  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
196 
197  NumberOfNeverPresentDigisHB=dbe_->bookProfile("Problem_NeverPresentDigis_HB_vs_LS",
198  "Total Number of Never-Present HB Cells vs LS;Lumi Section;Dead Cells",
199  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
200 
201  NumberOfNeverPresentDigisHE=dbe_->bookProfile("Problem_NeverPresentDigis_HE_vs_LS",
202  "Total Number of Never-Present HE Cells vs LS;Lumi Section;Dead Cells",
203  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
204 
205  NumberOfNeverPresentDigisHO=dbe_->bookProfile("Problem_NeverPresentDigis_HO_vs_LS",
206  "Total Number of Never-Present HO Cells vs LS;Lumi Section;Dead Cells",
207  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
208 
209  NumberOfNeverPresentDigisHF=dbe_->bookProfile("Problem_NeverPresentDigis_HF_vs_LS",
210  "Total Number of Never-Present HF Cells vs LS;Lumi Section;Dead Cells",
211  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
212  (NumberOfNeverPresentDigis->getTProfile())->SetMarkerStyle(20);
213  (NumberOfNeverPresentDigisHB->getTProfile())->SetMarkerStyle(20);
214  (NumberOfNeverPresentDigisHE->getTProfile())->SetMarkerStyle(20);
215  (NumberOfNeverPresentDigisHO->getTProfile())->SetMarkerStyle(20);
216  (NumberOfNeverPresentDigisHF->getTProfile())->SetMarkerStyle(20);
217 
219 
221  {
222  dbe_->setCurrentFolder(subdir_+"dead_digi_often_missing");
223  //units<<"("<<deadmon_checkNevents_<<" consec. events)";
224  name<<"Dead Cells with No Digis";
226  name.str(),
227  "");
228  name.str("");
229  name<<"HB HE HF Depth 1 Dead Cells with No Digis for at least 1 Full Luminosity Block";
230  RecentMissingDigisByDepth.depth[0]->setTitle(name.str().c_str());
231 
232  name.str("");
233  name<<"HB HE HF Depth 2 Dead Cells with No Digis for at least 1 Full Luminosity Block";
234  RecentMissingDigisByDepth.depth[1]->setTitle(name.str().c_str());
235 
236  name.str("");
237  name<<"HE Depth 3 Dead Cells with No Digis for at least 1 Full Luminosity Block";
238  RecentMissingDigisByDepth.depth[2]->setTitle(name.str().c_str());
239 
240  name.str("");
241  name<<"HO Depth 4 Dead Cells with No Digis for at least 1 Full Luminosity Block";
242  RecentMissingDigisByDepth.depth[3]->setTitle(name.str().c_str());
243  name.str("");
244 
245  // 1D plots count number of bad cells
246  name<<"Total Number of Hcal Digis Unoccupied for at least 1 Full Luminosity Block";
247  NumberOfRecentMissingDigis=dbe_->bookProfile("Problem_RecentMissingDigis_HCAL_vs_LS",
248  name.str(),
249  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
250  name.str("");
251  name<<"Total Number of HB Digis Unoccupied for at least 1 Full LS vs LS;Lumi Section; Dead Cells";
252  NumberOfRecentMissingDigisHB=dbe_->bookProfile("Problem_RecentMissingDigis_HB_vs_LS",
253  name.str(),
254  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
255  name.str("");
256  name<<"Total Number of HE Digis Unoccupied for at least 1 Full LS vs LS;Lumi Section; Dead Cells";
257  NumberOfRecentMissingDigisHE=dbe_->bookProfile("Problem_RecentMissingDigis_HE_vs_LS",
258  name.str(),
259  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
260  name.str("");
261  name<<"Total Number of HO Digis Unoccupied for at least 1 Full LS vs LS;Lumi Section; Dead Cells";
262  NumberOfRecentMissingDigisHO=dbe_->bookProfile("Problem_RecentMissingDigis_HO_vs_LS",
263  name.str(),
264  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
265  name.str("");
266  name<<"Total Number of HF Digis Unoccupied for at least 1 Full LS vs LS;Lumi Section; Dead Cells";
267  NumberOfRecentMissingDigisHF=dbe_->bookProfile("Problem_RecentMissingDigis_HF_vs_LS",
268  name.str(),
269  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
270  (NumberOfRecentMissingDigis->getTProfile())->SetMarkerStyle(20);
271  (NumberOfRecentMissingDigisHB->getTProfile())->SetMarkerStyle(20);
272  (NumberOfRecentMissingDigisHE->getTProfile())->SetMarkerStyle(20);
273  (NumberOfRecentMissingDigisHO->getTProfile())->SetMarkerStyle(20);
274  (NumberOfRecentMissingDigisHF->getTProfile())->SetMarkerStyle(20);
275 
276  }
277 
279  {
280  // test 1: energy never above threshold
281  dbe_->setCurrentFolder(subdir_+"dead_rechit_neverpresent");
282  SetupEtaPhiHists(RecHitPresentByDepth,"RecHit Above Threshold At Least Once","");
283  // set more descriptive titles for threshold plots
284  units.str("");
285  units<<"Cells Above Energy Threshold At Least Once: Depth 1 -- HB >="<<HBenergyThreshold_<<" GeV, HE >= "<<HEenergyThreshold_<<", HF >="<<HFenergyThreshold_<<" GeV";
286  RecHitPresentByDepth.depth[0]->setTitle(units.str().c_str());
287  units.str("");
288  units<<"Cells Above Energy Threshold At Least Once: Depth 2 -- HB >="<<HBenergyThreshold_<<" GeV, HE >= "<<HEenergyThreshold_<<", HF >="<<HFenergyThreshold_<<" GeV";
289  RecHitPresentByDepth.depth[1]->setTitle(units.str().c_str());
290  units.str("");
291  units<<"Cells Above Energy Threshold At Least Once: Depth 3 -- HE >="<<HEenergyThreshold_<<" GeV";
292  RecHitPresentByDepth.depth[2]->setTitle(units.str().c_str());
293  units.str("");
294  units<<"Cells Above Energy Threshold At Least Once: Depth 4 -- HO >="<<HOenergyThreshold_<<" GeV";
295  RecHitPresentByDepth.depth[3]->setTitle(units.str().c_str());
296  units.str("");
297 
298  // 1D plots count number of bad cells
299  NumberOfNeverPresentRecHits=dbe_->bookProfile("Problem_RecHitsNeverPresent_HCAL_vs_LS",
300  "Total Number of Hcal Rechits with Low Energy;Lumi Section;Dead Cells",
301  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
302  name.str("");
303  name<<"Total Number of HB RecHits with Energy Never >= "<<HBenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
304  NumberOfNeverPresentRecHitsHB=dbe_->bookProfile("Problem_RecHitsNeverPresent_HB_vs_LS",
305  name.str(),
306  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
307  name.str("");
308  name<<"Total Number of HE RecHits with Energy Never >= "<<HEenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
309  NumberOfNeverPresentRecHitsHE=dbe_->bookProfile("Problem_RecHitsNeverPresent_HE_vs_LS",
310  name.str(),
311  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
312  name.str("");
313  name<<"Total Number of HO RecHits with Energy Never >= "<<HOenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
314  NumberOfNeverPresentRecHitsHO=dbe_->bookProfile("Problem_RecHitsNeverPresent_HO_vs_LS",
315  name.str(),
316  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
317  name.str("");
318  name<<"Total Number of HF RecHits with Energy Never >= "<<HFenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
319  NumberOfNeverPresentRecHitsHF=dbe_->bookProfile("Problem_RecHitsNeverPresent_HF_vs_LS",
320  name.str(),
321  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
322  (NumberOfNeverPresentRecHits->getTProfile())->SetMarkerStyle(20);
323  (NumberOfNeverPresentRecHitsHB->getTProfile())->SetMarkerStyle(20);
324  (NumberOfNeverPresentRecHitsHE->getTProfile())->SetMarkerStyle(20);
325  (NumberOfNeverPresentRecHitsHO->getTProfile())->SetMarkerStyle(20);
326  (NumberOfNeverPresentRecHitsHF->getTProfile())->SetMarkerStyle(20);
327 
328  dbe_->setCurrentFolder(subdir_+"dead_rechit_often_missing");
329  SetupEtaPhiHists(RecentMissingRecHitsByDepth,"RecHits Failing Energy Threshold Test","");
330  // set more descriptive titles for threshold plots
331  units.str("");
332  units<<"RecHits with Consistent Low Energy Depth 1 -- HB <"<<HBenergyThreshold_<<" GeV, HE < "<<HEenergyThreshold_<<", HF <"<<HFenergyThreshold_<<" GeV";
333  RecentMissingRecHitsByDepth.depth[0]->setTitle(units.str().c_str());
334  units.str("");
335  units<<"RecHits with Consistent Low Energy Depth 2 -- HB <"<<HBenergyThreshold_<<" GeV, HE < "<<HEenergyThreshold_<<", HF <"<<HFenergyThreshold_<<" GeV";
336  RecentMissingRecHitsByDepth.depth[1]->setTitle(units.str().c_str());
337  units.str("");
338  units<<"RecHits with Consistent Low Energy Depth 3 -- HE <"<<HEenergyThreshold_<<" GeV";
339  RecentMissingRecHitsByDepth.depth[2]->setTitle(units.str().c_str());
340  units.str("");
341  units<<"RecHits with Consistent Low Energy Depth 4 -- HO <"<<HOenergyThreshold_<<" GeV";
342  RecentMissingRecHitsByDepth.depth[3]->setTitle(units.str().c_str());
343  units.str("");
344 
345 
346  // 1D plots count number of bad cells
347  name.str("");
348  name<<"Total Number of Hcal RecHits with Consistent Low Energy;Lumi Section;Dead Cells";
349  NumberOfRecentMissingRecHits=dbe_->bookProfile("Problem_BelowEnergyRecHits_HCAL_vs_LS",
350  name.str(),
351  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
352  name.str("");
353  name<<"Total Number of HB RecHits with Consistent Low Energy < "<<HBenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
354  NumberOfRecentMissingRecHitsHB=dbe_->bookProfile("Problem_BelowEnergyRecHits_HB_vs_LS",
355  name.str(),
356  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
357  name.str("");
358  name<<"Total Number of HE RecHits with Consistent Low Energy < "<<HEenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
359  NumberOfRecentMissingRecHitsHE=dbe_->bookProfile("Problem_BelowEnergyRecHits_HE_vs_LS",
360  name.str(),
361  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
362  name.str("");
363  name<<"Total Number of HO RecHits with Consistent Low Energy < "<<HOenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
364  NumberOfRecentMissingRecHitsHO=dbe_->bookProfile("Problem_BelowEnergyRecHits_HO_vs_LS",
365  name.str(),
366  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
367  name.str("");
368  name<<"Total Number of HF RecHits with Consistent Low Energy < "<<HFenergyThreshold_<<" GeV;Lumi Section;Dead Cells";
369  NumberOfRecentMissingRecHitsHF=dbe_->bookProfile("Problem_BelowEnergyRecHits_HF_vs_LS",
370  name.str(),
371  NLumiBlocks_,0.5,NLumiBlocks_+0.5,100,0,10000);
372  (NumberOfRecentMissingRecHits->getTProfile())->SetMarkerStyle(20);
373  (NumberOfRecentMissingRecHitsHB->getTProfile())->SetMarkerStyle(20);
374  (NumberOfRecentMissingRecHitsHE->getTProfile())->SetMarkerStyle(20);
375  (NumberOfRecentMissingRecHitsHO->getTProfile())->SetMarkerStyle(20);
376  (NumberOfRecentMissingRecHitsHF->getTProfile())->SetMarkerStyle(20);
377 
378  } // if (deadmon_test_rechits)
379 
380 
381  if (makeDiagnostics_)
382  {
383  dbe_->setCurrentFolder(subdir_+"DiagnosticPlots");
384  HBDeadVsEvent=dbe_->book1D("HBDeadVsEvent","HB Total Dead Cells Vs Event", NLumiBlocks_/10,-0.5,NLumiBlocks_-0.5);
385  HEDeadVsEvent=dbe_->book1D("HEDeadVsEvent","HE Total Dead Cells Vs Event", NLumiBlocks_/10,-0.5,NLumiBlocks_-0.5);
386  HODeadVsEvent=dbe_->book1D("HODeadVsEvent","HO Total Dead Cells Vs Event", NLumiBlocks_/10,-0.5,NLumiBlocks_-0.5);
387  HFDeadVsEvent=dbe_->book1D("HFDeadVsEvent","HF Total Dead Cells Vs Event", NLumiBlocks_/10,-0.5,NLumiBlocks_-0.5);
388  }
389 
390  return;
391 
392 } // void HcalDeadCellMonitor::setup(...)
393 
395 {
396  if (debug_>1) std::cout <<"HcalDeadCellMonitor::beginRun"<<std::endl;
398 
399  if (tevt_==0) this->setup(); // set up histograms if they have not been created before
400  if (mergeRuns_==false)
401  this->reset();
402 
403  doReset_ = true;
404 
405  // Get known dead cells for this run
406  KnownBadCells_.clear();
407  if (badChannelStatusMask_>0)
408  {
410  c.get<HcalChannelQualityRcd>().get(p);
411  HcalChannelQuality* chanquality= new HcalChannelQuality(*p.product());
412  std::vector<DetId> mydetids = chanquality->getAllChannels();
413  for (std::vector<DetId>::const_iterator i = mydetids.begin();
414  i!=mydetids.end();
415  ++i)
416  {
417  if (i->det()!=DetId::Hcal) continue; // not an hcal cell
418  HcalDetId id=HcalDetId(*i);
419  int status=(chanquality->getValues(id))->getValue();
420  if ((status & badChannelStatusMask_))
421  KnownBadCells_[id.rawId()]=status;
422  }
423  delete chanquality;
424  } // if (badChannelStatusMask_>0)
425  return;
426 } //void HcalDeadCellMonitor::beginRun(...)
427 
429 {
430  if (debug_>1) std::cout <<"HcalDeadCellMonitor::reset()"<<std::endl;
431  doReset_ = false;
432 
434  zeroCounters();
435  deadevt_=0;
436  is_RBX_loss_ = 0;
437  beamMode_ = 0 ;
438  alarmer_counter_ = 0;
440  is_stable_beam = true;
441  hbhedcsON = true; hfdcsON = true; hodcsON = true;
447 
448  for (unsigned int depth=0;depth<DigiPresentByDepth.depth.size();++depth)
449  DigiPresentByDepth.depth[depth]->Reset();
450 
451  // Mark HORing2 channels as present (fill with a 2, rather than a 1, to distinguish between this setting and actual presence)
452  if (excludeHORing2_==true && DigiPresentByDepth.depth.size()>3)
453  {
454  for (int ieta=11;ieta<=15;++ieta)
455  for (int iphi=1;iphi<=72;++iphi)
456  {
457  // Don't fill ring2 SiPMs, since they will still be active even if the rest of HO is excluded.
458  if (isSiPM(ieta,iphi,4)==false)
459  DigiPresentByDepth.depth[3]->Fill(ieta,iphi,2);
460  //std::cout <<" FILLING ("<<-1*ieta<<", "<<iphi<<") with '2'"<<std::endl;
461  DigiPresentByDepth.depth[3]->Fill(-1*ieta,iphi,2);
462  }
463  }
465 
466 
468  {
471  }
473  {
486 
487  // Mark HORing2 channels as present (fill with a 2, rather than a 1, to distinguish between this setting and actual presence)
488  if (excludeHORing2_==true && RecHitPresentByDepth.depth.size()>3)
489  {
490  for (int ieta=11;ieta<=15;++ieta)
491  for (int iphi=1;iphi<=72;++iphi)
492  {
493  RecHitPresentByDepth.depth[3]->Fill(ieta,iphi,2);
494  RecHitPresentByDepth.depth[3]->Fill(-1*ieta,iphi,2);
495  }
496  }
498  }
499 
500  Nevents->Reset();
501 } // reset function is empty for now
502 
503 /* ------------------------------------------------------------------------- */
504 
505 
507 {
508  if (!enableCleanup_) return;
509  if (dbe_)
510  {
512  dbe_->removeContents();
513  dbe_->setCurrentFolder(subdir_+"dead_digi_never_present");
514  dbe_->removeContents();
515  dbe_->setCurrentFolder(subdir_+"dead_digi_often_missing");
516  dbe_->removeContents();
517  dbe_->setCurrentFolder(subdir_+"dead_rechit_neverpresent");
518  dbe_->removeContents();
519  dbe_->setCurrentFolder(subdir_+"dead_rechit_often_missing");
520  dbe_->removeContents();
521  dbe_->setCurrentFolder(subdir_+"dead_cell_parameters");
522  dbe_->removeContents();
523  dbe_->setCurrentFolder(subdir_+"LSvalues");
524  dbe_->removeContents();
525  }
526  return;
527 } // void HcalDeadCellMonitor::cleanup()
528 
529 /* ------------------------------------------------------------------------- */
530 
532  const edm::EventSetup& c)
533 {
534  // skip old lumi sections
535  if (this->LumiInOrder(lumiSeg.luminosityBlock())==false) return;
536 
537  // Reset current LS histogram
538  if (ProblemsCurrentLB)
540 
543 
544  //increase the number of LS counting, for alarmer. Only make alarms for HBHE
545  if(hbhedcsON == true && hfdcsON == true && HBpresent_ == 1 && HEpresent_ == 1 && HFpresent_ == 1)
547  else
548  alarmer_counter_ = 0;
549 
550  if(hodcsON==true && HOpresent_ == 1)
552  else
554 
555  if (!is_stable_beam)
556  {
557  alarmer_counter_ = 0;
559  }
560 
561  // Here is where we determine whether or not to process an event
562  // Not enough events
563  // there are less than minDeadEventCount_ in this LS, but RBXloss is found
564 
566  {
570 
571  endLumiProcessed_=true;
572  is_RBX_loss_=0;
573 
574  for (unsigned int i=0;i<156;++i)
575  rbxlost[i] = 0;
576 
577  if (ProblemsCurrentLB)
578  {
579  ProblemsCurrentLB->setBinContent(0,0, levt_); // underflow bin contains number of events
587  }
588  }
589 
590  if (deadevt_<minDeadEventCount_) // perform normal tasks, since no RBX loss is detected in this lumisections
591  return;
592 
593  endLumiProcessed_=true;
594  // fillNevents_problemCells checks for never-present cells
598 
599  if (ProblemsCurrentLB)
600  {
601  ProblemsCurrentLB->setBinContent(0,0, levt_); // underflow bin contains number of events
609  }
610  zeroCounters();
611  deadevt_=0;
612  is_RBX_loss_=0;
613  beamMode_ = 0;
614  return;
615 } //endLuminosityBlock()
616 
618 {
619  // Always carry out overall occupancy test at endRun, regardless minimum number of events?
620  // Or should we require an absolute lower bound?
621  // We can always run this test; we'll use the summary client to implement a lower bound before calculating reportSummary values
622  if (endLumiProcessed_==false) fillNevents_problemCells(); // always check for never-present cells
623 
624  return;
625 }
626 
628 {
629  if (debug_>0) std::cout <<"HcalDeadCellMonitor::endJob()"<<std::endl;
630  if (enableCleanup_) cleanup(); // when do we force cleanup?
631 }
632 
634 {
635  if (!IsAllowedCalibType()) return;
636  endLumiProcessed_=false;
637 
638  if(doReset_)
639  this->reset();
640 
641  Nevents->Fill(0,1); // count all events of allowed calibration type, even if their lumi block is not in the right order
642  if (LumiInOrder(e.luminosityBlock())==false) return;
643  // try to get rechits and digis
647 
651 
653 
655  // check if detectors whether they were ON
657  e.getByToken(tok_dcs_, dcsStatus);
658 
659  if (dcsStatus.isValid() && dcsStatus->size() != 0)
660  {
661  if ((*dcsStatus)[0].ready(DcsStatus::HBHEa) &&
662  (*dcsStatus)[0].ready(DcsStatus::HBHEb) &&
663  (*dcsStatus)[0].ready(DcsStatus::HBHEc))
664  {
665  hbhedcsON = true;
666  if (debug_) std::cout << "hbhe on" << std::endl;
667  }
668  else hbhedcsON = false;
669 
670  if ((*dcsStatus)[0].ready(DcsStatus::HF))
671  {
672  hfdcsON = true;
673  if (debug_) std::cout << "hf on" << std::endl;
674  }
675  else hfdcsON = false;
676 
677  if ((*dcsStatus)[0].ready(DcsStatus::HO))
678  {
679  hodcsON = true;
680  if (debug_) std::cout << "ho on" << std::endl;
681  }
682  else hodcsON = false;
683  }
685 
686  if (!(e.getByToken(tok_hbhedigi_,hbhe_digi)))
687  {
688  edm::LogWarning("HcalDeadCellMonitor")<< digiLabel_<<" hbhe_digi not available";
689  return;
690  }
691  if (!(e.getByToken(tok_hodigi_,ho_digi)))
692  {
693  edm::LogWarning("HcalDeadCellMonitor")<< digiLabel_<<" ho_digi not available";
694  return;
695  }
696  if (!(e.getByToken(tok_hfdigi_,hf_digi)))
697  {
698  edm::LogWarning("HcalDeadCellMonitor")<< digiLabel_<<" hf_digi not available";
699  return;
700  }
701 
702  if (!(e.getByToken(tok_hbhe_,hbhe_rechit)))
703  {
704  edm::LogWarning("HcalDeadCellMonitor")<< hbheRechitLabel_<<" hbhe_rechit not available";
705  return;
706  }
707 
708  if (!(e.getByToken(tok_hf_,hf_rechit)))
709  {
710  edm::LogWarning("HcalDeadCellMonitor")<< hfRechitLabel_<<" hf_rechit not available";
711  return;
712  }
713  if (!(e.getByToken(tok_ho_,ho_rechit)))
714  {
715  edm::LogWarning("HcalDeadCellMonitor")<< hoRechitLabel_<<" ho_rechit not available";
716  return;
717  }
718  if (!(e.getByToken(tok_gtEvm_, gtEvm_handle)))
719  {
720  edm::LogWarning("HcalDeadCellMonitor")<< "gtEvmDigis"<<" gtEvmDigis not available";
721  return;
722  }
723  L1GtfeExtWord gtfeEvmExtWord = gtEvm_handle.product()->gtfeWord();
724 
725  if (debug_>1) std::cout <<"\t<HcalDeadCellMonitor::analyze> Processing good event! event # = "<<ievt_<<std::endl;
726  // Good event found; increment counter (via base class analyze method)
727  // This also runs the allowed calibration /lumi in order tests again; remove?
729 
730  ++deadevt_; //increment local counter
731 
732  processEvent(*hbhe_rechit, *ho_rechit, *hf_rechit, *hbhe_digi, *ho_digi, *hf_digi);
733 
734  // check for presence of an RBX data loss
735  if(levt_>10 && tevt_ % 10 == 0 ) //levt_ counts events perLS, but excludes
736  { //"wrong", calibration-type events. Compare with tevt_ instead...
737  for(int i=71; i<132; i++)
738  {
739  // These RBXs in HO are excluded, set to 1 to ignore
740  // HO0: 96-107 (all)
741  // HO1: 85-95, 109-119 (all odd)
742  // HO2: 73, 75, 79, 81, 83, 121-131 (all odd)
743  if(i >= 72 && i < 95 && i%2==0)
744  occupancy_RBX[i] = 1;
745  if(i >=108 && i <= 131 && i%2==0)
746  occupancy_RBX[i] = 1;
747 
748  if(i==117 || i==131) // HO SiPMs have much less hits, 10 events not enough.
749  occupancy_RBX[i] = 1; // Also no RBX loss for SiPMs, so ignore for now.
750  if(i==77)
751  occupancy_RBX[i] = 1;
752  }
753 
754  // RBX loss detected
755  for (unsigned int i=0;i<132;++i)
756  if(occupancy_RBX[i] == 0)
757  {
758  is_RBX_loss_ = 1;
759  rbxlost[i] = 1;
760  }
761 
762  int intensity1_ = gtfeEvmExtWord.totalIntensityBeam1();
763  int intensity2_ = gtfeEvmExtWord.totalIntensityBeam2();
764 
765  is_stable_beam = gtfeEvmExtWord.beamMode() == 11 ? true : false;
766 
767  for (unsigned int i=132;i<156;++i)
768  if(occupancy_RBX[i] == 0 && gtfeEvmExtWord.beamMode() == 11)
769  if(intensity1_>100 && intensity2_>100) // only in stable beam mode (11) and with circulating beams, otherwise
770  { // this check is too sensitive in HF
771  is_RBX_loss_ = 1;
772  rbxlost[i] = 1;
773  }
774 
775  // no RBX loss, reset the counters
776  if (is_RBX_loss_ == 0)
777  for (unsigned int i=0;i<156;++i)
778  occupancy_RBX[i] = 0;
779  }
780 
781  // if RBX is lost any time during the LS, don't allow the counters to increment
782  if(is_RBX_loss_ == 1)
783  for (unsigned int i=0;i<156;++i)
784  if(rbxlost[i]==1) occupancy_RBX[i] = 0;
785 
786 } // void HcalDeadCellMonitor::analyze(...)
787 
788 /* --------------------------------------- */
789 
790 
792  const HORecHitCollection& hoHits,
793  const HFRecHitCollection& hfHits,
794  const HBHEDigiCollection& hbhedigi,
795  const HODigiCollection& hodigi,
796  const HFDigiCollection& hfdigi)
797 {
798  if (debug_>1) std::cout <<"<HcalDeadCellMonitor::processEvent> Processing event..."<<std::endl;
799 
800  // Do Digi-Based dead cell searches
801 
802  // Make sure histograms update
803  for (unsigned int i=0;i<DigiPresentByDepth.depth.size();++i)
804  DigiPresentByDepth.depth[i]->update();
805 
811 
813  {
814 
815  for (unsigned int i=0;i<RecentMissingDigisByDepth.depth.size();++i)
816  RecentMissingDigisByDepth.depth[i]->update();
817 
823  }
824 
826  j!=hbhedigi.end(); ++j)
827  {
828  const HBHEDataFrame digi = (const HBHEDataFrame)(*j);
829  processEvent_HBHEdigi(digi);
830  }
831 
833  j!=hodigi.end(); ++j)
834  {
835  const HODataFrame digi = (const HODataFrame)(*j);
836  process_Digi(digi);
837  }
839  j!=hfdigi.end(); ++j)
840  {
841  const HFDataFrame digi = (const HFDataFrame)(*j);
842  process_Digi(digi);
843  }
845 
846  // Search for "dead" cells below a certain energy
848  {
849  // Normalization Fill
850  for (unsigned int i=0;i<RecentMissingRecHitsByDepth.depth.size();++i)
852 
858 
860  j!=hbHits.end(); ++j)
861  process_RecHit(j);
862 
864  k!=hoHits.end(); ++k)
865  process_RecHit(k);
866 
868  j!=hfHits.end(); ++j)
869  process_RecHit(j);
870 
871  } // if (deadmon_test_rechits)
872 
873  if (!makeDiagnostics_) return;
874  if (tevt_>=NLumiBlocks_) return;
875  // Diagnostic plots -- add number of missing channels vs event number
876  int hbpresent=0;
877  int hepresent=0;
878  int hopresent=0;
879  int hfpresent=0;
880  int ieta=0;
881  for (int d=0;d<4;++d)
882  {
883  for (int phi=0;phi<72;++phi)
884  {
885  for (int eta=0;eta<85;++eta)
886  {
887  if (!present_digi[eta][phi][d]) continue;
888  if (d==3) ++hopresent;
889  else if (d==2) ++hepresent;
890  else if (d==1)
891  {
892  ieta=binmapd2[eta];
893  //if (abs(ieta)>29) continue;
894  if (abs(ieta)>29) ++hfpresent;
895  else if (abs(ieta)<17) ++hbpresent; //depths 15&16
896  else ++hepresent;
897  }
898  else if (d==0)
899  {
900  ieta=eta-42;
901  if (abs(ieta)>29) ++hfpresent;
902  else if (abs(ieta)<17) ++hbpresent;
903  else ++hepresent;
904  }
905  }
906  }
907  } // for (int d=0;d<4;++d)
908  HBDeadVsEvent->Fill(tevt_,2592-hbpresent);
909  HEDeadVsEvent->Fill(tevt_,2592-hepresent);
910  HODeadVsEvent->Fill(tevt_,2160-hopresent);
911  HFDeadVsEvent->Fill(tevt_,1728-hfpresent);
912  return;
913 } // void HcalDeadCellMonitor::processEvent(...)
914 
915 /************************************/
916 
917 
918 // Digi-based dead cell checks
919 
921 {
922  // Simply check whether a digi is present. If so, increment occupancy counter.
923  process_Digi(digi);
924  return;
925 } //void HcalDeadCellMonitor::processEvent_HBHEdigi(HBHEDigiCollection::const_iterator j)
926 
927 template<class DIGI>
929 {
930  // Remove the validate check when we figure out how to access bad digis in digi monitor
931  //if (!digi.validate()) return; // digi must be good to be counted
932  int ieta=digi.id().ieta();
933  int iphi=digi.id().iphi();
934  int depth=digi.id().depth();
935 
936  // Fill occupancy counter
937  ++recentoccupancy_digi[CalcEtaBin(digi.id().subdet(),ieta,depth)][iphi-1][depth-1];
938 
939  // If previously-missing digi found, change boolean status and fill histogram
940  if (present_digi[CalcEtaBin(digi.id().subdet(),ieta,depth)][iphi-1][depth-1]==false)
941  {
942  if (DigiPresentByDepth.depth[depth-1])
943  {
944  DigiPresentByDepth.depth[depth-1]->setBinContent(CalcEtaBin(digi.id().subdet(),ieta,depth)+1,iphi,1);
945  }
946  present_digi[CalcEtaBin(digi.id().subdet(),ieta,depth)][iphi-1][depth-1]=true;
947  }
948  return;
949 }
950 
951 //RecHit-based dead cell checks
952 
953 template<class RECHIT>
955 {
956  float en = rechit->energy();
957  HcalDetId id(rechit->detid().rawId());
958  int ieta = id.ieta();
959  int iphi = id.iphi();
960  int depth = id.depth();
961 
962  if (id.subdet()==HcalBarrel)
963  {
964  if (en>=HBenergyThreshold_)
965  {
966  ++recentoccupancy_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1];
967  present_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1]=true;
968  if (RecHitPresentByDepth.depth[depth-1])
969  RecHitPresentByDepth.depth[depth-1]->setBinContent(CalcEtaBin(id.subdet(),ieta,depth)+1,iphi,1);
970  }
972  // RBX index, HB RBX indices are 0-35
973  int RBXindex = logicalMap_->getHcalFrontEndId(rechit->detid()).rbxIndex();
974 
975  occupancy_RBX[RBXindex]++;
977  }
978  else if (id.subdet()==HcalEndcap)
979  {
980  if (en>=HEenergyThreshold_)
981  {
982  ++recentoccupancy_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1];
983  present_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1]=true;
984  if (RecHitPresentByDepth.depth[depth-1])
985  RecHitPresentByDepth.depth[depth-1]->setBinContent(CalcEtaBin(id.subdet(),ieta,depth)+1,iphi,1);
986  }
988  // RBX index, HE RBX indices are 36-71
989  int RBXindex = logicalMap_->getHcalFrontEndId(rechit->detid()).rbxIndex();
990 
991  occupancy_RBX[RBXindex]++;
993  }
994  else if (id.subdet()==HcalForward)
995  {
996  if (en>=HFenergyThreshold_)
997  {
998  ++recentoccupancy_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1];
999 
1000  present_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1]=true;
1001  if (RecHitPresentByDepth.depth[depth-1])
1002  RecHitPresentByDepth.depth[depth-1]->setBinContent(CalcEtaBin(id.subdet(),ieta,depth)+1,iphi,1);
1003  }
1005  // RBX index, HF RBX indices are 132-155
1006  int RBXindex = logicalMap_->getHcalFrontEndId(rechit->detid()).rbxIndex();
1007 
1008  occupancy_RBX[RBXindex]++;
1010  }
1011  else if (id.subdet()==HcalOuter)
1012  {
1013  if (en>=HOenergyThreshold_)
1014  {
1015  ++recentoccupancy_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1];
1016  present_rechit[CalcEtaBin(id.subdet(),ieta,depth)][iphi-1][depth-1]=true;
1017  if (RecHitPresentByDepth.depth[depth-1])
1018  RecHitPresentByDepth.depth[depth-1]->setBinContent(CalcEtaBin(id.subdet(),ieta,depth)+1,iphi,1);
1019  }
1021  // RBX index, HO RBX indices are 73-95 (odd), 96-107 (all), 108-119 (odd), 120-130 (EXCL), 131
1022  int RBXindex = logicalMap_->getHcalFrontEndId(rechit->detid()).rbxIndex();
1023 
1024  occupancy_RBX[RBXindex]++;
1026  }
1027 }
1028 
1030 {
1031  // Fill Histograms showing digi cells with no occupancy for the past few lumiblocks
1032  if (!deadmon_test_digis_) return; // extra protection here against calling histograms than don't exist
1033 
1034  if (debug_>0)
1035  std::cout <<"<HcalDeadCellMonitor::fillNevents_recentdigis> CHECKING FOR RECENT MISSING DIGIS evtcount = "<<deadevt_<<std::endl;
1036 
1037  int ieta=0;
1038  int iphi=0;
1039 
1040  int etabins=0;
1041  int phibins=0;
1042 
1044  if ((deadevt_ >= 10 && deadevt_<minDeadEventCount_) || (deadevt_ >= 10 && is_RBX_loss_==1)) // maybe not enough events to run the standard test
1045  // if( is_RBX_loss_ == 1 ) // but enough to detect RBX loss
1046  for (unsigned int depth=0;depth<RecentMissingDigisByDepth.depth.size();++depth)
1047  {
1048  RecentMissingDigisByDepth.depth[depth]->setBinContent(0,0,ievt_);
1049  etabins=RecentMissingDigisByDepth.depth[depth]->getNbinsX();
1050  phibins=RecentMissingDigisByDepth.depth[depth]->getNbinsY();
1051  for (int eta=0;eta<etabins;++eta)
1052  for (int phi=0;phi<phibins;++phi)
1053  {
1054  iphi=phi+1;
1055  for (int subdet=1;subdet<=4;++subdet)
1056  {
1057  ieta=CalcIeta((HcalSubdetector)subdet,eta,depth+1);
1058  if (ieta==-9999) continue;
1059  if (!validDetId((HcalSubdetector)subdet, ieta, iphi, depth+1))
1060  continue;
1061  // now check which dead cell tests failed; increment counter if any failed
1062  HcalDetId TempID((HcalSubdetector)subdet, ieta, iphi, (int)depth+1);
1063 
1064  int index = logicalMap_->getHcalFrontEndId(TempID).rbxIndex();
1065  // if(subdet==HcalForward) continue;
1066 
1067  if(occupancy_RBX[index]==0)
1068  {
1069  recentoccupancy_digi[eta][phi][depth] = 0;
1070  RecentMissingDigisByDepth.depth[depth]->Fill(ieta,iphi,deadevt_);
1071  }
1072  }
1073  }
1074  }
1076 
1077  if (deadevt_ < minDeadEventCount_) return; // not enough entries to make a determination for this LS
1078 
1079  for (unsigned int depth=0;depth<RecentMissingDigisByDepth.depth.size();++depth)
1080  {
1081  RecentMissingDigisByDepth.depth[depth]->setBinContent(0,0,ievt_);
1082  etabins=RecentMissingDigisByDepth.depth[depth]->getNbinsX();
1083  phibins=RecentMissingDigisByDepth.depth[depth]->getNbinsY();
1084  for (int eta=0;eta<etabins;++eta)
1085  {
1086  for (int subdet=1;subdet<=4;++subdet)
1087  {
1088  ieta=CalcIeta((HcalSubdetector)subdet,eta,depth+1);
1089  if (ieta==-9999) continue;
1090  for (int phi=0;phi<phibins;++phi)
1091  {
1092  iphi=phi+1;
1093 
1094  if (!validDetId((HcalSubdetector)subdet, ieta, iphi, depth+1))
1095  continue;
1096 
1097  // Ignore subdetectors that weren't in run?
1098  /*
1099  if ((subdet==HcalBarrel && !HBpresent_) ||
1100  (subdet==HcalEndcap &&!HEpresent_) ||
1101  (subdet==HcalOuter &&!HOpresent_) ||
1102  (subdet==HcalForward &&!HFpresent_)) continue;
1103  */
1104  int zside=0;
1105  if (subdet==HcalForward) // shift HcalForward ieta
1106  ieta<0 ? zside=-1 : zside=+1;
1107 
1108  if (recentoccupancy_digi[eta][phi][depth]==0)
1109  {
1110  if (debug_>0)
1111  {
1112  std::cout <<"DEAD CELL; NO RECENT OCCUPANCY: subdet = "<<subdet<<", ieta = "<<ieta<<", iphi = "<<iphi<<" depth = "<<depth+1<<std::endl;
1113  std::cout <<"\t RAW COORDINATES: eta = "<<eta<< " phi = "<<phi<<" depth = "<<depth<<std::endl;
1114  std::cout <<"\t Present? "<<present_digi[eta][phi][depth]<<std::endl;
1115  }
1116 
1117  // Don't fill HORing2 if boolean enabled
1118  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1119  continue;
1120 
1121  // no digi was found for the N events; Fill cell as bad for all N events (N = checkN);
1122  if (RecentMissingDigisByDepth.depth[depth]) RecentMissingDigisByDepth.depth[depth]->Fill(ieta+zside,iphi,deadevt_);
1123  }
1124  } // for (int subdet=1;subdet<=4;++subdet)
1125  } // for (int phi=0;...)
1126  } // for (int eta=0;...)
1127  } //for (int depth=1;...)
1129 
1130  return;
1131 
1132 } // void HcalDeadCellMonitor::fillNevents_recentdigis()
1133 
1134 
1135 
1136 /* ----------------------------------- */
1137 
1139 {
1140  // Fill Histograms showing unoccupied rechits, or rec hits with low energy
1141 
1142  // This test is a bit pointless, unless the energy threshold is greater than the ZS threshold.
1143  // If we require that cells are always < thresh to be flagged by this test, and if
1144  // thresh < ZS, then we will never catch any cells, since they'll show up as dead in the
1145  // neverpresent/occupancy test plots first.
1146  // Only exception is if something strange is going on between ZS ADC value an RecHit energy?
1147 
1148  if (!deadmon_test_rechits_) return;
1150 
1151  if (debug_>0)
1152  std::cout <<"<HcalDeadCellMonitor::fillNevents_energy> BELOW-ENERGY-THRESHOLD PLOTS"<<std::endl;
1153 
1154  int ieta=0;
1155  int iphi=0;
1156 
1157  int etabins=0;
1158  int phibins=0;
1159 
1161  if ((deadevt_ >= 10 && deadevt_<minDeadEventCount_) || (deadevt_ >= 10 && is_RBX_loss_==1)) // maybe not enough events to run the standard test
1162  // if( is_RBX_loss_ == 1 ) // but enough to detect RBX loss
1163  for (unsigned int depth=0;depth<RecentMissingRecHitsByDepth.depth.size();++depth)
1164  {
1165  RecentMissingRecHitsByDepth.depth[depth]->setBinContent(0,0,ievt_);
1166  etabins=RecentMissingRecHitsByDepth.depth[depth]->getNbinsX();
1167  phibins=RecentMissingRecHitsByDepth.depth[depth]->getNbinsY();
1168  for (int eta=0;eta<etabins;++eta)
1169  for (int phi=0;phi<phibins;++phi)
1170  {
1171  iphi=phi+1;
1172  for (int subdet=1;subdet<=4;++subdet)
1173  {
1174  ieta=CalcIeta((HcalSubdetector)subdet,eta,depth+1);
1175  if (ieta==-9999) continue;
1176  if (!validDetId((HcalSubdetector)subdet, ieta, iphi, depth+1))
1177  continue;
1178  // now check which dead cell tests failed; increment counter if any failed
1179  HcalDetId TempID((HcalSubdetector)subdet, ieta, iphi, (int)depth+1);
1180 
1181  int index = logicalMap_->getHcalFrontEndId(TempID).rbxIndex();
1182  // if(subdet==HcalForward) continue;
1183 
1184  if(occupancy_RBX[index]==0)
1185  {
1186  recentoccupancy_rechit[eta][phi][depth] = 0;
1187  RecentMissingRecHitsByDepth.depth[depth]->Fill(ieta,iphi,deadevt_);
1188  }
1189  }
1190  }
1191  }
1193 
1194  if (deadevt_ < minDeadEventCount_) return; // not enough entries to make a determination for this LS
1195 
1196  for (unsigned int depth=0;depth<RecentMissingRecHitsByDepth.depth.size();++depth)
1197  {
1198  RecentMissingRecHitsByDepth.depth[depth]->setBinContent(0,0,ievt_);
1199  etabins=RecentMissingRecHitsByDepth.depth[depth]->getNbinsX();
1200  phibins=RecentMissingRecHitsByDepth.depth[depth]->getNbinsY();
1201  for (int eta=0;eta<etabins;++eta)
1202  {
1203  for (int subdet=1;subdet<=4;++subdet)
1204  {
1205  ieta=CalcIeta((HcalSubdetector)subdet,eta,depth+1);
1206  if (ieta==-9999) continue;
1207  for (int phi=0;phi<phibins;++phi)
1208  {
1209  iphi=phi+1;
1210  if (!validDetId((HcalSubdetector)subdet, ieta, iphi, depth+1))
1211  continue;
1212 
1213  if (recentoccupancy_rechit[eta][phi][depth]>0) continue; // cell exceeded energy at least once, so it's not dead
1214 
1215  // Ignore subdetectors that weren't in run?
1216  /*
1217  if ((subdet==HcalBarrel && !HBpresent_) ||
1218  (subdet==HcalEndcap &&!HEpresent_) ||
1219  (subdet==HcalOuter &&!HOpresent_) ||
1220  (subdet==HcalForward &&!HFpresent_)) continue;
1221  */
1222 
1223  int zside=0;
1224  if (subdet==HcalForward) // shift HcalForward ieta
1225  {
1226  ieta<0 ? zside=-1 : zside=+1;
1227  }
1228 
1229  if (debug_>2)
1230  std::cout <<"DEAD CELL; BELOW ENERGY THRESHOLD; subdet = "<<subdet<<" ieta = "<<ieta<<", phi = "<<iphi<<" depth = "<<depth+1<<std::endl;
1231  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1232  continue;
1233 
1234  if (RecentMissingRecHitsByDepth.depth[depth]) RecentMissingRecHitsByDepth.depth[depth]->Fill(ieta+zside,iphi,deadevt_);
1235  } // loop on phi bins
1236  } // for (unsigned int depth=1;depth<=4;++depth)
1237  } // // loop on subdetectors
1238  } // for (int eta=0;...)
1239 
1241 
1242  return;
1243 } // void HcalDeadCellMonitor::fillNevents_recentrechits()
1244 
1245 
1247 {
1248  //fillNevents_problemCells now only performs checks of never-present cells
1249 
1250  if (debug_>0)
1251  std::cout <<"<HcalDeadCellMonitor::fillNevents_problemCells> FILLING PROBLEM CELL PLOTS"<<std::endl;
1252 
1253  int ieta=0;
1254  int iphi=0;
1255 
1256  // Count problem cells in each subdetector
1257 
1258  NumBadHB=0;
1259  NumBadHE=0;
1260  NumBadHO=0;
1261  NumBadHF=0;
1262  NumBadHFLUMI=0;
1263  NumBadHO01=0;
1264  NumBadHO2=0;
1265  NumBadHO12=0;
1266  NumBadHO1P02=0;
1267 
1268  int knownBadHB=0;
1269  int knownBadHE=0;
1270  int knownBadHF=0;
1271  int knownBadHO=0;
1272  int knownBadHFLUMI=0;
1273  int knownBadHO01=0;
1274  int knownBadHO2=0;
1275  int knownBadHO12=0;
1276 
1277 
1278  unsigned int neverpresentHB=0;
1279  unsigned int neverpresentHE=0;
1280  unsigned int neverpresentHO=0;
1281  unsigned int neverpresentHF=0;
1282 
1283  unsigned int unoccupiedHB=0;
1284  unsigned int unoccupiedHE=0;
1285  unsigned int unoccupiedHO=0;
1286  unsigned int unoccupiedHF=0;
1287 
1288  unsigned int belowenergyHB=0;
1289  unsigned int belowenergyHE=0;
1290  unsigned int belowenergyHO=0;
1291  unsigned int belowenergyHF=0;
1292 
1293  unsigned int energyneverpresentHB=0;
1294  unsigned int energyneverpresentHE=0;
1295  unsigned int energyneverpresentHO=0;
1296  unsigned int energyneverpresentHF=0;
1297 
1299  Nevents->Fill(1,deadevt_);
1300 
1301  int etabins=0;
1302  int phibins=0;
1303 
1304  // Store values for number of bad channels in each lumi section, for plots of ProblemsVsLS.
1305  // This is different than the NumBadHB, etc. values, which must included even known bad channels
1306  // in order to calculate reportSummaryByLS values correctly.
1307 
1309  //Check for RBX data loss
1310  unsigned int RBX_loss_HB=0;
1311  unsigned int RBX_loss_HE=0;
1312  unsigned int RBX_loss_HO01=0;
1313  unsigned int RBX_loss_HO2=0;
1314  unsigned int RBX_loss_HF=0;
1315 
1316  unsigned int counter_HB = 0;
1317  unsigned int counter_HE = 0;
1318  unsigned int counter_HO01 = 0;
1319  unsigned int counter_HO2 = 0;
1320  unsigned int counter_HF = 0;
1321 
1322  for(int i=0; i<156; i++)
1323  {
1324  if(occupancy_RBX[i]==0 && is_RBX_loss_ == 1)
1325  {
1326  if(i<=35) //HB
1327  { counter_HB ++ ; RBX_loss_HB = 72*(counter_HB); }
1328  if(i>=36 && i<=71) //HE
1329  { counter_HE ++ ; RBX_loss_HE = 72*(counter_HE); }
1330  if(i>=85 && i<=119) // HO Rings 0, 1
1331  { counter_HO01 ++ ; RBX_loss_HO01 = 72*(counter_HO01); }
1332  if(i>=121 || i<=83) // HO Ring 2
1333  { counter_HO2 ++ ; RBX_loss_HO2 = 72*(counter_HO2); }
1334  if(i>=132 && i<=155) //HF
1335  { counter_HF ++ ; RBX_loss_HF = 72*(counter_HF); }
1336 
1337  if(excludeHO1P02_==true && i==109) NumBadHO1P02 = 72; // exclude HO1P02
1338  }
1339  if(occupancy_RBX[i]>0)
1341  if(occupancy_RBX[i]==0 && is_RBX_loss_ == 1)
1342  RBX_loss_VS_LB->Fill(currentLS, i, 1);
1343  }
1344 
1345  if (deadevt_ >= 10 && deadevt_<minDeadEventCount_) // maybe not enough events to run the standard test
1346  if( is_RBX_loss_ == 1 ) // but enough to detect RBX loss
1347  {
1348  NumBadHB+=RBX_loss_HB;
1349  NumBadHE+=RBX_loss_HE;
1350  NumBadHO+=RBX_loss_HO01+RBX_loss_HO2;
1351  NumBadHO01+=RBX_loss_HO01;
1352  NumBadHO2+=RBX_loss_HO2;
1353  NumBadHF+=RBX_loss_HF;
1354 
1355  belowenergyHB+=RBX_loss_HB;
1356  belowenergyHE+=RBX_loss_HE;
1357  belowenergyHO+=RBX_loss_HO01+RBX_loss_HO2;
1358  belowenergyHF+=RBX_loss_HF;
1359 
1360  unoccupiedHB+=RBX_loss_HB;
1361  unoccupiedHE+=RBX_loss_HE;
1362  unoccupiedHO+=RBX_loss_HO01+RBX_loss_HO2;
1363  unoccupiedHF+=RBX_loss_HF;
1364  }
1366 
1367  for (unsigned int depth=0;depth<DigiPresentByDepth.depth.size();++depth)
1368  {
1369  DigiPresentByDepth.depth[depth]->setBinContent(0,0,ievt_);
1370  etabins=DigiPresentByDepth.depth[depth]->getNbinsX();
1371  phibins=DigiPresentByDepth.depth[depth]->getNbinsY();
1372  for (int eta=0;eta<etabins;++eta)
1373  {
1374  for (int phi=0;phi<phibins;++phi)
1375  {
1376  iphi=phi+1;
1377  for (int subdet=1;subdet<=4;++subdet)
1378  {
1379  ieta=CalcIeta((HcalSubdetector)subdet,eta,depth+1);
1380  if (ieta==-9999) continue;
1381  if (!validDetId((HcalSubdetector)subdet, ieta, iphi, depth+1))
1382  continue;
1383  // Ignore subdetectors that weren't in run?
1384  /*
1385  if ((subdet==HcalBarrel && !HBpresent_) ||
1386  (subdet==HcalEndcap &&!HEpresent_) ||
1387  (subdet==HcalOuter &&!HOpresent_) ||
1388  (subdet==HcalForward &&!HFpresent_)) continue;
1389  */
1390 
1391  /*
1392  if ((!checkHB_ && subdet==HcalBarrel) ||
1393  (!checkHE_ && subdet==HcalEndcap) ||
1394  (!checkHO_ && subdet==HcalOuter) ||
1395  (!checkHF_ && subdet==HcalForward)) continue;
1396  */
1397 
1398  // now check which dead cell tests failed; increment counter if any failed
1399  if ((present_digi[eta][phi][depth]==0) ||
1402  )
1403  {
1404  HcalDetId TempID((HcalSubdetector)subdet, ieta, iphi, (int)depth+1);
1405  if (subdet==HcalBarrel)
1406  {
1407  ++NumBadHB;
1408  if (KnownBadCells_.find(TempID.rawId())!=KnownBadCells_.end())
1409  ++knownBadHB;
1410  }
1411  else if (subdet==HcalEndcap)
1412  {
1413  ++NumBadHE;
1414  if (KnownBadCells_.find(TempID.rawId())!=KnownBadCells_.end())
1415  ++knownBadHE;
1416  }
1417 
1418  else if (subdet==HcalOuter)
1419  {
1420  ++NumBadHO;
1421  if (abs(ieta)<=10) ++NumBadHO01;
1422  else ++NumBadHO2;
1423  // Don't include HORing2 if boolean set; subtract away those counters
1424  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1425  {
1426  --NumBadHO;
1427  --NumBadHO2;
1428  --NumBadHO12;
1429  }
1430  // Don't include HO1P02 if boolean set, RBX does not repsond well to resets,; subtract away those counters
1431  if (excludeHO1P02_==true && ( (ieta>4 && ieta<10) && (iphi<=10 || iphi>70) ) )
1432  ++NumBadHO1P02;
1433 
1434  if (KnownBadCells_.find(TempID.rawId())!=KnownBadCells_.end())
1435  {
1436  ++knownBadHO;
1437  if (abs(ieta)<=10) ++knownBadHO01;
1438  else ++knownBadHO2;
1439  // Don't include HORing2 if boolean set; subtract away those counters
1440  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1441  {
1442  --knownBadHO;
1443  --knownBadHO12;
1444  }
1445  }
1446  }
1447  else if (subdet==HcalForward)
1448  {
1449  ++NumBadHF;
1450  if (depth==1 && (abs(ieta)==33 || abs(ieta)==34))
1451  ++NumBadHFLUMI;
1452  else if (depth==2 && (abs(ieta)==35 || abs(ieta)==36))
1453  ++NumBadHFLUMI;
1454  if (KnownBadCells_.find(TempID.rawId())!=KnownBadCells_.end())
1455  {
1456  ++knownBadHF;
1457  if (depth==1 && (abs(ieta)==33 || abs(ieta)==34))
1458  ++knownBadHFLUMI;
1459  else if (depth==2 && (abs(ieta)==35 || abs(ieta)==36))
1460  ++knownBadHFLUMI;
1461  }
1462  }
1463  }
1464  if (present_digi[eta][phi][depth]==0 )
1465  {
1466  if (subdet==HcalBarrel) ++neverpresentHB;
1467  else if (subdet==HcalEndcap) ++neverpresentHE;
1468  else if (subdet==HcalOuter)
1469  {
1470  ++neverpresentHO;
1471  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1472  --neverpresentHO;
1473  }
1474  else if (subdet==HcalForward) ++neverpresentHF;
1475  }
1476  // Count recent unoccupied digis if the total events in this lumi section is > minEvents_
1478  {
1479  HcalDetId TempID((HcalSubdetector)subdet, ieta, iphi, (int)depth+1);
1480  if (subdet==HcalBarrel) ++unoccupiedHB;
1481  else if (subdet==HcalEndcap) ++unoccupiedHE;
1482  else if (subdet==HcalOuter)
1483  {
1484  ++unoccupiedHO;
1485  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1486  --unoccupiedHO;
1487  if (KnownBadCells_.find(TempID.rawId())!=KnownBadCells_.end() && abs(ieta)<=10)
1488  --unoccupiedHO;
1489  }
1490  else if (subdet==HcalForward) ++unoccupiedHF;
1491  }
1492  // Look at rechit checks
1494  {
1495  if (present_rechit[eta][phi][depth]==0)
1496  {
1497  if (subdet==HcalBarrel) ++energyneverpresentHB;
1498  else if (subdet==HcalEndcap) ++energyneverpresentHE;
1499  else if (subdet==HcalOuter)
1500  {
1501  ++energyneverpresentHO;
1502  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1503  --energyneverpresentHO;
1504  }
1505  else if (subdet==HcalForward) ++energyneverpresentHF;
1506  }
1508  {
1509  HcalDetId TempID((HcalSubdetector)subdet, ieta, iphi, (int)depth+1);
1510  if (subdet==HcalBarrel) ++belowenergyHB;
1511  else if (subdet==HcalEndcap) ++belowenergyHE;
1512  else if (subdet==HcalOuter)
1513  {
1514  ++belowenergyHO;
1515  if (excludeHORing2_==true && abs(ieta)>10 && isSiPM(ieta,iphi,depth+1)==false)
1516  --belowenergyHO;
1517  if (KnownBadCells_.find(TempID.rawId())!=KnownBadCells_.end() && abs(ieta)<=10)
1518  --belowenergyHO;
1519  }
1520  else if (subdet==HcalForward) ++belowenergyHF;
1521  }
1522  }
1523  } // subdet loop
1524  } // phi loop
1525  } //eta loop
1526  } // depth loop
1527 
1528  // Fill with number of problem cells found on this pass
1529  NumberOfNeverPresentDigisHB->Fill(currentLS,neverpresentHB);
1530  NumberOfNeverPresentDigisHE->Fill(currentLS,neverpresentHE);
1531  NumberOfNeverPresentDigisHO->Fill(currentLS,neverpresentHO);
1532  NumberOfNeverPresentDigisHF->Fill(currentLS,neverpresentHF);
1533  NumberOfNeverPresentDigis->Fill(currentLS,neverpresentHB+neverpresentHE+neverpresentHO+neverpresentHF);
1534 
1536  {
1537  if( NumBadHB<RBX_loss_HB )
1538  NumBadHB+=RBX_loss_HB;
1539  if( NumBadHE<RBX_loss_HE )
1540  NumBadHE+=RBX_loss_HE;
1541  if( NumBadHO01<RBX_loss_HO01 )
1542  NumBadHO01+=RBX_loss_HO01;
1543  if( NumBadHO2<RBX_loss_HO2 )
1544  NumBadHO2+=RBX_loss_HO2;
1545  if( NumBadHF<RBX_loss_HF )
1546  NumBadHF+=RBX_loss_HF;
1547 
1548  if( belowenergyHB<RBX_loss_HB )
1549  belowenergyHB+=RBX_loss_HB;
1550  if( belowenergyHE<RBX_loss_HE )
1551  belowenergyHE+=RBX_loss_HE;
1552  if( belowenergyHO<RBX_loss_HO01+RBX_loss_HO2)
1553  belowenergyHO+=RBX_loss_HO01+RBX_loss_HO2;
1554  if( belowenergyHF<RBX_loss_HF )
1555  belowenergyHF+=RBX_loss_HF;
1556 
1557  if( unoccupiedHB<RBX_loss_HB )
1558  unoccupiedHB+=RBX_loss_HB;
1559  if( unoccupiedHE<RBX_loss_HE )
1560  unoccupiedHE+=RBX_loss_HE;
1561  if( unoccupiedHO<RBX_loss_HO01+RBX_loss_HO2 )
1562  unoccupiedHO+=RBX_loss_HO01+RBX_loss_HO2;
1563  if( unoccupiedHF<RBX_loss_HF )
1564  unoccupiedHF+=RBX_loss_HF;
1565 
1566  // is_RBX_loss_ = 0;
1567  }
1568 
1569  ProblemsVsLB_HB->Fill(currentLS,NumBadHB-knownBadHB+0.0001); // add a small offset, so that the histograms reset when no errors follow
1570  ProblemsVsLB_HE->Fill(currentLS,NumBadHE-knownBadHE+0.0001); // problematic LSs
1571  ProblemsVsLB_HO->Fill(currentLS,NumBadHO01-knownBadHO01+0.0001);
1572  ProblemsVsLB_HO2->Fill(currentLS,NumBadHO2-knownBadHO2+0.0001);
1573  ProblemsVsLB_HF->Fill(currentLS,NumBadHF-knownBadHF+0.0001);
1574  ProblemsVsLB_HBHEHF->Fill(currentLS,NumBadHB+NumBadHE+NumBadHF-knownBadHB-knownBadHE-knownBadHF+0.0001);
1575  ProblemsVsLB->Fill(currentLS,NumBadHB+NumBadHE+NumBadHO01+NumBadHO2+NumBadHF-knownBadHB-knownBadHE-knownBadHO01-knownBadHO2-knownBadHF+0.0001);
1576 
1577  if(excludeHO1P02_==true)
1579 
1580  if( NumBadHB+NumBadHE+NumBadHF-knownBadHB-knownBadHE-knownBadHF < 30 )
1581  alarmer_counter_ = 0;
1582  if( NumBadHO01-knownBadHO01 < 30 )
1584 
1585  if( alarmer_counter_ >= 10 )
1586  ProblemsInLastNLB_HBHEHF_alarm->Fill( std::min(int(NumBadHB+NumBadHE+NumBadHF-knownBadHB-knownBadHE-knownBadHF), 99) );
1587  if( alarmer_counterHO01_ >= 10 )
1588  ProblemsInLastNLB_HO01_alarm->Fill( std::min(int(NumBadHO01-knownBadHO01), 99) );
1589 
1590  // if (deadevt_<minDeadEventCount_)
1591  // return;
1592 
1593  if (deadmon_test_digis_)
1594  {
1599  NumberOfRecentMissingDigis->Fill(currentLS,unoccupiedHB+unoccupiedHE+unoccupiedHO+unoccupiedHF);
1600  }
1601 
1603  {
1604  NumberOfNeverPresentRecHitsHB->Fill(currentLS,energyneverpresentHB);
1605  NumberOfNeverPresentRecHitsHE->Fill(currentLS,energyneverpresentHE);
1606  NumberOfNeverPresentRecHitsHO->Fill(currentLS,energyneverpresentHO);
1607  NumberOfNeverPresentRecHitsHF->Fill(currentLS,energyneverpresentHF);
1608  NumberOfNeverPresentRecHits->Fill(currentLS,energyneverpresentHB+energyneverpresentHE+energyneverpresentHO+energyneverpresentHF);
1609 
1614  NumberOfRecentMissingRecHits->Fill(currentLS,belowenergyHB+belowenergyHE+belowenergyHO+belowenergyHF);
1615  }
1616 
1617  return;
1618 } // void HcalDeadCellMonitor::fillNevents_problemCells(void)
1619 
1620 
1621 void HcalDeadCellMonitor::zeroCounters(bool resetpresent)
1622 {
1623 
1624  // zero all counters
1625 
1626  // 2D histogram counters
1627  for (unsigned int i=0;i<85;++i)
1628  {
1629  for (unsigned int j=0;j<72;++j)
1630  {
1631  for (unsigned int k=0;k<4;++k)
1632  {
1633  if (resetpresent) present_digi[i][j][k]=false; // keeps track of whether digi was ever present
1634  if (resetpresent) present_rechit[i][j][k]=false;
1635  recentoccupancy_digi[i][j][k]=0; // counts occupancy in last (checkNevents) events
1636  recentoccupancy_rechit[i][j][k]=0; // counts instances of cell above threshold energy in last (checkNevents)
1637  }
1638  }
1639  }
1640 
1641  for (unsigned int i=0;i<156;++i)
1642  {
1643  occupancy_RBX[i] = 0;
1644  rbxlost[i] = 0;
1645  }
1646 
1647  return;
1648 } // void HcalDeadCellMonitor::zeroCounters(bool resetpresent)
1649 
edm::InputTag hfRechitLabel_
void beginRun(const edm::Run &run, const edm::EventSetup &c)
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
MonitorElement * NumberOfNeverPresentRecHitsHO
bool LumiInOrder(int lumisec)
MonitorElement * NumberOfRecentMissingRecHitsHF
MonitorElement * NumberOfNeverPresentRecHits
void setBinContent(int binx, double content)
set content of bin (1-D)
MonitorElement * ProblemsCurrentLB
MonitorElement * NumberOfNeverPresentDigisHB
const int binmapd2[]
void analyze(edm::Event const &e, edm::EventSetup const &s)
virtual void analyze(const edm::Event &e, const edm::EventSetup &c)
MonitorElement * HEDeadVsEvent
MonitorElement * NumberOfRecentMissingRecHits
MonitorElement * book1D(const char *name, const char *title, int nchX, double lowX, double highX)
Book 1D histogram.
Definition: DQMStore.cc:964
void zeroCounters(bool resetpresent=false)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
bool present_digi[85][72][4]
edm::InputTag hbheRechitLabel_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::map< unsigned int, int > KnownBadCells_
MonitorElement * NumberOfNeverPresentDigisHE
std::vector< int > AllowedCalibTypes_
void endRun(const edm::Run &run, const edm::EventSetup &c)
void Reset(void)
std::vector< HBHEDataFrame >::const_iterator const_iterator
HcalDeadCellMonitor(const edm::ParameterSet &ps)
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)
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:59
MonitorElement * NumberOfRecentMissingDigisHB
const Item * getValues(DetId fId, bool throwOnFail=true) const
int zside(DetId const &)
void update(void)
Mark the object updated.
void process_RecHit(T &rechit)
T eta() const
MonitorElement * ProblemsInLastNLB_HO01_alarm
MonitorElement * NumberOfRecentMissingDigisHE
bool present_rechit[85][72][4]
edm::EDGetTokenT< HORecHitCollection > tok_ho_
MonitorElement * bookFloat(const char *name)
Book float.
Definition: DQMStore.cc:901
void Fill(long long x)
LuminosityBlockNumber_t luminosityBlock() const
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
edm::EDGetTokenT< DcsStatusCollection > tok_dcs_
bool isSiPM(int ieta, int iphi, int depth)
EtaPhiHists RecHitPresentByDepth
MonitorElement * RBX_loss_VS_LB
std::vector< MonitorElement * > depth
virtual void beginRun(const edm::Run &run, const edm::EventSetup &c)
int CalcIeta(int subdet, int eta, int depth)
MonitorElement * ProblemsVsLB
void removeContents(void)
erase all monitoring elements in current directory (not including subfolders);
Definition: DQMStore.cc:3151
MonitorElement * NumberOfNeverPresentDigisHF
MonitorElement * ProblemsVsLB_HBHEHF
edm::InputTag hoRechitLabel_
std::vector< DetId > getAllChannels() const
unsigned int occupancy_RBX[156]
HcalLogicalMap * logicalMap_
MonitorElement * NumberOfNeverPresentDigisHO
int ieta() const
get the cell ieta
Definition: HcalDetId.h:36
MonitorElement * NumberOfNeverPresentRecHitsHB
HcalSubdetector
Definition: HcalAssistant.h:31
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
MonitorElement * Nevents
MonitorElement * bookProfile(const char *name, const char *title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, const char *option="s")
Definition: DQMStore.cc:1278
unsigned int recentoccupancy_rechit[85][72][4]
MonitorElement * NumberOfRecentMissingRecHitsHE
MonitorElement * ProblemsVsLB_HF
MonitorElement * NumberOfRecentMissingDigisHO
bool isValid() const
Definition: HandleBase.h:76
MonitorElement * NumberOfNeverPresentRecHitsHF
edm::EDGetTokenT< HODigiCollection > tok_hodigi_
MonitorElement * ProblemsVsLB_HB
int k[5][pyjets_maxn]
const cms_uint32_t totalIntensityBeam2() const
const_iterator end() const
const HcalFrontEndId getHcalFrontEndId(const DetId &)
edm::EDGetTokenT< HFRecHitCollection > tok_hf_
const cms_uint32_t totalIntensityBeam1() const
unsigned int recentoccupancy_digi[85][72][4]
void processEvent(const HBHERecHitCollection &hbHits, const HORecHitCollection &hoHits, const HFRecHitCollection &hfHits, const HBHEDigiCollection &hbhedigi, const HODigiCollection &hodigi, const HFDigiCollection &hfdigi)
EtaPhiHists RecentMissingDigisByDepth
edm::EDGetTokenT< HFDigiCollection > tok_hfdigi_
T const * product() const
Definition: Handle.h:81
edm::EDGetTokenT< HBHEDigiCollection > tok_hbhedigi_
MonitorElement * NumberOfRecentMissingRecHitsHO
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:86
EtaPhiHists DigiPresentByDepth
int rbxIndex() const
virtual void reset(void)
void FillUnphysicalHEHFBins(std::vector< TH2F > &hh)
EtaPhiHists RecentMissingRecHitsByDepth
int CalcEtaBin(int subdet, int ieta, int depth)
void SetupEtaPhiHists(EtaPhiHists &hh, std::string Name, std::string Units)
MonitorElement * HBDeadVsEvent
MonitorElement * NumberOfNeverPresentRecHitsHE
TString units(TString variable, Char_t axis)
MonitorElement * ProblemsVsLB_HE
TProfile * getTProfile(void) const
edm::EDGetTokenT< HBHERecHitCollection > tok_hbhe_
MonitorElement * NumberOfNeverPresentDigis
MonitorElement * NumberOfRecentMissingDigis
const JetExtendedData & getValue(const Container &, const reco::JetBaseRef &)
get value for the association. Throw exception if no association found
void endLuminosityBlock(const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &c)
MonitorElement * NumberOfRecentMissingDigisHF
tuple cout
Definition: gather_cfg.py:121
void process_Digi(T &digi)
void processEvent_HBHEdigi(HBHEDataFrame digi)
tuple status
Definition: ntuplemaker.py:245
MonitorElement * bookInt(const char *name)
Book int.
Definition: DQMStore.cc:871
MonitorElement * ProblemsInLastNLB_HBHEHF_alarm
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:1092
virtual void setup(void)
edm::EDGetTokenT< L1GlobalTriggerEvmReadoutRecord > tok_gtEvm_
MonitorElement * HFDeadVsEvent
void Reset(void)
reset ME (ie. contents, errors, etc)
const cms_uint16_t beamMode() const
MonitorElement * ProblemsVsLB_HO2
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:677
MonitorElement * HODeadVsEvent
const_iterator begin() const
Definition: Run.h:41
bool validDetId(HcalSubdetector sd, int ies, int ip, int dp)
MonitorElement * NumberOfRecentMissingRecHitsHB
MonitorElement * ProblemsVsLB_HO
Definition: DDAxes.h:10