12 #include <klm/modules/KLMDQM/KLMDQMModule.h>
15 #include <klm/dataobjects/KLMChannelIndex.h>
16 #include <klm/dataobjects/KLMDigitRaw.h>
19 #include <TDirectory.h>
27 m_DAQInclusion{
nullptr},
29 m_TimeScintillatorBKLM{
nullptr},
30 m_TimeScintillatorEKLM{
nullptr},
31 m_PlaneBKLMPhi{
nullptr},
32 m_PlaneBKLMZ{
nullptr},
34 m_MaskedChannelsPerSector{
nullptr},
37 m_DigitsScintillatorBKLM{
nullptr},
38 m_DigitsScintillatorEKLM{
nullptr},
39 m_DigitsMultiStripBKLM{
nullptr},
40 m_DigitsMultiStripEKLM{
nullptr},
41 m_TriggerBitsBKLM{
nullptr},
42 m_TriggerBitsEKLM{
nullptr},
43 m_KlmDigitsAfterLERInj{
nullptr},
44 m_TriggersLERInj{
nullptr},
45 m_KlmDigitsAfterHERInj{
nullptr},
46 m_TriggersHERInj{
nullptr},
52 setDescription(
"KLM data quality monitor.");
53 setPropertyFlags(c_ParallelProcessingCertified);
54 addParam(
"histogramDirectoryName", m_HistogramDirectoryName,
55 "Directory for KLM DQM histograms in ROOT file.",
63 uint16_t sector = klmSector.getKLMSectorNumber();
72 TDirectory* oldDirectory, *newDirectory;
73 oldDirectory = gDirectory;
77 m_DAQInclusion =
new TH1F(
"daq_inclusion",
"Is KLM included in DAQ?", 2, 0.0, 2.0);
82 m_TimeRPC =
new TH1F(
"time_rpc",
"RPC hit time", 128, -1023.5, 0.5);
83 m_TimeRPC->GetXaxis()->SetTitle(
"Time, ns");
86 new TH1F(
"time_scintillator_bklm",
"Scintillator hit time (BKLM)",
91 new TH1F(
"time_scintillator_eklm",
"Scintillator hit time (EKLM)",
97 "BKLM plane occupancy (#phi readout)",
102 "BKLM plane occupancy (z readout)",
106 m_PlaneEKLM =
new TH1F(
"plane_eklm",
"EKLM plane occupancy (both readouts)", 208, 0.5, 208.5);
110 int nChannelHistograms =
115 uint16_t* firstChannelNumbers =
new uint16_t[nChannelHistograms + 1];
129 int layerIncrease = (klmSector.getSection() == 1) ? 4 : 5;
132 1 + layerIncrease, 1, 1);
136 1 + layerIncrease * 2, 1, 1);
149 uint16_t sector = klmSector.getKLMSectorNumber();
152 for (
int j = 0; j < nHistograms; j++) {
154 "strip_hits_subdetector_" + std::to_string(klmSector.getSubdetector()) +
155 "_section_" + std::to_string(klmSector.getSection()) +
156 "_sector_" + std::to_string(klmSector.getSector()) +
157 "_" + std::to_string(j);
158 std::string title =
"Sector " + std::to_string(klmSector.getSector()) +
" -- " +
161 name.c_str(), title.c_str(),
162 firstChannelNumbers[i + 1] - firstChannelNumbers[i],
163 firstChannelNumbers[i] - 0.5, firstChannelNumbers[i + 1] - 0.5);
168 delete[] firstChannelNumbers;
173 totalSectors, -0.5, totalSectors - 0.5);
176 uint16_t sector = klmSector.getKLMSectorNumber();
182 m_DigitsKLM =
new TH1F(
"digits_klm",
"Number of KLM digits",
184 m_DigitsKLM->GetXaxis()->SetTitle(
"Number of digits");
186 m_DigitsRPC =
new TH1F(
"digits_rpc",
"Number of RPC digits",
188 m_DigitsRPC->GetXaxis()->SetTitle(
"Number of digits");
207 m_TriggerBitsBKLM =
new TH1F(
"trigger_bits_bklm",
"Trigger bits of multi-strip digits (BKLM)",
214 m_TriggerBitsEKLM =
new TH1F(
"trigger_bits_eklm",
"Trigger bits of multi-strip digits (EKLM)",
223 m_KlmDigitsAfterLERInj =
new TH1F(
"KLMOccInjLER",
"KLMOccInjLER / Time;Time in #mus;KLM Digits / Time (5 #mus bins)",
226 m_TriggersLERInj =
new TH1F(
"KLMOEccInjLER",
"KLMEOccInjLER / Time;Time in #mus;Triggers / Time (5 #mus bins)",
229 m_KlmDigitsAfterHERInj =
new TH1F(
"KLMOccInjHER",
"KLMOccInjHER / Time;Time in #mus;KLM Digits / Time (5 #mus bins)",
232 m_TriggersHERInj =
new TH1F(
"KLMEOccInjHER",
"KLMEOccInjHER / Time;Time in #mus;Triggers / Time (5 #mus bins)",
271 uint16_t sector = klmSector.getKLMSectorNumber();
273 for (
int j = 0; j < nHistograms; j++)
295 int nDigits =
m_Digits.getEntries();
296 int nDigitsRPC = 0, nDigitsScintillatorBKLM = 0, nDigitsScintillatorEKLM = 0;
297 int nDigitsMultiStripBKLM = 0, nDigitsMultiStripEKLM = 0;
306 nDigitsScintillatorEKLM++;
307 int section = digit.getSection();
308 int sector = digit.getSector();
309 int layer = digit.getLayer();
310 int plane = digit.getPlane();
311 int strip = digit.getStrip();
312 if (not digit.isMultiStrip()) {
318 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
319 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
320 if ((xMin > channelIndex) || (xMax < channelIndex))
325 nDigitsMultiStripEKLM++;
329 if (digit.isMultiStrip()) {
333 if ((triggerBits & 0x1) != 0)
335 if ((triggerBits & 0x2) != 0)
337 if ((triggerBits & 0x4) != 0)
339 if ((triggerBits & 0x8) != 0)
344 int section = digit.getSection();
345 int sector = digit.getSector();
346 int layer = digit.getLayer();
347 int plane = digit.getPlane();
348 int strip = digit.getStrip();
349 if (not digit.isMultiStrip()) {
355 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
356 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
357 if ((xMin > channelIndex) || (xMax < channelIndex))
362 nDigitsMultiStripBKLM++;
367 nDigitsScintillatorBKLM++;
370 if (digit.isMultiStrip()) {
374 if ((triggerBits & 0x1) != 0)
376 if ((triggerBits & 0x2) != 0)
378 if ((triggerBits & 0x4) != 0)
380 if ((triggerBits & 0x8) != 0)
385 B2FATAL(
"Not a BKLM or a EKLM digit, something went really wrong.");
388 int section = hit1d.getSection();
389 int sector = hit1d.getSector();
390 int layer = hit1d.getLayer();
392 section, sector, layer);
393 if (hit1d.isPhiReadout())
403 if (nDigitsMultiStripBKLM > 0)
405 if (nDigitsMultiStripEKLM > 0)
409 unsigned int difference = rawFtsw.GetTimeSinceLastInjection(0);
410 if (difference != 0x7FFFFFFF) {
412 float differenceInUs = difference / 127.;
413 if (rawFtsw.GetIsHER(0)) {