9 #include <trg/cdc/modules/unpacker/CDCTriggerUnpackerModule.h>
10 #include <framework/core/ModuleParam.templateDetails.h>
11 #include <trg/cdc/dbobjects/CDCTriggerNeuroConfig.h>
20 using namespace CDCTriggerUnpacker;
33 using dataWord = std::bitset<wordWidth>;
57 unsigned inEventWidth,
unsigned inOffset,
58 int inHeaderSize,
const std::vector<int>& inNodeID,
const std::vector<int>& inNodeID_pcie40,
59 unsigned inNInnerMergers,
int& inDelay,
63 inHeaderSize, inNodeID, inNodeID_pcie40, inDelay, inCnttrg, inDebugLevel),
65 nInnerMergers(inNInnerMergers) {};
72 void reserve(
int subDetectorId, std::array<int, nFinesse> nWords,
bool pciedata)
override
77 iNode_i = iNode_pcie40;
78 iFinesse_i = iFinesse_pcie40;
81 iFinesse_i = iFinesse;
84 if (subDetectorId != iNode_i) {
87 if (nWords[iFinesse_i] < headerSize) {
90 size_t nClocks = (nWords[iFinesse_i] - headerSize) / eventWidth;
93 for (
unsigned i = 0; i < nClocks; ++i) {
96 B2DEBUG(20, name <<
": " << nClocks <<
" clocks");
97 }
else if (entries != nClocks) {
98 B2DEBUG(20,
"Number of clocks in " << name <<
" conflicts with others!");
104 std::array<int*, 48> data32tab,
105 std::array<int, 48> nWords,
106 bool pciedata)
override
111 iNode_i = iNode_pcie40;
112 iFinesse_i = iFinesse_pcie40;
115 iFinesse_i = iFinesse;
118 if (subDetectorId != iNode_i) {
121 if (nWords[iFinesse_i] < headerSize) {
122 B2DEBUG(20,
"The module " << name <<
" does not have enough data (" <<
123 nWords[iFinesse_i] <<
"). Nothing will be unpacked.");
129 for (
int i = headerSize; i < nWords[iFinesse_i]; i += eventWidth) {
130 int iclock = (i - headerSize) / eventWidth;
131 auto mergerClock = (*arrayPtr)[iclock];
132 B2DEBUG(100,
"clock " << iclock);
134 for (
unsigned j = offset; j < eventWidth; ++j) {
135 int iMerger = (eventWidth - j - 1) / 8 + nInnerMergers;
136 int pos = (eventWidth - j - 1) % 8;
137 dataWord word(data32tab[iFinesse_i][i + j]);
139 mergerClock->m_signal[iMerger].set(pos *
wordWidth + k, word[k]);
143 if (debugLevel >= 300) {
144 printBuffer(data32tab[iFinesse_i] + headerSize, eventWidth);
146 printBuffer(data32tab[iFinesse_i] + headerSize + eventWidth, eventWidth);
148 for (
int i = 0; i < std::accumulate(nMergers.begin(), nMergers.end(), 0); ++i) {
149 B2DEBUG(99, (*arrayPtr)[0]->m_signal[i].to_string());
159 const std::string& inName,
unsigned inEventWidth,
unsigned inOffset,
160 unsigned inHeaderSize,
const std::vector<int>& inNodeID,
const std::vector<int>& inNodeID_pcie40,
161 unsigned inNumTS,
int& inDelay,
164 SubTrigger(inName, inEventWidth, inOffset /
wordWidth, inHeaderSize, inNodeID, inNodeID_pcie40,
165 inDelay, inCnttrg, inDebugLevel),
166 inputArrayPtr(inArrayPtr), outputArrayPtr(outArrayPtr),
167 iTracker(std::stoul(inName.substr(inName.length() - 1))),
168 numTS(inNumTS), offsetBitWidth(inOffset) {};
189 void reserve(
int subDetectorId, std::array<int, nFinesse> nWords,
bool pciedata)
override
194 iNode_i = iNode_pcie40;
195 iFinesse_i = iFinesse_pcie40;
198 iFinesse_i = iFinesse;
201 size_t nClocks = (nWords[iFinesse_i] - headerSize) / eventWidth;
203 if (subDetectorId == iNode_i) {
205 for (
unsigned i = 0; i < nClocks; ++i) {
209 for (
unsigned j = 0; j < nTrackers; ++j) {
210 for (
unsigned iAxialTSF = 0; iAxialTSF < nAxialTSF; ++iAxialTSF) {
211 inputClock->
m_signal[iAxialTSF][j].fill(zero_val);
213 outputClock->
m_signal[j].fill(zero_val);
216 B2DEBUG(20, name <<
": " << nClocks <<
" clocks");
217 }
else if (entries != nClocks) {
218 B2DEBUG(20,
"Number of clocks in " << name <<
" conflicts with others!");
233 std::array<int*, 48> data32tab,
234 std::array<int, 48> nWords,
235 bool pciedata)
override
240 iNode_i = iNode_pcie40;
241 iFinesse_i = iFinesse_pcie40;
244 iFinesse_i = iFinesse;
247 if (subDetectorId != iNode_i) {
254 using halfDataWord = std::bitset<16>;
255 std::vector<halfDataWord> counters;
256 counters.reserve(inputArrayPtr->
getEntries());
257 for (
int iclock = 0; iclock < inputArrayPtr->
getEntries(); ++iclock) {
258 counters.emplace_back(data32tab[iFinesse_i]
259 [headerSize + eventWidth * iclock] & 0xffff);
260 B2DEBUG(100,
"iclock " << iclock <<
" --> " << counters.at(iclock).to_ulong() <<
" : " << std::hex << counters.at(iclock));
262 bool counter_correct_error =
false;
263 while (counters.at(1).to_ulong() - counters.at(0).to_ulong() != 4) {
264 std::rotate(counters.begin(), counters.begin() + 1, counters.end());
273 B2DEBUG(90,
"PHYSJG: clock counter rotation over one cycle: " << ccShift);
274 for (
const auto& c : counters) {
275 B2DEBUG(90,
"" << c.to_ulong() <<
" : " << std::hex << c);
277 counter_correct_error =
true;
281 if (counter_correct_error) {
282 B2DEBUG(20,
"PHYSJG: " << name <<
" too many clock counter rotation corrections: " << ccShift <<
" data object skipped.");
286 if (! std::is_sorted(counters.begin(), counters.end(),
287 [](halfDataWord i, halfDataWord j) {
288 return (j.to_ulong() - i.to_ulong() == 4);
290 B2DEBUG(20,
"clock counters are still out of order");
291 for (
const auto& c : counters) {
292 B2DEBUG(90,
"" << c.to_ulong());
297 B2DEBUG(15,
"shifting the first " << ccShift <<
298 " clock(s) to the end for " << name);
304 for (
int i = headerSize; i < nWords[iFinesse_i]; i += eventWidth) {
305 int iclock = (i - headerSize) / eventWidth - ccShift;
309 auto inputClock = (*inputArrayPtr)[iclock];
310 auto outputClock = (*outputArrayPtr)[iclock];
312 outputClock->m_signal[iTracker].fill(zero_val);
313 B2DEBUG(90,
"unpacker clock " << iclock);
314 if (debugLevel >= 300) {
315 printBuffer(data32tab[iFinesse_i] + headerSize + eventWidth * iclock,
319 std::array<dataWord, 2> ccword({
320 data32tab[iFinesse_i][i + 2], data32tab[iFinesse_i][i + 3]
324 for (
unsigned iTSF = 0; iTSF < nAxialTSF; ++iTSF) {
326 inputClock->m_signal[nAxialTSF - 1 - iTSF][iTracker].fill(zero_val);
328 if (firmwareVersion <
"18012600") {
342 for (
unsigned pos = 0; pos < clockCounterWidth; ++pos) {
343 const int j = (pos + iTSF * clockCounterWidth) /
wordWidth;
344 const int k = (pos + iTSF * clockCounterWidth) %
wordWidth;
361 inputClock->m_signal[nAxialTSF - 1 - iTSF][iTracker][pos] =
366 for (
unsigned pos = 0; pos < numTS * lenTS; ++pos) {
367 const int j = (offsetBitWidth + pos + iTSF * numTS * lenTS) /
wordWidth;
368 const int k = (offsetBitWidth + pos + iTSF * numTS * lenTS) %
wordWidth;
369 dataWord word(data32tab[iFinesse_i][i + j]);
373 inputClock->m_signal[nAxialTSF - 1 - iTSF][iTracker]
374 [clockCounterWidth + pos] = std_logic(word[
wordWidth - 1 - k]);
390 unsigned TSFWidth = clockCounterWidth + numTS * lenTS;
391 for (
unsigned pos = 0; pos < TSFWidth; ++pos) {
392 const int j = (offsetBitWidth + pos + iTSF * TSFWidth) /
wordWidth;
393 const int k = (offsetBitWidth + pos + iTSF * TSFWidth) %
wordWidth;
394 dataWord word(data32tab[iFinesse_i][i + j]);
395 inputClock->m_signal[nAxialTSF - 1 - iTSF][iTracker][pos] =
399 if (debugLevel >= 100) {
400 display_hex(inputClock->m_signal[nAxialTSF - 1 - iTSF][iTracker]);
404 if (firmwareVersion <
"18012600") {
409 const int outputOffset = nAxialTSF * numTS * lenTS;
410 const int oldtrackWidth = 6;
411 for (
unsigned pos = 0; pos < 732; ++pos) {
412 const int j = (offsetBitWidth + pos + outputOffset) /
wordWidth;
413 const int k = (offsetBitWidth + pos + outputOffset) %
wordWidth;
414 dataWord word(data32tab[iFinesse_i][i + j]);
415 outputClock->m_signal[iTracker][clockCounterWidth + oldtrackWidth + pos]
425 const int outputOffset = offsetBitWidth + nAxialTSF * numTS * lenTS + 45;
426 for (
unsigned pos = 0; pos < T2DOutputWidth; ++pos) {
427 const int j = (pos + outputOffset) /
wordWidth;
428 const int k = (pos + outputOffset) %
wordWidth;
429 dataWord word(data32tab[iFinesse_i][i + j]);
430 outputClock->m_signal[iTracker][clockCounterWidth + pos]
434 if (debugLevel >= 100) {
435 display_hex(outputClock->m_signal[iTracker]);
445 const std::string& inName,
unsigned inEventWidth,
unsigned inOffset,
446 unsigned inHeaderSize,
const std::vector<int>& inNodeID,
const std::vector<int>& inNodeID_pcie40,
int& inDelay,
449 SubTrigger(inName, inEventWidth, inOffset /
wordWidth, inHeaderSize, inNodeID, inNodeID_pcie40,
450 inDelay, inCnttrg, inDebugLevel),
452 iTracker(std::stoul(inName.substr(inName.length() - 1))),
453 offsetBitWidth(inOffset) {};
462 void reserve(
int subDetectorId, std::array<int, nFinesse> nWords,
bool pciedata)
override
467 iNode_i = iNode_pcie40;
468 iFinesse_i = iFinesse_pcie40;
471 iFinesse_i = iFinesse;
474 size_t nClocks = (nWords[iFinesse_i] - headerSize) / eventWidth;
476 if (subDetectorId == iNode_i) {
478 for (
unsigned i = 0; i < nClocks; ++i) {
481 for (
unsigned j = 0; j < nTrackers; ++j) {
482 nnclock->
m_signal[j].fill(zero_val);
485 B2DEBUG(20, name <<
": " << nClocks <<
" clocks");
486 }
else if (entries != nClocks) {
487 B2DEBUG(20,
"Number of clocks in " << name <<
" conflicts with others!");
493 std::array<int*, nFinesse> data32tab,
494 std::array<int, nFinesse> nWords,
495 bool pciedata)
override
500 iNode_i = iNode_pcie40;
501 iFinesse_i = iFinesse_pcie40;
504 iFinesse_i = iFinesse;
507 if (subDetectorId != iNode_i) {
512 for (
int i = headerSize; i < nWords[iFinesse_i]; i += eventWidth) {
513 int iclock = (i - headerSize) / eventWidth;
514 auto nnclock = (*ArrayPtr)[iclock];
515 B2DEBUG(20,
"clock " << iclock);
516 if (debugLevel >= 300) {
517 printBuffer(data32tab[iFinesse_i] + headerSize + eventWidth * iclock,
521 for (
unsigned pos = 0; pos < NN_WIDTH; ++pos) {
522 const int j = (offsetBitWidth + pos) /
wordWidth;
523 const int k = (offsetBitWidth + pos) %
wordWidth;
524 std::bitset<wordWidth> word(data32tab[iFinesse_i][i + j]);
525 nnclock->m_signal[iTracker][pos] = std_logic(word[
wordWidth - 1 - k]);
527 if (debugLevel >= 100) {
528 display_hex(nnclock->m_signal[iTracker]);
544 "whether to unpack merger data (recorded by Merger Reader / TSF)",
false);
546 "whether to unpack 2D tracker data",
false);
548 "whether to unpacker neurotrigger data",
false);
550 "flag to decode 2D finder track",
false);
552 "flag to decode input TS to 2D",
false);
554 "flag to decode neurotrigger data",
false);
564 "list of COPPER and HSLB ID of Merger reader (TSF)", defaultMergerNodeID);
572 "list of COPPER and HSLB ID of 2D tracker", defaultTracker2DNodeID);
573 NodeList defaultTracker2DNodeID_pcie40 = {
580 "list of PCIe40 ch ID of 2D tracker", defaultTracker2DNodeID_pcie40);
589 "list of COPPER and HSLB ID of neurotrigger", defaultNeuroNodeID);
590 NodeList defaultNeuroNodeID_pcie40 = {
597 "list of PCIe40 ch ID of neurotrigger", defaultNeuroNodeID_pcie40);
600 "number of words (number of bits / 32) of the B2L header", 3);
602 "Whether to align out-of-sync Belle2Link data between different sub-modules",
true);
604 "Use values stored in the payload of the ConditionsDB."
605 "This affects the output scaling of the Neurotrigger as well as the"
606 "bit configuration of its unpacker. If false, an old unpacker version with fixed scalings and old bit adresses is used.",
609 "Simulate 13 bit drift time by using 2d clock counter value.",
619 m_mergerBits.registerInDataStore(
"CDCTriggerMergerBits");
622 m_bitsTo2D.registerInDataStore(
"CDCTriggerTSFTo2DBits");
623 m_bits2DTo3D.registerInDataStore(
"CDCTrigger2DTo3DBits");
626 m_bitsNN.registerInDataStore(
"CDCTriggerNNBits");
652 for (
int iSL = 0; iSL < 9; iSL += 2) {
654 const int nInnerMergers = std::accumulate(
nMergers.begin(),
656 B2DEBUG(20,
"in: " << nInnerMergers);
672 m_n2DTS = m_dbn2DTS->getnTS();
673 int datasize_2D = 64;
676 }
else if (m_n2DTS == 15) {
680 for (
int iTracker = 0; iTracker < 4; ++iTracker) {
684 "Tracker2D" + std::to_string(iTracker), datasize_2D, 82,
m_headerSize,
693 "Neuro" + std::to_string(iTracker), 64, 0,
m_headerSize,
711 m_exp = bevt->getExperiment();
712 m_run = bevt->getRun();
715 B2FATAL(
"CDCTriggerNeuroConfig is not valid.");
717 B2DEBUG(2,
"Load Neurotrigger configuration for network " <<
m_cdctriggerneuroconfig->getNNName() <<
" from database ");
718 B2DEBUG(10, padright(
"Name", 50) << padright(
"start", 10) << padright(
"end", 10) << padright(
"offset", 10));
720 B2DEBUG(10, padright(x.name, 48) <<
": " << padright(std::to_string(x.start), 10) << padright(std::to_string(x.end),
721 10) << padright(std::to_string(x.offset), 10));
733 B2DEBUG(10, padright(
" ", 100));
734 B2DEBUG(10,
"----------------------------------------------------------------------------------------------------");
735 B2DEBUG(10, padright(
" ", 100));
737 std::string experimentstring =
"Experiment " + std::to_string(eventMetaData->getExperiment()) +
" Run " +
738 std::to_string(eventMetaData->getRun()) +
" Event " + std::to_string(eventMetaData->getEvent());
739 B2DEBUG(10, padright(experimentstring, 100));
744 B2DEBUG(20,
"exp<7: skip cdctrg unpacker for DQM");
749 B2DEBUG(99,
m_rawTriggers.getEntries() <<
" COPPERs in RawTRGs");
755 if (rawTRG.GetMaxNumOfCh(0) == 48) {
m_pciedata =
true; }
756 else if (rawTRG.GetMaxNumOfCh(0) == 4) {
m_pciedata =
false; }
757 else { B2FATAL(
"CDCTriggerUnpackerModule: Invalid value of GetMaxNumOfCh from raw data: " <<
LogVar(
"Number of ch: ", rawTRG.GetMaxNumOfCh(0))); }
759 const int subDetectorId = rawTRG.GetNodeID(0);
762 const int nEntriesRawTRG = rawTRG.GetNumEntries();
765 B2DEBUG(99,
"nEntries of rawTRG: " << nEntriesRawTRG);
766 for (
int j = 0; j < nEntriesRawTRG; ++j) {
770 std::array<int, nFinesse> nWords;
771 std::array<int*, nFinesse> data32tab;
774 for (
int iFinesse = 0; iFinesse < rawTRG.GetMaxNumOfCh(0); ++iFinesse) {
775 nWords[iFinesse] = rawTRG.GetDetectorNwords(j, iFinesse);
776 if (nWords[iFinesse] == 0) {
779 data32tab[iFinesse] = (
int*)rawTRG.GetDetectorBuffer(j, iFinesse);
784 if (trg->getHeaders(subDetectorId, data32tab, nWords,
m_pciedata)) {
785 trg->reserve(subDetectorId, nWords,
m_pciedata);
786 B2DEBUG(99,
"starting to unpack a subTrigger, subDetectorId" << std::hex << subDetectorId);
787 trg->unpack(subDetectorId, data32tab, nWords,
m_pciedata);
792 B2DEBUG(99,
"looped over entries and filled words " << nEntriesRawTRG);
794 B2DEBUG(99,
"looped over rawTriggers, unpacking 2D ");
798 for (
short iclock = 0; iclock <
m_bits2DTo3D.getEntries(); ++iclock) {
806 B2DEBUG(99,
"unpack 2D Input TS ");
808 std::array<int, 4> clockCounter2D = {0, 0, 0, 0};
809 std::array<int, 4> timeOffset2D = {0, 0, 0, 0};
811 for (
int iTracker = 0; iTracker < nTrackers; ++iTracker) {
816 std::string strInput = slv_to_bin_string(trackerData);
817 clockCounter2D[iTracker] = std::stoi(strInput.substr(0, clockCounterWidth), 0, 2);
818 int clockCounterDiff = clockCounter2D[iTracker] - clockCounter2D[0];
828 if (clockCounterDiff > 1250) {
829 clockCounterDiff -= 1280;
830 }
else if (clockCounterDiff < -1250) {
831 clockCounterDiff += 1280;
833 timeOffset2D[iTracker] = clockCounterDiff;
834 if (clockCounterDiff != 0) {
835 B2DEBUG(100,
"Adding " << clockCounterDiff <<
" clock(s) to 2D" << iTracker <<
" found time");
837 if (std::abs(clockCounterDiff) > 2) {
838 B2DEBUG(20,
"Clock counters between 2D [0," << iTracker <<
"] differ by " << clockCounterDiff <<
" clocks! (" \
839 << clockCounter2D[0] <<
", " << clockCounter2D[iTracker] <<
")");
842 for (
short iclock = 0; iclock <
m_bitsTo2D.getEntries(); ++iclock) {
843 B2DEBUG(30,
"clock " << iclock);
847 B2DEBUG(99,
"now unpack neuro ");
856 B2DEBUG(99,
" all is unpacked ##### ");
Class to hold one clock cycle of raw bit content.
SignalBus m_signal
SignalBus of the Bitstream.
static constexpr std::array< int, 9 > nMergers
data width of a single merger unit
int m_debugLevel
debug level specified in the steering file
StoreArray< RawTRG > m_rawTriggers
array containing the raw trigger data object
bool m_pciedata
PCIe40 data or copper data.
NodeList m_tracker2DNodeID_pcie40
list of (PCIe40 ID, ch ID) of 2D tracker
DBObjPtr< CDCTriggerNeuroConfig > m_cdctriggerneuroconfig
current neurotrigger config from database; used for unscaling network target
int m_headerSize
number of words (number of bits / 32) of the B2L header
int m_mergerDelay
Belle2Link delay of the merger reader.
bool m_sim13dt
bool value wether to simulate 13 bit drift time by using 2dcc
StoreArray< MergerBits > m_mergerBits
merger output bitstream
StoreArray< CDCTriggerMLPInput > m_NeuroInputs
decoded input vector for neural network
int m_NeuroCnttrg
NN cnttrg.
void initialize() override
Register input and output data.
int m_NeuroDelay
Belle2Link delay of the neurotrigger.
void event() override
convert raw data (in B2L buffer to bitstream)
NodeList m_neuroNodeID
list of (COPPER ID, HSLB ID) of neurotrigger
StoreArray< CDCTriggerUnpacker::T2DOutputBitStream > m_bits2DTo3D
bitstream of 2D output to 3D/Neuro
bool m_decodeNeuro
flag to decode neurotrigger data
void terminate() override
Delete dynamically allocated variables.
int m_2DFinderDelay
Belle2Link delay of the 2D finder.
StoreArray< CDCTriggerSegmentHit > m_TSHits
decoded track segment hit
bool m_alignFoundTime
flag to align found time in different sub-modules
bool m_unpackTracker2D
flag to unpack 2D tracker data
CDCTriggerUnpackerModule()
Constructor: Sets the description, the properties and the parameters of the module.
NodeList m_tracker2DNodeID
list of (COPPER ID, HSLB ID) of 2D tracker
StoreArray< CDCTriggerSegmentHit > m_NNInputTSHitsAll
all decoded stereo track segment hits from the neural network input
StoreArray< CDCTriggerTrack > m_2DFinderTracks
decoded 2D finder track
void beginRun() override
begin Run
bool m_decodeTSHit
flag to decode track segment
StoreArray< CDCTriggerTrack > m_NeuroTracks
decoded Neuro tracks
StoreArray< CDCTriggerTrack > m_NNInput2DFinderTracks
decoded 2D finder tracks from the neural network input
int m_2DFinderCnttrg
2D cnttrg
StoreObjPtr< BinnedEventT0 > m_ETFTime
store object for unpacked etf event time from neuro b2link
bool m_decode2DFinderInputTS
flag to decode 2D finder input TS
NodeList m_neuroNodeID_pcie40
list of (PCIe40 ID, ch ID) of neurotrigger
StoreArray< CDCTriggerUnpacker::NNBitStream > m_bitsNN
bitstream of Neuro input and output (including intermediate results)
NodeList m_mergerNodeID
list of (COPPER ID, HSLB ID) of Merger reader (TSF)
StoreArray< CDCTriggerFinderClone > m_2DFinderClones
additional information of the 2D finder track
StoreArray< CDCTriggerUnpacker::TSFOutputBitStream > m_bitsTo2D
bitstream of TSF output to 2D tracker
StoreArray< CDCTriggerSegmentHit > m_NNInputTSHits
decoded track segment hits from the neural network input
bool m_unpackNeuro
flag to unpack neurotrigger data
std::vector< SubTrigger * > m_subTrigger
vector holding the pointers to all the dynamically allocated SubTriggers
bool m_decode2DFinderTrack
flag to decode 2D finder track
bool m_useDB
bool value for wether to use the conditions database
bool m_unpackMerger
flag to unpack merger data (recorded by Merger Reader / TSF)
int getDebugLevel() const
Returns the configured debug messaging level.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
void setReturnValue(int value)
Sets the return value for this module as integer.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
LogConfig & getLogConfig()
Returns the log system configuration.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
bool create(bool replace=false)
Create a default object in the data store.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
int getEntries() const
Get the number of objects in the array.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Type-safe access to single objects in the data store.
bool isValid() const
Check whether the object was created.
Class to store variables with their name which were sent to the logging service.
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
static constexpr int wordWidth
width of a single word in the raw int buffer
static constexpr int mergerWidth
Merger data width.
std::vector< std::vector< int > > NodeList
Node list.
Abstract base class for different kinds of events.
unpacker for the merger reader (TSF which reads the merger output)
StoreArray< MergerBits > * arrayPtr
pointer to the merger output Bitstream
void unpack(int subDetectorId, std::array< int *, 48 > data32tab, std::array< int, 48 > nWords, bool pciedata) override
Unpack function.
unsigned nInnerMergers
number of merger units in the inner super layer than this one
Merger(StoreArray< MergerBits > *inArrayPtr, const std::string &inName, unsigned inEventWidth, unsigned inOffset, int inHeaderSize, const std::vector< int > &inNodeID, const std::vector< int > &inNodeID_pcie40, unsigned inNInnerMergers, int &inDelay, int &inCnttrg, int inDebugLevel)
Constructor.
void reserve(int subDetectorId, std::array< int, nFinesse > nWords, bool pciedata) override
reserve enough number of clocks (entries) in the Bitstream StoreArray
Neuro(StoreArray< NNBitStream > *arrPtr, const std::string &inName, unsigned inEventWidth, unsigned inOffset, unsigned inHeaderSize, const std::vector< int > &inNodeID, const std::vector< int > &inNodeID_pcie40, int &inDelay, int &inCnttrg, int inDebugLevel)
Constructor.
void unpack(int subDetectorId, std::array< int *, nFinesse > data32tab, std::array< int, nFinesse > nWords, bool pciedata) override
Unpack the Belle2Link data and fill the Bitstream.
StoreArray< NNBitStream > * ArrayPtr
Array pointer for NN.
unsigned offsetBitWidth
Offset bit width.
unsigned iTracker
Tracker board ID.
void reserve(int subDetectorId, std::array< int, nFinesse > nWords, bool pciedata) override
Calculate the number of clocks in the data, reserve that much of clocks in the Bitstream(s)
enum class SubTriggerType : unsigned char {Merger, TSF, T2D, T3D, Neuro, ETF};
unpacker for the 2D tracker
Tracker2D(StoreArray< TSFOutputBitStream > *inArrayPtr, StoreArray< T2DOutputBitStream > *outArrayPtr, const std::string &inName, unsigned inEventWidth, unsigned inOffset, unsigned inHeaderSize, const std::vector< int > &inNodeID, const std::vector< int > &inNodeID_pcie40, unsigned inNumTS, int &inDelay, int &inCnttrg, int inDebugLevel)
constructor
StoreArray< T2DOutputBitStream > * outputArrayPtr
pointer to the Bitstream of 2D output to 3D/Neuro
void unpack(int subDetectorId, std::array< int *, 48 > data32tab, std::array< int, 48 > nWords, bool pciedata) override
Unpack the Belle2Link data and fill the Bitstream.
unsigned offsetBitWidth
starting point of the input data in an Belle2Link event
unsigned iTracker
ID of the 2D tracker (0 to 3)
unsigned numTS
Number of TS sent to 2D (0 to 20)
StoreArray< TSFOutputBitStream > * inputArrayPtr
pointer to the Bitstream of 2D input
void reserve(int subDetectorId, std::array< int, nFinesse > nWords, bool pciedata) override
Calculate the number of clocks in the data, reserve that much of clocks in the Bitstream(s)