Belle II Software  release-08-00-04
KLMDQMModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 /* Own header. */
10 #include <klm/modules/KLMDQM/KLMDQMModule.h>
11 
12 /* KLM headers. */
13 #include <klm/dataobjects/KLMChannelIndex.h>
14 #include <klm/dataobjects/KLMDigitRaw.h>
15 
16 /* ROOT headers. */
17 #include <TDirectory.h>
18 
19 using namespace Belle2;
20 
21 REG_MODULE(KLMDQM);
22 
24  HistoModule(),
25  m_DAQInclusion{nullptr},
26  m_TimeRPC{nullptr},
27  m_TimeScintillatorBKLM{nullptr},
28  m_TimeScintillatorEKLM{nullptr},
29  m_PlaneBKLMPhi{nullptr},
30  m_PlaneBKLMZ{nullptr},
31  m_PlaneEKLM{nullptr},
32  m_MaskedChannelsPerSector{nullptr},
33  m_DigitsKLM{nullptr},
34  m_DigitsRPC{nullptr},
35  m_DigitsScintillatorBKLM{nullptr},
36  m_DigitsScintillatorEKLM{nullptr},
37  m_DigitsMultiStripBKLM{nullptr},
38  m_DigitsMultiStripEKLM{nullptr},
39  m_TriggerBitsBKLM{nullptr},
40  m_TriggerBitsEKLM{nullptr},
41  m_DigitsAfterLERInj{nullptr},
42  m_TriggersLERInj{nullptr},
43  m_DigitsAfterHERInj{nullptr},
44  m_TriggersHERInj{nullptr},
45  m_ChannelArrayIndex{&(KLMChannelArrayIndex::Instance())},
46  m_SectorArrayIndex{&(KLMSectorArrayIndex::Instance())},
47  m_ElementNumbers{&(KLMElementNumbers::Instance())},
48  m_eklmElementNumbers{&(EKLMElementNumbers::Instance())}
49 {
50  setDescription("KLM data quality monitor.");
52  addParam("histogramDirectoryName", m_HistogramDirectoryName,
53  "Directory for KLM DQM histograms in ROOT file.",
54  std::string("KLM"));
55 }
56 
58 {
60  for (KLMChannelIndex& klmSector : klmIndex) {
61  KLMSectorNumber sector = klmSector.getKLMSectorNumber();
62  KLMSectorNumber sectorIndex = m_SectorArrayIndex->getIndex(sector);
63  if (m_ChannelHits[sectorIndex] != nullptr)
64  delete[] m_ChannelHits[sectorIndex];
65  }
67  for (KLMChannelIndex& klmSection : klmIndex) {
68  KLMSubdetectorNumber subdetector = klmSection.getSubdetector();
69  if (subdetector == KLMElementNumbers::c_EKLM) {
70  KLMSectionNumber section = klmSection.getSection();
71  if (m_Spatial2DHitsEKLM[section - 1] != nullptr)
72  delete[] m_Spatial2DHitsEKLM[section - 1];
73  }
74  }
75 }
76 
78 {
79  TDirectory* oldDirectory, *newDirectory;
80  oldDirectory = gDirectory;
81  newDirectory = oldDirectory->mkdir(m_HistogramDirectoryName.c_str());
82  newDirectory->cd();
83  /* DAQ inclusion. */
84  m_DAQInclusion = new TH1F("daq_inclusion", "Is KLM included in DAQ?", 2, 0.0, 2.0);
85  m_DAQInclusion->GetXaxis()->SetBinLabel(1, "No");
86  m_DAQInclusion->GetXaxis()->SetBinLabel(2, "Yes");
87  /* Time histograms. */
88  m_TimeRPC = new TH1F("time_rpc", "RPC hit time", 128, -1223.5, -199.5);
89  m_TimeRPC->GetXaxis()->SetTitle("Time, ns");
91  new TH1F("time_scintillator_bklm", "Scintillator hit time (BKLM)",
92  100, -5000, -4000);
93  m_TimeScintillatorBKLM->GetXaxis()->SetTitle("Time, ns");
95  new TH1F("time_scintillator_eklm", "Scintillator hit time (EKLM)",
96  100, -5100, -4100);
97  m_TimeScintillatorEKLM->GetXaxis()->SetTitle("Time, ns");
98  /* Number of hits per plane. */
99  m_PlaneBKLMPhi = new TH1F("plane_bklm_phi",
100  "BKLM plane occupancy (#phi readout)",
101  240, 0.5, 240.5);
102  m_PlaneBKLMPhi->GetXaxis()->SetTitle("Layer number");
103  m_PlaneBKLMZ = new TH1F("plane_bklm_z",
104  "BKLM plane occupancy (z readout)",
105  240, 0.5, 240.5);
106  m_PlaneBKLMZ->GetXaxis()->SetTitle("Layer number");
107  m_PlaneEKLM = new TH1F("plane_eklm", "EKLM plane occupancy (both readouts)", 208, 0.5, 208.5);
108  m_PlaneEKLM->GetXaxis()->SetTitle("Plane number");
109  /* Number of hits per channel. */
110  int nChannelHistograms =
115  KLMChannelNumber* firstChannelNumbers =
116  new KLMChannelNumber[nChannelHistograms + 1];
117  int i = 0;
119  for (KLMChannelIndex& klmSector : klmIndex) {
120  KLMChannelIndex klmChannel(klmSector);
122  KLMChannelNumber channel = klmChannel.getKLMChannelNumber();
123  firstChannelNumbers[i] = m_ChannelArrayIndex->getIndex(channel);
124  if (klmSector.getSubdetector() == KLMElementNumbers::c_BKLM) {
126  klmChannel.getSection(), klmChannel.getSector(), 8, 0, 1);
127  firstChannelNumbers[i + 1] = m_ChannelArrayIndex->getIndex(channel);
128  i += 2;
129  } else {
130  int layerIncrease = (klmSector.getSection() == 1) ? 4 : 5;
132  klmChannel.getSection(), klmChannel.getSector(),
133  1 + layerIncrease, 1, 1);
134  firstChannelNumbers[i + 1] = m_ChannelArrayIndex->getIndex(channel);
136  klmChannel.getSection(), klmChannel.getSector(),
137  1 + layerIncrease * 2, 1, 1);
138  firstChannelNumbers[i + 2] = m_ChannelArrayIndex->getIndex(channel);
139  i += 3;
140  }
141  }
142  firstChannelNumbers[nChannelHistograms] = m_ChannelArrayIndex->getNElements();
143  i = 0;
145  for (KLMChannelIndex& klmSector : klmIndex) {
146  int nHistograms;
147  if (klmSector.getSubdetector() == KLMElementNumbers::c_BKLM)
148  nHistograms = m_ChannelHitHistogramsBKLM;
149  else
150  nHistograms = m_ChannelHitHistogramsEKLM;
151  KLMSectorNumber sector = klmSector.getKLMSectorNumber();
152  KLMSectorNumber sectorIndex = m_SectorArrayIndex->getIndex(sector);
153  m_ChannelHits[sectorIndex] = new TH1F*[nHistograms];
154  for (int j = 0; j < nHistograms; j++) {
155  std::string name =
156  "strip_hits_subdetector_" + std::to_string(klmSector.getSubdetector()) +
157  "_section_" + std::to_string(klmSector.getSection()) +
158  "_sector_" + std::to_string(klmSector.getSector()) +
159  "_" + std::to_string(j);
160  std::string title = "Sector " + std::to_string(klmSector.getSector()) + " -- " +
161  m_ElementNumbers->getSectorDAQName(klmSector.getSubdetector(), klmSector.getSection(), klmSector.getSector());
162  m_ChannelHits[sectorIndex][j] = new TH1F(
163  name.c_str(), title.c_str(),
164  firstChannelNumbers[i + 1] - firstChannelNumbers[i],
165  firstChannelNumbers[i] - 0.5, firstChannelNumbers[i + 1] - 0.5);
166  i++;
167  }
168  }
169  delete[] firstChannelNumbers;
170  /* Masked channels per sector:
171  * it is defined here, but filled by the analysis module. */
173  m_MaskedChannelsPerSector = new TH1F("masked_channels", "Number of masked channels per sector",
174  totalSectors, -0.5, totalSectors - 0.5);
176  for (KLMChannelIndex& klmSector : klmIndex) {
177  std::string label = m_ElementNumbers->getSectorDAQName(klmSector.getSubdetector(), klmSector.getSection(), klmSector.getSector());
178  KLMSectorNumber sector = klmSector.getKLMSectorNumber();
179  KLMSectorNumber sectorIndex = m_SectorArrayIndex->getIndex(sector);
180  m_MaskedChannelsPerSector->GetXaxis()->SetBinLabel(sectorIndex + 1, label.c_str());
181  }
182  /* Number of digits. */
183  m_DigitsKLM = new TH1F("digits_klm", "Number of KLM digits",
184  250.0, 0.0, 250.0);
185  m_DigitsKLM->GetXaxis()->SetTitle("Number of digits");
186  m_DigitsRPC = new TH1F("digits_rpc", "Number of RPC digits",
187  250.0, 0.0, 250.0);
188  m_DigitsRPC->GetXaxis()->SetTitle("Number of digits");
189  m_DigitsScintillatorBKLM = new TH1F("digits_scintillator_bklm", "Number of scintillator digits (BKLM)",
190  250.0, 0.0, 250.0);
191  m_DigitsScintillatorBKLM->GetXaxis()->SetTitle("Number of digits");
192  m_DigitsScintillatorEKLM = new TH1F("digits_scintillator_eklm", "Number of scintillator digits (EKLM)",
193  250.0, 0.0, 250.0);
194  m_DigitsScintillatorEKLM->GetXaxis()->SetTitle("Number of digits");
195  m_DigitsMultiStripBKLM = new TH1F("digits_multi_bklm", "Number of multi-strip digits (BKLM)",
196  50.0, 0.0, 50.0);
197  m_DigitsMultiStripBKLM->GetXaxis()->SetTitle("Number of multi-strip digits");
198  m_DigitsMultiStripEKLM = new TH1F("digits_multi_eklm", "Number of multi-strip digits (EKLM)",
199  50.0, 0.0, 50.0);
200  m_DigitsMultiStripEKLM->GetXaxis()->SetTitle("Number of multi-strip digits");
201  /* Trigger bits. */
202  m_TriggerBitsBKLM = new TH1F("trigger_bits_bklm", "Trigger bits of multi-strip digits (BKLM)",
203  (double)c_0x1, (double)c_0x8, (double)c_0x1 + 1.0);
204  m_TriggerBitsBKLM->GetXaxis()->SetBinLabel(c_0x8, "0x8");
205  m_TriggerBitsBKLM->GetXaxis()->SetBinLabel(c_0x4, "0x4");
206  m_TriggerBitsBKLM->GetXaxis()->SetBinLabel(c_0x2, "0x2");
207  m_TriggerBitsBKLM->GetXaxis()->SetBinLabel(c_0x1, "0x1");
208  m_TriggerBitsEKLM = new TH1F("trigger_bits_eklm", "Trigger bits of multi-strip digits (EKLM)",
209  (double)c_0x1, (double)c_0x8, (double)c_0x1 + 1.0);
210  m_TriggerBitsEKLM->GetXaxis()->SetBinLabel(c_0x8, "0x8");
211  m_TriggerBitsEKLM->GetXaxis()->SetBinLabel(c_0x4, "0x4");
212  m_TriggerBitsEKLM->GetXaxis()->SetBinLabel(c_0x2, "0x2");
213  m_TriggerBitsEKLM->GetXaxis()->SetBinLabel(c_0x1, "0x1");
214  /* Number of digits after injection */
215  /* For the histograms below, we use the same style as for other subdetectors. */
216  m_DigitsAfterLERInj = new TH1F("KLMOccInjLER", "KLM digits after LER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
217  4000, 0, 20000);
218  m_TriggersLERInj = new TH1F("KLMTrigInjLER", "Triggers after KER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
219  4000, 0, 20000);
220  m_DigitsAfterHERInj = new TH1F("KLMOccInjHER", "KLM digits after HER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
221  4000, 0, 20000);
222  m_TriggersHERInj = new TH1F("KLMTrigInjHER", "Triggers after HER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
223  4000, 0, 20000);
224  /* Spatial distribution of EKLM 2d hits per layer. */
226  for (KLMChannelIndex& klmSection : klmIndex) {
227  KLMSubdetectorNumber subdetector = klmSection.getSubdetector();
228  if (subdetector == KLMElementNumbers::c_EKLM) {
229  KLMSectionNumber section = klmSection.getSection();
230  int maximalLayerNumber = m_eklmElementNumbers->getMaximalDetectorLayerNumber(section);
231  m_Spatial2DHitsEKLM[section - 1] = new TH2F*[maximalLayerNumber];
232  std::string sectionName = (section == EKLMElementNumbers::c_ForwardSection) ? "Forward" : "Backward";
233  for (int j = 1; j <= maximalLayerNumber; ++j) {
234  std::string name = "spatial_2d_hits_subdetector_" + std::to_string(subdetector) +
235  "_section_" + std::to_string(section) +
236  "_layer_" + std::to_string(j);
237  std::string title = "Endcap " + sectionName + " , Layer " + std::to_string(j);
238  /* Use bins with a size of 10 cm per side. */
239  m_Spatial2DHitsEKLM[section - 1][j - 1] = new TH2F(name.c_str(), title.c_str(),
240  340 * 2 / 10, -340, 340,
241  340 * 2 / 10, -340, 340);
242  m_Spatial2DHitsEKLM[section - 1][j - 1]->GetXaxis()->SetTitle("X coordinate [cm]");
243  m_Spatial2DHitsEKLM[section - 1][j - 1]->GetYaxis()->SetTitle("Y coordinate [cm]");
244  }
245  }
246  }
247  oldDirectory->cd();
248 }
249 
251 {
252  REG_HISTOGRAM;
253  m_RawFtsws.isOptional();
254  m_RawKlms.isOptional();
255  m_Digits.isOptional();
256  m_BklmHit1ds.isOptional();
257  m_Hit2ds.isOptional();
258 }
259 
261 {
262  /* DAQ inclusion. */
263  m_DAQInclusion->Reset();
264  if (m_RawKlms.isValid())
265  m_DAQInclusion->Fill("Yes", 1);
266  else
267  m_DAQInclusion->Fill("No", 1);
268  /* Time. */
269  m_TimeRPC->Reset();
270  m_TimeScintillatorBKLM->Reset();
271  m_TimeScintillatorEKLM->Reset();
272  /* Plane hits. */
273  m_PlaneEKLM->Reset();
274  m_PlaneBKLMPhi->Reset();
275  m_PlaneBKLMZ->Reset();
276  /* Channel hits. */
278  for (KLMChannelIndex& klmSector : klmIndex) {
279  int nHistograms;
280  if (klmSector.getSubdetector() == KLMElementNumbers::c_BKLM)
281  nHistograms = m_ChannelHitHistogramsBKLM;
282  else
283  nHistograms = m_ChannelHitHistogramsEKLM;
284  KLMSectorNumber sector = klmSector.getKLMSectorNumber();
285  KLMSectorNumber sectorIndex = m_SectorArrayIndex->getIndex(sector);
286  for (int j = 0; j < nHistograms; j++)
287  m_ChannelHits[sectorIndex][j]->Reset();
288  }
289  /* Digits. */
290  m_DigitsKLM->Reset();
291  m_DigitsRPC->Reset();
292  m_DigitsScintillatorBKLM->Reset();
293  m_DigitsScintillatorEKLM->Reset();
294  m_DigitsMultiStripBKLM->Reset();
295  m_DigitsMultiStripEKLM->Reset();
296  /* Trigger bits. */
297  m_TriggerBitsBKLM->Reset();
298  m_TriggerBitsEKLM->Reset();
299  /* Injection information. */
300  m_DigitsAfterLERInj->Reset();
301  m_TriggersLERInj->Reset();
302  m_DigitsAfterHERInj->Reset();
303  m_TriggersHERInj->Reset();
304  /* Spatial 2D hits distributions. */
306  for (KLMChannelIndex& klmSection : klmIndex) {
307  KLMSubdetectorNumber subdetector = klmSection.getSubdetector();
308  if (subdetector == KLMElementNumbers::c_EKLM) {
309  KLMSectionNumber section = klmSection.getSection();
310  int maximalLayerNumber =
312  for (int j = 1; j <= maximalLayerNumber; ++j)
313  m_Spatial2DHitsEKLM[section - 1][j - 1]->Reset();
314  }
315  }
316 }
317 
319 {
320  int nDigits = m_Digits.getEntries();
321  int nDigitsRPC = 0, nDigitsScintillatorBKLM = 0, nDigitsScintillatorEKLM = 0;
322  int nDigitsMultiStripBKLM = 0, nDigitsMultiStripEKLM = 0;
323  for (const KLMDigit& digit : m_Digits) {
324  /*
325  * Reject digits that are below the threshold (such digits may appear
326  * for simulated events).
327  */
328  if (!digit.isGood())
329  continue;
330  if (digit.getSubdetector() == KLMElementNumbers::c_EKLM) {
331  nDigitsScintillatorEKLM++;
332  int section = digit.getSection();
333  int sector = digit.getSector();
334  int layer = digit.getLayer();
335  int plane = digit.getPlane();
336  int strip = digit.getStrip();
337  if (not digit.isMultiStrip()) {
338  KLMSectorNumber klmSector = m_ElementNumbers->sectorNumberEKLM(section, sector);
339  KLMSectorNumber klmSectorIndex = m_SectorArrayIndex->getIndex(klmSector);
340  KLMChannelNumber channel = m_ElementNumbers->channelNumberEKLM(section, sector, layer, plane, strip);
341  KLMChannelNumber channelIndex = m_ChannelArrayIndex->getIndex(channel);
342  for (int j = 0; j < m_ChannelHitHistogramsEKLM; j++) {
343  double xMin = m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
344  double xMax = m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
345  if ((xMin > channelIndex) || (xMax < channelIndex))
346  continue;
347  m_ChannelHits[klmSectorIndex][j]->Fill(channelIndex);
348  }
349  } else
350  nDigitsMultiStripEKLM++;
351  int planeGlobal = m_eklmElementNumbers->planeNumber(section, layer, sector, plane);
352  m_PlaneEKLM->Fill(planeGlobal);
353  m_TimeScintillatorEKLM->Fill(digit.getTime());
354  if (digit.isMultiStrip()) {
355  KLMDigitRaw* digitRaw = digit.getRelated<KLMDigitRaw>();
356  if (digitRaw) {
357  uint16_t triggerBits = digitRaw->getTriggerBits();
358  if ((triggerBits & 0x1) != 0)
359  m_TriggerBitsEKLM->Fill(c_0x1);
360  if ((triggerBits & 0x2) != 0)
361  m_TriggerBitsEKLM->Fill(c_0x2);
362  if ((triggerBits & 0x4) != 0)
363  m_TriggerBitsEKLM->Fill(c_0x4);
364  if ((triggerBits & 0x8) != 0)
365  m_TriggerBitsEKLM->Fill(c_0x8);
366  }
367  }
368  } else if (digit.getSubdetector() == KLMElementNumbers::c_BKLM) {
369  int section = digit.getSection();
370  int sector = digit.getSector();
371  int layer = digit.getLayer();
372  int plane = digit.getPlane();
373  int strip = digit.getStrip();
374  if (not digit.isMultiStrip()) {
375  KLMSectorNumber klmSector = m_ElementNumbers->sectorNumberBKLM(section, sector);
376  KLMSectorNumber klmSectorIndex = m_SectorArrayIndex->getIndex(klmSector);
377  KLMChannelNumber channel = m_ElementNumbers->channelNumberBKLM(section, sector, layer, plane, strip);
378  KLMChannelNumber channelIndex = m_ChannelArrayIndex->getIndex(channel);
379  for (int j = 0; j < m_ChannelHitHistogramsBKLM; j++) {
380  double xMin = m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
381  double xMax = m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
382  if ((xMin > channelIndex) || (xMax < channelIndex))
383  continue;
384  m_ChannelHits[klmSectorIndex][j]->Fill(channelIndex);
385  }
386  } else
387  nDigitsMultiStripBKLM++;
388  if (digit.inRPC()) {
389  nDigitsRPC++;
390  m_TimeRPC->Fill(digit.getTime());
391  } else {
392  nDigitsScintillatorBKLM++;
393  m_TimeScintillatorBKLM->Fill(digit.getTime());
394  }
395  if (digit.isMultiStrip()) {
396  KLMDigitRaw* digitRaw = digit.getRelated<KLMDigitRaw>();
397  if (digitRaw) {
398  uint16_t triggerBits = digitRaw->getTriggerBits();
399  if ((triggerBits & 0x1) != 0)
400  m_TriggerBitsBKLM->Fill(c_0x1);
401  if ((triggerBits & 0x2) != 0)
402  m_TriggerBitsBKLM->Fill(c_0x2);
403  if ((triggerBits & 0x4) != 0)
404  m_TriggerBitsBKLM->Fill(c_0x4);
405  if ((triggerBits & 0x8) != 0)
406  m_TriggerBitsBKLM->Fill(c_0x8);
407  }
408  }
409  } else
410  B2FATAL("Not a BKLM or a EKLM digit, something went really wrong.");
411  }
412  for (const BKLMHit1d& hit1d : m_BklmHit1ds) {
413  int section = hit1d.getSection();
414  int sector = hit1d.getSector();
415  int layer = hit1d.getLayer();
416  int layerGlobal = BKLMElementNumbers::layerGlobalNumber(
417  section, sector, layer);
418  if (hit1d.isPhiReadout())
419  m_PlaneBKLMPhi->Fill(layerGlobal);
420  else
421  m_PlaneBKLMZ->Fill(layerGlobal);
422  }
423  /* Digits. */
424  m_DigitsKLM->Fill((double)nDigits);
425  m_DigitsRPC->Fill((double)nDigitsRPC);
426  m_DigitsScintillatorBKLM->Fill((double)nDigitsScintillatorBKLM);
427  m_DigitsScintillatorEKLM->Fill((double)nDigitsScintillatorEKLM);
428  if (nDigitsMultiStripBKLM > 0)
429  m_DigitsMultiStripBKLM->Fill((double)nDigitsMultiStripBKLM);
430  if (nDigitsMultiStripEKLM > 0)
431  m_DigitsMultiStripEKLM->Fill((double)nDigitsMultiStripEKLM);
432  /* Injection information. */
433  for (RawFTSW& rawFtsw : m_RawFtsws) {
434  unsigned int difference = rawFtsw.GetTimeSinceLastInjection(0);
435  if (difference != 0x7FFFFFFF) {
436  /* 127 MHz clock ticks to us, inexact rounding. */
437  float differenceInUs = difference / 127.;
438  if (rawFtsw.GetIsHER(0)) {
439  m_DigitsAfterHERInj->Fill(differenceInUs, nDigits);
440  m_TriggersHERInj->Fill(differenceInUs);
441  } else {
442  m_DigitsAfterLERInj->Fill(differenceInUs, nDigits);
443  m_TriggersLERInj->Fill(differenceInUs);
444  }
445  }
446  /*
447  * Usually, only one RawFTSW object is stored per event.
448  * If there are more, ignore the others.
449  */
450  break;
451  }
452  /* Spatial 2D hits distributions. */
453  for (const KLMHit2d& hit2d : m_Hit2ds) {
454  if (hit2d.getSubdetector() != KLMElementNumbers::c_EKLM)
455  continue;
456  int section = hit2d.getSection();
457  int layer = hit2d.getLayer();
458  m_Spatial2DHitsEKLM[section - 1][layer - 1]->Fill(hit2d.getPositionX(), hit2d.getPositionY());
459  }
460 }
461 
463 {
464 }
465 
467 {
468 }
static constexpr int getMaximalSectorGlobalNumber()
Get maximal sector global number.
static int layerGlobalNumber(int section, int sector, int layer)
Get layer global number.
Store one reconstructed BKLM 1D hit as a ROOT object.
Definition: BKLMHit1d.h:30
EKLM element numbers.
int getMaximalDetectorLayerNumber(int section) const
Get maximal detector layer number.
int planeNumber(int section, int layer, int sector, int plane) const
Get plane number.
static constexpr int getMaximalSectorGlobalNumberKLMOrder()
Get maximal sector global number with KLM ordering (section, sector).
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
KLM channel array index.
KLM channel index.
int getSection() const
Get section.
int getSector() const
Get sector.
KLMChannelNumber getKLMChannelNumber() const
Get KLM channel number.
void setIndexLevel(enum IndexLevel indexLevel)
Set index level.
TH1F * m_DigitsMultiStripEKLM
Number of multi-strip digits: EKLM scintillators.
Definition: KLMDQMModule.h:160
StoreArray< RawFTSW > m_RawFtsws
Raw FTSW.
Definition: KLMDQMModule.h:196
const int m_ChannelHitHistogramsEKLM
Number of channel hit histograms per sector for EKLM.
Definition: KLMDQMModule.h:110
TH1F * m_PlaneBKLMPhi
Plane occupancy: BKLM, phi readout.
Definition: KLMDQMModule.h:128
TH1F * m_TriggerBitsBKLM
Trigger bits: BKLM scintillators.
Definition: KLMDQMModule.h:163
~KLMDQMModule()
Destructor.
Definition: KLMDQMModule.cc:57
TH1F * m_TimeScintillatorEKLM
Time: EKLM scintillators.
Definition: KLMDQMModule.h:125
StoreArray< KLMDigit > m_Digits
KLM digits.
Definition: KLMDQMModule.h:202
void initialize() override
Initializer.
TH1F * m_DigitsScintillatorEKLM
Number of digits: EKLM scintillators.
Definition: KLMDQMModule.h:154
TH1F ** m_ChannelHits[EKLMElementNumbers::getMaximalSectorGlobalNumberKLMOrder()+BKLMElementNumbers::getMaximalSectorGlobalNumber()]
Number of hits per channel.
Definition: KLMDQMModule.h:139
TH1F * m_TimeRPC
Time: BKLM RPCs.
Definition: KLMDQMModule.h:119
TH1F * m_DigitsKLM
Number of digits: whole KLM.
Definition: KLMDQMModule.h:145
void event() override
This method is called for each event.
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
Definition: KLMDQMModule.h:190
KLMDQMModule()
Constructor.
Definition: KLMDQMModule.cc:23
const int m_ChannelHitHistogramsBKLM
Number of channel hit histograms per sector for BKLM.
Definition: KLMDQMModule.h:107
TH1F * m_TriggerBitsEKLM
Trigger bits: EKLM scintillators.
Definition: KLMDQMModule.h:166
void endRun() override
This method is called if the current run ends.
const EKLMElementNumbers * m_eklmElementNumbers
Element numbers.
Definition: KLMDQMModule.h:193
void terminate() override
This method is called at the end of the event processing.
TH1F * m_PlaneBKLMZ
Plane occupancy: BKLM, z readout.
Definition: KLMDQMModule.h:131
TH1F * m_TimeScintillatorBKLM
Time: BKLM scintillators.
Definition: KLMDQMModule.h:122
TH1F * m_DigitsRPC
Number of digits: BKLM RPCs.
Definition: KLMDQMModule.h:148
TH1F * m_TriggersHERInj
Histogram to be used for normalization of occupancy after HER injection.
Definition: KLMDQMModule.h:178
void beginRun() override
Called when entering a new run.
TH1F * m_DigitsAfterHERInj
Number of KLM Digits after LER injection.
Definition: KLMDQMModule.h:175
TH1F * m_DigitsScintillatorBKLM
Number of digits: BKLM scintillators.
Definition: KLMDQMModule.h:151
TH1F * m_TriggersLERInj
Histogram to be used for normalization of occupancy after LER injection.
Definition: KLMDQMModule.h:172
TH1F * m_DigitsMultiStripBKLM
Number of multi-strip digits: BKLM scintillators.
Definition: KLMDQMModule.h:157
const KLMSectorArrayIndex * m_SectorArrayIndex
KLM sector array index.
Definition: KLMDQMModule.h:187
StoreArray< BKLMHit1d > m_BklmHit1ds
BKLM 1d hits.
Definition: KLMDQMModule.h:205
TH1F * m_DigitsAfterLERInj
Number of KLM Digits after LER injection.
Definition: KLMDQMModule.h:169
TH1F * m_DAQInclusion
KLM DAQ inclusion.
Definition: KLMDQMModule.h:116
StoreArray< RawKLM > m_RawKlms
Raw KLM.
Definition: KLMDQMModule.h:199
TH1F * m_PlaneEKLM
Plane occupancy: EKLM.
Definition: KLMDQMModule.h:134
TH2F ** m_Spatial2DHitsEKLM[EKLMElementNumbers::getMaximalSectionNumber()]
Spatial distribution of EKLM 2d hits per layer.
Definition: KLMDQMModule.h:181
TH1F * m_MaskedChannelsPerSector
Masked channels per sector.
Definition: KLMDQMModule.h:142
const KLMChannelArrayIndex * m_ChannelArrayIndex
KLM channel array index.
Definition: KLMDQMModule.h:184
std::string m_HistogramDirectoryName
Directory for KLM DQM histograms in ROOT file.
Definition: KLMDQMModule.h:113
void defineHisto() override
Definition of the histograms.
Definition: KLMDQMModule.cc:77
StoreArray< KLMHit2d > m_Hit2ds
KLM 2d hits.
Definition: KLMDQMModule.h:208
Class to store the raw words from the unpacker, digit-by-digit.
Definition: KLMDigitRaw.h:29
uint16_t getTriggerBits()
Get trigger bits.
Definition: KLMDigitRaw.h:159
KLM digit (class representing a digitized hit in RPCs or scintillators).
Definition: KLMDigit.h:29
uint16_t getNElements() const
Get number of elements.
uint16_t getIndex(uint16_t number) const
Get element index.
KLM element numbers.
KLMSectorNumber sectorNumberEKLM(int section, int sector) const
Get sector number for EKLM.
KLMChannelNumber channelNumberBKLM(int section, int sector, int layer, int plane, int strip) const
Get channel number for BKLM.
KLMSectorNumber sectorNumberBKLM(int section, int sector) const
Get sector number for BKLM.
std::string getSectorDAQName(int subdetector, int section, int sector) const
Get DAQ name for a given sector.
KLMChannelNumber channelNumberEKLM(int section, int sector, int layer, int plane, int strip) const
Get channel number for EKLM.
KLM 2d hit.
Definition: KLMHit2d.h:33
KLM sector array index.
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
The Raw FTSW class.
Definition: RawFTSW.h:30
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
uint16_t KLMSectorNumber
Sector number.
uint16_t KLMChannelNumber
Channel number.
uint16_t KLMSubdetectorNumber
Subdetector number.
uint16_t KLMSectionNumber
Section number.
Abstract base class for different kinds of events.