10 #include <arich/modules/arichPacker/ARICHPackerModule.h>
13 #include <framework/datastore/StoreArray.h>
14 #include <framework/datastore/StoreObjPtr.h>
17 #include <framework/logging/Logger.h>
20 #include <arich/dataobjects/ARICHDigit.h>
21 #include <rawdata/dataobjects/RawARICH.h>
22 #include <framework/dataobjects/EventMetaData.h>
33 #define ARICH_BUFFER_NWORDS 252
45 m_nonSuppressed(0), m_bitMask(0), m_debug(0)
49 setDescription(
"Raw data packer for ARICH");
50 setPropertyFlags(c_ParallelProcessingCertified);
51 addParam(
"nonSuppressed", m_nonSuppressed,
"Pack in non-suppressed format (store all channels)",
unsigned(0));
52 addParam(
"version", m_version,
"dataformat version",
unsigned(6));
53 addParam(
"bitMask", m_bitMask,
"hit bit mask (4 bits/channel)", (
unsigned)0xF);
54 addParam(
"debug", m_debug,
"print packed bitmap", 0);
55 addParam(
"inputDigitsName", m_inputDigitsName,
"name of ARICHDigit store array",
string(
""));
56 addParam(
"outputRawDataName", m_outputRawDataName,
"name of RawARICH store array",
string(
""));
60 ARICHPackerModule::~ARICHPackerModule()
64 void ARICHPackerModule::initialize()
74 void ARICHPackerModule::beginRun()
78 void ARICHPackerModule::event()
85 int nModules = N_MERGERS * N_FEB2MERGER;
87 vector<const ARICHDigit*>* sortedDigits =
new vector<const ARICHDigit*>[nModules];
89 for (
const auto& digit : digits) {
90 int moduleID = digit.getModuleID();
91 unsigned mergerID = m_mergerMap->getMergerID(moduleID);
92 if (!mergerID) { B2WARNING(
"No module2merger mapping for module ID: " << moduleID <<
"; Digit will not be packed!");
continue;}
93 if (!m_copperMap->getCopperID(mergerID)) { B2WARNING(
"No merger2copper mapping for merger ID: " << mergerID <<
"; Digit will not be packed!");
continue;}
94 sortedDigits[moduleID - 1].push_back(&digit);
98 int buffer[4][ARICH_BUFFER_NWORDS];
100 for (
const auto& copperID : m_copperMap->getCopperIDs()) {
102 int bufferSize[4] = {0, 0, 0, 0};
103 for (
int finesse = 0; finesse < 4; finesse++) {
107 for (
int j = 0; j < ARICH_BUFFER_NWORDS; j++) {
108 buffer[finesse][j] = 0;
111 auto* buf = buffer[finesse];
114 unsigned mergerID = m_copperMap->getMergerID(copperID, finesse);
115 unsigned mergerSN = m_mergerMap->getMergerSN(mergerID);
116 if (!mergerID)
continue;
119 unsigned dataFormat = m_nonSuppressed + 1;
120 mergerHead.type = dataFormat;
121 mergerHead.version = m_version;
122 mergerHead.mergerID = mergerSN;
123 mergerHead.FEBSlot = 0;
124 mergerHead.trigger = evtMetaData->getEvent();
127 ibyte += ARICHRAW_HEADER_SIZE;
129 int nboards = N_FEB2MERGER;
131 for (
int k = 0; k < nboards; k++) {
133 int moduleID = m_mergerMap->getModuleID(mergerID, k + 1);
134 if (moduleID <= 0)
continue;
138 FEBHead.type = dataFormat;
139 FEBHead.version = m_version;
140 FEBHead.mergerID = mergerSN;
142 FEBHead.trigger = evtMetaData->getEvent();
144 if (m_nonSuppressed) {
146 FEBHead.length = 144 + ARICHFEB_HEADER_SIZE;
147 writeHeader(buf, ibyte, FEBHead);
148 ibyte += ARICHFEB_HEADER_SIZE;
151 for (
const auto& digit : sortedDigits[moduleID - 1]) {
152 unsigned chn = digit->getChannelID();
154 unsigned shift = 143 - chn;
155 unsigned bitmap = (unsigned)digit->getBitmap();
156 buf[(ibyte + shift) / 4] += (bitmap << (3 - (ibyte + shift) % 4) * 8);
160 FEBHead.length = ARICHFEB_HEADER_SIZE + sortedDigits[moduleID - 1].size() * 2;
161 writeHeader(buf, ibyte, FEBHead);
162 ibyte += ARICHFEB_HEADER_SIZE;
164 for (
const auto& digit : sortedDigits[moduleID - 1]) {
165 unsigned chn = digit->getChannelID();
167 unsigned shift = (3 - ibyte % 4) * 8;
168 buf[ibyte / 4] += (chn << shift);
170 shift = (3 - ibyte % 4) * 8;
171 unsigned bitmap = (unsigned)digit->getBitmap();
172 buf[ibyte / 4] += (bitmap << shift);
179 mergerHead.length = ibyte - ARICHRAW_HEADER_SIZE;
180 writeHeader(buf, merg, mergerHead);
182 bufferSize[finesse] = ceil(ibyte / 4.);
185 std::cout <<
"Pack finesse: " << finesse << std::endl;
186 for (
int i = 0; i < bufferSize[finesse]; i++) {
187 std::cout << i <<
"-th word bitset " << bitset<32>(buf[i]) << std::endl;
193 info.exp_num = evtMetaData->getExperiment();
194 info.run_subrun_num = (evtMetaData->getRun() << 8) +
195 (evtMetaData->getSubrun() & 0xFF);
196 info.eve_num = evtMetaData->getEvent();
197 info.node_id = ARICH_ID + copperID;
201 info.hslb_crc16_error_bit = 0;
202 info.truncation_mask = 0;
203 info.type_of_data = 0;
206 raw->PackDetectorBuf(buffer[0], bufferSize[0],
207 buffer[1], bufferSize[1],
208 buffer[2], bufferSize[2],
209 buffer[3], bufferSize[3],
214 delete [] sortedDigits;
218 void ARICHPackerModule::writeHeader(
int* buffer,
unsigned& ibyte,
const ARICHRawHeader& head)
221 unsigned char line1[4];
224 line1[3] = head.type;
225 line1[2] = head.version;
226 line1[1] = head.mergerID;
227 line1[0] = head.FEBSlot;
229 for (
int i = 0; i < 4; i++) {
230 shift = (3 - ibyte % 4) * 8;
231 buffer[ibyte / 4] |= line1[3 - i] << shift;
235 auto len =
reinterpret_cast<const unsigned char*
>(&head.length);
237 for (
int i = 0; i < 4; i++) {
238 shift = (3 - ibyte % 4) * 8;
239 buffer[ibyte / 4] |= len[3 - i] << shift;
244 auto trg =
reinterpret_cast<const unsigned char*
>(&head.trigger);
245 for (
int i = 0; i < 4; i++) {
246 shift = (3 - ibyte % 4) * 8;
247 buffer[ibyte / 4] |= trg[3 - i] << shift;
256 void ARICHPackerModule::endRun()
260 void ARICHPackerModule::terminate()
Raw data packer for ARICH.
struct to contain header information used by RawCOPPERFormat::Packer()
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Accessor to arrays stored in the data store.
T * appendNew()
Construct a new T object at the end of the array.
Type-safe access to single objects in the data store.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.