10 #include <klm/modules/KLMDQM/KLMDQMModule.h>
13 #include <klm/dataobjects/KLMChannelIndex.h>
14 #include <klm/dataobjects/KLMDigitRaw.h>
17 #include <TDirectory.h>
25 m_DAQInclusion{
nullptr},
27 m_TimeScintillatorBKLM{
nullptr},
28 m_TimeScintillatorEKLM{
nullptr},
29 m_PlaneBKLMPhi{
nullptr},
30 m_PlaneBKLMZ{
nullptr},
32 m_MaskedChannelsPerSector{
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},
50 setDescription(
"KLM data quality monitor.");
51 setPropertyFlags(c_ParallelProcessingCertified);
52 addParam(
"histogramDirectoryName", m_HistogramDirectoryName,
53 "Directory for KLM DQM histograms in ROOT file.",
79 TDirectory* oldDirectory, *newDirectory;
80 oldDirectory = gDirectory;
84 m_DAQInclusion =
new TH1F(
"daq_inclusion",
"Is KLM included in DAQ?", 2, 0.0, 2.0);
89 m_TimeRPC =
new TH1F(
"time_rpc",
"RPC hit time", 128, -1223.5, -199.5);
90 m_TimeRPC->GetXaxis()->SetTitle(
"Time, ns");
93 new TH1F(
"time_scintillator_bklm",
"Scintillator hit time (BKLM)",
98 new TH1F(
"time_scintillator_eklm",
"Scintillator hit time (EKLM)",
104 "BKLM plane occupancy (#phi readout)",
109 "BKLM plane occupancy (z readout)",
113 m_PlaneEKLM =
new TH1F(
"plane_eklm",
"EKLM plane occupancy (both readouts)", 208, 0.5, 208.5);
117 int nChannelHistograms =
122 uint16_t* firstChannelNumbers =
new uint16_t[nChannelHistograms + 1];
136 int layerIncrease = (klmSector.getSection() == 1) ? 4 : 5;
139 1 + layerIncrease, 1, 1);
143 1 + layerIncrease * 2, 1, 1);
160 for (
int j = 0; j < nHistograms; j++) {
162 "strip_hits_subdetector_" + std::to_string(klmSector.getSubdetector()) +
163 "_section_" + std::to_string(klmSector.getSection()) +
164 "_sector_" + std::to_string(klmSector.getSector()) +
165 "_" + std::to_string(j);
166 std::string title =
"Sector " + std::to_string(klmSector.getSector()) +
" -- " +
169 name.c_str(), title.c_str(),
170 firstChannelNumbers[i + 1] - firstChannelNumbers[i],
171 firstChannelNumbers[i] - 0.5, firstChannelNumbers[i + 1] - 0.5);
176 delete[] firstChannelNumbers;
181 totalSectors, -0.5, totalSectors - 0.5);
191 m_DigitsKLM =
new TH1F(
"digits_klm",
"Number of KLM digits",
193 m_DigitsKLM->GetXaxis()->SetTitle(
"Number of digits");
195 m_DigitsRPC =
new TH1F(
"digits_rpc",
"Number of RPC digits",
197 m_DigitsRPC->GetXaxis()->SetTitle(
"Number of digits");
216 m_TriggerBitsBKLM =
new TH1F(
"trigger_bits_bklm",
"Trigger bits of multi-strip digits (BKLM)",
223 m_TriggerBitsEKLM =
new TH1F(
"trigger_bits_eklm",
"Trigger bits of multi-strip digits (EKLM)",
232 m_DigitsAfterLERInj =
new TH1F(
"KLMOccInjLER",
"KLM digits after LER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
235 m_TriggersLERInj =
new TH1F(
"KLMTrigInjLER",
"Triggers after KER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
238 m_DigitsAfterHERInj =
new TH1F(
"KLMOccInjHER",
"KLM digits after HER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
241 m_TriggersHERInj =
new TH1F(
"KLMTrigInjHER",
"Triggers after HER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
253 for (
int j = 1; j <= maximalLayerNumber; ++j) {
254 std::string name =
"spatial_2d_hits_subdetector_" + std::to_string(subdetector) +
255 "_section_" + std::to_string(section) +
256 "_layer_" + std::to_string(j);
257 std::string title =
"Endcap " + sectionName +
" , Layer " + std::to_string(j);
260 340 * 2 / 10, -340, 340,
261 340 * 2 / 10, -340, 340);
307 for (
int j = 0; j < nHistograms; j++)
331 int maximalLayerNumber =
333 for (
int j = 1; j <= maximalLayerNumber; ++j)
341 int nDigits =
m_Digits.getEntries();
342 int nDigitsRPC = 0, nDigitsScintillatorBKLM = 0, nDigitsScintillatorEKLM = 0;
343 int nDigitsMultiStripBKLM = 0, nDigitsMultiStripEKLM = 0;
352 nDigitsScintillatorEKLM++;
353 int section = digit.getSection();
354 int sector = digit.getSector();
355 int layer = digit.getLayer();
356 int plane = digit.getPlane();
357 int strip = digit.getStrip();
358 if (not digit.isMultiStrip()) {
364 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
365 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
366 if ((xMin > channelIndex) || (xMax < channelIndex))
371 nDigitsMultiStripEKLM++;
375 if (digit.isMultiStrip()) {
379 if ((triggerBits & 0x1) != 0)
381 if ((triggerBits & 0x2) != 0)
383 if ((triggerBits & 0x4) != 0)
385 if ((triggerBits & 0x8) != 0)
390 int section = digit.getSection();
391 int sector = digit.getSector();
392 int layer = digit.getLayer();
393 int plane = digit.getPlane();
394 int strip = digit.getStrip();
395 if (not digit.isMultiStrip()) {
401 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
402 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
403 if ((xMin > channelIndex) || (xMax < channelIndex))
408 nDigitsMultiStripBKLM++;
413 nDigitsScintillatorBKLM++;
416 if (digit.isMultiStrip()) {
420 if ((triggerBits & 0x1) != 0)
422 if ((triggerBits & 0x2) != 0)
424 if ((triggerBits & 0x4) != 0)
426 if ((triggerBits & 0x8) != 0)
431 B2FATAL(
"Not a BKLM or a EKLM digit, something went really wrong.");
434 int section = hit1d.getSection();
435 int sector = hit1d.getSector();
436 int layer = hit1d.getLayer();
438 section, sector, layer);
439 if (hit1d.isPhiReadout())
449 if (nDigitsMultiStripBKLM > 0)
451 if (nDigitsMultiStripEKLM > 0)
455 unsigned int difference = rawFtsw.GetTimeSinceLastInjection(0);
456 if (difference != 0x7FFFFFFF) {
458 float differenceInUs = difference / 127.;
459 if (rawFtsw.GetIsHER(0)) {
475 int section = hit2d.getSection();
476 int layer = hit2d.getLayer();
477 m_Spatial2DHitsEKLM[section - 1][layer - 1]->Fill(hit2d.getPositionX(), hit2d.getPositionY());
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.
int getMaximalDetectorLayerNumber(int section) const
Get maximal detector layer number.
static const EKLMElementNumbers & Instance()
Instantiation.
@ c_ForwardSection
Forward.
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).
Class for 2d hits handling.
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
static const KLMChannelArrayIndex & Instance()
Instantiation.
int getSection() const
Get section.
int getSector() const
Get sector.
@ c_IndexLevelSection
Section.
@ c_IndexLevelSector
Sector.
@ c_IndexLevelStrip
Strip.
KLMChannelNumber getKLMChannelNumber() const
Get KLM channel number.
void setIndexLevel(enum IndexLevel indexLevel)
Set index level.
KLM data quality monitor module.
TH1F * m_DigitsMultiStripEKLM
Number of multi-strip digits: EKLM scintillators.
StoreArray< RawFTSW > m_RawFtsws
Raw FTSW.
const int m_ChannelHitHistogramsEKLM
Number of channel hit histograms per sector for EKLM.
TH1F * m_PlaneBKLMPhi
Plane occupancy: BKLM, phi readout.
TH1F * m_TriggerBitsBKLM
Trigger bits: BKLM scintillators.
~KLMDQMModule()
Destructor.
TH1F * m_TimeScintillatorEKLM
Time: EKLM scintillators.
StoreArray< KLMDigit > m_Digits
KLM digits.
void initialize() override
Initializer.
TH1F * m_DigitsScintillatorEKLM
Number of digits: EKLM scintillators.
TH1F ** m_ChannelHits[EKLMElementNumbers::getMaximalSectorGlobalNumberKLMOrder()+BKLMElementNumbers::getMaximalSectorGlobalNumber()]
Number of hits per channel.
TH1F * m_TimeRPC
Time: BKLM RPCs.
TH1F * m_DigitsKLM
Number of digits: whole KLM.
void event() override
This method is called for each event.
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
const int m_ChannelHitHistogramsBKLM
Number of channel hit histograms per sector for BKLM.
TH1F * m_TriggerBitsEKLM
Trigger bits: EKLM scintillators.
void endRun() override
This method is called if the current run ends.
const EKLMElementNumbers * m_eklmElementNumbers
Element numbers.
void terminate() override
This method is called at the end of the event processing.
TH1F * m_PlaneBKLMZ
Plane occupancy: BKLM, z readout.
TH1F * m_TimeScintillatorBKLM
Time: BKLM scintillators.
TH1F * m_DigitsRPC
Number of digits: BKLM RPCs.
StoreArray< EKLMHit2d > m_EklmHit2ds
EKLM 2d hits.
TH1F * m_TriggersHERInj
Histogram to be used for normalization of occupancy after HER injection.
void beginRun() override
Called when entering a new run.
TH1F * m_DigitsAfterHERInj
Number of KLM Digits after LER injection.
TH1F * m_DigitsScintillatorBKLM
Number of digits: BKLM scintillators.
TH1F * m_TriggersLERInj
Histogram to be used for normalization of occupancy after LER injection.
TH1F * m_DigitsMultiStripBKLM
Number of multi-strip digits: BKLM scintillators.
const KLMSectorArrayIndex * m_SectorArrayIndex
KLM sector array index.
StoreArray< BKLMHit1d > m_BklmHit1ds
BKLM 1d hits.
TH1F * m_DigitsAfterLERInj
Number of KLM Digits after LER injection.
TH1F * m_DAQInclusion
KLM DAQ inclusion.
StoreArray< RawKLM > m_RawKlms
Raw KLM.
TH1F * m_PlaneEKLM
Plane occupancy: EKLM.
TH2F ** m_Spatial2DHitsEKLM[EKLMElementNumbers::getMaximalSectionNumber()]
Spatial distribution of EKLM 2d hits per layer.
TH1F * m_MaskedChannelsPerSector
Masked channels per sector.
const KLMChannelArrayIndex * m_ChannelArrayIndex
KLM channel array index.
std::string m_HistogramDirectoryName
Directory for KLM DQM histograms in ROOT file.
void defineHisto() override
Definition of the histograms.
Class to store the raw words from the unpacker, digit-by-digit.
uint16_t getTriggerBits()
Get trigger bits.
KLM digit (class representing a digitized hit in RPCs or scintillators).
uint16_t getNElements() const
Get number of elements.
uint16_t getIndex(uint16_t number) const
Get element index.
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.
static const KLMElementNumbers & Instance()
Instantiation.
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.
static const KLMSectorArrayIndex & Instance()
Instantiation.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
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.