Belle II Software development
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/datastore/RelationArray.h>
15#include <framework/logging/Logger.h>
16#include <framework/utilities/FileSystem.h>
17// framework - Database
18#include <framework/database/DBArray.h>
19
20#include <iostream>
21
22using namespace std;
23using namespace Belle2;
24using namespace CDC;
25
26//-----------------------------------------------------------------
27// Register the Module
28//-----------------------------------------------------------------
29REG_MODULE(CDCUnpacker);
30
31//-----------------------------------------------------------------
32// Implementation
33//-----------------------------------------------------------------
34
36{
37 //Set module properties
38 setDescription("CDCUnpacker generates CDCHit from Raw data.");
40
41 addParam("rawCDCName", m_rawCDCName, "Name of the RawCDC List name..", string(""));
42 addParam("cdcRawHitWaveFormName", m_cdcRawHitWaveFormName, "Name of the CDCRawHit (Raw data mode).", string(""));
43 addParam("cdcRawHitName", m_cdcRawHitName, "Name of the CDCRawHit (Suppressed mode).", string(""));
44 addParam("cdcHitName", m_cdcHitName, "Name of the CDCHit List name..", string(""));
45 addParam("fadcThreshold", m_fadcThreshold, "Threshold count.", 1);
46
47 addParam("xmlMapFileName", m_xmlMapFileName, "path+name of the xml file", string(""));
48 addParam("enableStoreCDCRawHit", m_enableStoreCDCRawHit, "Enable to store to the CDCRawHit object", false);
49 addParam("enablePrintOut", m_enablePrintOut, "Enable to print out the data to the terminal", false);
50 addParam("boardIDTrig", m_boardIDTrig, "Board ID for the trigger.", 7);
51 addParam("channelTrig", m_channelTrig, "Channel for the trigger.", 1);
52 addParam("subtractTrigTiming", m_subtractTrigTiming, "Enable to subtract the trigger timing from TDCs.", false);
53 addParam("tdcOffset", m_tdcOffset, "TDC offset (in TDC count).", 0);
54 addParam("enableDatabase", m_enableDatabase, "Enable database to read the channel map.", true);
55 addParam("enable2ndHit", m_enable2ndHit, "Enable 2nd hit timing as a individual CDCHit object.", false);
56 addParam("tdcAuxOffset", m_tdcAuxOffset, "TDC auxiliary offset (in TDC count).", 0);
57 addParam("pedestalSubtraction", m_pedestalSubtraction, "Enable ADC pedestal subtraction.", m_pedestalSubtraction);
58 addParam("relationRawHits", m_relationRawHits, "Enable relation of CDCHits, CDCRawHits, and CDCRawHitWaveForms.", false);
59 addParam("recoverBoardIdError", m_recoverBoardIdError, "Recover boardID errors", true);
60}
61
63{
64}
65
67{
68 m_dataLengthError = false;
69 m_dataSizeError = false;
71 if ((*m_channelMapFromDB).isValid()) {
72 // B2INFO("Channel map is valid");
73 } else {
74 B2FATAL("Channel map is not valid");
75 }
76
77 if (m_enablePrintOut == true) {
78 B2INFO("CDCUnpacker: initialize() Called.");
79 }
80
81 m_rawCDCs.isRequired(m_rawCDCName);
83 m_CDCRawHits.registerInDataStore(m_cdcRawHitName);
84 m_CDCHits.registerInDataStore(m_cdcHitName);
85
86 if (m_relationRawHits == true) {
87 m_CDCHits.registerRelationTo(m_CDCRawHitWaveForms);
88 m_CDCHits.registerRelationTo(m_CDCRawHits);
89
90 // Set default names for the relations.
92 DataStore::arrayName<CDCRawHit>(m_cdcRawHitName),
93 DataStore::arrayName<CDCHit>(m_cdcHitName));
94
96 DataStore::arrayName<CDCRawHitWaveForm>(m_cdcRawHitWaveFormName),
97 DataStore::arrayName<CDCHit>(m_cdcHitName));
98 }
99
100 if (m_enablePrintOut == true) {
101 B2INFO("CDCUnpacker: " << LogVar("FADC threshold", m_fadcThreshold));
102 }
103
105}
106
108{
109 if (m_enablePrintOut == true) {
110 B2INFO("CDCUnpacker: beginRun() called.");
111 }
112
113
114 loadMap();
116}
117
119{
120 if (m_enablePrintOut == true) {
121 B2INFO("CDCUnpacker: event() started.");
122 }
123
124 // TDC count for the trigger scinti.
125 int tdcCountTrig = m_tdcOffset;
126
128
129 // Create Data objects.
130 m_CDCHits.clear();
131
132 if (m_relationRawHits == true) {
133 RelationArray rawCDCsToCDCHits(m_CDCRawHits, m_CDCHits, m_relCDCRawHitToCDCHitName); // CDCRawHit <-> CDCHit
134 RelationArray rawCDCWFsToCDCHits(m_CDCRawHitWaveForms, m_CDCHits, m_relCDCRawHitWFToCDCHitName); // CDCRawHitWaveForm <-> CDCHit
135 }
136
137 if (m_enableStoreCDCRawHit == true) {
138 m_CDCRawHits.clear();
139 m_CDCRawHitWaveForms.clear();
140 }
141
142 //
143 // Process RawCDC data block.
144 //
145
146 const int nEntries = m_rawCDCs.getEntries();
147
148 B2DEBUG(99, "nEntries of RawCDCs : " << nEntries);
149
150 for (int i = 0; i < nEntries; ++i) {
151 const int subDetectorId = m_rawCDCs[i]->GetNodeID(0);
152 const int iNode = (subDetectorId & 0xFFFFFF);
153 const int nEntriesRawCDC = m_rawCDCs[i]->GetNumEntries();
154
155 B2DEBUG(99, LogVar("nEntries of rawCDC[i]", nEntriesRawCDC));
156
157 for (int j = 0; j < nEntriesRawCDC; ++j) {
158 int trigType = m_rawCDCs[i]->GetTRGType(j); // Get event type of L1 trigger.
159 int nWords[48];
160 int* data32tab[48];
161 int MaxNumOfCh = m_rawCDCs[i]->GetMaxNumOfCh(j);
162 string readoutName;
163 if (MaxNumOfCh == 4) readoutName = "COPPER";
164 else if (MaxNumOfCh == 48) readoutName = "PCIe40";
165 else
166 B2FATAL("CDC UnpackerModule: Invalid value of GetMaxNumOfCh from raw data: " << LogVar("Number of ch: ",
167 m_rawCDCs[i]->GetMaxNumOfCh(j)));
168
169 for (int k = 0; k < MaxNumOfCh; ++k) {
170 nWords[k] = m_rawCDCs[i]->GetDetectorNwords(j, k);
171 if (MaxNumOfCh == 48 && m_rawCDCs[i]->CheckOnlineRemovedDataBit(j, k) == true) { //for error flag in ff55 trailer
172 if (nWords[k] != 0)
173 B2FATAL("The data is not removed for the bad channel (" << j << "," << k << ") with error flag in ff55 trailer! ");
174 }
175 data32tab[k] = (int*)m_rawCDCs[i]->GetDetectorBuffer(j, k);
176 }
177
178 //
179 // Search Data from Finess 0->MaxNumOfCh (4/48 for COPPER/PCIe40).
180 //
181
182 for (int iFiness = 0; iFiness < MaxNumOfCh; ++iFiness) {
183 int* ibuf = data32tab[iFiness];
184 const int nWord = nWords[iFiness];
185 B2DEBUG(99, LogVar("nWords (from " + readoutName + " header)", nWord));
186
187 if (m_enablePrintOut == true) {
188 B2INFO("CDCUnpacker : Print out CDC data block.");
189 printBuffer(ibuf, nWord);
190 }
191
192 const int c_headearWords = 3;
193 if (nWord < c_headearWords) {
194 if (m_enablePrintOut == true) {
195 B2WARNING("CDCUnpacker : No CDC block header.");
196 }
197 continue;
198 }
199
200 if (m_enablePrintOut == true) {
201 B2INFO("CDCUnpacker : RawDataBlock(CDC) : Block # "
202 << LogVar("Block", i)
203 << LogVar("Node", iNode)
204 << LogVar("Finness", iFiness));
205 }
206
207 setCDCPacketHeader(ibuf);
208
209 // Skip invalid boardsIDs
210 if (m_boardId > 300) {
211 B2WARNING("Unrecoverable board " << std::hex << m_boardId);
212 continue;
213 }
214
215 const int dataType = getDataType();
216 const int dataLength = getDataLength() / 4; // Data length in int word (4bytes).
217 const int swDataLength = dataLength * 2; // Data length in short word (2bytes).
218
219
220 if (dataLength != (nWord - c_headearWords)) {
221 if (m_dataSizeError == false) {
222 B2ERROR("Inconsistent data size between " + readoutName + " and CDC FEE."
223 << LogVar("data length", dataLength) << LogVar("nWord", nWord)
224 << LogVar("Node ID", iNode) << LogVar("Finness ID", iFiness));
225 m_dataSizeError = true;
226 } else {
227 B2WARNING("Inconsistent data size between " + readoutName + " and CDC FEE."
228 << LogVar("data length", dataLength) << LogVar("nWord", nWord)
229 << LogVar("Node ID", iNode) << LogVar("Finness ID", iFiness));
230 }
231 continue;
232 }
233 if (m_enablePrintOut == true) {
234 B2INFO("CDCUnpacker : " << LogVar("Data size", dataLength));
235 }
236
237 const int board = getBoardId();
238 const int trgNumber = getTriggerNumber();
239 const int trgTime = getTriggerTime();
240
241 if (m_enablePrintOut == true) {
242 B2INFO("CDCUnpacker : " << LogVar("Board", board) << LogVar("Trigger number", trgNumber)
243 << LogVar("Trigger time ", trgTime));
244 }
245
246 //
247 // Check the data type (raw or suppressed mode?).
248 //
249
250 if (dataType == 1) { // Raw data mode.
251 if (m_enablePrintOut == true) {
252 B2INFO("CDCUnpacker : Raw data mode.");
253 }
254
255 m_buffer.clear();
256
257 for (int it = 0; it < dataLength; ++it) {
258 int index = it + c_headearWords;
259
260 m_buffer.push_back(static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
261 m_buffer.push_back(static_cast<unsigned short>(ibuf[index] & 0xffff));
262 }
263
264 const int fadcTdcChannels = 48; // Total channels of FADC or TDC.
265 const int nSamples = swDataLength / (2 * fadcTdcChannels); // Number of samplings.
266
267 std::vector<unsigned short> fadcs;
268 std::vector<unsigned short> tdcs;
269
270 for (int iCh = 0; iCh < fadcTdcChannels; ++iCh) {
271 const int offset = fadcTdcChannels;
272 unsigned short fadcSum = 0; // FADC sum below threshold.
273 unsigned short tdc1 = 0x7fff; // Fastest TDC.
274 unsigned short tdc2 = 0x7fff; // 2nd fastest TDC.
275
276 for (int iSample = 0; iSample < nSamples; ++iSample) {
277 // FADC value for each sample and channel.
278
279 unsigned short fadc = m_buffer.at(iCh + 2 * fadcTdcChannels * iSample);
280
281 if (fadc > m_fadcThreshold) {
282 fadcSum += fadc;
283 }
284 // TDC count for each sample and channel.
285
286 unsigned short tdc = m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x7fff;
287 unsigned short tdcIsValid = (m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x8000) >> 15;
288 if (tdcIsValid == 1) { // good tdc data.
289 if (tdc > 0) { // if hit timng is 0, skip.
290 if (tdc < tdc1) {
291 tdc2 = tdc1; // 2nd fastest hit
292 tdc1 = tdc; // fastest hit.
293 }
294 }
295 }
296
297 fadcs.push_back(fadc);
298 tdcs.push_back(tdc);
299 if (m_enableStoreCDCRawHit == true) {
300 // Store to the CDCRawHitWaveForm object.
301 const unsigned short status = 0;
302 m_CDCRawHitWaveForms.appendNew(status, trgNumber, iNode, iFiness, board, iCh, iSample, trgTime, fadc, tdc);
303 }
304
305 }
306
307 if (tdc1 != 0x7fff) {
308 // Store to the CDCHit object.
309 const WireID wireId = getWireID(board, iCh);
310 if (wireTopology.isValidWireID(wireId)) {
311 if (trgTime < tdc1) {
312 tdc1 = (trgTime | 0x8000) - tdc1;
313 } else {
314 tdc1 = trgTime - tdc1;
315 }
316 CDCHit* firstHit = m_CDCHits.appendNew(tdc1, fadcSum, wireId);
317 if (m_enable2ndHit == true) {
318 CDCHit* secondHit = m_CDCHits.appendNew(tdc2, fadcSum, wireId);
319 secondHit->setOtherHitIndices(firstHit);
320 secondHit->set2ndHitFlag();
321 }
322 if (m_enableStoreCDCRawHit == true) {
323 if (m_relationRawHits == true) {
324 for (int iSample = 0; iSample < nSamples; ++iSample) {
325 m_CDCHits[m_CDCHits.getEntries() - 1]->addRelationTo(m_CDCRawHitWaveForms[m_CDCRawHitWaveForms.getEntries() - 1 + iSample -
326 (nSamples - 1) ]);
327 }
328 }
329 }
330 } else {
331 B2WARNING("Skip invalid wire board, channel: " << board << ", " << iCh);
332 }
333 }
334
335
336
337
338 if (m_enablePrintOut == true) {
339 //
340 // Print out (for debug).
341 //
342
343 printf("FADC ch %2d : ", iCh);
344 for (int iSample = 0; iSample < nSamples; ++iSample) {
345 printf("%4x ", fadcs.at(iSample));
346 }
347 printf("\n");
348
349 printf("TDC ch %2d : ", iCh);
350 for (int iSample = 0; iSample < nSamples; ++iSample) {
351 printf("%4x ", tdcs.at(iSample));
352 }
353 printf("\n");
354 }
355
356 }
357
358 } else if (dataType == 2) { // Suppressed mode.
359 if (m_enablePrintOut == true) {
360 B2INFO("CDCUnpacker : Suppressed mode.");
361 }
362
363 // convert int array -> short array.
364 m_buffer.clear();
365 for (int it = 0; it < dataLength; ++it) {
366 int index = it + c_headearWords;
367 m_buffer.push_back(static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
368 m_buffer.push_back(static_cast<unsigned short>(ibuf[index] & 0xffff));
369 }
370
371 const size_t bufSize = m_buffer.size();
372 for (size_t it = 0; it < bufSize;) {
373 unsigned short header = m_buffer.at(it); // Header.
374 unsigned short ch = (header & 0xff00) >> 8; // Channel ID in FE.
375 unsigned short length = (header & 0xff) / 2; // Data length in short word.
376
377 if (header == 0xff02) {
378 it++;
379 continue;
380 }
381
382 if (!((length == 4) || (length == 5))) {
383 if (m_dataLengthError == false) {
384 B2ERROR("CDCUnpacker : data length should be 4 or 5 words."
385 << LogVar("data length", length)
386 << LogVar("board id", board)
387 << LogVar("channel", ch));
388 m_dataLengthError = true;
389 } else {
390 B2WARNING("CDCUnpacker : data length should be 4 or 5 words."
391 << LogVar("data length", length)
392 << LogVar("board id", board)
393 << LogVar("channel", ch));
394 }
395 break;
396 }
397
398 unsigned short tot = m_buffer.at(it + 1); // Time over threshold.
399 unsigned short fadcSum = m_buffer.at(it + 2); // FADC sum.
400
401 if (m_pedestalSubtraction == true) {
402 int diff = fadcSum - (*m_adcPedestalFromDB)->getPedestal(board, ch);
403 if (diff <= m_fadcThreshold) {
404 fadcSum = 0;
405 } else {
406 fadcSum = static_cast<unsigned short>(diff);
407 }
408 }
409 unsigned short tdc1 = 0; // TDC count.
410 unsigned short tdc2 = 0; // 2nd TDC count.
411 unsigned short tdcFlag = 0; // Multiple hit or not (1 for multi hits, 0 for single hit).
412
413 if (length == 4) {
414 tdc1 = m_buffer.at(it + 3);
415 } else if (length == 5) {
416 tdc1 = m_buffer.at(it + 3);
417 tdc2 = m_buffer.at(it + 4) & 0x7fff;
418 tdcFlag = (m_buffer.at(it + 4) & 0x8000) >> 15;
419 } else {
420 B2ERROR("CDCUnpacker : Undefined data length (should be 4 or 5 short words) ");
421 }
422
423 if (ch >= 48) {
424 B2WARNING("Invalid channel "
425 << LogVar("channel", ch)
426 << LogVar("board", board)
427 << LogVar("buffer total size", m_buffer.size())
428 << LogVar("length", length)
429 << LogVar("tdc", tdc1)
430 << LogVar("adc", fadcSum)
431 << LogVar("tot", tot)
432 );
433 it += length;
434 continue;
435 }
436
437 if (m_enablePrintOut == true) {
438 printf("%4x %4x %4x %4x %4x %4x %4x \n", ch, length, tot, fadcSum, tdc1, tdc2, tdcFlag);
439 }
440 if (length == 4 || length == 5) {
441
442 // const unsigned short status = 0;
443 const unsigned short status = trigType; // temporally trigger type is stored, here.
444 // Store to the CDCHit.
445 const WireID wireId = getWireID(board, ch);
446
447 if (isValidBoardChannel(wireId)) {
448 if (wireTopology.isValidWireID(wireId)) {
449
450 if (board == m_boardIDTrig && ch == m_channelTrig) {
451 tdcCountTrig = tdc1;
452 } else {
453 CDCHit* firstHit = m_CDCHits.appendNew(tdc1, fadcSum, wireId,
454 0, tot);
455 if (length == 5) {
456 if (m_enable2ndHit == true) {
457 CDCHit* secondHit = m_CDCHits.appendNew(tdc2, fadcSum, wireId,
458 0, tot);
459 secondHit->setOtherHitIndices(firstHit);
460 secondHit->set2ndHitFlag();
461 }
462 }
463 }
464
465 if (m_enableStoreCDCRawHit == true) {
466 // Store to the CDCRawHit object.
467 if (m_relationRawHits == true) {
468 CDCRawHit* rawHit = m_CDCRawHits.appendNew(status, trgNumber, iNode, iFiness, board, ch,
469 trgTime, fadcSum, tdc1, tdc2, tot);
470 m_CDCHits[m_CDCHits.getEntries() - 1]->addRelationTo(rawHit);
471 if (m_enable2ndHit == true) {
472 m_CDCHits[m_CDCHits.getEntries() - 2]->addRelationTo(rawHit);
473 }
474 } else {
475 m_CDCRawHits.appendNew(status, trgNumber, iNode, iFiness, board, ch,
476 trgTime, fadcSum, tdc1, tdc2, tot);
477 }
478 }
479 } else {
480 B2WARNING("Skip invalid wire board, channel: " << board << ", " << ch);
481 }
482 } else {
483 B2WARNING("Undefined board id is fired: " << LogVar("board id", board) << " " << LogVar("channel", ch));
484 }
485 }
486 it += length;
487 }
488
489 } else {
490 B2WARNING("CDCUnpacker : Undefined CDC Data Block : Block # " << LogVar("block id", i));
491 }
492 }
493 }
494 }
495
496 //
497 // t0 correction w.r.t. the timing of the trigger counter.
498 //
499 if (m_subtractTrigTiming == true) {
500 for (auto& hit : m_CDCHits) {
501 int tdc = hit.getTDCCount();
502 if (hit.is2ndHit()) {
503 if (tdc != 0) {
504 tdc = tdc - (tdcCountTrig - m_tdcOffset);
505 }
506 } else {
507 tdc = tdc - (tdcCountTrig - m_tdcOffset);
508 }
509
510 tdc -= m_tdcAuxOffset;
511 hit.setTDCCount(static_cast<unsigned short>(tdc));
512 }
513 }
514}
515
517{
518 if (m_enablePrintOut == true) {
519 B2INFO("CDCUnpacker : End run.");
520 }
521}
522
524{
525 if (m_enablePrintOut == true) {
526 B2INFO("CDCUnpacker : Terminated.");
527 }
528
531}
532
533
534WireID CDCUnpackerModule::getWireID(int iBoard, int iCh) const
535{
536 return m_map[iBoard][iCh];
537}
538
540{
541
542 if (m_enableDatabase == false) {
543
544 // Read the channel map from the local text.
545 std::string fileName = FileSystem::findFile(m_xmlMapFileName);
546 std::cout << fileName << std::endl;
547 if (fileName == "") {
548 B2ERROR("CDC unpacker can't find a filename: " << LogVar("file name", fileName));
549 exit(1);
550 }
551
552
553 ifstream ifs;
554 ifs.open(fileName.c_str());
555 int isl;
556 int icl;
557 int iw;
558 int iBoard;
559 int iCh;
560
561 while (!ifs.eof()) {
562 ifs >> isl >> icl >> iw >> iBoard >> iCh;
563 const WireID wireId(isl, icl, iw);
564 m_map[iBoard][iCh] = wireId;
565 }
566 } else {
567 for (const auto& cm : (*m_channelMapFromDB)) {
568 const int isl = cm.getISuperLayer();
569 const int il = cm.getILayer();
570 const int iw = cm.getIWire();
571 const int iBoard = cm.getBoardID();
572 const int iCh = cm.getBoardChannel();
573 const WireID wireId(isl, il, iw);
574 m_map[iBoard][iCh] = wireId;
575 }
576 }
577}
578
580{
581 if (m_pedestalSubtraction == true) {
583 if (!(*m_adcPedestalFromDB).isValid()) {
584 m_pedestalSubtraction = false;
585 }
586 }
587
588}
589
590void CDCUnpackerModule::printBuffer(int* buf, int nwords)
591{
592
593 for (int j = 0; j < nwords; ++j) {
594 printf(" %.8x", buf[j]);
595 if ((j + 1) % 10 == 0) {
596 printf("\n");
597 }
598 }
599 printf("\n");
600
601 return;
602}
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
The CDCRawHit (suppressed mode) class.
Definition: CDCRawHit.h:25
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_relCDCRawHitWFToCDCHitName
Relation name between CDCRawHitWaveForm and CDCHit.
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.
std::string m_relCDCRawHitToCDCHitName
Relation name between CDCRawHit and CDCHit.
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_relationRawHits
True if add relation of CDCHits, CDCRawHits, and CDCRawHitWaveForms.
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.
CDCUnpackerModule()
Constructor of the module.
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 relationName(const std::string &fromName, const std::string &toName, std::string const &namedRelation="")
Return storage name for a relation between two arrays of the given names.
Definition: DataStore.h:180
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:151
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
Low-level class to create/modify relations between StoreArrays.
Definition: RelationArray.h:62
Class representing the sense wire arrangement in the whole of the central drift chamber.
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
bool isValidWireID(const WireID &wireID) const
Checks the validity of a wireID convenience object.
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:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:649
Abstract base class for different kinds of events.
STL namespace.