6#include "BmnADCDigit.h"
7#include "BmnAbstractTDCDigit.h"
9#include "BmnHRBDigit.h"
10#include "BmnHgndRaw.h"
11#include "BmnMSCDigit.h"
12#include "BmnMSCZSDigit.h"
15#include "BmnTDCDigit.h"
16#include "BmnTQDCADCDigit.h"
17#include "BmnVspRawDigit.h"
19#include "StorableTimeslice.h"
20#include "StsXyterMessage.h"
22using namespace std::chrono;
98 auto f =
merger->GetFile();
100 TTree* treeSpills =
new TTree(
"BMN_RAW_SPILLS",
"BMN_RAW_SPILLS");
115 for (
size_t j = 0; j <
vecTree->size(); j++) {
116 if ((*
vecTree)[j].first == spillId) {
148 LOGF(debug2,
"Calculate task %d in id %d done",
taskId,
threadId);
169 LOGF(info,
"thread file closed");
175 const uint32_t* data,
176 BmnEventType fCurEvType,
182 std::memcpy(
rawData, data,
sizeof(uint32_t) * len);
221 LOG(info) <<
"Converted event #" <<
fCurEvent.fEventId;
230 const DeviceHeader* dh =
reinterpret_cast<const DeviceHeader*
>(d + idx);
234 uint32_t serial = dh->Serial;
235 uint8_t
id = dh->DeviceId;
237 uint32_t payload = dh->GetNWords();
239 if (payload > 2000000) {
240 LOGF(warn,
"Event %d:\n serial = 0x%06X\n id = Ox%02X\n payload = %d",
fCurEvent.fEventId, serial,
id,
245 LOGF(debug4,
"STAT iev %7d idx %6u/%6u idev %02X serial 0x%08X payload %4u",
fCurEvent.fEventId, idx,
246 len,
id, serial, payload);
291 LOGF(warning,
"Malformed data from ADC64WR %08X in the event %u", serial,
fCurEvent.fEventId);
311 if (payload + idx > len) {
313 "Error in the event #%d: 0x%08X : %2X device payload length mismatch! pauload %5u idx/len: %5u/%5u \n",
314 fCurEvent.fEventId, serial,
id, payload, idx, len);
351 for (uint32_t
i = 0;
i < len;
i++) {
369 modId = (d[
i] >> 16) & 0x7F;
370 slot = (d[
i] >> 23) & 0x1F;
377 if (!((d[
i] >> 16) & 0x1))
379 if (!((d[
i] >> 17) & 0x1))
381 if (!((d[
i] >> 18) & 0x1))
383 if (!((d[
i] >> 19) & 0x1))
424 uint32_t nSmpl = (len - 3) / nWords;
426 for (uint32_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
427 for (uint32_t iWord = 0; iWord < nWords; ++iWord) {
428 uint32_t word32 = d[3 + iWord + iSmpl * nWords];
429 for (
Int_t iCh = 0; iCh < 32; ++iCh) {
430 if (word32 &
BIT(iCh)) {
432 new (ar_hrb[
hrb->GetEntriesFast()])
BmnHRBDigit(serial, iCh + 32 * iWord, iSmpl, tH, tL);
443 uint32_t type = d[idx] >> 28;
455 if (type ==
kWORDAUX && !countersDone) {
464 countersDone =
kTRUE;
476 uint32_t type = d[idx] >> 28;
479 LOGF(warning,
"TDC (modID 0x%02X serial 0x%08X slot %d tdcID %d) error flags: 0x%04X", modId, serial, slot,
480 ((d[idx] >> 24) & 0xF), (d[idx] & ((1 << 15) - 1)));
481 if ((d[idx] &
BIT(12)) || (d[idx] &
BIT(13))) {
482 LOGF(warning,
"TDC data loss in 0x%08X ", serial);
487 uint32_t tdcId = (d[idx] >> 24) & 0xF;
489 (modId ==
kTDC64V) ? (d[idx] & 0x7FFFF) : ((d[idx] & 0x7FFFF) << 2) | ((d[idx] & 0x180000) >> 19);
490 uint32_t channel = (modId ==
kTDC64V) ? (d[idx] >> 19) & 0x1F : (d[idx] >> 21) & 0x7;
493 new (ar_tdc[
tdc->GetEntriesFast()])
496 LOGF(debug4,
"tdc %08X : %d channel %d", serial, slot, channel);
506 uint32_t type = d[idx] >> 28;
511 uint32_t channel = 0;
513 vector<int16_t> valI;
517 LOGF(warning,
"TDC (serial 0x%08X slot %d tdcID %d) error flags: 0x%04X", serial, slot,
518 ((d[idx] >> 24) & ((1 << 4) - 1)), (d[idx] & ((1 << 15) - 1)));
519 if ((d[idx] &
BIT(12)) || (d[idx] &
BIT(13))) {
520 LOGF(warning,
"TQDC data loss in 0x%08X ", serial);
524 uint32_t mode = (d[idx] >> 26) & 0x3;
527 channel = (d[idx] >> 19) & 0x1F;
528 uint32_t time = ((d[idx] & 0x7FFFF) << 2) | ((d[idx] >> 24) & 0x3);
530 new ((*tqdc_tdc)[
tqdc_tdc->GetEntriesFast()])
533 }
else if ((type == 4) && (mode != 0)) {
534 channel = (d[idx] >> 19) & 0x1F;
535 if (d[idx] &
BIT(16)) {
536 adcTimestamp = d[idx] & 0xFFFF;
539 trigTimestamp = d[idx] & 0xFFFF;
542 tdcTimestamp = d[idx] & 0xFFF;
550 if ((type == 5) && (mode == 2) ) {
551 Short_t val = (d[idx] & ((1 << 14) - 1)) - (1 << (14 - 1));
555 new ((*tqdc_adc)[
tqdc_adc->GetEntriesFast()])
556 BmnTQDCADCDigit(serial, channel, slot, std::move(valI), trigTimestamp, adcTimestamp);
562 type = d[++idx] >> 28;
573 vector<int16_t> valI;
574 const uint8_t NBytesInSample = 2;
576 while (iWord < len) {
577 uint16_t adcTS = d[iWord] & (
BIT(16) - 1);
578 uint16_t SigLen = d[iWord] >> 16;
579 uint16_t NSamples = SigLen / NBytesInSample;
582 if (iWord + NSampleWords + 1 > len) {
583 LOGF(error,
"TQDC ADC wrong payload length! iWord %u SigLen %u len %u", iWord, SigLen, len);
586 uint16_t iSampleWord = 0;
587 while (iSampleWord++ < NSampleWords) {
588 int16_t adcLo =
static_cast<int16_t
>(d[iWord + iSampleWord] & (
BIT(16) - 1));
589 int16_t adcHi =
static_cast<int16_t
>(d[iWord + iSampleWord] >> 16);
590 valI.push_back(adcLo);
591 if (valI.size() < NSamples)
592 valI.push_back(adcHi);
596 iWord += iSampleWord;
609 uint16_t tdcLine = 0;
610 while (tdcLine < len) {
611 uint32_t word = d[tdcLine];
612 uint32_t bt = word >> 28;
629 uint8_t channel = (word >> 21) & (
BIT(7) - 1);
631 uint32_t time = word & (
BIT(21) - 1);
639 LOGF(warning,
"TDC (serial 0x%08X tdcID %d) error flags: 0x%04X %s", serial,
640 ((word >> 24) & ((1 << 4) - 1)), (word & ((1 << 15) - 1)),
641 ((word &
BIT(12)) || (word &
BIT(13))) ?
"data lost" :
"");
655 const MStreamTAI* ms0 =
reinterpret_cast<const MStreamTAI*
>(d + index);
662 while (index < len) {
663 const TqdcDataHeader* th =
reinterpret_cast<const TqdcDataHeader*
>(d + index);
668 switch (th->DataType) {
676 printf(
"Wrong TQDC data type %u !\n", th->DataType);
690 const MStreamTAI* ms0 =
reinterpret_cast<const MStreamTAI*
>(d + index);
696 while (index < len) {
697 uint8_t dtype = d[index] >> 28;
698 bool overflow = d[index] &
BIT(16);
709 printf(
"Wrong VXS data type %u !\n", dtype);
723 const MStreamTAI* ms0 =
reinterpret_cast<const MStreamTAI*
>(d + index);
730 while (index < len) {
731 uint8_t dtype = d[index] >> 28;
732 bool overflow = d[index] &
BIT(16);
746 printf(
"Wrong TTVXS data type %u !\n", dtype);
758 return MapVSP(d, dev_hdr);
762 LOGF(error,
"BmnRawSource::ProcessGenericDevice: Unknown device serial 0x%08X", dev_hdr->Serial);
772 const uint16_t* words =
reinterpret_cast<const uint16_t*
>(d);
773 size_t total_words = len /
sizeof(uint16_t);
775 if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug4)) {
776 for (
size_t i = 0;
i < total_words; ++
i)
777 LOGF(debug4,
"0x%04x", words[
i]);
781 std::vector<uint16_t> event_words;
782 std::unique_ptr<BmnHgndRaw::FIFO_block> event;
784 while (index < total_words) {
785 auto* word = words + index;
787 LOGF(error,
"BmnRawSource::FillTDC250HGND: Wrong header 0x%04X", *word);
794 LOGF(debug4,
"Event type %d, 16bit words %d (index=%zu, total=%zu)", (uint32_t)event_type, event_length, index,
797 if (index + event_length > total_words) {
798 LOGF(error,
"BmnRawSource::FillTDC250HGND: Event block overruns buffer");
802 event_words.assign(word, word + event_length);
803 if (FairLogger::GetLogger()->IsLogNeeded(fair::Severity::debug4)) {
804 for (
size_t i = 0;
i < event_words.size(); ++
i) {
805 LOGF(debug4,
"0x%04x", event_words[
i]);
809 if (event_type == BmnHgndRaw::Block::EventPacketVersion::V1) {
810 event = std::make_unique<BmnHgndRaw::Event_type_1>(event_words);
811 }
else if (event_type == BmnHgndRaw::Block::EventPacketVersion::V2) {
812 event = std::make_unique<BmnHgndRaw::Event_type_2>(event_words);
813 if (!event->validate()) {
814 LOGF(error,
"BmnRawSource::FillTDC250HGND: Event block validation failed");
820 LOGF(error,
"BmnRawSource::FillTDC250HGND: Event cast to Event_type_2 failed");
825 uint8_t tfall_100ps = ev2->TDC_falling_time;
826 int64_t time_sec = ev2->timestamp >> 31;
828 uint64_t time_nsec = ((ev2->timestamp & 0x7ffffff0) >> 4) * 32;
829 uint16_t time_100ps =
830 (ev2->timestamp & 0xf) * 32 + trise_100ps;
831 uint16_t plen_100ps =
832 (ev2->pulse_length + 1) * 32 + tfall_100ps - trise_100ps;
834 LOGF(debug4,
"ch_num = 0x%02X", ev2->channel_number);
835 LOGF(debug4,
"timestamp = 0x%016lX", ev2->timestamp);
836 LOGF(debug4,
"time_sec = 0x%08X", time_sec);
837 LOGF(debug4,
"time_nsec = 0x%08X", time_nsec);
838 LOGF(debug4,
"trise_100ps = 0x%02X", trise_100ps);
839 LOGF(debug4,
"tfall_100ps = 0x%02X", tfall_100ps);
840 LOGF(debug4,
"time_100ps = 0x%04X", time_100ps);
841 LOGF(debug4,
"plen_100ps = 0x%04X", plen_100ps);
842 LOGF(debug4,
"global_ch = 0x%04X", ev2->channel_number_global);
844 new ((*tdc_hgnd)[
tdc_hgnd->GetEntriesFast()])
845 BmnAbstractTDCDigit(serial, ev2->channel_number_global, time_sec, time_nsec, time_100ps, plen_100ps);
847 LOGF(error,
"BmnRawSource::FillTDC250HGND: Wrong event type");
851 index += event_length;
859 LOGF(debug,
"MapVSP");
860 if (dev_hdr->GetNWords() < 3) {
861 LOGF(warning,
"Empty VSP block");
864 uint8_t iComp = (dev_hdr->Serial & 0xFF000000) >> 24;
871 LOGF(debug,
"FillVSP");
872 const uint8_t kuMaxComps = 10;
873 uint16_t fvuCurrentTsMsbCycle[kuMaxComps] = {};
874 uint64_t fvulCurrentTsMsb[kuMaxComps] = {};
880 for (uint8_t iw01 = 0; iw01 < nComp; iw01++)
881 (*stti).append_component(1);
884 uint8_t iw01 = el.first;
885 auto* mslice_descr = el.second;
889 for (uint8_t uw02 = 0; uw02 < nComp; uw02++) {
893 uint16_t fuCurrentEquipmentId =
static_cast<uint16_t
>(msd.
eq_id);
894 uint16_t fusCurrentDpbIdx =
static_cast<uint32_t
>(fuCurrentEquipmentId & 0xFFFF);
897 uint64_t tgn = msd.
idx;
899 LOGF(warning,
"!!! Misplaced VSP event! tgn = %lu while EventId = %u !!!\n", tgn,
fCurEvent.fEventId);
900 uint32_t tgNev =
static_cast<uint32_t
>(tgn);
909 uint32_t uNbMessages = 0;
911 uint64_t uiTrgTimeFLES = 0;
912 uint64_t uiHitTimeFLES = 0;
915 static const uint32_t kuBytesPerMessage = 4;
917 uNbMessages = (size - (size % kuBytesPerMessage)) / kuBytesPerMessage;
920 const uint32_t* pInBuff =
reinterpret_cast<const uint32_t*
>((*stti).content(uw02, 0));
923 uint64_t uiTrgTime_TsMsb = 0;
924 uint64_t uiHitTime_TsMsb = 0;
925 uint64_t uiTrgTime_Epoch = 0;
927 uint16_t uiTsMsbMessageNumber = 0;
928 uint16_t uiEpochMessageNumber = 0;
930 uint16_t usHitMissedEvts = 0;
931 if (uNbMessages == 0)
935 for (uint32_t uIdx = 0; uIdx < uNbMessages; ++uIdx) {
937 uint32_t ulData =
static_cast<uint32_t
>(pInBuff[uIdx]);
945 uiEpochMessageNumber++;
947 if (uiEpochMessageNumber == 1)
950 printf(
"fles WARNING: more than one EPOCH message in event tgN = %lu, exactly: %u\n", tgn,
951 uiEpochMessageNumber);
955 uiTsMsbMessageNumber++;
957 if (uVal < fvulCurrentTsMsb[uw02]) {
958 printf(
"TsMsbCycle: event trigger# %u", tgNev);
959 printf(
"\tDPB: %u, Old TsMsb= %lu, new TsMsb=%lu, Old MsbCy=%u\n", uw02, fvulCurrentTsMsb[uw02],
960 uVal, fvuCurrentTsMsbCycle[uw02]);
962 if ((fvulCurrentTsMsb[uw02] - uVal) > 10000000)
963 fvuCurrentTsMsbCycle[uw02]++;
966 fvulCurrentTsMsb[uw02] = uVal;
967 uiHitTime_TsMsb = uVal << 10;
969 * fvuCurrentTsMsbCycle[uw02];
970 if (uiTsMsbMessageNumber == 1) {
972 uiHitTime_TsMsb & 0xFFE0000000;
978 uiHitTimeFLES = uiHitTime_TsMsb +
static_cast<uint64_t
>(usRawTs);
985 dig->
AppendHit(uiHitTimeFLES, usElinkIdx, usChan, usRawAdc);
994 uiTrgTimeFLES = uiTrgTime_TsMsb + uiTrgTime_Epoch;
1005 const uint32_t len = dev_hdr->GetNWords();
1006 const MSC16VE_EHeader* ms =
reinterpret_cast<const MSC16VE_EHeader*
>(d);
1009 if (ms->Hdr.Len > (len - 1)) {
1010 LOGF(error,
"MSC header payload length mismatch!");
1018 std::array<uint8_t, MSC_N_COUNTERS> cntrs = {};
1019 switch (ms->GetVersion()) {
1021 const uint8_t NumsInWord = 4;
1022 while (index < len) {
1023 uint8_t type = d[index] >> 28;
1027 uint32_t ext_cond = (d[index] >> 24) & (
BIT(4) - 1);
1028 uint32_t sliceNum = (d[index]) & (
BIT(24) - 1);
1029 auto sc_time_shift = ms->SliceInt * sliceNum * 1ns;
1031 LOGF(debug,
"MSC ext_cond %2u sliceNum %7u time %s", ext_cond, sliceNum,
1033 new ((*msc)[
msc->GetEntriesFast()])
1039 for (uint8_t
i = 0;
i < NumsInWord;
i++) {
1040 uint32_t cnt = (d[index] >> (
i * ms->NCntrBits)) & (
BIT(ms->NCntrBits) - 1);
1041 cntrs[type * NumsInWord +
i] = cnt;
1050 if (ms->Hdr.Len <= 1 + (
sizeof(MSC16VE_EHeader) -
sizeof(MStreamHeader)) /
kNBYTESINWORD)
1052 uint32_t n_slices = ms->Hdr.Len - 1 - (
sizeof(MSC16VE_EHeader) -
sizeof(MStreamHeader)) /
kNBYTESINWORD;
1053 uint32_t missing_hits = d[index++];
1055 LOGF(info,
"missing_hits %3u !!!", missing_hits);
1059 vector<uint8_t>& vals = dig->
GetValues();
1062 int32_t istart = index;
1063 while (index < len) {
1064 uint8_t cnt = d[index] & (
BIT(ms->NCntrBits) - 1);
1065 uint8_t ext_cond = (d[index] >> ms->NCntrBits) & (
BIT(ms->ExtCondCnt) - 1);
1066 uint32_t sliceNum = d[index] >> (ms->NCntrBits + ms->ExtCondCnt);
1067 auto sc_time_shift = ms->SliceInt * sliceNum * 1ns;
1068 SysPoint point_slice{point + sc_time_shift};
1069 int32_t iVal = index - istart;
1074 conds[iVal] = ext_cond;
1075 LOGF(debug,
"MSC ext_cond %2u cnt %2u sliceNum %7u time %s", ext_cond, cnt, sliceNum,
1081 LOGF(warning,
"MSC16 ver $u not implemented", ms->GetVersion());
1090 LOGF(info,
"Found virtual device 0x%08X block", dh->Serial);
1092 LOGF(info,
"Not T0 device");
1096 std::ofstream outfile(
Form(
"virt_device_run_%u_%08X_%02X_t_%ld_%ld.txt",
fCurEvent.fRunId, dh->Serial,
1099 ios::out | ios::binary);
1101 outfile << std::hex << d[
i];
1116 const MStreamHeader* ms =
reinterpret_cast<const MStreamHeader*
>(d);
1120 auto* ms0 =
reinterpret_cast<const MStreamTAI*
>(d + index);
1128 LOGF(error,
"UT24VE-TRC Error! MSHeader payload length larger than from device header!");
1133 LOGF(debug,
"FillUT24VE_TRC etype %u WR %08X ts: %s", (uint32_t)
fCurEvent.fEvType, serial,
1138 while (++index < len) {
1139 uint32_t sig_states = d[index];
1140 vec.push_back(sig_states);
1141 bitset<32> sig_states_bs(sig_states);
1142 LOGF(debug2,
"TRC states d[%3u] %s", index, sig_states_bs.to_string());
1154 LOGF(warn,
"Possibly wrong state of %08X", serial);
1162 uint32_t word = d[idx];
1163 uint32_t
id = word >> 28;
1166 uint32_t d0 = d[idx + 0];
1167 uint32_t d1 = d[idx + 1];
1168 uint32_t d2 = d[idx + 2];
1169 uint32_t d3 = d[idx + 3];
1170 if ((d0 >> 28) != 2 || (d1 >> 28) != 2 || (d2 >> 28) != 2 || (d3 >> 28) != 2)
1172 int64_t ts_t0_s = -1;
1173 int64_t ts_t0_ns = -1;
1174 int64_t GlobalEvent = -1;
1175 ts_t0_ns = (d0 & 0x0FFFFFFF) | ((d1 & 0x3) << 28);
1176 ts_t0_s = ((d1 >> 4) & 0xFFFFFF) | ((d2 & 0xFFFF) << 24);
1177 GlobalEvent = ((d3 & 0x0FFFFFFF) << 12) | ((d2 >> 16) & 0xFFF);
1184 LOGF(debug2,
"ts :\t %10lli %9lli TMWR 0x%08X", ts_t0_s, ts_t0_ns, serial);
1187 uint32_t d0 = d[idx + 0];
1188 uint32_t d1 = d[idx + 1];
1189 if (((d0 >> 28) != 4) || ((d1 >> 28) != 5))
1215 printf(
"unrecognized TMWR id %u\n",
id);
1225 uint32_t type = d[idx] >> 28;
1229 std::array<uint32_t, MSC_N_COUNTERS>& cntrArrCur = dig->
GetValue();
1238 }
else if (type == 5) {
1239 uint32_t cnt = d[idx] & (
BIT(28) - 1);
1242 cntrArrCur[iCnt++] = cnt;
1245 type = (d[++idx] >> 28) & (
BIT(5) - 1);
1253 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1972, 1, 1, 0, 0, 9), 10));
1254 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1972, 7, 1, 0, 0, 10), 11));
1255 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1973, 1, 1, 0, 0, 11), 12));
1256 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1974, 1, 1, 0, 0, 12), 13));
1257 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1975, 1, 1, 0, 0, 13), 14));
1258 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1976, 1, 1, 0, 0, 14), 15));
1259 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1977, 1, 1, 0, 0, 15), 16));
1260 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1978, 1, 1, 0, 0, 16), 17));
1261 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1979, 1, 1, 0, 0, 17), 18));
1262 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1980, 1, 1, 0, 0, 18), 19));
1263 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1981, 7, 1, 0, 0, 19), 20));
1264 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1982, 7, 1, 0, 0, 20), 21));
1265 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1983, 7, 1, 0, 0, 21), 22));
1266 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1985, 7, 1, 0, 0, 22), 23));
1267 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1988, 1, 1, 0, 0, 23), 24));
1268 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1990, 1, 1, 0, 0, 24), 25));
1269 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1991, 1, 1, 0, 0, 25), 26));
1270 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1992, 7, 1, 0, 0, 26), 27));
1271 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1993, 7, 1, 0, 0, 27), 28));
1272 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1994, 7, 1, 0, 0, 28), 29));
1273 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1996, 1, 1, 0, 0, 29), 30));
1274 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1997, 7, 1, 0, 0, 30), 31));
1275 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(1999, 1, 1, 0, 0, 31), 32));
1276 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(2006, 1, 1, 0, 0, 32), 33));
1277 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(2009, 1, 1, 0, 0, 33), 34));
1278 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(2012, 7, 1, 0, 0, 34), 35));
1279 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(2015, 7, 1, 0, 0, 35), 36));
1280 leaps.insert(pair<TTimeStamp, Int_t>(
TTimeStamp(2017, 1, 1, 0, 0, 36), 37));
1287 if (t <
leaps.begin()->first) {
1288 LOGF(warning,
"Wrong time! %s", t.
AsString());
1292 LOGF(warning,
"Warning! Leap seconds table expired!");
1294 auto it =
leaps.lower_bound(t);
1295 if ((it ==
leaps.end()))
1297 else if (it->first > t)
void memset(T *dest, T i, size_t num)
Copy to memory block [@dest, @dest+@num] num number of times the value of i of type @T with size @typ...
char * Form(const char *fmt,...)
BmnStatus
Define status code.
@ kBMNPAYLOAD
spill event.
@ kBMNPEDESTAL
pedestal event.
std::chrono::time_point< SysClock > SysPoint
const uint32_t kMSTREAM_TYPE_TRIG
const uint32_t kADC64VE_XGE
const uint32_t kEVENTTYPESLOT
const uint32_t kVSP_SERIALS
const uint32_t kMODTRAILER
const uint32_t TDC_TRAILING
const uint32_t kMSTREAM_TYPE_TDC
const uint32_t TMWR_REL_TS
const uint32_t kVIRTUAL_DEVICE
const uint32_t kTQDC16VS_E
const uint32_t kEVTRAILER
const uint32_t TMWR_REL_TS_TB
const uint32_t TMWR_EOS_CNT
const uint32_t kUT24VE_TRC
const uint32_t kMSTREAM_TYPE_STAT
const uint32_t kTDC64VHLE
const uint32_t TDC_EV_HEADER
const uint32_t TDC_EV_TRAILER
const uint32_t TDC_LEADING
const uint32_t MSC_N_COUNTERS
const uint32_t kMSTREAM_TYPE_ADC
const uint32_t kNBYTESINWORD
const uint32_t kGENERIC_DEVICE
const uint32_t kHGND_SERIALS
const uint32_t kT0_BIN_BLOCK_BYTES
const uint32_t SERIAL_TO_CFG
const uint32_t TMWR_PULSE
const uint32_t kTDC64VHLE_E
const uint32_t kT0_BIN_BLOCK_WORDS
const uint8_t MSC_TIME_SLICE_INFO
const uint32_t kMSC16VE_E
const uint32_t kMODHEADER
const uint32_t TMWR_EOS_CNT_MATCHED
BmnStatus FillTTVXS(const uint32_t *d, uint32_t serial, uint32_t &len)
https://afi.jinr.ru/TTVXS_DataFormat
Int_t GetUTCShift(TTimeStamp t)
uint32_t rawData[10000000]
vector< pair< int, pair< int, int > > > * vecTree
Bool_t fExportExternalSpillStat
BmnStatus ConvertStatEvent(const uint32_t *d, uint32_t &len)
void WriteSpill(Int_t spillId)
void ClearRawSpillArrays()
BmnSyncDigit * FillWR(uint32_t iSerial, uint64_t iEvent, int64_t t_sec, int64_t t_ns)
BmnStatus FillTQDC_E(const uint32_t *d, uint32_t serial, uint32_t &len)
Parse TQDC16VS-E MStream data block https://afi.jinr.ru/DataFormatTQDC16VSE.
BmnStatus MapVSP(const uint32_t *d, const DeviceHeader *dev_hdr)
Parse VSP data block.
BmnStatus FillVSP(TClonesArray *ar)
void SetTrees(TTree *tree, TTree *treeSpills)
BmnStatus FillTDC72VXS(const uint32_t *d, uint32_t serial, uint32_t &len, uint32_t modid)
https://afi.jinr.ru/TDC72VXS_DataFormat
BmnStatus Process_HRB(const uint32_t *data, uint32_t len, uint32_t serial)
BmnStatus FillBlockTDC(const uint32_t *d, uint32_t serial, uint16_t &len, TClonesArray *ar, uint32_t modid)
BmnStatus FillTQDC(const uint32_t *d, uint32_t serial, uint32_t slot, uint32_t modId, uint32_t &idx)
BmnStatus FillFVME2TMWR(const uint32_t *d, uint32_t serial, uint32_t &idx, uint32_t &len)
std::shared_ptr< TBufferMergerFile > mergerFile
BmnStatus FillMSC16VE_E(const uint32_t *d, const DeviceHeader *dev_hdr)
Parse MSC16VE-E MStream data block https://afi.jinr.ru/DataFormatMSC_ETH.
BmnStatus FillTDC250HGND(const uint32_t *d, uint32_t serial, uint32_t len)
Parse custom HGND TDC data block.
map< TTimeStamp, Int_t > leaps
BmnStatus ProcessEvent(const uint32_t *data, uint32_t len)
void SetData(Int_t taskId, Int_t len=0, const uint32_t *data=nullptr, BmnEventType fCurEvType=kBMNEMPTY, uint32_t fRunId=7444, uint32_t fEventId=-1)
BmnStatus FillUT24VE_TRC(const uint32_t *d, uint32_t &serial, uint32_t &len)
Parse UT24VE-TRC MStream data block https://afi.jinr.ru/DataFormatUT24VE-TRC.
BmnEventHeader * eventHeaderDAQ
BmnStatus FillMSC(const uint32_t *d, uint32_t serial, uint32_t slot, uint32_t &idx)
BmnStatus Process_FVME(const uint32_t *data, uint32_t len, uint32_t serial, BmnTrigInfo &spillInfo)
BmnStatus FillU40VE(const uint32_t *d, uint32_t slot, uint32_t &idx, BmnTrigInfo &spillInfo)
BmnStatus ProcessGenericDevice(const uint32_t *d, const DeviceHeader *dev_hdr)
BmnStatus FillTDC(const uint32_t *d, uint32_t serial, uint32_t slot, uint32_t modId, uint32_t &idx)
BmnStatus FillVirtualDevice(const uint32_t *d, const DeviceHeader *dh)
BmnStatus FillBlockADC(const uint32_t *d, uint32_t serial, uint8_t channel, uint16_t &len, TClonesArray *ar)
vector< pair< int, pair< int, int > > > * vecTreeSpills
std::map< uint8_t, const uint32_t * > time_slice_map
void RegisterSpillBranches()
static std::string TimePoint2String(SysPoint p)
static SysPoint TimeStamp2TP(TTimeStamp p)
static TTimeStamp TimePoint2TS(SysPoint p)
std::array< IntType, MSC_N_COUNTERS > & GetValue()
Raw MSC block with zero suppression and for one specific channel.
std::vector< IntType > & GetValues()
std::vector< TTimeStamp > & GetTimes()
std::vector< uint8_t > & GetExtCond()
Long64_t GetTime_sec() const
Long64_t GetTime_ns() const
T0 module spill settings and counts.
void SetTimeSinceLastEvNs(Double_t dur)
Write time since the last written event.
Class BmnTrigInfo Trigger counters of the current spill from U40VE card.
void SetTrigBefo(UInt_t _v)
void SetTrigAccepted(UInt_t _v)
void SetTrigAfter(UInt_t _v)
void SetTrigAll(UInt_t _v)
void SetTrigRjct(UInt_t _v)
void SetTrigCand(UInt_t _v)
void SetTrigAvail(UInt_t _v)
void AppendHit(uint64_t HitTime, uint16_t ElinkIdx, uint16_t Chan, uint16_t Adc)
void SetTHitMissedEvts(uint16_t val)
void SetTTrigTime(uint64_t val)
Int_t GetEntriesFast() const
Double_t AsDouble() const
const char * AsString(const Option_t *option="") const
virtual Int_t Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99)
The StorableTimeslice class contains the data of a single timeslice.
uint32_t GetTsMsbValBinning() const
For TS MSB data: Returns the TS MSB 29 bit field).
uint16_t GetHitAdc() const
For Hit data: Returns ADC value (5 bit field).
uint16_t GetLinkIndexHitBinning() const
For Hit data: Returns (global) index of the eLink on which the message was received (6 bit field) => ...
uint16_t GetHitTimeBinning() const
For Hit data: Returns timestamp (9 bit field + 1b extra on b30) => Quick and dirty hack for binning F...
uint32_t GetEpochVal() const
For Epoch data: Returns the Epoch (29 bit field).
uint16_t GetHitChannel() const
For Hit data: Returns StsXYTER channel number (7 bit field).
MessType GetMessType() const
Returns the message type, see enum MessType.
bool IsHitMissedEvts() const
For Hit data: Returns Missed event flag (1 bit field).
bool is_word_event_header(uint16_t word)
uint16_t get_block_size(EventPacketVersion packet_version=ERR)
EventPacketVersion get_event_packet_version(uint16_t word)
static constexpr uint64_t kulTsCycleNbBinsBinning
Microslice descriptor struct.
uint64_t idx
Microslice index / start time.
uint32_t size
Content size (bytes).
uint16_t eq_id
Equipment identifier.