10#include <klm/modules/KLMDQM/KLMDQMModule.h>
13#include <klm/dataobjects/KLMChannelIndex.h>
14#include <klm/dataobjects/KLMDigitRaw.h>
17#include <TDirectory.h>
59 "Directory for KLM DQM histograms in ROOT file.",
62 "Min time for RPC time histogram.",
double(-1223.5));
64 "Max time for RPC time histogram.",
double(-199.5));
66 "Min time for BKLM scintillator time histogram.",
double(-5300));
68 "Max time for BKLM scintillator time histogram.",
double(-4300));
70 "Min time for EKLM scintillator time histogram.",
double(-5300));
72 "Max time for EKLM scintillator time histogram.",
double(-4300));
74 "Min time for RPC hit revo9DCArrivalTime histogram.",
double(-10000));
76 "Max time for RPC hit revo9DCArrivalTime histogram.",
double(3000));
101 TDirectory* oldDirectory, *newDirectory;
102 oldDirectory = gDirectory;
106 m_DAQInclusion =
new TH1F(
"daq_inclusion",
"Is KLM included in DAQ?", 2, 0.0, 2.0);
111 m_TimeRPC->GetXaxis()->SetTitle(
"Time, ns");
113 new TH1F(
"time_scintillator_bklm",
"Scintillator hit time (BKLM)",
117 new TH1F(
"time_scintillator_eklm",
"Scintillator hit time (EKLM)",
125 "BKLM plane occupancy (#phi readout)",
129 "BKLM plane occupancy (z readout)",
132 m_PlaneEKLM =
new TH1F(
"plane_eklm",
"EKLM plane occupancy (both readouts)", 208, 0.5, 208.5);
135 int nChannelHistograms =
155 int layerIncrease = (klmSector.getSection() == 1) ? 4 : 5;
158 1 + layerIncrease, 1, 1);
162 1 + layerIncrease * 2, 1, 1);
179 for (
int j = 0; j < nHistograms; j++) {
181 "strip_hits_subdetector_" + std::to_string(klmSector.getSubdetector()) +
182 "_section_" + std::to_string(klmSector.getSection()) +
183 "_sector_" + std::to_string(klmSector.getSector()) +
184 "_" + std::to_string(j);
185 std::string title =
"Sector " + std::to_string(klmSector.getSector()) +
" -- " +
186 m_ElementNumbers->getSectorDAQName(klmSector.getSubdetector(), klmSector.getSection(), klmSector.getSector());
188 name.c_str(), title.c_str(),
189 firstChannelNumbers[i + 1] - firstChannelNumbers[i],
190 firstChannelNumbers[i] - 0.5, firstChannelNumbers[i + 1] - 0.5);
194 delete[] firstChannelNumbers;
199 totalSectors, -0.5, totalSectors - 0.5);
202 std::string label =
m_ElementNumbers->getSectorDAQName(klmSector.getSubdetector(), klmSector.getSection(), klmSector.getSector());
208 m_DigitsKLM =
new TH1F(
"digits_klm",
"Number of KLM digits",
210 m_DigitsKLM->GetXaxis()->SetTitle(
"Number of digits");
211 m_DigitsRPC =
new TH1F(
"digits_rpc",
"Number of RPC digits",
213 m_DigitsRPC->GetXaxis()->SetTitle(
"Number of digits");
227 m_TriggerBitsBKLM =
new TH1F(
"trigger_bits_bklm",
"Trigger bits of multi-strip digits (BKLM)",
233 m_TriggerBitsEKLM =
new TH1F(
"trigger_bits_eklm",
"Trigger bits of multi-strip digits (EKLM)",
242 int nL1Bins = nTimingBits + 1;
244 "Event background trigger summary;Trigger Decision;Events",
245 nL1Bins, 0.5, 0.5 + nL1Bins);
254 m_DigitsAfterLERInj =
new TH1F(
"KLMOccInjLER",
"KLM digits after LER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
256 m_TriggersLERInj =
new TH1F(
"KLMTrigInjLER",
"Triggers after KER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
258 m_DigitsAfterHERInj =
new TH1F(
"KLMOccInjHER",
"KLM digits after HER injection / Time;Time [#mus];Number of KLM digits / (5 #mus)",
260 m_TriggersHERInj =
new TH1F(
"KLMTrigInjHER",
"Triggers after HER injection / Time;Time [#mus];Number of triggers / (5 #mus)",
271 for (
int j = 1; j <= maximalLayerNumber; ++j) {
272 std::string name =
"spatial_2d_hits_subdetector_" + std::to_string(subdetector) +
273 "_section_" + std::to_string(section) +
274 "_layer_" + std::to_string(j);
275 std::string title =
"Endcap " + sectionName +
" , Layer " + std::to_string(j);
278 340 * 2 / 10, -340, 340,
279 340 * 2 / 10, -340, 340);
290 "BKLM Scintillator Standard Readout;FEE Card", bklmSectors * 2, 0.5, 0.5 + bklmSectors * 2);
292 "BKLM Scintillator Feature Extraction;FEE Card", bklmSectors * 2, 0.5, 0.5 + bklmSectors * 2);
294 "EKLM Standard Readout;Plane number", eklmPlanes, 0.5, 0.5 + eklmPlanes);
296 "EKLM Feature Extraction;Plane number", eklmPlanes, 0.5, 0.5 + eklmPlanes);
339 for (
int j = 0; j < nHistograms; j++)
366 int maximalLayerNumber =
368 for (
int j = 1; j <= maximalLayerNumber; ++j)
385 for (
int i = 0; i < nTimingBits; ++i) {
393 }
catch (
const std::exception&) {
398 int nDigits =
m_Digits.getEntries();
399 int nDigitsRPC = 0, nDigitsScintillatorBKLM = 0, nDigitsScintillatorEKLM = 0;
400 int nDigitsMultiStripBKLM = 0, nDigitsMultiStripEKLM = 0;
411 nDigitsScintillatorEKLM++;
412 int section = digit.getSection();
413 int sector = digit.getSector();
414 int layer = digit.getLayer();
415 int plane = digit.getPlane();
416 int strip = digit.getStrip();
417 if (not digit.isMultiStrip()) {
423 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
424 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
425 if ((xMin > channelIndex) || (xMax < channelIndex))
430 nDigitsMultiStripEKLM++;
434 if (digit.isMultiStrip()) {
437 if ((triggerBits & 0x1) != 0)
439 if ((triggerBits & 0x2) != 0)
441 if ((triggerBits & 0x4) != 0)
443 if ((triggerBits & 0x8) != 0)
457 int section = digit.getSection();
458 int sector = digit.getSector();
459 int layer = digit.getLayer();
460 int plane = digit.getPlane();
461 int strip = digit.getStrip();
466 if (not digit.isMultiStrip()) {
470 double xMin =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmin();
471 double xMax =
m_ChannelHits[klmSectorIndex][j]->GetXaxis()->GetXmax();
472 if ((xMin > channelIndex) || (xMax < channelIndex))
477 nDigitsMultiStripBKLM++;
483 nDigitsScintillatorBKLM++;
494 if (digit.isMultiStrip()) {
497 if ((triggerBits & 0x1) != 0)
499 if ((triggerBits & 0x2) != 0)
501 if ((triggerBits & 0x4) != 0)
503 if ((triggerBits & 0x8) != 0)
508 B2FATAL(
"Not a BKLM or a EKLM digit, something went really wrong.");
511 int section = hit1d.getSection();
512 int sector = hit1d.getSector();
513 int layer = hit1d.getLayer();
515 section, sector, layer);
516 if (hit1d.isPhiReadout())
526 if (nDigitsMultiStripBKLM > 0)
528 if (nDigitsMultiStripEKLM > 0)
532 unsigned int difference = rawFtsw.GetTimeSinceLastInjection(0);
533 if (difference != 0x7FFFFFFF) {
535 float differenceInUs = difference / 127.;
536 if (rawFtsw.GetIsHER(0)) {
554 int section = hit2d.getSection();
555 int layer = hit2d.getLayer();
556 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.
static constexpr int getMaximalPlaneGlobalNumber()
Get maximal plane global number.
@ c_ForwardSection
Forward.
static constexpr int getMaximalSectorGlobalNumberKLMOrder()
Get maximal sector global number with KLM ordering (section, sector).
HistoModule()
Constructor.
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.
double m_BKLMScintTimeMin
Min time for BKLM Scint.
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_FE_EKLM_Plane_1
feature extraction status 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.
double m_RPCTimeMax
Max time for RPC.
StoreArray< KLMDigit > m_Digits
KLM digits.
double m_RPCTimeMin
Min time for RPC.
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.
double m_Revo9DCArrivalTimeMax
Max time for revo9DCArrivalTime for RPC.
void event() override
This method is called for each event.
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
KLMDQMModule()
Constructor.
double m_Revo9DCArrivalTimeMin
Min time for revo9DCArrivalTime for RPC.
double m_EKLMScintTimeMax
Max time for EKLM Scint.
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.
double m_BKLMScintTimeMax
Max time for BKLM Scint.
StoreObjPtr< TRGSummary > m_trgSummary
Trigger summary (event-level L1 bits).
void terminate() override
This method is called at the end of the event processing.
TH1F * m_TimeRevo9DCArrivalTime
Time: revo9DCArrivalTime for RPC.
TH1F * m_PlaneBKLMZ
Plane occupancy: BKLM, z readout.
TH1F * m_TimeScintillatorBKLM
Time: BKLM scintillators.
TH1F * m_FE_BKLM_Layer_1
feature extraction status for BKLM Scintillator
TH1F * m_DigitsRPC
Number of digits: BKLM RPCs.
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.
TH1F * m_FE_EKLM_Plane_0
Standard Readout status for EKLM.
StoreArray< RawKLM > m_RawKlms
Raw KLM.
KLMTime * m_klmTime
KLM time conversion (for revo9DCArrivalTime).
TH1F * m_PlaneEKLM
Plane occupancy: EKLM.
TH2F ** m_Spatial2DHitsEKLM[EKLMElementNumbers::getMaximalSectionNumber()]
Spatial distribution of EKLM 2d hits per layer.
TH1F * m_EventBackgroundTriggerSummary
Event-level background trigger summary (from TRGSummary).
TH1F * m_MaskedChannelsPerSector
Masked channels per sector.
double m_EKLMScintTimeMin
Min time for EKLM Scint.
const KLMChannelArrayIndex * m_ChannelArrayIndex
KLM channel array index.
static constexpr std::array< TRGSummary::ETimingType, 3 > c_KlmL1Triggers
L1 timing trigger bits of interest for KLM DQM (event-level).
std::string m_HistogramDirectoryName
Directory for KLM DQM histograms in ROOT file.
TH1F * m_FE_BKLM_Layer_0
Standard Readout status for BKLM Scintillator.
void defineHisto() override
Definition of the histograms.
StoreArray< KLMHit2d > m_Hit2ds
KLM 2d hits.
Class to store the raw words from the unpacker, digit-by-digit.
uint16_t getTriggerBits()
Get trigger bits.
uint16_t getFEStatus()
Get FE.
KLM digit (class representing a digitized hit in RPCs or scintillators).
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#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.