Belle II Software  release-08-03-00
CDCUnpackerModule.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 #include <cdc/modules/cdcUnpacker/CDCUnpackerModule.h>
10 // DB objects
11 #include <cdc/dbobjects/CDCChannelMap.h>
12 
13 #include <framework/datastore/DataStore.h>
14 #include <framework/logging/Logger.h>
15 #include <framework/utilities/FileSystem.h>
16 // framework - Database
17 #include <framework/database/DBArray.h>
18 
19 #include <iostream>
20 
21 using namespace std;
22 using namespace Belle2;
23 using namespace CDC;
24 
25 //-----------------------------------------------------------------
26 // Register the Module
27 //-----------------------------------------------------------------
28 REG_MODULE(CDCUnpacker);
29 
30 //-----------------------------------------------------------------
31 // Implementation
32 //-----------------------------------------------------------------
33 
34 CDCUnpackerModule::CDCUnpackerModule() : Module()
35 {
36  //Set module properties
37  setDescription("CDCUnpacker generates CDCHit from Raw data.");
39 
40  addParam("rawCDCName", m_rawCDCName, "Name of the RawCDC List name..", string(""));
41  addParam("cdcRawHitWaveFormName", m_cdcRawHitWaveFormName, "Name of the CDCRawHit (Raw data mode).", string(""));
42  addParam("cdcRawHitName", m_cdcRawHitName, "Name of the CDCRawHit (Suppressed mode).", string(""));
43  addParam("cdcHitName", m_cdcHitName, "Name of the CDCHit List name..", string(""));
44  addParam("fadcThreshold", m_fadcThreshold, "Threshold count.", 1);
45 
46  addParam("xmlMapFileName", m_xmlMapFileName, "path+name of the xml file", string(""));
47  addParam("enableStoreCDCRawHit", m_enableStoreCDCRawHit, "Enable to store to the CDCRawHit object", false);
48  addParam("enablePrintOut", m_enablePrintOut, "Enable to print out the data to the terminal", false);
49  addParam("boardIDTrig", m_boardIDTrig, "Board ID for the trigger.", 7);
50  addParam("channelTrig", m_channelTrig, "Channel for the trigger.", 1);
51  addParam("subtractTrigTiming", m_subtractTrigTiming, "Enable to subtract the trigger timing from TDCs.", false);
52  addParam("tdcOffset", m_tdcOffset, "TDC offset (in TDC count).", 0);
53  addParam("enableDatabase", m_enableDatabase, "Enable database to read the channel map.", true);
54  addParam("enable2ndHit", m_enable2ndHit, "Enable 2nd hit timing as a individual CDCHit object.", false);
55  addParam("tdcAuxOffset", m_tdcAuxOffset, "TDC auxiliary offset (in TDC count).", 0);
56  addParam("pedestalSubtraction", m_pedestalSubtraction, "Enbale ADC pedestal subtraction.", m_pedestalSubtraction);
57  addParam("recoverBoardIdError", m_recoverBoardIdError, "Recover boardID errors", true);
58 }
59 
61 {
62 }
63 
65 {
66  m_dataLengthError = false;
67  m_dataSizeError = false;
69  if ((*m_channelMapFromDB).isValid()) {
70  // B2INFO("Channel map is valid");
71  } else {
72  B2FATAL("Channel map is not valid");
73  }
74 
75  if (m_enablePrintOut == true) {
76  B2INFO("CDCUnpacker: initialize() Called.");
77  }
78 
79  m_rawCDCs.isRequired(m_rawCDCName);
80  m_CDCRawHitWaveForms.registerInDataStore(m_cdcRawHitWaveFormName);
81  m_CDCRawHits.registerInDataStore(m_cdcRawHitName);
82  m_CDCHits.registerInDataStore(m_cdcHitName);
83 
84  if (m_enablePrintOut == true) {
85  B2INFO("CDCUnpacker: " << LogVar("FADC threshold", m_fadcThreshold));
86  }
87 }
88 
90 {
91  if (m_enablePrintOut == true) {
92  B2INFO("CDCUnpacker: beginRun() called.");
93  }
94 
95 
96  loadMap();
98 }
99 
101 {
102  if (m_enablePrintOut == true) {
103  B2INFO("CDCUnpacker: event() started.");
104  }
105 
106  // TDC count for the trigger scinti.
107  int tdcCountTrig = m_tdcOffset;
108 
109  // Create Data objects.
110  m_CDCHits.clear();
111 
112  if (m_enableStoreCDCRawHit == true) {
113  m_CDCRawHits.clear();
114  m_CDCRawHitWaveForms.clear();
115  }
116 
117  //
118  // Proccess RawCDC data block.
119  //
120 
121  const int nEntries = m_rawCDCs.getEntries();
122 
123  B2DEBUG(99, "nEntries of RawCDCs : " << nEntries);
124 
125  for (int i = 0; i < nEntries; ++i) {
126  const int subDetectorId = m_rawCDCs[i]->GetNodeID(0);
127  const int iNode = (subDetectorId & 0xFFFFFF);
128  const int nEntriesRawCDC = m_rawCDCs[i]->GetNumEntries();
129 
130  B2DEBUG(99, LogVar("nEntries of rawCDC[i]", nEntriesRawCDC));
131 
132  for (int j = 0; j < nEntriesRawCDC; ++j) {
133  int trigType = m_rawCDCs[i]->GetTRGType(j); // Get event type of L1 trigger.
134  int nWords[48];
135  int* data32tab[48];
136  int MaxNumOfCh = m_rawCDCs[i]->GetMaxNumOfCh(j);
137  string readoutName;
138  if (MaxNumOfCh == 4) readoutName = "COPPER";
139  else if (MaxNumOfCh == 48) readoutName = "PCIe40";
140  else
141  B2FATAL("CDC UnpackerModule: Invalid value of GetMaxNumOfCh from raw data: " << LogVar("Number of ch: ",
142  m_rawCDCs[i]->GetMaxNumOfCh(j)));
143 
144  for (int k = 0; k < MaxNumOfCh; ++k) {
145  nWords[k] = m_rawCDCs[i]->GetDetectorNwords(j, k);
146  if (MaxNumOfCh == 48 && m_rawCDCs[i]->CheckOnlineRemovedDataBit(j, k) == true) { //for error flag in ff55 trailer
147  if (nWords[k] != 0)
148  B2FATAL("The data is not removed for the bad channel (" << j << "," << k << ") with error flag in ff55 trailer! ");
149  }
150  data32tab[k] = (int*)m_rawCDCs[i]->GetDetectorBuffer(j, k);
151  }
152 
153  //
154  // Search Data from Finess 0->MaxNumOfCh (4/48 for COPPER/PCIe40).
155  //
156 
157  for (int iFiness = 0; iFiness < MaxNumOfCh; ++iFiness) {
158  int* ibuf = data32tab[iFiness];
159  const int nWord = nWords[iFiness];
160  B2DEBUG(99, LogVar("nWords (from " + readoutName + " header)", nWord));
161 
162  if (m_enablePrintOut == true) {
163  B2INFO("CDCUnpacker : Print out CDC data block.");
164  printBuffer(ibuf, nWord);
165  }
166 
167  const int c_headearWords = 3;
168  if (nWord < c_headearWords) {
169  if (m_enablePrintOut == true) {
170  B2WARNING("CDCUnpacker : No CDC block header.");
171  }
172  continue;
173  }
174 
175  if (m_enablePrintOut == true) {
176  B2INFO("CDCUnpacker : RawDataBlock(CDC) : Block # "
177  << LogVar("Block", i)
178  << LogVar("Node", iNode)
179  << LogVar("Finness", iFiness));
180  }
181 
182  setCDCPacketHeader(ibuf);
183 
184  // Skip invalid boardsIDs
185  if (m_boardId > 300) {
186  B2WARNING("Unrecoverable board " << std::hex << m_boardId);
187  continue;
188  }
189 
190  const int dataType = getDataType();
191  const int dataLength = getDataLength() / 4; // Data length in int word (4bytes).
192  const int swDataLength = dataLength * 2; // Data length in short word (2bytes).
193 
194 
195  if (dataLength != (nWord - c_headearWords)) {
196  if (m_dataSizeError == false) {
197  B2ERROR("Inconsistent data size between " + readoutName + " and CDC FEE."
198  << LogVar("data length", dataLength) << LogVar("nWord", nWord)
199  << LogVar("Node ID", iNode) << LogVar("Finness ID", iFiness));
200  m_dataSizeError = true;
201  } else {
202  B2WARNING("Inconsistent data size between " + readoutName + " and CDC FEE."
203  << LogVar("data length", dataLength) << LogVar("nWord", nWord)
204  << LogVar("Node ID", iNode) << LogVar("Finness ID", iFiness));
205  }
206  continue;
207  }
208  if (m_enablePrintOut == true) {
209  B2INFO("CDCUnpacker : " << LogVar("Data size", dataLength));
210  }
211 
212  const int board = getBoardId();
213  const int trgNumber = getTriggerNumber();
214  const int trgTime = getTriggerTime();
215 
216  if (m_enablePrintOut == true) {
217  B2INFO("CDCUnpacker : " << LogVar("Board", board) << LogVar("Trigger number", trgNumber)
218  << LogVar("Trigger time ", trgTime));
219  }
220 
221  //
222  // Check the data type (raw or supressed mode?).
223  //
224 
225  if (dataType == 1) { // Raw data mode.
226  if (m_enablePrintOut == true) {
227  B2INFO("CDCUnpacker : Raw data mode.");
228  }
229 
230  m_buffer.clear();
231 
232  for (int it = 0; it < dataLength; ++it) {
233  int index = it + c_headearWords;
234 
235  m_buffer.push_back(static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
236  m_buffer.push_back(static_cast<unsigned short>(ibuf[index] & 0xffff));
237  }
238 
239  const int fadcTdcChannels = 48; // Total channels of FADC or TDC.
240  const int nSamples = swDataLength / (2 * fadcTdcChannels); // Number of samplings.
241 
242  std::vector<unsigned short> fadcs;
243  std::vector<unsigned short> tdcs;
244 
245  for (int iCh = 0; iCh < fadcTdcChannels; ++iCh) {
246  const int offset = fadcTdcChannels;
247  unsigned short fadcSum = 0; // FADC sum below thereshold.
248  unsigned short tdc1 = 0x7fff; // Fastest TDC.
249  unsigned short tdc2 = 0x7fff; // 2nd fastest TDC.
250 
251  for (int iSample = 0; iSample < nSamples; ++iSample) {
252  // FADC value for each sample and channel.
253 
254  unsigned short fadc = m_buffer.at(iCh + 2 * fadcTdcChannels * iSample);
255 
256  if (fadc > m_fadcThreshold) {
257  fadcSum += fadc;
258  }
259  // TDC count for each sample and channel.
260 
261  unsigned short tdc = m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x7fff;
262  unsigned short tdcIsValid = (m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x8000) >> 15;
263  if (tdcIsValid == 1) { // good tdc data.
264  if (tdc > 0) { // if hit timng is 0, skip.
265  if (tdc < tdc1) {
266  tdc2 = tdc1; // 2nd fastest hit
267  tdc1 = tdc; // fastest hit.
268  }
269  }
270  }
271 
272  fadcs.push_back(fadc);
273  tdcs.push_back(tdc);
274  if (m_enableStoreCDCRawHit == true) {
275  // Store to the CDCRawHitWaveForm object.
276  const unsigned short status = 0;
277  m_CDCRawHitWaveForms.appendNew(status, trgNumber, iNode, iFiness, board, iCh, iSample, trgTime, fadc, tdc);
278  }
279 
280  }
281 
282  if (tdc1 != 0x7fff) {
283  // Store to the CDCHit object.
284  const WireID wireId = getWireID(board, iCh);
285 
286  if (trgTime < tdc1) {
287  tdc1 = (trgTime | 0x8000) - tdc1;
288  } else {
289  tdc1 = trgTime - tdc1;
290  }
291  CDCHit* firstHit = m_CDCHits.appendNew(tdc1, fadcSum, wireId);
292  if (m_enable2ndHit == true) {
293  CDCHit* secondHit = m_CDCHits.appendNew(tdc2, fadcSum, wireId);
294  secondHit->setOtherHitIndices(firstHit);
295  secondHit->set2ndHitFlag();
296  }
297  }
298 
299 
300 
301 
302  if (m_enablePrintOut == true) {
303  //
304  // Print out (for debug).
305  //
306 
307  printf("FADC ch %2d : ", iCh);
308  for (int iSample = 0; iSample < nSamples; ++iSample) {
309  printf("%4x ", fadcs.at(iSample));
310  }
311  printf("\n");
312 
313  printf("TDC ch %2d : ", iCh);
314  for (int iSample = 0; iSample < nSamples; ++iSample) {
315  printf("%4x ", tdcs.at(iSample));
316  }
317  printf("\n");
318  }
319 
320  }
321 
322  } else if (dataType == 2) { // Suppressed mode.
323  if (m_enablePrintOut == true) {
324  B2INFO("CDCUnpacker : Suppressed mode.");
325  }
326 
327  // convert int array -> short array.
328  m_buffer.clear();
329  for (int it = 0; it < dataLength; ++it) {
330  int index = it + c_headearWords;
331  m_buffer.push_back(static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
332  m_buffer.push_back(static_cast<unsigned short>(ibuf[index] & 0xffff));
333  }
334 
335  const size_t bufSize = m_buffer.size();
336  for (size_t it = 0; it < bufSize;) {
337  unsigned short header = m_buffer.at(it); // Header.
338  unsigned short ch = (header & 0xff00) >> 8; // Channel ID in FE.
339  unsigned short length = (header & 0xff) / 2; // Data length in short word.
340 
341  if (header == 0xff02) {
342  it++;
343  continue;
344  }
345 
346  if (!((length == 4) || (length == 5))) {
347  if (m_dataLengthError == false) {
348  B2ERROR("CDCUnpacker : data length should be 4 or 5 words."
349  << LogVar("data length", length)
350  << LogVar("board id", board)
351  << LogVar("channel", ch));
352  m_dataLengthError = true;
353  } else {
354  B2WARNING("CDCUnpacker : data length should be 4 or 5 words."
355  << LogVar("data length", length)
356  << LogVar("board id", board)
357  << LogVar("channel", ch));
358  }
359  break;
360  }
361 
362  unsigned short tot = m_buffer.at(it + 1); // Time over threshold.
363  unsigned short fadcSum = m_buffer.at(it + 2); // FADC sum.
364 
365  if (m_pedestalSubtraction == true) {
366  int diff = fadcSum - (*m_adcPedestalFromDB)->getPedestal(board, ch);
367  if (diff <= m_fadcThreshold) {
368  fadcSum = 0;
369  } else {
370  fadcSum = static_cast<unsigned short>(diff);
371  }
372  }
373  unsigned short tdc1 = 0; // TDC count.
374  unsigned short tdc2 = 0; // 2nd TDC count.
375  unsigned short tdcFlag = 0; // Multiple hit or not (1 for multi hits, 0 for single hit).
376 
377  if (length == 4) {
378  tdc1 = m_buffer.at(it + 3);
379  } else if (length == 5) {
380  tdc1 = m_buffer.at(it + 3);
381  tdc2 = m_buffer.at(it + 4) & 0x7fff;
382  tdcFlag = (m_buffer.at(it + 4) & 0x8000) >> 15;
383  } else {
384  B2ERROR("CDCUnpacker : Undefined data length (should be 4 or 5 short words) ");
385  }
386 
387  if (ch >= 48) {
388  B2WARNING("Invalid channel "
389  << LogVar("channel", ch)
390  << LogVar("board", board)
391  << LogVar("buffer total size", m_buffer.size())
392  << LogVar("length", length)
393  << LogVar("tdc", tdc1)
394  << LogVar("adc", fadcSum)
395  << LogVar("tot", tot)
396  );
397  it += length;
398  continue;
399  }
400 
401  if (m_enablePrintOut == true) {
402  printf("%4x %4x %4x %4x %4x %4x %4x \n", ch, length, tot, fadcSum, tdc1, tdc2, tdcFlag);
403  }
404  if (length == 4 || length == 5) {
405 
406  // const unsigned short status = 0;
407  const unsigned short status = trigType; // temporally trigger type is stored, here.
408  // Store to the CDCHit.
409  const WireID wireId = getWireID(board, ch);
410 
411  if (isValidBoardChannel(wireId)) {
412  if (board == m_boardIDTrig && ch == m_channelTrig) {
413  tdcCountTrig = tdc1;
414  } else {
415  CDCHit* firstHit = m_CDCHits.appendNew(tdc1, fadcSum, wireId,
416  0, tot);
417  if (length == 5) {
418  if (m_enable2ndHit == true) {
419  CDCHit* secondHit = m_CDCHits.appendNew(tdc2, fadcSum, wireId,
420  0, tot);
421  secondHit->setOtherHitIndices(firstHit);
422  secondHit->set2ndHitFlag();
423  }
424  }
425  }
426 
427  if (m_enableStoreCDCRawHit == true) {
428  // Store to the CDCRawHit object.
429  m_CDCRawHits.appendNew(status, trgNumber, iNode, iFiness, board, ch,
430  trgTime, fadcSum, tdc1, tdc2, tot);
431  }
432 
433  } else {
434  B2WARNING("Undefined board id is fired: " << LogVar("board id", board) << " " << LogVar("channel", ch));
435  }
436  }
437  it += length;
438  }
439 
440  } else {
441  B2WARNING("CDCUnpacker : Undefined CDC Data Block : Block # " << LogVar("block id", i));
442  }
443  }
444  }
445  }
446 
447  //
448  // t0 correction w.r.t. the timing of the trigger counter.
449  //
450  if (m_subtractTrigTiming == true) {
451  for (auto& hit : m_CDCHits) {
452  int tdc = hit.getTDCCount();
453  if (hit.is2ndHit()) {
454  if (tdc != 0) {
455  tdc = tdc - (tdcCountTrig - m_tdcOffset);
456  }
457  } else {
458  tdc = tdc - (tdcCountTrig - m_tdcOffset);
459  }
460 
461  tdc -= m_tdcAuxOffset;
462  hit.setTDCCount(static_cast<unsigned short>(tdc));
463  }
464  }
465 }
466 
468 {
469  if (m_enablePrintOut == true) {
470  B2INFO("CDCUnpacker : End run.");
471  }
472 }
473 
475 {
476  if (m_enablePrintOut == true) {
477  B2INFO("CDCUnpacker : Terminated.");
478  }
479 
482 }
483 
484 
485 WireID CDCUnpackerModule::getWireID(int iBoard, int iCh) const
486 {
487  return m_map[iBoard][iCh];
488 }
489 
491 {
492 
493  if (m_enableDatabase == false) {
494 
495  // Read the channel map from the local text.
496  std::string fileName = FileSystem::findFile(m_xmlMapFileName);
497  std::cout << fileName << std::endl;
498  if (fileName == "") {
499  B2ERROR("CDC unpacker can't find a filename: " << LogVar("file name", fileName));
500  exit(1);
501  }
502 
503 
504  ifstream ifs;
505  ifs.open(fileName.c_str());
506  int isl;
507  int icl;
508  int iw;
509  int iBoard;
510  int iCh;
511 
512  while (!ifs.eof()) {
513  ifs >> isl >> icl >> iw >> iBoard >> iCh;
514  const WireID wireId(isl, icl, iw);
515  m_map[iBoard][iCh] = wireId;
516  }
517  } else {
518  for (const auto& cm : (*m_channelMapFromDB)) {
519  const int isl = cm.getISuperLayer();
520  const int il = cm.getILayer();
521  const int iw = cm.getIWire();
522  const int iBoard = cm.getBoardID();
523  const int iCh = cm.getBoardChannel();
524  const WireID wireId(isl, il, iw);
525  m_map[iBoard][iCh] = wireId;
526  }
527  }
528 }
529 
531 {
532  if (m_pedestalSubtraction == true) {
534  if (!(*m_adcPedestalFromDB).isValid()) {
535  m_pedestalSubtraction = false;
536  }
537  }
538 
539 }
540 
541 void CDCUnpackerModule::printBuffer(int* buf, int nwords)
542 {
543 
544  for (int j = 0; j < nwords; ++j) {
545  printf(" %.8x", buf[j]);
546  if ((j + 1) % 10 == 0) {
547  printf("\n");
548  }
549  }
550  printf("\n");
551 
552  return;
553 }
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:40
void set2ndHitFlag()
Setter for 2nd hit flag.
Definition: CDCHit.h:113
void setOtherHitIndices(CDCHit *otherHit)
Setter for the other hit indices.
Definition: CDCHit.h:147
StoreArray< RawCDC > m_rawCDCs
Input array for CDC Raw.
bool m_enableDatabase
Enable/Disable to read the channel map from the database.
int m_boardId
Front end board ID.
std::vector< unsigned short > m_buffer
Short ward buffer of CDC event block.
int m_channelTrig
Channel for the trigger.
bool m_dataSizeError
True if data size error between CDCFE and COPPER has been already reported.
std::string m_rawCDCName
Name of the RawCDC dataobject (suppressed mode).
void initialize() override
Initializes the Module.
DBArray< CDCChannelMap > * m_channelMapFromDB
Channel map retrieved from DB.
StoreArray< CDCRawHitWaveForm > m_CDCRawHitWaveForms
Raw hit waveforms.
void printBuffer(int *buf, int nwords)
Print out the CDC data block in hex.
int getTriggerNumber()
Getter for trigger number.
void event() override
Event action (main routine).
StoreArray< CDCRawHit > m_CDCRawHits
Raw hits.
bool m_subtractTrigTiming
Enable/Disable to subtract the trigger timing from TDCs.
bool m_dataLengthError
True if data length error has been already reported.
void endRun() override
End run action.
void terminate() override
Termination action.
int getTriggerTime()
Getter for trigger time in nsec.
int m_tdcOffset
TDC offset (nsec).
std::string m_xmlMapFileName
Name of the assignment map of FE board channel to the cell.
WireID m_map[300][48]
Assignment map of FE board channel to the cell.
int getDataType()
Getter for CDC data mode.
std::string m_cdcRawHitName
Name of the CDCRawHit dataobject (suppressed mode).
bool m_pedestalSubtraction
Whether pedestal is subtracted (true) or not (false).
void beginRun() override
Begin run action.
bool m_recoverBoardIdError
Recover boardID error if true, skip information otherwise.
DBObjPtr< CDCADCDeltaPedestals > * m_adcPedestalFromDB
ADC delta pedestal.
int m_boardIDTrig
Board ID for the trigger.
bool m_enableStoreCDCRawHit
Enable/Disable to store CDCRawHit.
int m_tdcAuxOffset
TDC auxiliary offset (nsec).
int getDataLength()
Getter for data length in byte.
void loadMap()
Load FE channel to cell ID map.
WireID getWireID(int iBoard, int iCh) const
Getter of Wire ID.
bool m_enablePrintOut
Enable/Disable to print out the data to the terminal.
bool isValidBoardChannel(WireID wireId)
Check if the hit wire is valid or not.
std::string m_cdcRawHitWaveFormName
Name of the CDCRawHit dataobject (raw data mode).
void setCDCPacketHeader(const int *buf)
Set CDC Packet header.
virtual ~CDCUnpackerModule()
Destructor of the module.
bool m_enable2ndHit
Enable/Disable to 2nd hit output.
int getBoardId()
Getter for FE board ID.
std::string m_cdcHitName
Tree name of the CDCHit object.
void setADCPedestal()
Set DBobject of ADC delta pedestal.
StoreArray< CDCHit > m_CDCHits
CDC hits.
Class for accessing arrays of objects in the database.
Definition: DBArray.h:26
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
static std::string findFile(const std::string &path, bool silent=false)
Search for given file or directory in local or central release directory, and return absolute path if...
Definition: FileSystem.cc:148
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
Class to identify a wire inside the CDC.
Definition: WireID.h:34
unsigned short getISuperLayer() const
Getter for Super-Layer.
Definition: WireID.h:130
Class to store variables with their name which were sent to the logging service.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#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.