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