Belle II Software  release-06-01-15
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_IsNullRun{false},
31  m_ChannelArrayIndex{&(KLMChannelArrayIndex::Instance())},
32  m_SectorArrayIndex{&(KLMSectorArrayIndex::Instance())},
33  m_ElementNumbers{&(KLMElementNumbers::Instance())},
34  m_EklmElementNumbers{&(EKLMElementNumbers::Instance())}
35 {
36  setDescription("Module used to analyze KLM DQM histograms.");
37  addParam("ThresholdForMasked", m_ThresholdForMasked,
38  "Threshold X for masked channels: if a channel has an occupancy X times larger than the average, it will be masked.", 100);
39  addParam("ThresholdForHot", m_ThresholdForHot,
40  "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).",
41  10);
42  addParam("ThresholdForLog", m_ThresholdForLog,
43  "Threshold Z for log scale view: if a channel has an occupancy Z times larger than the average, canvas shifts to log scale.",
44  20);
45  addParam("MinHitsForFlagging", m_MinHitsForFlagging, "Minimal number of hits in a channel required to flag it as 'Masked' or 'Hot'",
46  50);
47  addParam("MinProcessedEventsForMessages", m_MinProcessedEventsForMessagesInput,
48  "Minimal number of processed events required to print error messages", 10000.);
49 
50  m_MinProcessedEventsForMessages = m_MinProcessedEventsForMessagesInput;
51  m_2DHitsLine.SetLineColor(kRed);
52  m_2DHitsLine.SetLineWidth(3);
53  m_2DHitsLine.SetLineStyle(2); // dashed
54  m_PlaneLine.SetLineColor(kMagenta);
55  m_PlaneLine.SetLineWidth(1);
56  m_PlaneLine.SetLineStyle(2); // dashed
57  m_PlaneText.SetTextAlign(22); // centered, middle
58  m_PlaneText.SetTextColor(kMagenta);
59  m_PlaneText.SetTextFont(42); // Helvetica regular
60  m_PlaneText.SetTextSize(0.02); // 2% of TPad's full height
61 }
62 
64 {
65 }
66 
68 {
70  B2FATAL("The threshold used for hot channels is larger than the one for masked channels."
71  << LogVar("Threshold for hot channels", m_ThresholdForHot)
72  << LogVar("Threshold for masked channels", m_ThresholdForMasked));
73 
74 }
75 
77 {
78 }
79 
81 {
82  if (!m_ElectronicsMap.isValid())
83  B2FATAL("No KLM electronics map.");
85  m_ProcessedEvents = 0.;
86  m_DeadBarrelModules.clear();
87  m_DeadEndcapModules.clear();
88  m_MaskedChannels.clear();
89 
90  m_RunType = findHist("DQMInfo/rtype");
91  m_RunTypeString = m_RunType ? m_RunType->GetTitle() : "";
92  m_IsNullRun = (m_RunTypeString == "null");
93 }
94 
96 {
97 }
98 
100 {
101  TH1* histogram = findHist("DAQ/Nevent");
102  if (histogram == nullptr) {
103  B2WARNING("DAQ DQM histogram DAQ/Nevent is not found.");
104  /* Set the minimal number of processed events to 0 if we can't determine the processed events. */
106  return 0.;
107  }
108  return histogram->GetEntries();
109 }
110 
112  int subdetector, int section, int sector,
113  TH1* histogram, TCanvas* canvas, TLatex& latex)
114 {
115  double x = 0.15;
116  double y = 0.85;
117  int i, n;
118  std::map<uint16_t, double> moduleHitMap;
119  std::map<uint16_t, double>::iterator it;
120  double average = 0;
121  int channelSubdetector, channelSection, channelSector;
122  int layer, plane, strip;
123  std::string str;
124  canvas->Clear();
125  canvas->cd();
126  histogram->SetStats(false);
127  histogram->Draw();
128  n = histogram->GetXaxis()->GetNbins();
129  for (i = 1; i <= n; i++) {
130  uint16_t channelIndex = std::round(histogram->GetBinCenter(i));
131  uint16_t channelNumber = m_ChannelArrayIndex->getNumber(channelIndex);
132  double nHitsPerModule = histogram->GetBinContent(i);
133  average = average + nHitsPerModule;
135  channelNumber, &channelSubdetector, &channelSection, &channelSector,
136  &layer, &plane, &strip);
137  if ((channelSubdetector != subdetector) ||
138  (channelSection != section) ||
139  (channelSector != sector))
140  B2FATAL("Inconsistent element numbers.");
141  uint16_t module = m_ElementNumbers->moduleNumber(
142  subdetector, section, sector, layer);
143  it = moduleHitMap.find(module);
144  if (it == moduleHitMap.end())
145  moduleHitMap.insert(std::pair<uint16_t, double>(module, nHitsPerModule));
146  else
147  it->second += nHitsPerModule;
148  }
149  unsigned int activeModuleChannels = 0;
150  for (it = moduleHitMap.begin(); it != moduleHitMap.end(); ++it) {
151  uint16_t moduleNumber = it->first;
152  if (it->second != 0) {
153  activeModuleChannels += m_ElementNumbers->getNChannelsModule(moduleNumber);
154  continue;
155  }
157  moduleNumber, &channelSubdetector, &channelSection, &channelSector, &layer);
158  /* Channel with plane = 1, strip = 1 exists for any BKLM or EKLM module. */
159  uint16_t channel = m_ElementNumbers->channelNumber(
160  channelSubdetector, channelSection, channelSector,
161  layer, 1, 1);
162  const KLMElectronicsChannel* electronicsChannel =
163  m_ElectronicsMap->getElectronicsChannel(channel);
164  if (electronicsChannel == nullptr)
165  B2FATAL("Incomplete KLM electronics map.");
166  str = "No data from HSLB ";
167  if (channelSubdetector == KLMElementNumbers::c_BKLM) {
168  str += BKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
169  electronicsChannel->getSlot());
170  } else {
171  str += EKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
172  electronicsChannel->getSlot());
173  }
174  str += ", lane " + std::to_string(electronicsChannel->getLane());
175  latex.DrawLatexNDC(x, y, str.c_str());
176  y -= 0.05;
177  /* Store the module number, used later in processPlaneHistogram
178  * to color the canvas with red and to raise up an alarm. */
179  if (channelSubdetector == KLMElementNumbers::c_BKLM) {
180  std::vector<uint16_t>::iterator ite = std::find(m_DeadBarrelModules.begin(),
181  m_DeadBarrelModules.end(),
182  moduleNumber);
183  if (ite == m_DeadBarrelModules.end())
184  m_DeadBarrelModules.push_back(moduleNumber);
185  } else {
186  std::vector<uint16_t>::iterator ite = std::find(m_DeadEndcapModules.begin(),
187  m_DeadEndcapModules.end(),
188  moduleNumber);
189  if (ite == m_DeadEndcapModules.end())
190  m_DeadEndcapModules.push_back(moduleNumber);
191  }
192  }
193  if (activeModuleChannels == 0)
194  return;
195  average /= activeModuleChannels;
196  for (i = 1; i <= n; ++i) {
197  uint16_t channelIndex = std::round(histogram->GetBinCenter(i));
198  uint16_t channelNumber = m_ChannelArrayIndex->getNumber(channelIndex);
199  double nHits = histogram->GetBinContent(i);
201  channelNumber, &channelSubdetector, &channelSection, &channelSector,
202  &layer, &plane, &strip);
203  std::string channelStatus = "Normal";
204  if ((nHits > average * m_ThresholdForMasked) && (nHits > m_MinHitsForFlagging)) {
205  channelStatus = "Masked";
206  std::vector<uint16_t>::iterator ite = std::find(m_MaskedChannels.begin(),
207  m_MaskedChannels.end(),
208  channelNumber);
209  if (ite == m_MaskedChannels.end())
210  m_MaskedChannels.push_back(channelNumber);
211  B2DEBUG(20, "KLM@MaskMe " << channelNumber);
212  } else if ((nHits > average * m_ThresholdForHot) && (nHits > m_MinHitsForFlagging)) {
213  channelStatus = "Hot";
214  }
215  if (channelStatus != "Normal") {
216  const KLMElectronicsChannel* electronicsChannel =
217  m_ElectronicsMap->getElectronicsChannel(channelNumber);
218  if (electronicsChannel == nullptr)
219  B2FATAL("Incomplete BKLM electronics map.");
220  if (channelStatus == "Masked")
221  histogram->SetBinContent(i, 0);
222  str = channelStatus + " channel: HSLB ";
223  if (channelSubdetector == KLMElementNumbers::c_BKLM) {
224  str += BKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
225  electronicsChannel->getSlot());
226  } else {
227  str += EKLMElementNumbers::getHSLBName(electronicsChannel->getCopper(),
228  electronicsChannel->getSlot());
229  }
230  str += (", lane " + std::to_string(electronicsChannel->getLane()) +
231  ", axis " + std::to_string(electronicsChannel->getAxis()) +
232  ", channel " + std::to_string(electronicsChannel->getChannel()));
233  latex.DrawLatexNDC(x, y, str.c_str());
234  y -= 0.05;
235  }
236  }
237  if (histogram->GetMaximum()*n > histogram->Integral()*m_ThresholdForLog && average * activeModuleChannels > m_MinHitsForFlagging) {
238  canvas->SetLogy();
239  }
240  canvas->Modified();
241 }
242 
244  uint16_t section, TH2F* histogram, TCanvas* canvas)
245 {
246  canvas->Clear();
247  canvas->cd();
248  histogram->SetStats(false);
249  histogram->Draw("COLZ");
250  /* Draw the lines only for the backward layers. */
251  if (section == EKLMElementNumbers::c_ForwardSection) {
252  m_2DHitsLine.DrawLine(-110, 80, -110, 190);
253  m_2DHitsLine.DrawLine(-110, 190, 110, 190);
254  m_2DHitsLine.DrawLine(110, 80, 110, 190);
255  m_2DHitsLine.DrawLine(-110, 80, 110, 80);
256  }
257  canvas->Modified();
258 }
259 
261  const std::string& histName)
262 {
263  TH1* histogram = findHist("KLM/" + histName);
264  if (histogram == nullptr) {
265  B2ERROR("KLM DQM histogram KLM/" << histName << " is not found.");
266  return;
267  }
268  TCanvas* canvas = findCanvas("KLM/c_" + histName);
269  if (canvas == nullptr) {
270  B2ERROR("KLM DQM histogram canvas KLM/c_" << histName << " is not found.");
271  return;
272  }
273  histogram->Clear();
274  canvas->Clear();
275  canvas->cd();
276  if (m_MaskedChannels.size() > 0) {
277  int channelSubdetector, channelSection, channelSector;
278  int layer, plane, strip;
279  for (uint16_t channel : m_MaskedChannels) {
281  channel, &channelSubdetector, &channelSection, &channelSector,
282  &layer, &plane, &strip);
283  uint16_t sectorNumber;
284  if (channelSubdetector == KLMElementNumbers::c_BKLM)
285  sectorNumber = m_ElementNumbers->sectorNumberBKLM(channelSection, channelSector);
286  else
287  sectorNumber = m_ElementNumbers->sectorNumberEKLM(channelSection, channelSector);
288  uint16_t sectorIndex = m_SectorArrayIndex->getIndex(sectorNumber);
289  histogram->Fill(sectorIndex);
290  }
291  }
292  histogram->SetStats(false);
293  histogram->Draw();
294  canvas->Modified();
295 }
296 
298  const std::string& histName, TLatex& latex)
299 {
300  std::string name, alarm;
301  const double histMinNDC = 0.1;
302  const double histMaxNDC = 0.9;
303  const double histRangeNDC = histMaxNDC - histMinNDC;
304  int moduleSubdetector, moduleSection, moduleSector, moduleLayer;
305  double xAlarm = 0.15;
306  double yAlarm = 0.8;
307  TH1* histogram = findHist("KLM/" + histName);
308  if (histogram == nullptr) {
309  B2ERROR("KLM DQM histogram KLM/" << histName << " is not found.");
310  return;
311  }
312  TCanvas* canvas = findCanvas("KLM/c_" + histName);
313  if (canvas == nullptr) {
314  B2ERROR("KLM DQM histogram canvas KLM/c_" << histName << " is not found.");
315  return;
316  }
317  canvas->Clear();
318  canvas->cd();
319  histogram->SetStats(false);
320  histogram->Draw();
321  if (histName.find("bklm") != std::string::npos) {
322  /* First draw the vertical lines and the sector names. */
323  const double maximalSector = BKLMElementNumbers::getMaximalSectorGlobalNumber();
324  for (int sector = 0; sector < BKLMElementNumbers::getMaximalSectorGlobalNumber(); ++sector) {
325  double xLineNDC = histMinNDC + (histRangeNDC * sector) / maximalSector;
326  double xTextNDC = histMinNDC + (histRangeNDC * (sector + 0.5)) / maximalSector;
327  double yTextNDC = histMinNDC + 0.98 * histRangeNDC;
328  if (sector > 0)
329  m_PlaneLine.DrawLineNDC(xLineNDC, histMinNDC, xLineNDC, histMaxNDC);
330  name = "B";
331  if (sector < 8)
332  name += "B";
333  else
334  name += "F";
335  name += std::to_string(sector % 8);
336  m_PlaneText.DrawTextNDC(xTextNDC, yTextNDC, name.c_str());
337  }
338  /* Then, color the canvas with red if there is a dead module
339  * and write an error message. */
340  if (m_DeadBarrelModules.size() == 0) {
341  canvas->Pad()->SetFillColor(kWhite);
343  for (uint16_t module : m_DeadBarrelModules) {
345  module, &moduleSubdetector, &moduleSection, &moduleSector, &moduleLayer);
346  alarm = "No data from " + m_ElementNumbers->getSectorDAQName(moduleSubdetector, moduleSection, moduleSector);
347  alarm += ", layer " + std::to_string(moduleLayer);
348  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
349  yAlarm -= 0.05;
350  }
351  if (m_IsNullRun == false) {
352  alarm = "Call the KLM experts immediately!";
353  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
354  canvas->Pad()->SetFillColor(kRed);
355  }
356  }
357  } else {
358  /* First draw the vertical lines and the sector names. */
359  const double maximalLayer = EKLMElementNumbers::getMaximalLayerGlobalNumber();
360  for (int layerGlobal = 1; layerGlobal <= maximalLayer; ++layerGlobal) {
361  double xLineNDC = histMinNDC + (histRangeNDC * layerGlobal) / maximalLayer;
362  double xTextNDC = histMinNDC + (histRangeNDC * (layerGlobal - 0.5)) / maximalLayer;
363  double yTextNDC = histMinNDC + 0.98 * histRangeNDC;
364  if (layerGlobal < maximalLayer)
365  m_PlaneLine.DrawLineNDC(xLineNDC, histMinNDC, xLineNDC, histMaxNDC);
366  int section, layer;
368  layerGlobal, &section, &layer);
370  name = "B";
371  else
372  name = "F";
373  name += std::to_string(layer);
374  m_PlaneText.DrawTextNDC(xTextNDC, yTextNDC, name.c_str());
375  }
376  /* Then, color the canvas with red if there is a dead module
377  * and write an error message. */
378  if (m_DeadEndcapModules.size() == 0) {
379  canvas->Pad()->SetFillColor(kWhite);
381  for (uint16_t module : m_DeadEndcapModules) {
383  module, &moduleSubdetector, &moduleSection, &moduleSector, &moduleLayer);
384  alarm = "No data from " + m_ElementNumbers->getSectorDAQName(moduleSubdetector, moduleSection, moduleSector);
385  alarm += ", layer " + std::to_string(moduleLayer);
386  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
387  yAlarm -= 0.05;
388  }
389  if (m_IsNullRun == false) {
390  alarm = "Call the KLM experts immediately!";
391  latex.DrawLatexNDC(xAlarm, yAlarm, alarm.c_str());
392  canvas->Pad()->SetFillColor(kRed);
393  }
394  }
395  }
396  canvas->Modified();
397  canvas->Update();
398 }
399 
401 {
402  /* If KLM is not included, stop here and return. */
403  TH1* daqInclusion = findHist("KLM/daq_inclusion");
404  if (not(daqInclusion == nullptr)) {
405  int isKlmIncluded = daqInclusion->GetBinContent(daqInclusion->GetXaxis()->FindBin("Yes"));
406  if (isKlmIncluded == 0)
407  return;
408  }
409  /* Make sure that the vectors are cleared at each DQM refresh. */
410  m_DeadBarrelModules.clear();
411  m_DeadEndcapModules.clear();
412  m_MaskedChannels.clear();
414  std::string str, histogramName, canvasName;
415  TLatex latex;
416  latex.SetTextColor(kRed);
417  latex.SetTextAlign(11);
419  for (KLMChannelIndex& klmSector : klmIndex) {
420  int nHistograms;
421  if (klmSector.getSubdetector() == KLMElementNumbers::c_BKLM)
422  nHistograms = 2;
423  else
424  nHistograms = 3;
425  for (int j = 0; j < nHistograms; j++) {
426  str = "strip_hits_subdetector_" +
427  std::to_string(klmSector.getSubdetector()) +
428  "_section_" + std::to_string(klmSector.getSection()) +
429  "_sector_" + std::to_string(klmSector.getSector()) +
430  "_" + std::to_string(j);
431  histogramName = "KLM/" + str;
432  canvasName = "KLM/c_" + str;
433  TH1* histogram = findHist(histogramName);
434  if (histogram == nullptr) {
435  B2ERROR("KLM DQM histogram " << histogramName << " is not found.");
436  continue;
437  }
438  TCanvas* canvas = findCanvas(canvasName);
439  if (canvas == nullptr) {
440  B2ERROR("KLM DQM histogram canvas " << canvasName << " is not found.");
441  continue;
442  }
444  klmSector.getSubdetector(), klmSector.getSection(),
445  klmSector.getSector(), histogram, canvas, latex);
446  }
447  }
448  /* Temporary change the color palette. */
449  gStyle->SetPalette(kLightTemperature);
451  for (KLMChannelIndex& klmSection : klmIndex) {
452  uint16_t subdetector = klmSection.getSubdetector();
453  if (subdetector == KLMElementNumbers::c_EKLM) {
454  uint16_t section = klmSection.getSection();
455  int maximalLayerNumber = m_EklmElementNumbers->getMaximalDetectorLayerNumber(section);
456  for (int j = 1; j <= maximalLayerNumber; ++j) {
457  str = "spatial_2d_hits_subdetector_" + std::to_string(subdetector) +
458  "_section_" + std::to_string(section) +
459  "_layer_" + std::to_string(j);
460  histogramName = "KLM/" + str;
461  canvasName = "KLM/c_" + str;
462  TH2F* histogram = static_cast<TH2F*>(findHist(histogramName));
463  if (histogram == nullptr) {
464  B2ERROR("KLM DQM histogram " << histogramName << " is not found.");
465  continue;
466  }
467  TCanvas* canvas = findCanvas(canvasName);
468  if (canvas == nullptr) {
469  B2ERROR("KLM DQM histogram canvas " << canvasName << " is not found.");
470  continue;
471  }
472  processSpatial2DHitEndcapHistogram(section, histogram, canvas);
473  }
474  }
475  }
476  /* Reset the color palette to the default one. */
477  gStyle->SetPalette(kBird);
478  fillMaskedChannelsHistogram("masked_channels");
479  latex.SetTextColor(kBlue);
480  processPlaneHistogram("plane_bklm_phi", latex);
481  processPlaneHistogram("plane_bklm_z", latex);
482  processPlaneHistogram("plane_eklm", latex);
483 }
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.
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.
TString m_RunTypeString
String with run type.
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.
TH1 * m_RunType
Histogram from DQMInfo with run type.
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.
bool m_IsNullRun
Run type flag for null runs.
void fillMaskedChannelsHistogram(const std::string &histName)
Fill histogram containing masked channels per sector.
The base class for the histogram analysis module.
TCanvas * findCanvas(TString cname)
Find canvas by name.
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.