19#include <fairlogger/Logger.h>
27 stream <<
"Counter errorrs: lmB:" <<
lmB <<
" l0B:" <<
l0B <<
" l1B:" <<
l1B <<
" lmA:" <<
lmA <<
" l0A:" <<
l0A <<
" l1A:" <<
l1A;
43 lmBefore = (uint64_t)(raw.
lmBefore) + 0xffffffffull * (uint64_t)(overflow[0]);
44 lmAfter = (uint64_t)(raw.
lmAfter) + 0xffffffffull * (uint64_t)(overflow[1]);
45 l0Before = (uint64_t)(raw.
l0Before) + 0xffffffffull * (uint64_t)(overflow[2]);
46 l0After = (uint64_t)(raw.
l0After) + 0xffffffffull * (uint64_t)(overflow[3]);
47 l1Before = (uint64_t)(raw.
l1Before) + 0xffffffffull * (uint64_t)(overflow[4]);
48 l1After = (uint64_t)(raw.
l1After) + 0xffffffffull * (uint64_t)(overflow[5]);
69 for (
auto const& cnts :
scalers) {
72 std::cout <<
"Inputs:" <<
scalersInps.size() << std::endl;
82 for (
auto const& cnts :
scalers) {
85 std::cout <<
"Inputs:" <<
scalersInps.size() << std::endl;
96 for (uint32_t
i = 0;
i <
scalers.size();
i++) {
106 stream <<
"CTP Scalers (version:" << mVersion <<
") Run:" << mRunNumber << std::endl;
108 stream <<
"Detector mask:" << mDetectorMask << std::endl;
109 for (
auto const&
rec : mScalerRecordRaw) {
112 stream <<
"O2 Counters:" << std::endl;
113 for (
auto const&
rec : mScalerRecordO2) {
119 stream <<
"CTP Scalers (version:" << mVersion <<
") Run:" << mRunNumber << std::endl;
120 stream <<
"O2 Counters:" << std::endl;
121 for (
auto const&
rec : mScalerRecordO2) {
127 stream <<
"CTP Scalers (version:" << mVersion <<
") Run:" << mRunNumber << std::endl;
128 stream <<
"O2 Counters:" << std::endl;
130 for (
auto const&
rec : mScalerRecordO2) {
137 for (uint32_t
i = 0;
i < mClassMask.size();
i++) {
146 std::vector<uint32_t> indexes;
147 for (uint32_t
i = 0;
i < CTP_NCLASSES;
i++) {
149 indexes.push_back(
i);
158 LOG(error) <<
"Class index out of range:" << cls;
163 for (
auto const& clsl : clslist) {
169 LOG(error) <<
" Class not found:" << cls;
174 LOG(info) <<
"Loading CTP scalers.";
175 std::istringstream iss(rawscalers);
179 uint32_t nclasses = 0;
181 while (std::getline(iss, line)) {
183 if ((ret = processScalerLine(line,
level, nclasses)) != 0) {
189 LOG(error) <<
"Input string seems too small:\n"
194 LOG(error) <<
"Wrong number of classes in final record";
199int CTPRunScalers::processScalerLine(
const std::string& line,
int&
level, uint32_t& nclasses)
202 if (line.size() == 0) {
205 if (line.at(0) ==
'#') {
209 size_t ntokens = tokens.size();
217 LOG(error) <<
"Expected version in the first line";
220 mVersion = std::stoi(tokens[0]);
228 LOG(error) <<
"Wrong syntax of second line in CTP scalers";
231 mRunNumber = std::stol(tokens[0]);
232 uint32_t numofclasses = std::stoi(tokens[1]);
233 if ((numofclasses + 2) != ntokens) {
234 LOG(error) <<
"Wrong syntax of second line in CTP scalers";
238 for (uint32_t
i = 0;
i < numofclasses;
i++) {
239 int index = std::stoi(tokens[
i + 2]);
240 mClassMask[
index] = 1;
250 LOG(error) <<
"Wrong syntax of time stamp line in CTP scalers";
255 rec.intRecord.bc = std::stol(tokens[1]);
257 rec.epochTime = std::stoll(tokens[2]);
259 mScalerRecordRaw.push_back(
rec);
266 LOG(error) <<
"Wrong syntax of counters line in CTP scalers";
272 scaler.
lmBefore = std::stol(tokens[0]);
273 scaler.
lmAfter = std::stol(tokens[1]);
274 scaler.
l0Before = std::stol(tokens[2]);
275 scaler.
l0After = std::stol(tokens[3]);
276 scaler.
l1Before = std::stol(tokens[4]);
277 scaler.
l1After = std::stol(tokens[5]);
278 (mScalerRecordRaw.back()).scalers.push_back(scaler);
280 if (nclasses >= mClassMask.count()) {
294 overflows_t overflows;
295 for (uint32_t
i = 0;
i < mClassMask.size();
i++) {
297 overflows[
i] = {0, 0, 0, 0, 0, 0};
301 std::array<uint32_t, 48> overflowsInputs = {48 * 0};
305 copyRawToO2ScalerRecord(mScalerRecordRaw[0], o2rec, overflows, overflowsInputs);
306 mScalerRecordO2.push_back(o2rec);
308 for (uint32_t
i = 1;
i < mScalerRecordRaw.size();
i++) {
310 int ret = updateOverflows(mScalerRecordRaw[
i - 1], mScalerRecordRaw[
i], overflows);
319 ret = updateOverflowsInps(mScalerRecordRaw[
i - 1], mScalerRecordRaw[
i], overflowsInputs);
320 copyRawToO2ScalerRecord(mScalerRecordRaw[
i], o2rec, overflows, overflowsInputs);
321 mScalerRecordO2.push_back(o2rec);
332 if (rawrec.
scalers.size() != (mClassMask.count())) {
333 LOG(error) <<
"Inconsistent scaler record size:" << rawrec.
scalers.size() <<
" Expected:" << mClassMask.count();
341 for (uint32_t
i = 0;
i < rawrec.
scalers.size();
i++) {
346 o2rec.
scalers.push_back(o2scal);
349 uint64_t inpo2 = (uint64_t)(rawrec.
scalersInps[
i]) + 0xffffffffull * (uint64_t)(overflows[
i]);
404 int64_t difThres = 6;
406 if (dif <= difThres) {
408 }
else if (dif > difThres) {
411 LOG(error) <<
"LMA > LMB error:" << dif;
416 if (dif <= difThres) {
418 }
else if (dif > difThres) {
421 LOG(error) <<
"L0A > L0B error:" << dif;
426 if (dif <= difThres) {
428 }
else if (dif > difThres) {
431 LOG(error) <<
"L1A > L1B error:" << dif;
441 if (dif <= difThres) {
443 }
else if (dif > difThres) {
447 LOG(warning) <<
"L1B > L0A Before error:" << dif;
460 if (rec1.
scalers.size() != mClassMask.count()) {
461 LOG(error) <<
"Inconsistent scaler record size:" << rec1.
scalers.size() <<
" Expected:" << mClassMask.count();
468 for (uint32_t
i = 0;
i < rec0.
scalers.size();
i++) {
477 for (uint32_t
i = 0;
i < rec0.
scalers.size();
i++) {
482int CTPRunScalers::updateOverflows(
const CTPScalerRaw& scal0,
const CTPScalerRaw& scal1, std::array<uint32_t, 6>& overflow)
const
510 static int iPrint = 0;
514 LOG(warning) <<
"Input scalers not available. Size:" << rec0.
scalersInps.size();
521 LOG(warning) <<
"Input scalers not available. Size:" << rec0.
scalersInps.size();
526 for (uint32_t
i = 0;
i < NINPS;
i++) {
536 if (mScalerRecordO2.size() == 0) {
537 LOG(info) <<
"ScalerRecord is empty, doing nothing";
540 LOG(info) <<
"Scaler rates for run:" << mRunNumber;
543 for (uint32_t
i = 1;
i < mScalerRecordO2.size();
i++) {
548 tinrun = tinrun * 88e-6;
549 std::cout <<
"==> Time wrt to SOR [s]:" << tinrun <<
" time intervale[s]:" <<
tt << std::endl;
550 for (uint32_t
j = 0;
j < scalrec1->
scalers.size();
j++) {
553 double_t rMB = (
s1->lmBefore -
s0->lmBefore) /
tt;
554 double_t rMA = (
s1->lmAfter -
s0->lmAfter) /
tt;
555 double_t r0B = (
s1->l0Before -
s0->l0Before) /
tt;
556 double_t r0A = (
s1->l0After -
s0->l0After) /
tt;
557 double_t r1B = (
s1->l1Before -
s0->l1Before) /
tt;
558 double_t r1A = (
s1->l1After -
s0->l1After) /
tt;
559 std::cout <<
"Class:" <<
s0->classIndex <<
": ";
560 std::cout << rMB <<
" " << rMA <<
" ";
561 std::cout << r0B <<
" " << r0A <<
" ";
562 std::cout << r1B <<
" " << r1A;
563 std::cout << std::endl;
571 if (mScalerRecordO2.size() == 0) {
572 LOG(info) <<
"ScalerRecord is empty, doing nothing";
575 double_t time0 = mScalerRecordO2[0].epochTime;
576 double_t timeL = mScalerRecordO2[mScalerRecordO2.size() - 1].epochTime;
577 LOG(info) <<
"Scaler Integrals for run:" << mRunNumber <<
" duration:" << timeL - time0;
579 for (uint32_t
i = 0;
i < mScalerRecordO2[0].scalers.size();
i++) {
580 std::cout <<
i <<
" LMB " << mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[
i].lmBefore - mScalerRecordO2[0].scalers[
i].lmBefore << std::endl;
581 std::cout <<
i <<
" LMA " << mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[
i].lmAfter - mScalerRecordO2[0].scalers[
i].lmAfter << std::endl;
582 std::cout <<
i <<
" L0B " << mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[
i].l0Before - mScalerRecordO2[0].scalers[
i].l0Before << std::endl;
583 std::cout <<
i <<
" L0A " << mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[
i].l0After - mScalerRecordO2[0].scalers[
i].l0After << std::endl;
584 std::cout <<
i <<
" L1B " << mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[
i].l1Before - mScalerRecordO2[0].scalers[
i].l1Before << std::endl;
585 std::cout <<
i <<
" L1A " << mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[
i].l1After - mScalerRecordO2[0].scalers[
i].l1After << std::endl;
593 if (mScalerRecordO2.size() == 0) {
594 LOG(info) <<
"ScalerRecord is empty, doing nothing";
597 double_t time0 = mScalerRecordO2[0].epochTime;
598 double_t timeL = mScalerRecordO2[mScalerRecordO2.size() - 1].epochTime;
599 int integral = mScalerRecordO2[mScalerRecordO2.size() - 1].scalersInps[inp - 1] - mScalerRecordO2[0].scalersInps[inp - 1];
600 std::cout <<
"Scaler Integrals for run:" << mRunNumber <<
" duration:" << timeL - time0;
601 std::cout <<
" Input " << inp <<
" integral:" << integral <<
" rate:" << integral / (timeL - time0) << std::endl;
608 if (mScalerRecordO2.size() == 0) {
609 LOG(info) <<
"ScalerRecord is empty, doing nothing";
612 double_t time0 = mScalerRecordO2[0].epochTime;
613 double_t timeL = mScalerRecordO2[mScalerRecordO2.size() - 1].epochTime;
615 if (iscalerindex != 255) {
616 int integral = mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[iscalerindex].lmBefore - mScalerRecordO2[0].scalers[iscalerindex].lmBefore;
617 std::cout <<
"Scaler Integrals for run:" << mRunNumber <<
" duration:" << timeL - time0;
618 std::cout <<
" Class index" << iclsindex <<
" integral:" << integral <<
" rate:" << integral / (timeL - time0) << std::endl;
628 if (mScalerRecordO2.size() == 0) {
629 LOG(info) <<
"ScalerRecord is empty, doing nothing";
632 double_t time0 = mScalerRecordO2[0].epochTime;
633 double_t timeL = mScalerRecordO2[mScalerRecordO2.size() - 1].epochTime;
635 int integral = mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[iclsscalerindex - 1].lmBefore - mScalerRecordO2[0].scalers[iclsscalerindex - 1].lmBefore;
636 std::cout <<
"Scaler Integrals for run:" << mRunNumber <<
" duration:" << timeL - time0;
637 std::cout <<
" Class scaler index:" << iclsscalerindex <<
" integral:" << integral <<
" rate:" << integral / (timeL - time0) << std::endl;
644 for (uint32_t
i = 1;
i < mScalerRecordO2.size();
i++) {
645 auto prev = &mScalerRecordO2[
i - 1];
646 auto curr = &mScalerRecordO2[
i];
647 double_t
tt = (double_t)(curr->intRecord.orbit - prev->intRecord.orbit);
650 for (
int j = 0;
j < 1;
j++) {
651 auto s0 = &(prev->scalers[
j]);
652 auto s1 = &(curr->scalers[
j]);
653 double_t rMB = (
s1->lmBefore -
s0->lmBefore) /
tt;
654 auto delta = curr->epochTime - prev->epochTime;
655 double rMB2 = (
s1->lmBefore -
s0->lmBefore) / delta;
656 std::cout <<
"Class " <<
j <<
" " << (
unsigned long long)(prev->epochTime) <<
" " << (
unsigned long long)(curr->epochTime) <<
" DeltaTime " << delta <<
" tt " <<
tt <<
" interactions / s " << rMB <<
" in Hz " << rMB2 <<
"\n";
664 const auto s0 = mScalerRecordO2[0].scalers[classindex];
665 const auto s1 = mScalerRecordO2[mScalerRecordO2.size() - 1].scalers[classindex];
668 return (
s1.lmBefore -
s0.lmBefore);
670 return (
s1.lmAfter -
s0.lmAfter);
672 return (
s1.l0Before -
s0.l0Before);
674 return (
s1.l0After -
s0.l0After);
676 return (
s1.l1Before -
s0.l1Before);
678 return (
s1.l1After -
s0.l1After);
680 LOG(error) <<
"Wrong type:" <<
type;
683 }
else if (
type == 7) {
684 auto s0 = mScalerRecordO2[0].scalersInps[classindex];
685 auto s1 = mScalerRecordO2[mScalerRecordO2.size() - 1].scalersInps[classindex];
688 LOG(error) <<
"Wrong type:" <<
type;
695 std::vector<std::pair<double_t, double_t>> scals;
696 for (
int i = 0;
i < mScalerRecordO2.size() - 1;
i++) {
701 const auto s0 = mScalerRecordO2[
i].scalers[classindex];
702 const auto s1 = mScalerRecordO2[
i + 1].scalers[classindex];
704 diff =
s1.lmBefore -
s0.lmBefore;
705 }
else if (
type == 2) {
706 diff =
s1.lmAfter -
s0.lmAfter;
707 }
else if (
type == 3) {
708 diff =
s1.l0Before -
s0.l0Before;
709 }
else if (
type == 4) {
710 diff =
s1.l0After -
s0.l0After;
711 }
else if (
type == 5) {
712 diff =
s1.l1Before -
s0.l1Before;
713 }
else if (
type == 6) {
714 diff =
s1.l1After -
s0.l1After;
716 LOG(error) <<
"Wrong type:" <<
type;
719 }
else if (
type == 7) {
720 auto s0 = mScalerRecordO2[
i].scalersInps[classindex];
721 auto s1 = mScalerRecordO2[
i + 1].scalersInps[classindex];
724 LOG(error) <<
"Wrong type:" <<
type;
727 scals.emplace_back(std::pair<double_t, double_t>{diff, timeDiff});
737 if (mScalerRecordO2.size() <= 1) {
738 LOG(error) <<
"not enough data";
739 return std::make_pair(-1., -1.);
746 auto iter = std::lower_bound(mScalerRecordO2.begin(), mScalerRecordO2.end(),
orbit, [&](
CTPScalerRecordO2 const&
a, uint32_t
value) { return a.intRecord.orbit <= value; });
747 auto nextindex = std::distance(mScalerRecordO2.begin(), iter);
749 auto calcRate = [&](
auto index1,
auto index2) ->
double {
750 const auto& snext = mScalerRecordO2[index2];
751 const auto& sprev = mScalerRecordO2[index1];
752 auto timedelta = (snext.intRecord.orbit - sprev.intRecord.orbit) * 88.e-6;
754 const auto&
s0 = sprev.scalers[classindex];
755 const auto&
s1 = snext.scalers[classindex];
758 return (
s1.lmBefore -
s0.lmBefore) / timedelta;
760 return (
s1.lmAfter -
s0.lmAfter) / timedelta;
762 return (
s1.l0Before -
s0.l0Before) / timedelta;
764 return (
s1.l0After -
s0.l0After) / timedelta;
766 return (
s1.l1Before -
s0.l1Before) / timedelta;
768 return (
s1.l1After -
s0.l1After) / timedelta;
770 LOG(error) <<
"Wrong type:" <<
type;
773 }
else if (
type == 7) {
774 auto s0 = sprev.scalersInps[classindex];
775 auto s1 = snext.scalersInps[classindex];
776 return (
s1 -
s0) / timedelta;
778 LOG(error) <<
"Wrong type:" <<
type;
783 if (nextindex == 0) {
786 LOG(info) <<
"query orbit " <<
orbit <<
" before first record; Just returning the global rate";
787 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), -1);
789 LOG(info) <<
"query orbit " <<
orbit <<
" before first record; Returning the first rate";
790 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), calcRate(0, 1));
792 }
else if (nextindex == mScalerRecordO2.size()) {
794 LOG(info) <<
"query orbit " <<
orbit <<
" after last record; Just returning the global rate";
795 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), -1);
797 LOG(info) <<
"query orbit " <<
orbit <<
" after last record; Returning the last rate";
798 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), calcRate(mScalerRecordO2.size() - 2, mScalerRecordO2.size() - 1));
801 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), calcRate(nextindex - 1, nextindex));
803 return std::make_pair(-1., -1.);
811 if (mScalerRecordO2.size() <= 1) {
812 LOG(error) <<
"not enough data";
813 return std::make_pair(-1., -1.);
820 auto iter = std::lower_bound(mScalerRecordO2.begin(), mScalerRecordO2.end(), timestamp, [&](
CTPScalerRecordO2 const&
a,
double value) { return a.epochTime <= value; });
824 auto nextindex = std::distance(mScalerRecordO2.begin(), iter);
826 auto calcRate = [&](
auto index1,
auto index2) ->
double {
827 const auto& snext = mScalerRecordO2[index2];
828 const auto& sprev = mScalerRecordO2[index1];
829 auto timedelta = (snext.intRecord.orbit - sprev.intRecord.orbit) * 88.e-6;
832 const auto&
s0 = sprev.scalers[classindex];
833 const auto&
s1 = snext.scalers[classindex];
836 return (
s1.lmBefore -
s0.lmBefore) / timedelta;
838 return (
s1.lmAfter -
s0.lmAfter) / timedelta;
840 return (
s1.l0Before -
s0.l0Before) / timedelta;
842 return (
s1.l0After -
s0.l0After) / timedelta;
844 return (
s1.l1Before -
s0.l1Before) / timedelta;
846 return (
s1.l1After -
s0.l1After) / timedelta;
848 LOG(error) <<
"Wrong type:" <<
type;
851 }
else if (
type == 7) {
853 auto s0 = sprev.scalersInps[classindex];
854 auto s1 = snext.scalersInps[classindex];
855 return (
s1 -
s0) / timedelta;
857 LOG(error) <<
"Wrong type:" <<
type;
861 if (nextindex == 0) {
864 LOG(info) <<
"query timestamp " << (
long)timestamp <<
" before first record; Just returning the global rate";
865 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), -1);
867 LOG(info) <<
"query timestamp " << (
long)timestamp <<
" before first record; Returning the first rate";
868 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), calcRate(0, 1));
870 }
else if (nextindex == mScalerRecordO2.size()) {
872 LOG(info) <<
"query timestamp " << (
long)timestamp <<
" after last record; Just returning the global rate";
873 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), -1);
875 LOG(info) <<
"query timestamp " << (
long)timestamp <<
" after last record; Returning the last rate";
876 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), calcRate(mScalerRecordO2.size() - 2, mScalerRecordO2.size() - 1));
879 return std::make_pair( calcRate(0, mScalerRecordO2.size() - 1), calcRate(nextindex - 1, nextindex));
881 return std::make_pair(-1., -1.);
888 LOG(info) <<
"Subtracting from orbit " <<
offset;
889 for (
auto& screc : mScalerRecordRaw) {
890 uint32_t
orbit = screc.intRecord.orbit;
891 uint32_t orbitnew = 0;
896 screc.intRecord.orbit = orbitnew;
898 if (over != 0 && over != mScalerRecordRaw.size()) {
899 LOG(warning) <<
"Orbit overflow inside run. Run:" << mRunNumber;
905 "runn0",
"runn1",
"runn2",
"runn3",
"runn4",
"runn5",
"runn6",
"runn7",
"runn8",
"runn9",
"runn10",
"runn11",
"runn12",
"runn13",
"runn14",
"runn15",
"ltg1_ORB",
"ltg1_HB",
"ltg1_HBr",
"ltg1_HC",
"ltg1_PH",
"ltg1_PP",
"ltg1_CAL",
"ltg1_SOT",
"ltg1_EOT",
"ltg1_SOC",
"ltg1_EOC",
"ltg1_TF",
"ltg1_FERST",
"ltg1_RT",
"ltg1_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg1_GAP1",
"ltg1_GAP2",
"ltg1_TPC_sync",
"ltg1_TPC_rst",
"ltg1_TOF",
"ltg2_ORB",
"ltg2_HB",
"ltg2_HBr",
"ltg2_HC",
"ltg2_PH",
"ltg2_PP",
"ltg2_CAL",
"ltg2_SOT",
"ltg2_EOT",
"ltg2_SOC",
"ltg2_EOC",
"ltg2_TF",
"ltg2_FERST",
"ltg2_RT",
"ltg2_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg2_GAP1",
"ltg2_GAP2",
"ltg2_TPC_sync",
"ltg2_TPC_rst",
"ltg2_TOF",
"ltg3_ORB",
"ltg3_HB",
"ltg3_HBr",
"ltg3_HC",
"ltg3_PH",
"ltg3_PP",
"ltg3_CAL",
"ltg3_SOT",
"ltg3_EOT",
"ltg3_SOC",
"ltg3_EOC",
"ltg3_TF",
"ltg3_FERST",
"ltg3_RT",
"ltg3_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg3_GAP1",
"ltg3_GAP2",
"ltg3_TPC_sync",
"ltg3_TPC_rst",
"ltg3_TOF",
"ltg4_ORB",
"ltg4_HB",
"ltg4_HBr",
"ltg4_HC",
"ltg4_PH",
"ltg4_PP",
"ltg4_CAL",
"ltg4_SOT",
"ltg4_EOT",
"ltg4_SOC",
"ltg4_EOC",
"ltg4_TF",
"ltg4_FERST",
"ltg4_RT",
"ltg4_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg4_GAP1",
"ltg4_GAP2",
"ltg4_TPC_sync",
"ltg4_TPC_rst",
"ltg4_TOF",
"ltg5_ORB",
"ltg5_HB",
"ltg5_HBr",
"ltg5_HC",
"ltg5_PH",
"ltg5_PP",
"ltg5_CAL",
"ltg5_SOT",
"ltg5_EOT",
"ltg5_SOC",
"ltg5_EOC",
"ltg5_TF",
"ltg5_FERST",
"ltg5_RT",
"ltg5_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg5_GAP1",
"ltg5_GAP2",
"ltg5_TPC_sync",
"ltg5_TPC_rst",
"ltg5_TOF",
"ltg6_ORB",
"ltg6_HB",
"ltg6_HBr",
"ltg6_HC",
"ltg6_PH",
"ltg6_PP",
"ltg6_CAL",
"ltg6_SOT",
"ltg6_EOT",
"ltg6_SOC",
"ltg6_EOC",
"ltg6_TF",
"ltg6_FERST",
"ltg6_RT",
"ltg6_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg6_GAP1",
"ltg6_GAP2",
"ltg6_TPC_sync",
"ltg6_TPC_rst",
"ltg6_TOF",
"ltg7_ORB",
"ltg7_HB",
"ltg7_HBr",
"ltg7_HC",
"ltg7_PH",
"ltg7_PP",
"ltg7_CAL",
"ltg7_SOT",
"ltg7_EOT",
"ltg7_SOC",
"ltg7_EOC",
"ltg7_TF",
"ltg7_FERST",
"ltg7_RT",
"ltg7_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg7_GAP1",
"ltg7_GAP2",
"ltg7_TPC_sync",
"ltg7_TPC_rst",
"ltg7_TOF",
"ltg8_ORB",
"ltg8_HB",
"ltg8_HBr",
"ltg8_HC",
"ltg8_PH",
"ltg8_PP",
"ltg8_CAL",
"ltg8_SOT",
"ltg8_EOT",
"ltg8_SOC",
"ltg8_EOC",
"ltg8_TF",
"ltg8_FERST",
"ltg8_RT",
"ltg8_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg8_GAP1",
"ltg8_GAP2",
"ltg8_TPC_sync",
"ltg8_TPC_rst",
"ltg8_TOF",
"ltg9_ORB",
"ltg9_HB",
"ltg9_HBr",
"ltg9_HC",
"ltg9_PH",
"ltg9_PP",
"ltg9_CAL",
"ltg9_SOT",
"ltg9_EOT",
"ltg9_SOC",
"ltg9_EOC",
"ltg9_TF",
"ltg9_FERST",
"ltg9_RT",
"ltg9_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg9_GAP1",
"ltg9_GAP2",
"ltg9_TPC_sync",
"ltg9_TPC_rst",
"ltg9_TOF",
"ltg10_ORB",
"ltg10_HB",
"ltg10_HBr",
"ltg10_HC",
"ltg10_PH",
"ltg10_PP",
"ltg10_CAL",
"ltg10_SOT",
"ltg10_EOT",
"ltg10_SOC",
"ltg10_EOC",
"ltg10_TF",
"ltg10_FERST",
"ltg10_RT",
"ltg10_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg10_GAP1",
"ltg10_GAP2",
"ltg10_TPC_sync",
"ltg10_TPC_rst",
"ltg10_TOF",
"ltg11_ORB",
"ltg11_HB",
"ltg11_HBr",
"ltg11_HC",
"ltg11_PH",
"ltg11_PP",
"ltg11_CAL",
"ltg11_SOT",
"ltg11_EOT",
"ltg11_SOC",
"ltg11_EOC",
"ltg11_TF",
"ltg11_FERST",
"ltg11_RT",
"ltg11_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg11_GAP1",
"ltg11_GAP2",
"ltg11_TPC_sync",
"ltg11_TPC_rst",
"ltg11_TOF",
"ltg12_ORB",
"ltg12_HB",
"ltg12_HBr",
"ltg12_HC",
"ltg12_PH",
"ltg12_PP",
"ltg12_CAL",
"ltg12_SOT",
"ltg12_EOT",
"ltg12_SOC",
"ltg12_EOC",
"ltg12_TF",
"ltg12_FERST",
"ltg12_RT",
"ltg12_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg12_GAP1",
"ltg12_GAP2",
"ltg12_TPC_sync",
"ltg12_TPC_rst",
"ltg12_TOF",
"ltg13_ORB",
"ltg13_HB",
"ltg13_HBr",
"ltg13_HC",
"ltg13_PH",
"ltg13_PP",
"ltg13_CAL",
"ltg13_SOT",
"ltg13_EOT",
"ltg13_SOC",
"ltg13_EOC",
"ltg13_TF",
"ltg13_FERST",
"ltg13_RT",
"ltg13_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg13_GAP1",
"ltg13_GAP2",
"ltg13_TPC_sync",
"ltg13_TPC_rst",
"ltg13_TOF",
"ltg14_ORB",
"ltg14_HB",
"ltg14_HBr",
"ltg14_HC",
"ltg14_PH",
"ltg14_PP",
"ltg14_CAL",
"ltg14_SOT",
"ltg14_EOT",
"ltg14_SOC",
"ltg14_EOC",
"ltg14_TF",
"ltg14_FERST",
"ltg14_RT",
"ltg14_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg14_GAP1",
"ltg14_GAP2",
"ltg14_TPC_sync",
"ltg14_TPC_rst",
"ltg14_TOF",
"ltg15_ORB",
"ltg15_HB",
"ltg15_HBr",
"ltg15_HC",
"ltg15_PH",
"ltg15_PP",
"ltg15_CAL",
"ltg15_SOT",
"ltg15_EOT",
"ltg15_SOC",
"ltg15_EOC",
"ltg15_TF",
"ltg15_FERST",
"ltg15_RT",
"ltg15_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg15_GAP1",
"ltg15_GAP2",
"ltg15_TPC_sync",
"ltg15_TPC_rst",
"ltg15_TOF",
"ltg16_ORB",
"ltg16_HB",
"ltg16_HBr",
"ltg16_HC",
"ltg16_PH",
"ltg16_PP",
"ltg16_CAL",
"ltg16_SOT",
"ltg16_EOT",
"ltg16_SOC",
"ltg16_EOC",
"ltg16_TF",
"ltg16_FERST",
"ltg16_RT",
"ltg16_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg16_GAP1",
"ltg16_GAP2",
"ltg16_TPC_sync",
"ltg16_TPC_rst",
"ltg16_TOF",
"ltg17_ORB",
"ltg17_HB",
"ltg17_HBr",
"ltg17_HC",
"ltg17_PH",
"ltg17_PP",
"ltg17_CAL",
"ltg17_SOT",
"ltg17_EOT",
"ltg17_SOC",
"ltg17_EOC",
"ltg17_TF",
"ltg17_FERST",
"ltg17_RT",
"ltg17_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg17_GAP1",
"ltg17_GAP2",
"ltg17_TPC_sync",
"ltg17_TPC_rst",
"ltg17_TOF",
"ltg18_ORB",
"ltg18_HB",
"ltg18_HBr",
"ltg18_HC",
"ltg18_PH",
"ltg18_PP",
"ltg18_CAL",
"ltg18_SOT",
"ltg18_EOT",
"ltg18_SOC",
"ltg18_EOC",
"ltg18_TF",
"ltg18_FERST",
"ltg18_RT",
"ltg18_RS",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"ltg18_GAP1",
"ltg18_GAP2",
"ltg18_TPC_sync",
"ltg18_TPC_rst",
"ltg18_TOF",
"bc40",
"clk240",
"extorb",
"PLSRin",
"FastLMin",
"BUSYin",
"SPAREin",
"inp1",
"inp2",
"inp3",
"inp4",
"inp5",
"inp6",
"inp7",
"inp8",
"inp9",
"inp10",
"inp11",
"inp12",
"inp13",
"inp14",
"inp15",
"inp16",
"inp17",
"inp18",
"inp19",
"inp20",
"inp21",
"inp22",
"inp23",
"inp24",
"inp25",
"inp26",
"inp27",
"inp28",
"inp29",
"inp30",
"inp31",
"inp32",
"inp33",
"inp34",
"inp35",
"inp36",
"inp37",
"inp38",
"inp39",
"inp40",
"inp41",
"inp42",
"inp43",
"inp44",
"inp45",
"inp46",
"inp47",
"inp48",
"clamb1",
"clamb2",
"clamb3",
"clamb4",
"clamb5",
"clamb6",
"clamb7",
"clamb8",
"clamb9",
"clamb10",
"clamb11",
"clamb12",
"clamb13",
"clamb14",
"clamb15",
"clamb16",
"clamb17",
"clamb18",
"clamb19",
"clamb20",
"clamb21",
"clamb22",
"clamb23",
"clamb24",
"clamb25",
"clamb26",
"clamb27",
"clamb28",
"clamb29",
"clamb30",
"clamb31",
"clamb32",
"clamb33",
"clamb34",
"clamb35",
"clamb36",
"clamb37",
"clamb38",
"clamb39",
"clamb40",
"clamb41",
"clamb42",
"clamb43",
"clamb44",
"clamb45",
"clamb46",
"clamb47",
"clamb48",
"clamb49",
"clamb50",
"clamb51",
"clamb52",
"clamb53",
"clamb54",
"clamb55",
"clamb56",
"clamb57",
"clamb58",
"clamb59",
"clamb60",
"clamb61",
"clamb62",
"clamb63",
"clamb64",
"clama1",
"clama2",
"clama3",
"clama4",
"clama5",
"clama6",
"clama7",
"clama8",
"clama9",
"clama10",
"clama11",
"clama12",
"clama13",
"clama14",
"clama15",
"clama16",
"clama17",
"clama18",
"clama19",
"clama20",
"clama21",
"clama22",
"clama23",
"clama24",
"clama25",
"clama26",
"clama27",
"clama28",
"clama29",
"clama30",
"clama31",
"clama32",
"clama33",
"clama34",
"clama35",
"clama36",
"clama37",
"clama38",
"clama39",
"clama40",
"clama41",
"clama42",
"clama43",
"clama44",
"clama45",
"clama46",
"clama47",
"clama48",
"clama49",
"clama50",
"clama51",
"clama52",
"clama53",
"clama54",
"clama55",
"clama56",
"clama57",
"clama58",
"clama59",
"clama60",
"clama61",
"clama62",
"clama63",
"clama64",
"cla0b1",
"cla0b2",
"cla0b3",
"cla0b4",
"cla0b5",
"cla0b6",
"cla0b7",
"cla0b8",
"cla0b9",
"cla0b10",
"cla0b11",
"cla0b12",
"cla0b13",
"cla0b14",
"cla0b15",
"cla0b16",
"cla0b17",
"cla0b18",
"cla0b19",
"cla0b20",
"cla0b21",
"cla0b22",
"cla0b23",
"cla0b24",
"cla0b25",
"cla0b26",
"cla0b27",
"cla0b28",
"cla0b29",
"cla0b30",
"cla0b31",
"cla0b32",
"cla0b33",
"cla0b34",
"cla0b35",
"cla0b36",
"cla0b37",
"cla0b38",
"cla0b39",
"cla0b40",
"cla0b41",
"cla0b42",
"cla0b43",
"cla0b44",
"cla0b45",
"cla0b46",
"cla0b47",
"cla0b48",
"cla0b49",
"cla0b50",
"cla0b51",
"cla0b52",
"cla0b53",
"cla0b54",
"cla0b55",
"cla0b56",
"cla0b57",
"cla0b58",
"cla0b59",
"cla0b60",
"cla0b61",
"cla0b62",
"cla0b63",
"cla0b64",
"cla0a1",
"cla0a2",
"cla0a3",
"cla0a4",
"cla0a5",
"cla0a6",
"cla0a7",
"cla0a8",
"cla0a9",
"cla0a10",
"cla0a11",
"cla0a12",
"cla0a13",
"cla0a14",
"cla0a15",
"cla0a16",
"cla0a17",
"cla0a18",
"cla0a19",
"cla0a20",
"cla0a21",
"cla0a22",
"cla0a23",
"cla0a24",
"cla0a25",
"cla0a26",
"cla0a27",
"cla0a28",
"cla0a29",
"cla0a30",
"cla0a31",
"cla0a32",
"cla0a33",
"cla0a34",
"cla0a35",
"cla0a36",
"cla0a37",
"cla0a38",
"cla0a39",
"cla0a40",
"cla0a41",
"cla0a42",
"cla0a43",
"cla0a44",
"cla0a45",
"cla0a46",
"cla0a47",
"cla0a48",
"cla0a49",
"cla0a50",
"cla0a51",
"cla0a52",
"cla0a53",
"cla0a54",
"cla0a55",
"cla0a56",
"cla0a57",
"cla0a58",
"cla0a59",
"cla0a60",
"cla0a61",
"cla0a62",
"cla0a63",
"cla0a64",
"cla1b1",
"cla1b2",
"cla1b3",
"cla1b4",
"cla1b5",
"cla1b6",
"cla1b7",
"cla1b8",
"cla1b9",
"cla1b10",
"cla1b11",
"cla1b12",
"cla1b13",
"cla1b14",
"cla1b15",
"cla1b16",
"cla1b17",
"cla1b18",
"cla1b19",
"cla1b20",
"cla1b21",
"cla1b22",
"cla1b23",
"cla1b24",
"cla1b25",
"cla1b26",
"cla1b27",
"cla1b28",
"cla1b29",
"cla1b30",
"cla1b31",
"cla1b32",
"cla1b33",
"cla1b34",
"cla1b35",
"cla1b36",
"cla1b37",
"cla1b38",
"cla1b39",
"cla1b40",
"cla1b41",
"cla1b42",
"cla1b43",
"cla1b44",
"cla1b45",
"cla1b46",
"cla1b47",
"cla1b48",
"cla1b49",
"cla1b50",
"cla1b51",
"cla1b52",
"cla1b53",
"cla1b54",
"cla1b55",
"cla1b56",
"cla1b57",
"cla1b58",
"cla1b59",
"cla1b60",
"cla1b61",
"cla1b62",
"cla1b63",
"cla1b64",
"cla1a1",
"cla1a2",
"cla1a3",
"cla1a4",
"cla1a5",
"cla1a6",
"cla1a7",
"cla1a8",
"cla1a9",
"cla1a10",
"cla1a11",
"cla1a12",
"cla1a13",
"cla1a14",
"cla1a15",
"cla1a16",
"cla1a17",
"cla1a18",
"cla1a19",
"cla1a20",
"cla1a21",
"cla1a22",
"cla1a23",
"cla1a24",
"cla1a25",
"cla1a26",
"cla1a27",
"cla1a28",
"cla1a29",
"cla1a30",
"cla1a31",
"cla1a32",
"cla1a33",
"cla1a34",
"cla1a35",
"cla1a36",
"cla1a37",
"cla1a38",
"cla1a39",
"cla1a40",
"cla1a41",
"cla1a42",
"cla1a43",
"cla1a44",
"cla1a45",
"cla1a46",
"cla1a47",
"cla1a48",
"cla1a49",
"cla1a50",
"cla1a51",
"cla1a52",
"cla1a53",
"cla1a54",
"cla1a55",
"cla1a56",
"cla1a57",
"cla1a58",
"cla1a59",
"cla1a60",
"cla1a61",
"cla1a62",
"cla1a63",
"cla1a64",
"l0_trigger",
"l1_trigger",
"l2_trigger",
"clum1",
"clum2",
"clum3",
"clum4",
"clum5",
"clum6",
"clu01",
"clu02",
"clu03",
"clu04",
"clu05",
"clu06",
"clu11",
"clu12",
"clu13",
"clu14",
"clu15",
"clu16",
906 "ltg1_busy",
"ltg2_busy",
"ltg3_busy",
"ltg4_busy",
"ltg5_busy",
"ltg6_busy",
"ltg7_busy",
"ltg8_busy",
"ltg9_busy",
907 "ltg10_busy",
"ltg11_busy",
"ltg12_busy",
"ltg13_busy",
"ltg14_busy",
"ltg15_busy",
"ltg16_busy",
"ltg17_busy",
"ltg18_busy",
"orbitid",
"clum7",
"clum8",
"clu07",
"clu08",
"clu17",
"clu18",
"clu_busy1",
"clu_busy2",
"clu_busy3",
"clu_busy4",
"clu_busy5",
"clu_busy6",
"clu_busy7",
"clu_busy8"};
definition of CTPScalerRaw, CTPScalerO2
int printClassBRateAndIntegral(int iclsinscalers)
std::vector< uint32_t > getClassIndexes() const
int printClassBRateAndIntegralII(int icls)
uint64_t getLumiNoPuCorr(int classindex, int type) const
retrieves integral - same interface as getRate, no pileup correction
int readScalers(const std::string &rawscalers)
void printClasses(std::ostream &stream) const
void printLMBRateVsT() const
int printInputRateAndIntegral(int inp)
static std::vector< std::string > scalerNames
std::pair< double, double > getRate(uint32_t orbit, int classindex, int type, bool qc=0) const
std::pair< double, double > getRateGivenT(double timestamp, int classindex, int type, bool qc=0) const
same with absolute timestamp (not orbit) as argument
void printO2(std::ostream &stream) const
int checkConsistency(const CTPScalerO2 &scal0, const CTPScalerO2 &scal1, errorCounters &eCnts) const
void printStream(std::ostream &stream) const
int addOrbitOffset(uint32_t offset)
int getScalerIndexForClass(uint32_t cls) const
std::vector< std::pair< double_t, double_t > > getRatesForIndex(int classindex, int type) const
retrieves vector of counters - same interface as getRate, needed for
void printFromZero(std::ostream &stream) const
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s1
GLsizei const GLfloat * value
GLint GLint GLsizei GLint GLenum GLenum type
GLboolean GLboolean GLboolean GLboolean a
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat s0
constexpr double LHCOrbitMUS
uint16_t bc
bunch crossing ID of interaction
Scalers produced from raw scalers corrected for overflow.
void printFromZero(std::ostream &stream, CTPScalerO2 &scaler0) const
void createCTPScalerO2FromRaw(const CTPScalerRaw &raw, const std::array< uint32_t, 6 > &overfow)
void printStream(std::ostream &stream) const
void printStream(std::ostream &stream) const
o2::InteractionRecord intRecord
std::vector< uint64_t > scalersInps
std::vector< CTPScalerO2 > scalers
void printFromZero(std::ostream &stream, CTPScalerRecordO2 &record0) const
void printStream(std::ostream &stream) const
std::vector< CTPScalerRaw > scalers
void printStream(std::ostream &stream) const
o2::InteractionRecord intRecord
std::vector< uint32_t > scalersInps
void printStream(std::ostream &stream) const
static void trim(std::string &s)
static std::vector< std::string > tokenize(const std::string &src, char delim, bool trimToken=true, bool skipEmpty=true)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"