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_DigitsAfterLERInj{
nullptr},
44 m_TriggersLERInj{
nullptr},
45 m_DigitsAfterHERInj{
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();
70 uint16_t subdetector = klmSection.getSubdetector();
72 uint16_t section = klmSection.getSection();
81 TDirectory* oldDirectory, *newDirectory;
82 oldDirectory = gDirectory;
86 m_DAQInclusion =
new TH1F(
"daq_inclusion",
"Is KLM included in DAQ?", 2, 0.0, 2.0);
91 m_TimeRPC =
new TH1F(
"time_rpc",
"RPC hit time", 128, -1023.5, 0.5);
92 m_TimeRPC->GetXaxis()->SetTitle(
"Time, ns");
95 new TH1F(
"time_scintillator_bklm",
"Scintillator hit time (BKLM)",
100 new TH1F(
"time_scintillator_eklm",
"Scintillator hit time (EKLM)",
106 "BKLM plane occupancy (#phi readout)",
111 "BKLM plane occupancy (z readout)",
115 m_PlaneEKLM =
new TH1F(
"plane_eklm",
"EKLM plane occupancy (both readouts)", 208, 0.5, 208.5);
119 int nChannelHistograms =
124 uint16_t* firstChannelNumbers =
new uint16_t[nChannelHistograms + 1];
138 int layerIncrease = (klmSector.getSection() == 1) ? 4 : 5;
141 1 + layerIncrease, 1, 1);
145 1 + layerIncrease * 2, 1, 1);
159 uint16_t sector = klmSector.getKLMSectorNumber();
162 for (
int j = 0; j < nHistograms; j++) {
164 "strip_hits_subdetector_" + std::to_string(klmSector.getSubdetector()) +
165 "_section_" + std::to_string(klmSector.getSection()) +
166 "_sector_" + std::to_string(klmSector.getSector()) +
167 "_" + std::to_string(j);
168 std::string title =
"Sector " + std::to_string(klmSector.getSector()) +
" -- " +
171 name.c_str(), title.c_str(),
172 firstChannelNumbers[i + 1] - firstChannelNumbers[i],
173 firstChannelNumbers[i] - 0.5, firstChannelNumbers[i + 1] - 0.5);
178 delete[] firstChannelNumbers;
183 totalSectors, -0.5, totalSectors - 0.5);
187 uint16_t sector = klmSector.getKLMSectorNumber();
193 m_DigitsKLM =
new TH1F(
"digits_klm",
"Number of KLM digits",
195 m_DigitsKLM->GetXaxis()->SetTitle(
"Number of digits");
197 m_DigitsRPC =
new TH1F(
"digits_rpc",
"Number of RPC digits",
199 m_DigitsRPC->GetXaxis()->SetTitle(
"Number of digits");
218 m_TriggerBitsBKLM =
new TH1F(
"trigger_bits_bklm",
"Trigger bits of multi-strip digits (BKLM)",
225 m_TriggerBitsEKLM =
new TH1F(
"trigger_bits_eklm",
"Trigger bits of multi-strip digits (EKLM)",
234 m_DigitsAfterLERInj =
new TH1F(
"KLMOccInjLER",
"KLM digits after LER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
237 m_TriggersLERInj =
new TH1F(
"KLMTrigInjLER",
"Triggers after KER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
240 m_DigitsAfterHERInj =
new TH1F(
"KLMOccInjHER",
"KLM digits after HER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
243 m_TriggersHERInj =
new TH1F(
"KLMTrigInjHER",
"Triggers after HER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
249 uint16_t subdetector = klmSection.getSubdetector();
251 uint16_t section = klmSection.getSection();
255 for (
int j = 1; j <= maximalLayerNumber; ++j) {
256 std::string name =
"spatial_2d_hits_subdetector_" + std::to_string(subdetector) +
257 "_section_" + std::to_string(section) +
258 "_layer_" + std::to_string(j);
259 std::string title =
"Endcap " + sectionName +
" , Layer " + std::to_string(j);
262 340 * 2 / 10, -340, 340,
263 340 * 2 / 10, -340, 340);
307 uint16_t sector = klmSector.getKLMSectorNumber();
309 for (
int j = 0; j < nHistograms; j++)
330 uint16_t subdetector = klmSection.getSubdetector();
332 uint16_t section = klmSection.getSection();
334 for (
int j = 1; j <= maximalLayerNumber; ++j)
342 int nDigits =
m_Digits.getEntries();
343 int nDigitsRPC = 0, nDigitsScintillatorBKLM = 0, nDigitsScintillatorEKLM = 0;
344 int nDigitsMultiStripBKLM = 0, nDigitsMultiStripEKLM = 0;
353 nDigitsScintillatorEKLM++;
354 int section = digit.getSection();
355 int sector = digit.getSector();
356 int layer = digit.getLayer();
357 int plane = digit.getPlane();
358 int strip = digit.getStrip();
359 if (not digit.isMultiStrip()) {
365 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
366 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
367 if ((xMin > channelIndex) || (xMax < channelIndex))
372 nDigitsMultiStripEKLM++;
376 if (digit.isMultiStrip()) {
380 if ((triggerBits & 0x1) != 0)
382 if ((triggerBits & 0x2) != 0)
384 if ((triggerBits & 0x4) != 0)
386 if ((triggerBits & 0x8) != 0)
391 int section = digit.getSection();
392 int sector = digit.getSector();
393 int layer = digit.getLayer();
394 int plane = digit.getPlane();
395 int strip = digit.getStrip();
396 if (not digit.isMultiStrip()) {
402 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
403 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
404 if ((xMin > channelIndex) || (xMax < channelIndex))
409 nDigitsMultiStripBKLM++;
414 nDigitsScintillatorBKLM++;
417 if (digit.isMultiStrip()) {
421 if ((triggerBits & 0x1) != 0)
423 if ((triggerBits & 0x2) != 0)
425 if ((triggerBits & 0x4) != 0)
427 if ((triggerBits & 0x8) != 0)
432 B2FATAL(
"Not a BKLM or a EKLM digit, something went really wrong.");
435 int section = hit1d.getSection();
436 int sector = hit1d.getSector();
437 int layer = hit1d.getLayer();
439 section, sector, layer);
440 if (hit1d.isPhiReadout())
450 if (nDigitsMultiStripBKLM > 0)
452 if (nDigitsMultiStripEKLM > 0)
456 unsigned int difference = rawFtsw.GetTimeSinceLastInjection(0);
457 if (difference != 0x7FFFFFFF) {
459 float differenceInUs = difference / 127.;
460 if (rawFtsw.GetIsHER(0)) {
476 int section = hit2d.getSection();
477 int layer = hit2d.getLayer();
478 m_Spatial2DHitsEKLM[section - 1][layer - 1]->Fill(hit2d.getPositionX(), hit2d.getPositionY());