9 #include <cdc/modules/cdcUnpacker/CDCUnpackerModule.h>
11 #include <cdc/dbobjects/CDCChannelMap.h>
13 #include <framework/datastore/DataStore.h>
14 #include <framework/logging/Logger.h>
15 #include <framework/utilities/FileSystem.h>
17 #include <framework/database/DBArray.h>
34 CDCUnpackerModule::CDCUnpackerModule() :
Module()
69 if ((*m_channelMapFromDB).isValid()) {
72 B2FATAL(
"Channel map is not valid");
76 B2INFO(
"CDCUnpacker: initialize() Called.");
92 B2INFO(
"CDCUnpacker: beginRun() called.");
103 B2INFO(
"CDCUnpacker: event() started.");
121 const int nEntries =
m_rawCDCs.getEntries();
123 B2DEBUG(99,
"nEntries of RawCDCs : " << nEntries);
124 for (
int i = 0; i < nEntries; ++i) {
125 const int subDetectorId =
m_rawCDCs[i]->GetNodeID(0);
126 const int iNode = (subDetectorId & 0xFFFFFF);
127 const int nEntriesRawCDC =
m_rawCDCs[i]->GetNumEntries();
129 B2DEBUG(99,
LogVar(
"nEntries of rawCDC[i]", nEntriesRawCDC));
130 for (
int j = 0; j < nEntriesRawCDC; ++j) {
131 int trigType =
m_rawCDCs[i]->GetTRGType(j);
134 int MaxNumOfCh =
m_rawCDCs[i]->GetMaxNumOfCh(j);
136 if (MaxNumOfCh == 4) readoutName =
"COPPER";
137 else if (MaxNumOfCh == 48) readoutName =
"PCIe40";
139 B2FATAL(
"CDC UnpackerModule: Invalid value of GetMaxNumOfCh from raw data: " <<
LogVar(
"Number of ch: ",
142 for (
int k = 0; k < MaxNumOfCh; ++k) {
143 nWords[k] =
m_rawCDCs[i]->GetDetectorNwords(j, k);
144 data32tab[k] = (
int*)
m_rawCDCs[i]->GetDetectorBuffer(j, k);
151 for (
int iFiness = 0; iFiness < MaxNumOfCh; ++iFiness) {
152 int* ibuf = data32tab[iFiness];
153 const int nWord = nWords[iFiness];
154 B2DEBUG(99,
LogVar(
"nWords (from " + readoutName +
" header)", nWord));
157 B2INFO(
"CDCUnpacker : Print out CDC data block.");
161 const int c_headearWords = 3;
162 if (nWord < c_headearWords) {
164 B2WARNING(
"CDCUnpacker : No CDC block header.");
170 B2INFO(
"CDCUnpacker : RawDataBlock(CDC) : Block # "
173 <<
LogVar(
"Finness", iFiness));
180 const int swDataLength = dataLength * 2;
183 if (dataLength != (nWord - c_headearWords)) {
185 B2ERROR(
"Inconsistent data size between " + readoutName +
" and CDC FEE."
186 <<
LogVar(
"data length", dataLength) <<
LogVar(
"nWord", nWord)
187 <<
LogVar(
"Node ID", iNode) <<
LogVar(
"Finness ID", iFiness));
190 B2WARNING(
"Inconsistent data size between " + readoutName +
" and CDC FEE."
191 <<
LogVar(
"data length", dataLength) <<
LogVar(
"nWord", nWord)
192 <<
LogVar(
"Node ID", iNode) <<
LogVar(
"Finness ID", iFiness));
197 B2INFO(
"CDCUnpacker : " <<
LogVar(
"Data size", dataLength));
205 B2INFO(
"CDCUnpacker : " <<
LogVar(
"Board", board) <<
LogVar(
"Trigger number", trgNumber)
206 <<
LogVar(
"Trigger time ", trgTime));
215 B2INFO(
"CDCUnpacker : Raw data mode.");
220 for (
int it = 0; it < dataLength; ++it) {
221 int index = it + c_headearWords;
223 m_buffer.push_back(
static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
224 m_buffer.push_back(
static_cast<unsigned short>(ibuf[index] & 0xffff));
227 const int fadcTdcChannels = 48;
228 const int nSamples = swDataLength / (2 * fadcTdcChannels);
230 std::vector<unsigned short> fadcs;
231 std::vector<unsigned short> tdcs;
233 for (
int iCh = 0; iCh < fadcTdcChannels; ++iCh) {
234 const int offset = fadcTdcChannels;
235 unsigned short fadcSum = 0;
236 unsigned short tdc1 = 0x7fff;
237 unsigned short tdc2 = 0x7fff;
239 for (
int iSample = 0; iSample < nSamples; ++iSample) {
242 unsigned short fadc =
m_buffer.at(iCh + 2 * fadcTdcChannels * iSample);
249 unsigned short tdc =
m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x7fff;
250 unsigned short tdcIsValid = (
m_buffer.at(iCh + 2 * fadcTdcChannels * iSample + offset) & 0x8000) >> 15;
251 if (tdcIsValid == 1) {
260 fadcs.push_back(fadc);
264 const unsigned short status = 0;
265 m_CDCRawHitWaveForms.appendNew(status, trgNumber, iNode, iFiness, board, iCh, iSample, trgTime, fadc, tdc);
270 if (tdc1 != 0x7fff) {
274 if (trgTime < tdc1) {
275 tdc1 = (trgTime | 0x8000) - tdc1;
277 tdc1 = trgTime - tdc1;
295 printf(
"FADC ch %2d : ", iCh);
296 for (
int iSample = 0; iSample < nSamples; ++iSample) {
297 printf(
"%4x ", fadcs.at(iSample));
301 printf(
"TDC ch %2d : ", iCh);
302 for (
int iSample = 0; iSample < nSamples; ++iSample) {
303 printf(
"%4x ", tdcs.at(iSample));
310 }
else if (dataType == 2) {
312 B2INFO(
"CDCUnpacker : Suppressed mode.");
317 for (
int it = 0; it < dataLength; ++it) {
318 int index = it + c_headearWords;
319 m_buffer.push_back(
static_cast<unsigned short>((ibuf[index] & 0xffff0000) >> 16));
320 m_buffer.push_back(
static_cast<unsigned short>(ibuf[index] & 0xffff));
323 const int bufSize =
static_cast<int>(
m_buffer.size());
324 for (
int it = 0; it < bufSize;) {
325 unsigned short header =
m_buffer.at(it);
326 unsigned short ch = (header & 0xff00) >> 8;
327 unsigned short length = (header & 0xff) / 2;
329 if (header == 0xff02) {
334 if (!((length == 4) || (length == 5))) {
336 B2ERROR(
"CDCUnpacker : data length should be 4 or 5 words."
337 <<
LogVar(
"data length", length)
338 <<
LogVar(
"board id", board)
339 <<
LogVar(
"channel", ch));
342 B2WARNING(
"CDCUnpacker : data length should be 4 or 5 words."
343 <<
LogVar(
"data length", length)
344 <<
LogVar(
"board id", board)
345 <<
LogVar(
"channel", ch));
350 unsigned short tot =
m_buffer.at(it + 1);
351 unsigned short fadcSum =
m_buffer.at(it + 2);
353 int diff = fadcSum - (*m_adcPedestalFromDB)->getPedestal(board, ch);
357 fadcSum =
static_cast<unsigned short>(diff);
360 unsigned short tdc1 = 0;
361 unsigned short tdc2 = 0;
362 unsigned short tdcFlag = 0;
366 }
else if (length == 5) {
368 tdc2 =
m_buffer.at(it + 4) & 0x7fff;
369 tdcFlag = (
m_buffer.at(it + 4) & 0x8000) >> 15;
371 B2ERROR(
"CDCUnpacker : Undefined data length (should be 4 or 5 short words) ");
375 printf(
"%4x %4x %4x %4x %4x %4x %4x \n", ch, length, tot, fadcSum, tdc1, tdc2, tdcFlag);
377 if (length == 4 || length == 5) {
380 const unsigned short status = trigType;
402 m_CDCRawHits.appendNew(status, trgNumber, iNode, iFiness, board, ch,
403 trgTime, fadcSum, tdc1, tdc2, tot);
407 B2WARNING(
"Undefined board id is fired: " <<
LogVar(
"board id", board) <<
" " <<
LogVar(
"channel", ch));
410 it +=
static_cast<int>(length);
414 B2WARNING(
"CDCUnpacker : Undefined CDC Data Block : Block # " <<
LogVar(
"block id", i));
425 int tdc = hit.getTDCCount();
426 if (hit.is2ndHit()) {
435 hit.setTDCCount(
static_cast<unsigned short>(tdc));
443 B2INFO(
"CDCUnpacker : End run.");
450 B2INFO(
"CDCUnpacker : Terminated.");
460 return m_map[iBoard][iCh];
470 std::cout << fileName << std::endl;
471 if (fileName ==
"") {
472 B2ERROR(
"CDC unpacker can't find a filename: " <<
LogVar(
"file name", fileName));
478 ifs.open(fileName.c_str());
486 ifs >> isl >> icl >> iw >> iBoard >> iCh;
487 const WireID wireId(isl, icl, iw);
488 m_map[iBoard][iCh] = wireId;
493 const int il = cm.getILayer();
494 const int iw = cm.getIWire();
495 const int iBoard = cm.getBoardID();
496 const int iCh = cm.getBoardChannel();
497 const WireID wireId(isl, il, iw);
498 m_map[iBoard][iCh] = wireId;
507 if (!(*m_adcPedestalFromDB).isValid()) {
517 for (
int j = 0; j < nwords; ++j) {
518 printf(
" %.8x", buf[j]);
519 if ((j + 1) % 10 == 0) {
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
void set2ndHitFlag()
Setter for 2nd hit flag.
void setOtherHitIndices(CDCHit *otherHit)
Setter for the other hit indices.
StoreArray< RawCDC > m_rawCDCs
Input array for CDC Raw.
bool m_enableDatabase
Enable/Disable to read the channel map from the database.
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 m_fadcThreshold
FADC threshold.
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.
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.
Class for accessing objects in the database.
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...
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Class to identify a wire inside the CDC.
unsigned short getISuperLayer() const
Getter for Super-Layer.
Class to store variables with their name which were sent to the logging service.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.