Belle II Software  release-06-00-14
DQMHistAnalysisKLM.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 <dqm/analysis/modules/DQMHistAnalysisKLM.h>
11 
12 /* Belle 2 headers. */
13 #include <klm/dataobjects/KLMChannelIndex.h>
14 
15 /* ROOT headers. */
16 #include <TClass.h>
17 #include <TROOT.h>
18 #include <TStyle.h>
19 
20 /* C++ headers. */
21 #include <algorithm>
22 
23 using namespace Belle2;
24 
25 REG_MODULE(DQMHistAnalysisKLM)
26 
29  m_ProcessedEvents{0},
30  m_ChannelArrayIndex{&(KLMChannelArrayIndex::Instance())},
31  m_SectorArrayIndex{&(KLMSectorArrayIndex::Instance())},
32  m_ElementNumbers{&(KLMElementNumbers::Instance())},
33  m_EklmElementNumbers{&(EKLMElementNumbers::Instance())}
34 {
35  setDescription("Module used to analyze KLM DQM histograms.");
36  addParam("ThresholdForMasked", m_ThresholdForMasked,
37  "Threshold X for masked channels: if a channel has an occupancy X times larger than the average, it will be masked.", 100);
38  addParam("ThresholdForHot", m_ThresholdForHot,
39  "Threshold Y for hot channels: if a channel has an occupancy Y times larger than the average, it will be marked as hot (but not masked).",
40  10);
41  addParam("ThresholdForLog", m_ThresholdForLog,
42  "Threshold Z for log scale view: if a channel has an occupancy Z times larger than the average, canvas shifts to log scale.",
43  20);
44  addParam("MinHitsForFlagging", m_MinHitsForFlagging, "Minimal number of hits in a channel required to flag it as 'Masked' or 'Hot'",
45  50);
46  addParam("MinProcessedEventsForMessages", m_MinProcessedEventsForMessagesInput,
47  "Minimal number of processed events required to print error messages", 10000.);
48 
49  m_MinProcessedEventsForMessages = m_MinProcessedEventsForMessagesInput;
50  m_2DHitsLine.SetLineColor(kRed);
51  m_2DHitsLine.SetLineWidth(3);
52  m_2DHitsLine.SetLineStyle(2); // dashed
53  m_PlaneLine.SetLineColor(kMagenta);
54  m_PlaneLine.SetLineWidth(1);
55  m_PlaneLine.SetLineStyle(2); // dashed
56  m_PlaneText.SetTextAlign(22); // centered, middle
57  m_PlaneText.SetTextColor(kMagenta);
58  m_PlaneText.SetTextFont(42); // Helvetica regular
59  m_PlaneText.SetTextSize(0.02); // 2% of TPad's full height
60 }
61 
63 {
64 }
65 
67 {
69  B2FATAL("The threshold used for hot channels is larger than the one for masked channels."
70  << LogVar("Threshold for hot channels", m_ThresholdForHot)
71  << LogVar("Threshold for masked channels", m_ThresholdForMasked));
72 }
73 
75 {
76 }
77 
79 {
80  if (!m_ElectronicsMap.isValid())
81  B2FATAL("No KLM electronics map.");
83  m_ProcessedEvents = 0.;
84  m_DeadBarrelModules.clear();
85  m_DeadEndcapModules.clear();
86  m_MaskedChannels.clear();
87 }
88 
90 {
91 }
92 
94 {
95  TH1* histogram = findHist("DAQ/Nevent");
96  if (histogram == nullptr) {
97  B2WARNING("DAQ DQM histogram DAQ/Nevent is not found.");
98  /* Set the minimal number of processed events to 0 if we can't determine the processed events. */
100  return 0.;
101  }
102  return histogram->GetEntries();
103 }
104 
106  int subdetector, int section, int sector,
107  TH1* histogram, TCanvas* canvas, TLatex& latex)
108 {
109  double x = 0.15;
110  double y = 0.85;
111  int i, n;
112  std::map<uint16_t, double> moduleHitMap;
113  std::map<uint16_t, double>::iterator it;
114  double average = 0;
115  int channelSubdetector, channelSection, channelSector;
116  int layer, plane, strip;
117  std::string str;
118  canvas->Clear();
119  canvas->cd();
120  histogram->SetStats(false);
121  histogram->Draw();
122  n = histogram->GetXaxis()->GetNbins();
123  for (i = 1; i <= n; i++) {
124  uint16_t channelIndex = std::round(histogram->GetBinCenter(i));
125  uint16_t channelNumber = m_ChannelArrayIndex->getNumber(channelIndex);
126  double nHitsPerModule = histogram->GetBinContent(i);
127  average = average + nHitsPerModule;
129  channelNumber, &channelSubdetector, &channelSection, &channelSector,
130  &layer, &plane, &strip);
131  if ((channelSubdetector != subdetector) ||
132  (channelSection != section) ||
133  (channelSector != sector))
134  B2FATAL("Inconsistent element numbers.");
135  uint16_t module = m_ElementNumbers->moduleNumber(
136  subdetector, section, sector, layer);
137  it = moduleHitMap.find(module);
138  if (it == moduleHitMap.end())
139  moduleHitMap.insert(std::pair<uint16_t, double>(module, nHitsPerModule));
140  else
141  it->second += nHitsPerModule;
142  }
143  unsigned int activeModuleChannels = 0;
144  for (it = moduleHitMap.begin(); it != moduleHitMap.end(); ++it) {
145  uint16_t moduleNumber = it->first;
146  if (it->second != 0) {
147  activeModuleChannels += m_ElementNumbers->getNChannelsModule(moduleNumber);
148  continue;
149  }
151  moduleNumber, &channelSubdetector, &channelSection, &channelSector, &layer);
152  /* Channel with plane = 1, strip = 1 exists for any BKLM or EKLM module. */
153  uint16_t channel = m_ElementNumbers->channelNumber(
154  channelSubdetector, channelSection, channelSector,
155  layer, 1, 1);
156  const KLMElectronicsChannel* electronicsChannel =
157  m_ElectronicsMap->getElectronicsChannel(channel);
158  if (electronicsChannel == nullptr)
159  B2FATAL("Incomplete KLM electronics map.");
160  str = "No data from HSLB ";
161  if (channelSubdetector == KLMElementNumbers::c_BKLM) {
162  str += BKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
163  electronicsChannel->getSlot());
164  } else {
165  str += EKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
166  electronicsChannel->getSlot());
167  }
168  str += ", lane " + std::to_string(electronicsChannel->getLane());
169  latex.DrawLatexNDC(x, y, str.c_str());
170  y -= 0.05;
171  /* Store the module number, used later in processPlaneHistogram
172  * to color the canvas with red and to raise up an alarm. */
173  if (channelSubdetector == KLMElementNumbers::c_BKLM) {
174  std::vector<uint16_t>::iterator ite = std::find(m_DeadBarrelModules.begin(),
175  m_DeadBarrelModules.end(),
176  moduleNumber);
177  if (ite == m_DeadBarrelModules.end())
178  m_DeadBarrelModules.push_back(moduleNumber);
179  } else {
180  std::vector<uint16_t>::iterator ite = std::find(m_DeadEndcapModules.begin(),
181  m_DeadEndcapModules.end(),
182  moduleNumber);
183  if (ite == m_DeadEndcapModules.end())
184  m_DeadEndcapModules.push_back(moduleNumber);
185  }
186  }
187  if (activeModuleChannels == 0)
188  return;
189  average /= activeModuleChannels;
190  for (i = 1; i <= n; ++i) {
191  uint16_t channelIndex = std::round(histogram->GetBinCenter(i));
192  uint16_t channelNumber = m_ChannelArrayIndex->getNumber(channelIndex);
193  double nHits = histogram->GetBinContent(i);
195  channelNumber, &channelSubdetector, &channelSection, &channelSector,
196  &layer, &plane, &strip);
197  std::string channelStatus = "Normal";
198  if ((nHits > average * m_ThresholdForMasked) && (nHits > m_MinHitsForFlagging)) {
199  channelStatus = "Masked";
200  std::vector<uint16_t>::iterator ite = std::find(m_MaskedChannels.begin(),
201  m_MaskedChannels.end(),
202  channelNumber);
203  if (ite == m_MaskedChannels.end())
204  m_MaskedChannels.push_back(channelNumber);
205  B2DEBUG(20, "KLM@MaskMe " << channelNumber);
206  } else if ((nHits > average * m_ThresholdForHot) && (nHits > m_MinHitsForFlagging)) {
207  channelStatus = "Hot";
208  }
209  if (channelStatus != "Normal") {
210  const KLMElectronicsChannel* electronicsChannel =
211  m_ElectronicsMap->getElectronicsChannel(channelNumber);
212  if (electronicsChannel == nullptr)
213  B2FATAL("Incomplete BKLM electronics map.");
214  if (channelStatus == "Masked")
215  histogram->SetBinContent(i, 0);
216  str = channelStatus + " channel: HSLB ";
217  if (channelSubdetector == KLMElementNumbers::c_BKLM) {
218  str += BKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
219  electronicsChannel->getSlot());
220  } else {
221  str += EKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
222  electronicsChannel->getSlot());
223  }
224  str += (", lane " + std::to_string(electronicsChannel->getLane()) +
225  ", axis " + std::to_string(electronicsChannel->getAxis()) +
226  ", channel " + std::to_string(electronicsChannel->getChannel()));
227  latex.DrawLatexNDC(x, y, str.c_str());
228  y -= 0.05;
229  }
230  }
231  if (histogram->GetMaximum()*n > histogram->Integral()*m_ThresholdForLog && average * activeModuleChannels > m_MinHitsForFlagging) {
232  canvas->SetLogy();
233  }
234  canvas->Modified();
235 }
236 
238  uint16_t section, TH2F* histogram, TCanvas* canvas)
239 {
240  canvas->Clear();
241  canvas->cd();
242  histogram->SetStats(false);
243  histogram->Draw("COLZ");
244  /* Draw the lines only for the backward layers. */
245  if (section == EKLMElementNumbers::c_ForwardSection) {
246  m_2DHitsLine.DrawLine(-110, 80, -110, 190);
247  m_2DHitsLine.DrawLine(-110, 190, 110, 190);
248  m_2DHitsLine.DrawLine(110, 80, 110, 190);
249  m_2DHitsLine.DrawLine(-110, 80, 110, 80);
250  }
251  canvas->Modified();
252 }
253 
255  const std::string& histName)
256 {
257  TH1* histogram = findHist("KLM/" + histName);
258  if (histogram == nullptr) {
259  B2ERROR("KLM DQM histogram KLM/" << histName << " is not found.");
260  return;
261  }
262  TCanvas* canvas = findCanvas("KLM/c_" + histName);
263  if (canvas == nullptr) {
264  B2ERROR("KLM DQM histogram canvas KLM/c_" << histName << " is not found.");
265  return;
266  }
267  histogram->Clear();
268  canvas->Clear();
269  canvas->cd();
270  if (m_MaskedChannels.size() > 0) {
271  int channelSubdetector, channelSection, channelSector;
272  int layer, plane, strip;
273  for (uint16_t channel : m_MaskedChannels) {
275  channel, &channelSubdetector, &channelSection, &channelSector,
276  &layer, &plane, &strip);
277  uint16_t sectorNumber;
278  if (channelSubdetector == KLMElementNumbers::c_BKLM)
279  sectorNumber = m_ElementNumbers->sectorNumberBKLM(channelSection, channelSector);
280  else
281  sectorNumber = m_ElementNumbers->sectorNumberEKLM(channelSection, channelSector);
282  uint16_t sectorIndex = m_SectorArrayIndex->getIndex(sectorNumber);
283  histogram->Fill(sectorIndex);
284  }
285  }
286  histogram->SetStats(false);
287  histogram->Draw();
288  canvas->Modified();
289 }
290 
292  const std::string& histName, TLatex& latex)
293 {
294  std::string name, alarm;
295  const double histMinNDC = 0.1;
296  const double histMaxNDC = 0.9;
297  const double histRangeNDC = histMaxNDC - histMinNDC;
298  int moduleSubdetector, moduleSection, moduleSector, moduleLayer;
299  double xAlarm = 0.15;
300  double yAlarm = 0.8;
301  TH1* histogram = findHist("KLM/" + histName);
302  if (histogram == nullptr) {
303  B2ERROR("KLM DQM histogram KLM/" << histName << " is not found.");
304  return;
305  }
306  TCanvas* canvas = findCanvas("KLM/c_" + histName);
307  if (canvas == nullptr) {
308  B2ERROR("KLM DQM histogram canvas KLM/c_" << histName << " is not found.");
309  return;
310  }
311  canvas->Clear();
312  canvas->cd();
313  histogram->SetStats(false);
314  histogram->Draw();
315  if (histName.find("bklm") != std::string::npos) {
316  /* First draw the vertical lines and the sector names. */
317  const double maximalSector = BKLMElementNumbers::getMaximalSectorGlobalNumber();
318  for (int sector = 0; sector < BKLMElementNumbers::getMaximalSectorGlobalNumber(); ++sector) {
319  double xLineNDC = histMinNDC + (histRangeNDC * sector) / maximalSector;
320  double xTextNDC = histMinNDC + (histRangeNDC * (sector + 0.5)) / maximalSector;
321  double yTextNDC = histMinNDC + 0.98 * histRangeNDC;
322  if (sector > 0)
323  m_PlaneLine.DrawLineNDC(xLineNDC, histMinNDC, xLineNDC, histMaxNDC);
324  name = "B";
325  if (sector < 8)
326  name += "B";
327  else
328  name += "F";
329  name += std::to_string(sector % 8);
330  m_PlaneText.DrawTextNDC(xTextNDC, yTextNDC, name.c_str());
331  }
332  /* Then, color the canvas with red if there is a dead module
333  * and write an error message. */
334  if (m_DeadBarrelModules.size() == 0) {
335  canvas->Pad()->SetFillColor(kWhite);
337  for (uint16_t module : m_DeadBarrelModules) {
339  module, &moduleSubdetector, &moduleSection, &moduleSector, &moduleLayer);
340  alarm = "No data from " + m_ElementNumbers->getSectorDAQName(moduleSubdetector, moduleSection, moduleSector);
341  alarm += ", layer " + std::to_string(moduleLayer);
342  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
343  yAlarm -= 0.05;
344  }
345  alarm = "Call the KLM experts immediately!";
346  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
347  canvas->Pad()->SetFillColor(kRed);
348  }
349  } else {
350  /* First draw the vertical lines and the sector names. */
351  const double maximalLayer = EKLMElementNumbers::getMaximalLayerGlobalNumber();
352  for (int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
353  double xLineNDC = histMinNDC + (histRangeNDC * layerGlobal) / maximalLayer;
354  double xTextNDC = histMinNDC + (histRangeNDC * (layerGlobal - 0.5)) / maximalLayer;
355  double yTextNDC = histMinNDC + 0.98 * histRangeNDC;
356  if (layerGlobal < maximalLayer)
357  m_PlaneLine.DrawLineNDC(xLineNDC, histMinNDC, xLineNDC, histMaxNDC);
358  int section, layer;
360  layerGlobal, &section, &layer);
362  name = "B";
363  else
364  name = "F";
365  name += std::to_string(layer);
366  m_PlaneText.DrawTextNDC(xTextNDC, yTextNDC, name.c_str());
367  }
368  /* Then, color the canvas with red if there is a dead module
369  * and write an error message. */
370  if (m_DeadEndcapModules.size() == 0) {
371  canvas->Pad()->SetFillColor(kWhite);
373  for (uint16_t module : m_DeadEndcapModules) {
375  module, &moduleSubdetector, &moduleSection, &moduleSector, &moduleLayer);
376  alarm = "No data from " + m_ElementNumbers->getSectorDAQName(moduleSubdetector, moduleSection, moduleSector);
377  alarm += ", layer " + std::to_string(moduleLayer);
378  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
379  yAlarm -= 0.05;
380  }
381  alarm = "Call the KLM experts immediately!";
382  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
383  canvas->Pad()->SetFillColor(kRed);
384  }
385  }
386  canvas->Modified();
387  canvas->Update();
388 }
389 
390 TCanvas* DQMHistAnalysisKLMModule::findCanvas(const std::string& canvasName)
391 {
392  TIter nextkey(gROOT->GetListOfCanvases());
393  TObject* obj = nullptr;
394  while ((obj = dynamic_cast<TObject*>(nextkey()))) {
395  if (obj->IsA()->InheritsFrom("TCanvas")) {
396  if (obj->GetName() == canvasName)
397  return dynamic_cast<TCanvas*>(obj);
398  }
399  }
400  return nullptr;
401 }
402 
403 
405 {
406  /* If KLM is not included, stop here and return. */
407  TH1* daqInclusion = findHist("KLM/daq_inclusion");
408  if (not(daqInclusion == nullptr)) {
409  int isKlmIncluded = daqInclusion->GetBinContent(daqInclusion->GetXaxis()->FindBin("Yes"));
410  if (isKlmIncluded == 0)
411  return;
412  }
413  /* Make sure that the vectors are cleared at each DQM refresh. */
414  m_DeadBarrelModules.clear();
415  m_DeadEndcapModules.clear();
416  m_MaskedChannels.clear();
418  std::string str, histogramName, canvasName;
419  TLatex latex;
420  latex.SetTextColor(kRed);
421  latex.SetTextAlign(11);
423  for (KLMChannelIndex& klmSector : klmIndex) {
424  int nHistograms;
425  if (klmSector.getSubdetector() == KLMElementNumbers::c_BKLM)
426  nHistograms = 2;
427  else
428  nHistograms = 3;
429  for (int j = 0; j < nHistograms; j++) {
430  str = "strip_hits_subdetector_" +
431  std::to_string(klmSector.getSubdetector()) +
432  "_section_" + std::to_string(klmSector.getSection()) +
433  "_sector_" + std::to_string(klmSector.getSector()) +
434  "_" + std::to_string(j);
435  histogramName = "KLM/" + str;
436  canvasName = "KLM/c_" + str;
437  TH1* histogram = findHist(histogramName);
438  if (histogram == nullptr) {
439  B2ERROR("KLM DQM histogram " << histogramName << " is not found.");
440  continue;
441  }
442  TCanvas* canvas = findCanvas(canvasName);
443  if (canvas == nullptr) {
444  B2ERROR("KLM DQM histogram canvas " << canvasName << " is not found.");
445  continue;
446  }
448  klmSector.getSubdetector(), klmSector.getSection(),
449  klmSector.getSector(), histogram, canvas, latex);
450  }
451  }
452  /* Temporary change the color palette. */
453  gStyle->SetPalette(kLightTemperature);
455  for (KLMChannelIndex& klmSection : klmIndex) {
456  uint16_t subdetector = klmSection.getSubdetector();
457  if (subdetector == KLMElementNumbers::c_EKLM) {
458  uint16_t section = klmSection.getSection();
459  int maximalLayerNumber = m_EklmElementNumbers->getMaximalDetectorLayerNumber(section);
460  for (int j = 1; j <= maximalLayerNumber; ++j) {
461  str = "spatial_2d_hits_subdetector_" + std::to_string(subdetector) +
462  "_section_" + std::to_string(section) +
463  "_layer_" + std::to_string(j);
464  histogramName = "KLM/" + str;
465  canvasName = "KLM/c_" + str;
466  TH2F* histogram = static_cast<TH2F*>(findHist(histogramName));
467  if (histogram == nullptr) {
468  B2ERROR("KLM DQM histogram " << histogramName << " is not found.");
469  continue;
470  }
471  TCanvas* canvas = findCanvas(canvasName);
472  if (canvas == nullptr) {
473  B2ERROR("KLM DQM histogram canvas " << canvasName << " is not found.");
474  continue;
475  }
476  processSpatial2DHitEndcapHistogram(section, histogram, canvas);
477  }
478  }
479  }
480  /* Reset the color palette to the default one. */
481  gStyle->SetPalette(kBird);
482  fillMaskedChannelsHistogram("masked_channels");
483  latex.SetTextColor(kBlue);
484  processPlaneHistogram("plane_bklm_phi", latex);
485  processPlaneHistogram("plane_bklm_z", latex);
486  processPlaneHistogram("plane_eklm", latex);
487 }
static std::string getHSLBName(int copper, int slot)
Get HSLB name.
static constexpr int getMaximalSectorGlobalNumber()
Get maximal sector global number.
Analysis of KLM DQM histograms.
TLine m_PlaneLine
TLine for boundary in plane histograms.
double m_ProcessedEvents
Number of processed events.
void initialize() override
Initializer.
int m_ThresholdForLog
Threshold for log scale.
void event() override
This method is called for each event.
TCanvas * findCanvas(const std::string &canvasName)
Find TCanvas that matches a given name.
int m_MinHitsForFlagging
Minimal number of hits for flagging.
const KLMElementNumbers * m_ElementNumbers
KLM element numbers.
void endRun() override
This method is called if the current run ends.
const EKLMElementNumbers * m_EklmElementNumbers
EKLM element numbers.
void terminate() override
This method is called at the end of the event processing.
void processSpatial2DHitEndcapHistogram(uint16_t section, TH2F *histogram, TCanvas *canvas)
Process spatial 2D hits histograms for endcap.
std::vector< uint16_t > m_MaskedChannels
Vector of masked channels.
int m_ThresholdForHot
Threshold for hot channels.
std::vector< uint16_t > m_DeadBarrelModules
Vector of dead barrel modules.
void beginRun() override
Called when entering a new run.
double m_MinProcessedEventsForMessagesInput
Input parameter for minimal number of processed events for error messages.
TText m_PlaneText
TText for names in plane histograms.
DBObjPtr< KLMElectronicsMap > m_ElectronicsMap
Electronics map.
void processPlaneHistogram(const std::string &histName, TLatex &latex)
Process histogram containing the number of hits in plane.
int m_ThresholdForMasked
Threshold for masked channels.
const KLMSectorArrayIndex * m_SectorArrayIndex
KLM sector array index.
double m_MinProcessedEventsForMessages
Minimal number of processed events for error messages.
void analyseChannelHitHistogram(int subdetector, int section, int sector, TH1 *histogram, TCanvas *canvas, TLatex &latex)
Analyse channel hit histogram.
std::vector< uint16_t > m_DeadEndcapModules
Vector of dead endcap modules.
double getProcessedEvents()
Get number of processed events.
TLine m_2DHitsLine
TLine for background region in 2d hits histograms.
const KLMChannelArrayIndex * m_ChannelArrayIndex
KLM channel array index.
void fillMaskedChannelsHistogram(const std::string &histName)
Fill histogram containing masked channels per sector.
The base class for the histogram analysis module.
static TH1 * findHist(const std::string &histname)
Find histogram.
static constexpr int getMaximalLayerGlobalNumber()
Get maximal detector layer global number.
int getMaximalDetectorLayerNumber(int section) const
Get maximal detector layer number.
static const EKLMElementNumbers & Instance()
Instantiation.
void layerNumberToElementNumbers(int layerGlobal, int *section, int *layer) const
Get element numbers by detector layer global number.
static std::string getHSLBName(int copper, int slot)
Get HSLB name.
static const KLMChannelArrayIndex & Instance()
Instantiation.
KLM channel index.
void setIndexLevel(enum IndexLevel indexLevel)
Set index level.
BKLM electronics channel.
int getCopper() const
Get copper.
int getChannel() const
Get channel.
uint16_t getNumber(uint16_t index) const
Get element number.
uint16_t getIndex(uint16_t number) const
Get element index.
KLMSectorNumber sectorNumberEKLM(int section, int sector) const
Get sector number for EKLM.
KLMChannelNumber channelNumber(int subdetector, int section, int sector, int layer, int plane, int strip) const
Get channel number.
static const KLMElementNumbers & Instance()
Instantiation.
void channelNumberToElementNumbers(KLMChannelNumber channel, int *subdetector, int *section, int *sector, int *layer, int *plane, int *strip) const
Get element numbers by channel number.
unsigned int getNChannelsModule(KLMModuleNumber module) const
Get number of channels in module.
void moduleNumberToElementNumbers(KLMModuleNumber module, int *subdetector, int *section, int *sector, int *layer) const
Get element numbers by module number.
KLMModuleNumber moduleNumber(int subdetector, int section, int sector, int layer) const
Get module number.
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.
static const KLMSectorArrayIndex & Instance()
Instantiation.
Class to store variables with their name which were sent to the logging service.
TH2 * moduleHitMap(TH1 *hitMap, int moduleID)
Make hit map in HAPD view (12*12 channels)
Definition: hitMapMaker.cc:40
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.