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.
o2::raw::RawFileWriter * raw
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"