12 #include <arich/modules/arichPacker/ARICHPackerModule.h>
15 #include <framework/datastore/StoreArray.h>
16 #include <framework/datastore/StoreObjPtr.h>
19 #include <framework/logging/Logger.h>
22 #include <arich/dataobjects/ARICHDigit.h>
23 #include <rawdata/dataobjects/RawARICH.h>
24 #include <framework/dataobjects/EventMetaData.h>
35 #define ARICH_BUFFER_NWORDS 252 // arich number of words (ints) in buffer; 3 + 33 + 6 * 36; 3 merger header words + 5.5 FEB header words / FEB + 36 data words per / FEB
47 m_nonSuppressed(0), m_bitMask(0), m_debug(0)
51 setDescription(
"Raw data packer for ARICH");
52 setPropertyFlags(c_ParallelProcessingCertified);
53 addParam(
"nonSuppressed", m_nonSuppressed,
"Pack in non-suppressed format (store all channels)",
unsigned(0));
54 addParam(
"version", m_version,
"dataformat version",
unsigned(6));
55 addParam(
"bitMask", m_bitMask,
"hit bit mask (4 bits/channel)", (
unsigned)0xF);
56 addParam(
"debug", m_debug,
"print packed bitmap", 0);
57 addParam(
"inputDigitsName", m_inputDigitsName,
"name of ARICHDigit store array",
string(
""));
58 addParam(
"outputRawDataName", m_outputRawDataName,
"name of RawARICH store array",
string(
""));
62 ARICHPackerModule::~ARICHPackerModule()
66 void ARICHPackerModule::initialize()
73 rawData.registerInDataStore();
76 void ARICHPackerModule::beginRun()
80 void ARICHPackerModule::event()
87 int nModules = N_MERGERS * N_FEB2MERGER;
89 vector<const ARICHDigit*>* sortedDigits =
new vector<const ARICHDigit*>[nModules];
91 for (
const auto& digit : digits) {
92 int moduleID = digit.getModuleID();
93 unsigned mergerID = m_mergerMap->getMergerID(moduleID);
94 if (!mergerID) { B2WARNING(
"No module2merger mapping for module ID: " << moduleID <<
"; Digit will not be packed!");
continue;}
95 if (!m_copperMap->getCopperID(mergerID)) { B2WARNING(
"No merger2copper mapping for merger ID: " << mergerID <<
"; Digit will not be packed!");
continue;}
96 sortedDigits[moduleID - 1].push_back(&digit);
100 int buffer[4][ARICH_BUFFER_NWORDS];
102 for (
const auto& copperID : m_copperMap->getCopperIDs()) {
104 int bufferSize[4] = {0, 0, 0, 0};
105 for (
int finesse = 0; finesse < 4; finesse++) {
109 for (
int j = 0; j < ARICH_BUFFER_NWORDS; j++) {
110 buffer[finesse][j] = 0;
113 auto* buf = buffer[finesse];
116 unsigned mergerID = m_copperMap->getMergerID(copperID, finesse);
117 unsigned mergerSN = m_mergerMap->getMergerSN(mergerID);
118 if (!mergerID)
continue;
121 unsigned dataFormat = m_nonSuppressed + 1;
122 mergerHead.type = dataFormat;
123 mergerHead.version = m_version;
124 mergerHead.mergerID = mergerSN;
125 mergerHead.FEBSlot = 0;
126 mergerHead.trigger = evtMetaData->getEvent();
129 ibyte += ARICHRAW_HEADER_SIZE;
131 int nboards = N_FEB2MERGER;
133 for (
int k = 0; k < nboards; k++) {
135 int moduleID = m_mergerMap->getModuleID(mergerID, k + 1);
136 if (moduleID <= 0)
continue;
140 FEBHead.type = dataFormat;
141 FEBHead.version = m_version;
142 FEBHead.mergerID = mergerSN;
144 FEBHead.trigger = evtMetaData->getEvent();
146 if (m_nonSuppressed) {
148 FEBHead.length = 144 + ARICHFEB_HEADER_SIZE;
149 writeHeader(buf, ibyte, FEBHead);
150 ibyte += ARICHFEB_HEADER_SIZE;
153 for (
const auto& digit : sortedDigits[moduleID - 1]) {
154 unsigned chn = digit->getChannelID();
156 unsigned shift = 143 - chn;
157 unsigned bitmap = (unsigned)digit->getBitmap();
158 buf[(ibyte + shift) / 4] += (bitmap << (3 - (ibyte + shift) % 4) * 8);
162 FEBHead.length = ARICHFEB_HEADER_SIZE + sortedDigits[moduleID - 1].size() * 2;
163 writeHeader(buf, ibyte, FEBHead);
164 ibyte += ARICHFEB_HEADER_SIZE;
166 for (
const auto& digit : sortedDigits[moduleID - 1]) {
167 unsigned chn = digit->getChannelID();
169 unsigned shift = (3 - ibyte % 4) * 8;
170 buf[ibyte / 4] += (chn << shift);
172 shift = (3 - ibyte % 4) * 8;
173 unsigned bitmap = (unsigned)digit->getBitmap();
174 buf[ibyte / 4] += (bitmap << shift);
181 mergerHead.length = ibyte - ARICHRAW_HEADER_SIZE;
182 writeHeader(buf, merg, mergerHead);
184 bufferSize[finesse] = ceil(ibyte / 4.);
187 std::cout <<
"Pack finesse: " << finesse << std::endl;
188 for (
int i = 0; i < bufferSize[finesse]; i++) {
189 std::cout << i <<
"-th word bitset " << bitset<32>(buf[i]) << std::endl;
195 info.exp_num = evtMetaData->getExperiment();
196 info.run_subrun_num = (evtMetaData->getRun() << 8) +
197 (evtMetaData->getSubrun() & 0xFF);
198 info.eve_num = evtMetaData->getEvent();
199 info.node_id = ARICH_ID + copperID;
203 info.hslb_crc16_error_bit = 0;
204 info.truncation_mask = 0;
205 info.type_of_data = 0;
208 raw->PackDetectorBuf(buffer[0], bufferSize[0],
209 buffer[1], bufferSize[1],
210 buffer[2], bufferSize[2],
211 buffer[3], bufferSize[3],
216 delete [] sortedDigits;
220 void ARICHPackerModule::writeHeader(
int* buffer,
unsigned& ibyte,
const ARICHRawHeader& head)
223 unsigned char line1[4];
226 line1[3] = head.type;
227 line1[2] = head.version;
228 line1[1] = head.mergerID;
229 line1[0] = head.FEBSlot;
231 for (
int i = 0; i < 4; i++) {
232 shift = (3 - ibyte % 4) * 8;
233 buffer[ibyte / 4] |= line1[3 - i] << shift;
237 unsigned char* len = (
unsigned char*)&head.length;
238 for (
int i = 0; i < 4; i++) {
239 shift = (3 - ibyte % 4) * 8;
240 buffer[ibyte / 4] |= len[3 - i] << shift;
245 unsigned char* trg = (
unsigned char*)(&head.trigger);
246 for (
int i = 0; i < 4; i++) {
247 shift = (3 - ibyte % 4) * 8;
248 buffer[ibyte / 4] |= trg[3 - i] << shift;
257 void ARICHPackerModule::endRun()
261 void ARICHPackerModule::terminate()