20#include <fairlogger/Logger.h>
39 for (
int i = 0;
i < 72;
i++) {
63 static const uint8_t nopadding = 1;
64 static const uint8_t
padding = 0;
75 for (
int crateid = 0; crateid < 72; crateid++) {
85 const int received = 3;
86 uint32_t detField = (served << 24) + (received << 16);
89 std::string outFileLink;
91 if (fileFor ==
"all") {
93 }
else if (fileFor ==
"cruendpoint") {
95 }
else if (fileFor ==
"link") {
96 outFileLink =
o2::utils::Str::concat_string(
path,
"/",
"TOF_alio2-cr1-flp",
std::to_string(
Geo::getFLPid(crateid)),
"_cru",
std::to_string(
Geo::getCRUid(crateid)),
"_",
std::to_string(
Geo::getCRUendpoint(crateid)),
"_link",
std::to_string(RDHUtils::getLinkID(rdh)),
".raw");
98 throw std::runtime_error(
"invalid option provided for file grouping");
146 for (
int i = 1;
i < 72;
i++) {
162 printf(
"Crate %d: encode TRM %d \n", icrate, itrm);
167 mUnion[icrate]->trmDataHeader.slotId = itrm;
168 mUnion[icrate]->trmDataHeader.eventWords = 0;
170 mUnion[icrate]->trmDataHeader.emptyBit = 0;
171 mUnion[icrate]->trmDataHeader.dataId = 4;
175 for (
int ichain = 0; ichain < 2; ichain++) {
177 mUnion[icrate]->trmChainHeader.slotId = itrm;
179 mUnion[icrate]->trmChainHeader.mbz = 0;
180 mUnion[icrate]->trmChainHeader.dataId = 2 * ichain;
183 while (istart < summary.size()) {
185 int whatChain = summary[istart].getElChainIndex();
186 if (whatChain != ichain) {
189 int whatTRM = summary[istart].getElTRMIndex();
190 if (whatTRM != itrm) {
193 int whatCrate = summary[istart].getElCrateIndex();
194 if (whatCrate != icrate) {
200 if (hittimeTDC < 0) {
201 LOG(error) <<
"Negative hit encoded " << hittimeTDC <<
", something went wrong in filling readout window";
205 mUnion[icrate]->trmDataHit.time = hittimeTDC;
206 mUnion[icrate]->trmDataHit.chanId = summary[istart].getElChIndex();
207 mUnion[icrate]->trmDataHit.tdcId = summary[istart].getElTDCIndex();
208 mUnion[icrate]->trmDataHit.dataId = 0xa;
213 mUnion[icrate]->trmDataHit.chanId = summary[istart].getElChIndex();
214 mUnion[icrate]->trmDataHit.tdcId = summary[istart].getElTDCIndex();
215 mUnion[icrate]->trmDataHit.dataId = 0xc;
222 mUnion[icrate]->trmChainTrailer.status = 0;
223 mUnion[icrate]->trmChainTrailer.mbz = 0;
225 mUnion[icrate]->trmChainTrailer.dataId = 1 + 2 * ichain;
230 int neventwords =
getSize(trmheader,
mUnion[icrate]) / 4 + 1;
232 neventwords -= neventwords / 4 * 2;
234 trmheader->trmDataHeader.eventWords = neventwords;
237 mUnion[icrate]->trmDataTrailer.trailerMark = 3;
238 mUnion[icrate]->trmDataTrailer.eventCRC = 0;
239 mUnion[icrate]->trmDataTrailer.tempValue = 0;
240 mUnion[icrate]->trmDataTrailer.tempAddress = 0;
241 mUnion[icrate]->trmDataTrailer.tempChain = 0;
242 mUnion[icrate]->trmDataTrailer.tempAck = 0;
243 mUnion[icrate]->trmDataTrailer.lutErrorBit = 0;
244 mUnion[icrate]->trmDataTrailer.dataId = 5;
248bool Encoder::encode(std::vector<std::vector<o2::tof::Digit>> digitWindow,
int tofwindow)
251 printf(
"Something went wrong in encoding: digitWindow=%lu different from %d\n", digitWindow.size(),
Geo::NWINDOW_IN_ORBIT);
256 std::vector<o2::tof::Digit>& summary = digitWindow.at(iwin);
258 for (
auto dig = summary.begin(); dig != summary.end(); dig++) {
259 int digitchannel = dig->getChannel();
264 std::sort(summary.begin(), summary.end(),
265 [](
Digit a,
Digit b) { return a.getElectronicIndex() < b.getElectronicIndex(); });
270 std::cout <<
"-------- START ENCODE EVENT ----------------------------------------" << std::endl;
273 auto start = std::chrono::high_resolution_clock::now();
278 for (
int i = 0;
i < 72;
i++) {
288 std::vector<o2::tof::Digit>& summary = digitWindow.at(iwin);
296 int icurrentdigit = 0;
298 for (
int i = 0;
i < 72;
i++) {
315 mUnion[
i]->drmHeadW1.slotId = 1;
316 mUnion[
i]->drmHeadW1.partSlotMask = (
i % 2 == 0 ? 0x7fc : 0x7fe);
317 mUnion[
i]->drmHeadW1.clockStatus = 2;
318 mUnion[
i]->drmHeadW1.drmhVersion = 0x12;
319 mUnion[
i]->drmHeadW1.drmHSize = 5;
322 mUnion[
i]->drmHeadW1.dataId = 4;
325 mUnion[
i]->drmHeadW2.slotId = 1;
326 mUnion[
i]->drmHeadW2.enaSlotMask = (
i % 2 == 0 ? 0x7fc : 0x7fe);
328 mUnion[
i]->drmHeadW2.faultSlotMask = 0;
329 mUnion[
i]->drmHeadW2.readoutTimeOut = 0;
330 mUnion[
i]->drmHeadW2.dataId = 4;
333 mUnion[
i]->drmHeadW3.slotId = 1;
335 mUnion[
i]->drmHeadW3.locBunchCnt = 0;
336 mUnion[
i]->drmHeadW3.dataId = 4;
339 mUnion[
i]->drmHeadW4.slotId = 1;
340 mUnion[
i]->drmHeadW4.tempValue = 0;
342 mUnion[
i]->drmHeadW4.tempAddress = 0;
344 mUnion[
i]->drmHeadW4.dataId = 4;
347 mUnion[
i]->drmHeadW5.slotId = 1;
348 mUnion[
i]->drmHeadW5.eventCRC = 0;
351 mUnion[
i]->drmHeadW5.dataId = 4;
354 int trm0 = 4 - (
i % 2);
355 for (
int itrm = trm0; itrm < 13; itrm++) {
359 mUnion[
i]->drmDataTrailer.slotId = 1;
361 mUnion[
i]->drmDataTrailer.mbz = 0;
362 mUnion[
i]->drmDataTrailer.dataId = 5;
365 neventwords -= neventwords / 4 * 2;
376 LOG(error) <<
"Nbytes not divisible by 4? Something went wrong with the word (32 bits) length";
377 }
else if (nbytes % 8) {
378 LOG(error) <<
"Odd number of nwords in TOF payload, this should not happen";
379 }
else if (nbytes % 16) {
391 if (icurrentdigit < summary.size()) {
392 LOG(error) <<
"Not all digits are been used : only " << icurrentdigit <<
" of " << summary.size();
398 for (
int i = 0;
i < 72;
i++) {
404 auto finish = std::chrono::high_resolution_clock::now();
405 std::chrono::duration<double> elapsed = finish -
start;
413 char* in =
reinterpret_cast<char*
>(
first);
414 char* out =
reinterpret_cast<char*
>(last);
416 return int(out - in);
Definition of the 32 Central Trigger System (CTS) Trigger Types defined in https://twiki....
Definition of the TOF encoder.
Definition of the TOF encoder.
Header of the General Run Parameters object.
Header to collect LHC related constants.
Definition of the Names Generator class.
static std::string getGRPFileName(const std::string_view prefix=STANDARDSIMPREFIX)
static const HBFUtils & Instance()
static GRPObject * loadFrom(const std::string &grpFileName="")
void useRDHVersion(int v)
void useRDHDataFormat(unsigned char v)
void addData(uint16_t feeid, uint16_t cru, uint8_t lnk, uint8_t endpoint, const IR &ir, const gsl::span< char > data, bool preformatted=false, uint32_t trigger=0, uint32_t detField=0)
void setContinuousReadout()
LinkData & registerLink(uint16_t fee, uint16_t cru, uint8_t link, uint8_t endpoint, std::string_view outFileName)
TOF digit implementation.
static constexpr Int_t RATIO_TOT_TDC_BIN
static Int_t getCRUid(int link)
static Int_t getFEEid(int link)
static constexpr int BC_IN_WINDOW
static Int_t getFLPid(int link)
static constexpr int BC_IN_ORBIT
static Int_t getCRUendpoint(int link)
static Int_t getECHFromCH(int chan)
static Int_t getCRUlink(int link)
static constexpr int NWINDOW_IN_ORBIT
bool encode(std::vector< std::vector< o2::tof::Digit > > digitWindow, int tofwindow=0)
o2::InteractionRecord mIR
int getSize(void *first, void *last)
TOFDataHeader_t * mTOFDataHeader[72]
double mIntegratedAllBytes
std::vector< char > mBufferLocal
void encodeTRM(const std::vector< Digit > &summary, Int_t icrate, Int_t itrm, int &istart)
void nextWord(int icrate)
o2::raw::RawFileWriter mFileWriter
DRMDataHeader_t * mDRMDataHeader[72]
bool open(const std::string &name, const std::string &path=".", const std::string &fileFor="cruendpoint")
GLuint const GLchar * name
GLboolean GLboolean GLboolean b
GLsizei const GLchar *const * path
GLboolean GLboolean GLboolean GLboolean a
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
uint16_t bc
bunch crossing ID of interaction
IR getFirstSampledTFIR() const
get TF and HB (abs) for this IR
static void setLinkID(H &rdh, uint8_t v, NOTPTR(H))
static void setDetectorField(H &rdh, uint32_t v, NOTPTR(H))
static void setEndPointID(H &rdh, uint8_t v, NOTPTR(H))
static void setFEEID(RDHv4 &rdh, uint16_t v)
static constexpr int getVersion()
get numeric version of the RDH
static void setCRUID(H &rdh, uint16_t v, NOTPTR(H))
static std::string concat_string(Ts const &... ts)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"