Belle II Software  release-08-01-10
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("Invalid board " << std::hex << m_boardId << std::dec << " readout buffer block: " << i << " block channel: " << iFiness);
187  if (m_recoverBoardIdError) {
188  m_boardId = m_boardId & 0x01ff;
189  if (m_boardId > 300) {
190  B2WARNING("Unrecoverable board " << std::hex << m_boardId);
191  continue;
192  }
193  } else {
194  continue;
195  }
196  }
197 
198  const int dataType = getDataType();
199  const int dataLength = getDataLength() / 4; // Data length in int word (4bytes).
200  const int swDataLength = dataLength * 2; // Data length in short word (2bytes).
201 
202 
203  if (dataLength != (nWord - c_headearWords)) {
204  if (m_dataSizeError == false) {
205  B2ERROR("Inconsistent data size between " + readoutName + " and CDC FEE."
206  << LogVar("data length", dataLength) << LogVar("nWord", nWord)
207  << LogVar("Node ID", iNode) << LogVar("Finness ID", iFiness));
208  m_dataSizeError = true;
209  } else {
210  B2WARNING("Inconsistent data size between " + readoutName + " and CDC FEE."
211  << LogVar("data length", dataLength) << LogVar("nWord", nWord)
212  << LogVar("Node ID", iNode) << LogVar("Finness ID", iFiness));
213  }
214  continue;
215  }
216  if (m_enablePrintOut == true) {
217  B2INFO("CDCUnpacker : " << LogVar("Data size", dataLength));
218  }
219 
220  const int board = getBoardId();
221  const int trgNumber = getTriggerNumber();
222  const int trgTime = getTriggerTime();
223 
224  if (m_enablePrintOut == true) {
225  B2INFO("CDCUnpacker : " << LogVar("Board", board) << LogVar("Trigger number", trgNumber)
226  << LogVar("Trigger time ", trgTime));
227  }
228 
229  //
230  // Check the data type (raw or supressed mode?).
231  //
232 
233  if (dataType == 1) { // Raw data mode.
234  if (m_enablePrintOut == true) {
235  B2INFO("CDCUnpacker : Raw data mode.");
236  }
237 
238  m_buffer.clear();
239 
240  for (int it = 0; it < dataLength; ++it) {
241  int index = it + c_headearWords;
242 
243  m_buffer.push_back(static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
244  m_buffer.push_back(static_cast<unsigned short>(ibuf[index] & 0xffff));
245  }
246 
247  const int fadcTdcChannels = 48; // Total channels of FADC or TDC.
248  const int nSamples = swDataLength / (2 * fadcTdcChannels); // Number of samplings.
249 
250  std::vector<unsigned short> fadcs;
251  std::vector<unsigned short> tdcs;
252 
253  for (int iCh = 0; iCh < fadcTdcChannels; ++iCh) {
254  const int offset = fadcTdcChannels;
255  unsigned short fadcSum = 0; // FADC sum below thereshold.
256  unsigned short tdc1 = 0x7fff; // Fastest TDC.
257  unsigned short tdc2 = 0x7fff; // 2nd fastest TDC.
258 
259  for (int iSample = 0; iSample < nSamples; ++iSample) {
260  // FADC value for each sample and channel.
261 
262  unsigned short fadc = m_buffer.at(iCh + 2 * fadcTdcChannels * iSample);
263 
264  if (fadc > m_fadcThreshold) {
265  fadcSum += fadc;
266  }
267  // TDC count for each sample and channel.
268 
269  unsigned short tdc = m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x7fff;
270  unsigned short tdcIsValid = (m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x8000) >> 15;
271  if (tdcIsValid == 1) { // good tdc data.
272  if (tdc > 0) { // if hit timng is 0, skip.
273  if (tdc < tdc1) {
274  tdc2 = tdc1; // 2nd fastest hit
275  tdc1 = tdc; // fastest hit.
276  }
277  }
278  }
279 
280  fadcs.push_back(fadc);
281  tdcs.push_back(tdc);
282  if (m_enableStoreCDCRawHit == true) {
283  // Store to the CDCRawHitWaveForm object.
284  const unsigned short status = 0;
285  m_CDCRawHitWaveForms.appendNew(status, trgNumber, iNode, iFiness, board, iCh, iSample, trgTime, fadc, tdc);
286  }
287 
288  }
289 
290  if (tdc1 != 0x7fff) {
291  // Store to the CDCHit object.
292  const WireID wireId = getWireID(board, iCh);
293 
294  if (trgTime < tdc1) {
295  tdc1 = (trgTime | 0x8000) - tdc1;
296  } else {
297  tdc1 = trgTime - tdc1;
298  }
299  CDCHit* firstHit = m_CDCHits.appendNew(tdc1, fadcSum, wireId);
300  if (m_enable2ndHit == true) {
301  CDCHit* secondHit = m_CDCHits.appendNew(tdc2, fadcSum, wireId);
302  secondHit->setOtherHitIndices(firstHit);
303  secondHit->set2ndHitFlag();
304  }
305  }
306 
307 
308 
309 
310  if (m_enablePrintOut == true) {
311  //
312  // Print out (for debug).
313  //
314 
315  printf("FADC ch %2d : ", iCh);
316  for (int iSample = 0; iSample < nSamples; ++iSample) {
317  printf("%4x ", fadcs.at(iSample));
318  }
319  printf("\n");
320 
321  printf("TDC ch %2d : ", iCh);
322  for (int iSample = 0; iSample < nSamples; ++iSample) {
323  printf("%4x ", tdcs.at(iSample));
324  }
325  printf("\n");
326  }
327 
328  }
329 
330  } else if (dataType == 2) { // Suppressed mode.
331  if (m_enablePrintOut == true) {
332  B2INFO("CDCUnpacker : Suppressed mode.");
333  }
334 
335  // convert int array -> short array.
336  m_buffer.clear();
337  for (int it = 0; it < dataLength; ++it) {
338  int index = it + c_headearWords;
339  m_buffer.push_back(static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
340  m_buffer.push_back(static_cast<unsigned short>(ibuf[index] & 0xffff));
341  }
342 
343  const size_t bufSize = m_buffer.size();
344  for (size_t it = 0; it < bufSize;) {
345  unsigned short header = m_buffer.at(it); // Header.
346  unsigned short ch = (header & 0xff00) >> 8; // Channel ID in FE.
347  unsigned short length = (header & 0xff) / 2; // Data length in short word.
348 
349  if (header == 0xff02) {
350  it++;
351  continue;
352  }
353 
354  if (!((length == 4) || (length == 5))) {
355  if (m_dataLengthError == false) {
356  B2ERROR("CDCUnpacker : data length should be 4 or 5 words."
357  << LogVar("data length", length)
358  << LogVar("board id", board)
359  << LogVar("channel", ch));
360  m_dataLengthError = true;
361  } else {
362  B2WARNING("CDCUnpacker : data length should be 4 or 5 words."
363  << LogVar("data length", length)
364  << LogVar("board id", board)
365  << LogVar("channel", ch));
366  }
367  break;
368  }
369 
370  unsigned short tot = m_buffer.at(it + 1); // Time over threshold.
371  unsigned short fadcSum = m_buffer.at(it + 2); // FADC sum.
372 
373  if (m_pedestalSubtraction == true) {
374  int diff = fadcSum - (*m_adcPedestalFromDB)->getPedestal(board, ch);
375  if (diff <= m_fadcThreshold) {
376  fadcSum = 0;
377  } else {
378  fadcSum = static_cast<unsigned short>(diff);
379  }
380  }
381  unsigned short tdc1 = 0; // TDC count.
382  unsigned short tdc2 = 0; // 2nd TDC count.
383  unsigned short tdcFlag = 0; // Multiple hit or not (1 for multi hits, 0 for single hit).
384 
385  if (length == 4) {
386  tdc1 = m_buffer.at(it + 3);
387  } else if (length == 5) {
388  tdc1 = m_buffer.at(it + 3);
389  tdc2 = m_buffer.at(it + 4) & 0x7fff;
390  tdcFlag = (m_buffer.at(it + 4) & 0x8000) >> 15;
391  } else {
392  B2ERROR("CDCUnpacker : Undefined data length (should be 4 or 5 short words) ");
393  }
394 
395  if (ch >= 48) {
396  B2WARNING("Invalid channel "
397  << LogVar("channel", ch)
398  << LogVar("board", board)
399  << LogVar("buffer total size", m_buffer.size())
400  << LogVar("length", length)
401  << LogVar("tdc", tdc1)
402  << LogVar("adc", fadcSum)
403  << LogVar("tot", tot)
404  );
405  it += length;
406  continue;
407  }
408 
409  if (m_enablePrintOut == true) {
410  printf("%4x %4x %4x %4x %4x %4x %4x \n", ch, length, tot, fadcSum, tdc1, tdc2, tdcFlag);
411  }
412  if (length == 4 || length == 5) {
413 
414  // const unsigned short status = 0;
415  const unsigned short status = trigType; // temporally trigger type is stored, here.
416  // Store to the CDCHit.
417  const WireID wireId = getWireID(board, ch);
418 
419  if (isValidBoardChannel(wireId)) {
420  if (board == m_boardIDTrig && ch == m_channelTrig) {
421  tdcCountTrig = tdc1;
422  } else {
423  CDCHit* firstHit = m_CDCHits.appendNew(tdc1, fadcSum, wireId,
424  0, tot);
425  if (length == 5) {
426  if (m_enable2ndHit == true) {
427  CDCHit* secondHit = m_CDCHits.appendNew(tdc2, fadcSum, wireId,
428  0, tot);
429  secondHit->setOtherHitIndices(firstHit);
430  secondHit->set2ndHitFlag();
431  }
432  }
433  }
434 
435  if (m_enableStoreCDCRawHit == true) {
436  // Store to the CDCRawHit object.
437  m_CDCRawHits.appendNew(status, trgNumber, iNode, iFiness, board, ch,
438  trgTime, fadcSum, tdc1, tdc2, tot);
439  }
440 
441  } else {
442  B2WARNING("Undefined board id is fired: " << LogVar("board id", board) << " " << LogVar("channel", ch));
443  }
444  }
445  it += length;
446  }
447 
448  } else {
449  B2WARNING("CDCUnpacker : Undefined CDC Data Block : Block # " << LogVar("block id", i));
450  }
451  }
452  }
453  }
454 
455  //
456  // t0 correction w.r.t. the timing of the trigger counter.
457  //
458  if (m_subtractTrigTiming == true) {
459  for (auto& hit : m_CDCHits) {
460  int tdc = hit.getTDCCount();
461  if (hit.is2ndHit()) {
462  if (tdc != 0) {
463  tdc = tdc - (tdcCountTrig - m_tdcOffset);
464  }
465  } else {
466  tdc = tdc - (tdcCountTrig - m_tdcOffset);
467  }
468 
469  tdc -= m_tdcAuxOffset;
470  hit.setTDCCount(static_cast<unsigned short>(tdc));
471  }
472  }
473 }
474 
476 {
477  if (m_enablePrintOut == true) {
478  B2INFO("CDCUnpacker : End run.");
479  }
480 }
481 
483 {
484  if (m_enablePrintOut == true) {
485  B2INFO("CDCUnpacker : Terminated.");
486  }
487 
490 }
491 
492 
493 WireID CDCUnpackerModule::getWireID(int iBoard, int iCh) const
494 {
495  return m_map[iBoard][iCh];
496 }
497 
499 {
500 
501  if (m_enableDatabase == false) {
502 
503  // Read the channel map from the local text.
504  std::string fileName = FileSystem::findFile(m_xmlMapFileName);
505  std::cout << fileName << std::endl;
506  if (fileName == "") {
507  B2ERROR("CDC unpacker can't find a filename: " << LogVar("file name", fileName));
508  exit(1);
509  }
510 
511 
512  ifstream ifs;
513  ifs.open(fileName.c_str());
514  int isl;
515  int icl;
516  int iw;
517  int iBoard;
518  int iCh;
519 
520  while (!ifs.eof()) {
521  ifs >> isl >> icl >> iw >> iBoard >> iCh;
522  const WireID wireId(isl, icl, iw);
523  m_map[iBoard][iCh] = wireId;
524  }
525  } else {
526  for (const auto& cm : (*m_channelMapFromDB)) {
527  const int isl = cm.getISuperLayer();
528  const int il = cm.getILayer();
529  const int iw = cm.getIWire();
530  const int iBoard = cm.getBoardID();
531  const int iCh = cm.getBoardChannel();
532  const WireID wireId(isl, il, iw);
533  m_map[iBoard][iCh] = wireId;
534  }
535  }
536 }
537 
539 {
540  if (m_pedestalSubtraction == true) {
542  if (!(*m_adcPedestalFromDB).isValid()) {
543  m_pedestalSubtraction = false;
544  }
545  }
546 
547 }
548 
549 void CDCUnpackerModule::printBuffer(int* buf, int nwords)
550 {
551 
552  for (int j = 0; j < nwords; ++j) {
553  printf(" %.8x", buf[j]);
554  if ((j + 1) % 10 == 0) {
555  printf("\n");
556  }
557  }
558  printf("\n");
559 
560  return;
561 }
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.