13#include <fairlogger/Logger.h>
32 mCheckConsistency =
ctx.options().get<
bool>(
"check-consistency");
34 mDecodeinputs =
ctx.options().get<
bool>(
"ctpinputs-decoding");
36 mNTFToIntegrate =
ctx.options().get<
int>(
"ntf-to-average");
37 LOG(info) <<
"Window size: " << mNTFToIntegrate <<
" TFs";
38 mVerbose =
ctx.options().get<
bool>(
"use-verbose-mode");
39 int maxerrors =
ctx.options().get<
int>(
"print-errors-num");
44 std::string lumiinp1 =
ctx.options().get<std::string>(
"lumi-inp1");
45 std::string lumiinp2 =
ctx.options().get<std::string>(
"lumi-inp2");
48 mOutputLumiInfo.
inp1 = inp1;
49 mOutputLumiInfo.
inp2 = inp2;
50 mMaxInputSize =
ctx.options().get<
int>(
"max-input-size");
51 mMaxInputSizeFatal =
ctx.options().get<
bool>(
"max-input-size-fatal");
52 LOG(info) <<
"CTP reco init done. Inputs decoding here:" << mDecodeinputs <<
" DoLumi:" << mDoLumi <<
" DoDigits:" << mDoDigits <<
" NTF:" << mNTFToIntegrate <<
" Lumi inputs:" << lumiinp1 <<
":" << inp1 <<
" " << lumiinp2 <<
":" << inp2 <<
" Max errors:" << maxerrors <<
" Max input size:" << mMaxInputSize <<
" MaxInputSizeFatal:" << mMaxInputSizeFatal <<
" CheckConsistency:" << mCheckConsistency;
53 mMassiOutDir =
ctx.options().get<std::string>(
"massi-out-dir");
54 LOG(info) <<
"Massi output dir:" << mMassiOutDir;
55 mCrossSection =
ctx.options().get<
double>(
"cross-section");
56 LOG(info) <<
"Cross section (ub): " << mCrossSection;
57 mReorderDepth =
ctx.options().get<
int>(
"tf-reorder-depth");
67 for (
int i = 0;
i < o2::ctp::CTP_NCLASSES;
i++) {
68 mClsEA[
i] += clsEA[
i];
69 mClsEB[
i] += clsEB[
i];
72 totClasses += cntCA[
i];
75 std::sort(TFOrbits.begin(), TFOrbits.end());
76 size_t l = TFOrbits.size();
83 std::cout <<
"Missing orbits:";
84 for (
int i = 1;
i < l;
i++) {
85 if ((TFOrbits[
i] - o0) > 0x20) {
87 std::cout <<
" " << o0 <<
"-" << TFOrbits[
i];
89 nmiss += (TFOrbits[
i] - o0) / 0x20;
94 std::cout << std::endl;
95 LOG(info) <<
"Number of non continous TF:" << nmiss << std::endl;
96 LOG(info) <<
"Lost in shiftInputs:" << mLostDueToShiftInps;
97 LOG(info) <<
"Lost in addDigit Inputs:" << mIRRejected <<
" Classes:" << mTCRRejected;
98 if (mErrorIR || mErrorTCR) {
99 LOG(error) <<
"# of IR errors:" << mErrorIR <<
" TCR errors:" << mErrorTCR << std::endl;
101 if (mCheckConsistency) {
103 LOG(info) <<
"Total classes:" << totClasses;
105 for (
int i = 0;
i < o2::ctp::CTP_NCLASSES;
i++) {
108 LOG(error) <<
" Class without inputs:";
110 LOG(important) <<
"CLASS:" <<
name <<
":" <<
i <<
" Cls=>Inp:" << mClsA[
i] <<
" Inp=>Cls:" << mClsB[
i] <<
" ErrorsCls=>Inps:" << mClsEA[
i] <<
" MissingInps=>Cls:" << mClsEB[
i];
113 flushAllPendingTFs();
114 if (mTFsInCurrentWindow > 0) {
115 double timeInterval = orbitTime * mOrbitsInCurrentWindow;
116 double totalLumi1 = 0.0;
117 double totalLumi2 = 0.0;
118 double totalLumiErr1 = 0.0;
119 double totalLumiErr2 = 0.0;
120 size_t filledBCs = mLHCBCs.count();
121 for (
size_t bc = 0;
bc < mCountsPerBC1.size(); ++
bc) {
122 if (mCountsPerBC1[
bc] > 0) {
123 double rate1 = mCountsPerBC1[
bc] / timeInterval;
124 double lumi1 = rate1 / mCrossSection;
125 double lumiErr1 = std::sqrt(mCountsPerBC1[
bc]) / (timeInterval * mCrossSection);
126 auto [
mu, correctedRate1] = pileupCorrection(rate1);
127 double correctedLumi1 = correctedRate1 / mCrossSection;
130 if (mLHCBCs.test(
bc)) {
131 totalLumi1 += mCountsPerBC1[
bc] / (timeInterval * mCrossSection);
132 totalLumi2 += mCountsPerBC2[
bc] / (timeInterval * mCrossSection);
133 totalLumiErr1 += std::sqrt(mCountsPerBC1[
bc]) / (timeInterval * mCrossSection);
134 totalLumiErr2 += std::sqrt(mCountsPerBC2[
bc]) / (timeInterval * mCrossSection);
138 LOG(info) <<
"Flushed trailing partial window of " << mTFsInCurrentWindow <<
" TFs at end of stream";
141 double totalFillCountsInp1 = 0.0;
142 double totalFillCountsInp2 = 0.0;
143 for (
const auto&
count : mTotalCountsPerBC1) {
144 totalFillCountsInp1 +=
count;
146 for (
const auto&
count : mTotalCountsPerBC2) {
147 totalFillCountsInp2 +=
count;
150 double avgRate1 = totalFillCountsInp1 / mTotalElapsedTime;
151 double fillDurationSec = (mRunInfo.
eor - mRunInfo.
sor) / 1000.0;
152 double totalIntLumiInp1 = totalFillCountsInp1 / mCrossSection;
153 double estimatedTotalIntLumiInp1 = (avgRate1 / mCrossSection) * fillDurationSec;
154 LOG(info) <<
"Total Integrated Luminosity Input 1: " << totalIntLumiInp1 <<
" ub^-1" <<
" Rate (vis): " << avgRate1 <<
" Hz, Estimated Total Integrated Lumi: " << estimatedTotalIntLumiInp1 <<
" ub^-1";
156 for (
auto& [bucket, ofs] : mMassiFiles) {
163 mOutputDigits.clear();
164 std::map<o2::InteractionRecord, CTPDigit>
digits;
169 auto& inputs =
ctx.inputs();
170 auto dummyOutput = [&
ctx,
this]() {
171 if (this->mDoDigits) {
181 static size_t contDeadBeef = 0;
184 const auto dh = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
186 if (payloadSize == 0) {
188 if (++contDeadBeef <= maxWarn) {
189 LOGP(alarm,
"Found input [{}/{}/{:#x}] TF#{} 1st_orbit:{} Payload {} : assuming no payload for all links in this TF{}",
190 dh->dataOrigin.str, dh->dataDescription.str, dh->subSpecification, dh->tfCounter, dh->firstTForbit, payloadSize,
191 contDeadBeef == maxWarn ? fmt::format(
". {} such inputs in row received, stopping reporting", contDeadBeef) :
"");
200 std::vector<LumiInfo> lumiPointsHBF1;
203 size_t payloadSize = 0;
204 bool gotFirstOrbit =
false;
207 const auto dh = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
208 if (!gotFirstOrbit) {
209 mFirstOrbit = dh->firstTForbit;
210 gotFirstOrbit =
true;
212 uint32_t expectedOrbit = mPrevTFLastOrbit;
213 if (mFirstOrbit != expectedOrbit) {
216 LOG(warning) <<
"TF arrived out of order: previous TF ended at orbit " << mPrevTFLastOrbit <<
", this TF starts at " << mFirstOrbit <<
" (orbit went backwards by " << diff <<
")";
217 }
else if (diff > 0) {
218 LOG(warning) <<
"Gap detected: previous TF ended at orbit " << expectedOrbit <<
", this TF starts at " << mFirstOrbit <<
" (missing " << (mFirstOrbit - expectedOrbit) <<
" orbits)";
223 mPrevTFLastOrbit = mFirstOrbit + mRunInfo.
orbitsPerTF;
225 if (mMaxInputSize > 0) {
229 LOG(info) <<
"mFirstOrbit for this TF: " << mFirstOrbit <<
" gotFirstOrbit: " << gotFirstOrbit;
231 if (mMaxInputSize > 0 && payloadSize > (
size_t)mMaxInputSize) {
232 if (mMaxInputSizeFatal) {
234 LOG(error) <<
"Input data size bigger than threshold: " << mMaxInputSize <<
" < " << payloadSize <<
" decoding TF and exiting.";
237 LOG(error) <<
"Input data size:" << payloadSize <<
" sending dummy output";
247 ret = mDecoder.
decodeRaw(inputs,
filter, mOutputDigits, lumiPointsHBF1);
254 LOG(info) <<
"[CTPRawToDigitConverter - run] Writing " << mOutputDigits.size() <<
" digits. IR rejected:" << mDecoder.
getIRRejected() <<
" TCR rejected:" << mDecoder.
getTCRRejected();
265 uint32_t tfCountsT = 0;
266 uint32_t tfCountsV = 0;
267 for (
auto const& lp : lumiPointsHBF1) {
268 tfCountsT += lp.counts;
269 tfCountsV += lp.countsFV0;
273 mHistoryT.push_back(tfCountsT);
274 mCountsT += tfCountsT;
275 if (mHistoryT.size() <= mNTFToIntegrate) {
276 mNHBIntegratedT += lumiPointsHBF1.size();
278 mCountsT -= mHistoryT.front();
279 mHistoryT.pop_front();
282 mHistoryV.push_back(tfCountsV);
283 mCountsV += tfCountsV;
284 if (mHistoryV.size() <= mNTFToIntegrate) {
285 mNHBIntegratedV += lumiPointsHBF1.size();
287 mCountsV -= mHistoryV.front();
288 mHistoryV.pop_front();
291 if (mNHBIntegratedT || mNHBIntegratedV) {
292 mOutputLumiInfo.
orbit = lumiPointsHBF1[0].orbit;
294 mOutputLumiInfo.
counts = mCountsT;
301 LOGP(info,
"Orbit {}: {}/{} counts inp1/inp2 in {}/{} HBFs -> lumi_inp1 = {:.3e}+-{:.3e} lumi_inp2 = {:.3e}+-{:.3e}", mOutputLumiInfo.
orbit, mCountsT, mCountsV, mNHBIntegratedT, mNHBIntegratedV, mOutputLumiInfo.
getLumi(), mOutputLumiInfo.
getLumiError(), mOutputLumiInfo.
getLumiFV0(), mOutputLumiInfo.
getLumiFV0Error());
310 int inp1 = mOutputLumiInfo.
inp1;
311 int inp2 = mOutputLumiInfo.
inp2;
313 uint64_t inputMask1 = 1ull << (inp1 - 1);
314 uint64_t inputMask2 = 1ull << (inp2 - 1);
316 std::array<double, o2::constants::lhc::LHCMaxBunches> tfCountsPerBC1{};
317 std::array<double, o2::constants::lhc::LHCMaxBunches> tfCountsPerBC2{};
319 for (
const auto& digit : ctpdigits) {
320 uint32_t
orbit = digit.intRecord.orbit;
321 if (orbit < firstOrbit || orbit >= firstOrbit + orbitsPerTF) {
322 LOG(warning) <<
"Digit orbit " <<
orbit <<
" outside expected TF range [" << firstOrbit <<
", " << (firstOrbit + orbitsPerTF) <<
") - skipping";
325 uint64_t
mask = digit.CTPInputMask.to_ullong();
326 uint16_t
bc = digit.intRecord.bc;
328 if (
mask & inputMask1) {
329 tfCountsPerBC1[
bc] += 1.0;
331 if (
mask & inputMask2) {
332 tfCountsPerBC2[
bc] += 1.0;
337 if (mPendingTFs.count(firstOrbit)) {
338 LOG(warning) <<
"Duplicate firstOrbit " << firstOrbit <<
" received - overwriting pending entry";
340 mPendingTFs[firstOrbit] = PendingTF{tfCountsPerBC1, tfCountsPerBC2, unixTimeStart, orbitsPerTF};
341 if (!mPendingTFs.empty()) {
342 uint32_t smallestPending = mPendingTFs.begin()->first;
343 if (firstOrbit < smallestPending) {
344 LOG(warning) <<
"Late TF: firstOrbit=" << firstOrbit <<
" arrived after smallest pending=" << smallestPending;
351void RawDecoderSpec::integrateLumi(
const std::array<double, o2::constants::lhc::LHCMaxBunches>& tfCounts1,
const std::array<double, o2::constants::lhc::LHCMaxBunches>& tfCounts2, int64_t unixTimeStart, uint32_t nOrbitsThisTF)
353 if (mTFsInCurrentWindow == 0) {
354 mWindowStartTime = unixTimeStart;
357 for (
size_t bc = 0;
bc < mCountsPerBC1.size(); ++
bc) {
358 mCountsPerBC1[
bc] += tfCounts1[
bc];
359 mTotalCountsPerBC1[
bc] += tfCounts1[
bc];
361 for (
size_t bc = 0;
bc < mCountsPerBC2.size(); ++
bc) {
362 mCountsPerBC2[
bc] += tfCounts2[
bc];
363 mTotalCountsPerBC2[
bc] += tfCounts2[
bc];
365 mTotalElapsedTime += nOrbitsThisTF * orbitTime;
366 mOrbitsInCurrentWindow += nOrbitsThisTF;
367 ++mTFsInCurrentWindow;
369 if (mTFsInCurrentWindow < mNTFToIntegrate) {
373 if (mTFsInCurrentWindow >= mNTFToIntegrate) {
374 double timeInterval = orbitTime * mOrbitsInCurrentWindow;
376 size_t filledBCs = mLHCBCs.count();
378 double totalLumi1 = 0.0;
379 double totalLumi2 = 0.0;
380 double totalLumiErr1 = 0.0;
381 double totalLumiErr2 = 0.0;
382 for (
size_t bc = 0;
bc < mCountsPerBC1.size(); ++
bc) {
383 if (mCountsPerBC1[
bc] > 0 || mCountsPerBC2[
bc] > 0) {
384 double rate1 = mCountsPerBC1[
bc] / timeInterval;
385 double rate2 = mCountsPerBC2[
bc] / timeInterval;
386 double lumi1 = rate1 / mCrossSection;
387 double lumi2 = rate2 / mCrossSection;
388 double lumiErr1 = std::sqrt(mCountsPerBC1[
bc]) / (timeInterval * mCrossSection);
389 double lumiErr2 = std::sqrt(mCountsPerBC2[
bc]) / (timeInterval * mCrossSection);
390 auto [mu, correctedRate1] = pileupCorrection(rate1);
391 double correctedLumi1 = correctedRate1 / mCrossSection;
392 if (mCountsPerBC1[
bc] > 0) {
399 if (mLHCBCs.test(
bc)) {
400 totalLumi1 += mCountsPerBC1[
bc] / (timeInterval * mCrossSection);
401 totalLumi2 += mCountsPerBC2[
bc] / (timeInterval * mCrossSection);
402 totalLumiErr1 += std::sqrt(mCountsPerBC1[
bc]) / (timeInterval * mCrossSection);
403 totalLumiErr2 += std::sqrt(mCountsPerBC2[
bc]) / (timeInterval * mCrossSection);
408 mCountsPerBC1.fill(0.0);
409 mCountsPerBC2.fill(0.0);
410 mTFsInCurrentWindow = 0;
411 mOrbitsInCurrentWindow = 0;
416 int rfBucket = (
bc * 10) + 1;
417 auto it = mMassiFiles.find(rfBucket);
418 if (it == mMassiFiles.end()) {
419 std::string dirPath = mMassiOutDir +
"/" +
std::to_string(mMassiYear) +
"/lumi/" + mFillNumber;
422 std::filesystem::create_directories(dirPath, ec);
424 LOG(error) <<
"Failed to create Massi output directory " << dirPath <<
": " << ec.message();
428 auto result = mMassiFiles.emplace(rfBucket, std::ofstream(
filename, std::ios::app));
431 std::ofstream& ofs = it->second;
432 ofs << std::fixed << std::setprecision(0) << unixTimeStart <<
" " << mStableBeams <<
" ";
433 ofs << (std::abs(
lumi) < 1e-3 ? std::scientific : std::fixed) << std::setprecision(7) <<
lumi <<
" ";
434 ofs << (std::abs(lumiErr) < 1e-3 ? std::scientific : std::fixed) << std::setprecision(7) << lumiErr <<
" ";
435 ofs << (std::abs(correctedLumi) < 1e-3 ? std::scientific : std::fixed) << std::setprecision(7) << correctedLumi <<
" ";
436 ofs << std::fixed << std::setprecision(7) << correctedRate <<
" " << mu <<
" " << std::endl;
441 std::string dirPath = mMassiOutDir +
"/" +
std::to_string(mMassiYear) +
"/lumi/" + mFillNumber;
443 std::filesystem::create_directories(dirPath, ec);
445 LOG(error) <<
"Failed to create Massi output directory " << dirPath <<
": " << ec.message();
448 std::string
filename = dirPath +
"/" + mFillNumber +
"_lumi_ALICE.txt";
449 std::ofstream ofs(
filename, std::ios::app);
450 ofs << std::fixed << std::setprecision(0) << unixTimeStart <<
" " << mStableBeams <<
" ";
451 ofs << (std::abs(
lumi) < 1e-3 ? std::scientific : std::fixed) << std::setprecision(7) <<
lumi <<
" ";
452 ofs << (std::abs(lumiErr) < 1e-3 ? std::scientific : std::fixed) << std::setprecision(7) << lumiErr <<
" " << std::endl;
457 int64_t orbitResetTimeMUS = mRunInfo.
orbitReset;
462 std::time_t
time =
static_cast<std::time_t
>(unixTimeStart);
463 std::tm* tm = std::gmtime(&
time);
464 return tm->tm_year + 1900;
472 mOrbitResetTimeSec = mRunInfo.
orbitReset * 1e-6;
473 mRunStartTime = mRunInfo.
sor / 1000;
474 mRunEndTime = mRunInfo.
eor / 1000;
475 LOG(info) <<
"Run start time: " << mRunStartTime <<
" Run end time: " << mRunEndTime;
477void RawDecoderSpec::flushReadyTFs()
479 while (mPendingTFs.size() > mReorderDepth) {
480 auto it = mPendingTFs.begin();
481 integrateLumi(it->second.countsPerBC1, it->second.countsPerBC2, it->second.unixTimeStart, it->second.nOrbitsThisTF);
482 mPendingTFs.erase(it);
485void RawDecoderSpec::flushAllPendingTFs()
487 while (!mPendingTFs.empty()) {
488 auto it = mPendingTFs.begin();
489 integrateLumi(it->second.countsPerBC1, it->second.countsPerBC2, it->second.unixTimeStart, it->second.nOrbitsThisTF);
490 mPendingTFs.erase(it);
493std::pair<double, double> RawDecoderSpec::pileupCorrection(
double rate)
const
497 LOG(warning) <<
"Pile-up correction: p = " <<
p <<
" >= 1";
500 double mu = -std::log(1 - p);
502 return {
mu, correctedRate};
507 throw std::runtime_error(
"all outputs were disabled");
509 std::vector<o2::framework::InputSpec> inputs;
512 inputs.emplace_back(
"stdDist",
"FLP",
"DISTSUBTIMEFRAME", 0, o2::framework::Lifetime::Timeframe);
515 std::vector<o2::framework::OutputSpec> outputs;
516 inputs.emplace_back(
"ctpconfig",
"CTP",
"CTPCONFIG", 0, o2::framework::Lifetime::Condition,
o2::framework::ccdbParamSpec(
"CTP/Config/Config", 1));
517 inputs.emplace_back(
"grplhcif",
"GLO",
"GRPLHCIF", 0, o2::framework::Lifetime::Condition,
o2::framework::ccdbParamSpec(
"GLO/Config/GRPLHCIF"));
518 inputs.emplace_back(
"trigoffset",
"CTP",
"Trig_Offset", 0, o2::framework::Lifetime::Condition,
o2::framework::ccdbParamSpec(
"CTP/Config/TriggerOffsets"));
520 outputs.emplace_back(
"CTP",
"DIGITS", 0, o2::framework::Lifetime::Timeframe);
523 outputs.emplace_back(
"CTP",
"LUMI", 0, o2::framework::Lifetime::Timeframe);
526 "ctp-raw-decoder-lumi",
539 {
"ctpinputs-decoding",
o2::framework::VariantType::Bool,
false, {
"Inputs alignment: true - raw decoder - has to be compatible with CTF decoder: allowed options: 10,01,00"}},
549 LOG(info) <<
"updateing TroggerOffsetsParam: inputs L0_L1:" << trigOffsParam.
L0_L1 <<
" classes L0_L1:" << trigOffsParam.
L0_L1_classes;
551 if (ctpcfg !=
nullptr) {
556 if (grplhcif !=
nullptr) {
558 LOG(info) <<
"Bunch filling with time: " << grplhcif->getBunchFillingTime();
559 LOG(info) <<
"Fill number time: " << grplhcif->getFillNumberTime();
560 LOG(info) <<
"Injection scheme time: " << grplhcif->getInjectionSchemeTime();
563 auto bfilling = grplhcif->getBunchFilling();
564 std::vector<int> bcs = bfilling.getFilledBCs();
565 LOG(info) <<
"Filled BCs: " << bcs.size();
567 for (
auto const&
bc : bcs) {
container for the LHC InterFace data
Header to collect LHC related constants.
static BasicCCDBManager & instance()
static const VerbosityConfig & Instance()
std::string getClassNameFromIndex(int index)
std::array< uint64_t, o2::ctp::CTP_NCLASSES > getClassCountersA()
uint32_t getTCRRejected() const
std::array< uint64_t, o2::ctp::CTP_NCLASSES > getClassErrorsA()
std::array< uint64_t, o2::ctp::CTP_NCLASSES > getClassCountersB()
std::vector< uint32_t > & getTFOrbits()
void setCTPConfig(CTPConfiguration cfg)
int getLostDueToShiftInp()
int setLumiInp(int lumiinp, std::string inp)
int getLostDueToShiftCls()
void setDoDigits(bool digi)
int decodeRaw(o2::framework::InputRecord &inputs, std::vector< o2::framework::InputSpec > &filter, o2::pmr::vector< CTPDigit > &digits, std::vector< LumiInfo > &lumiPointsHBF1)
std::array< uint64_t, o2::ctp::CTP_NCLASSES > getClassErrorsB()
CTPConfiguration & getCTPConfig()
void setCheckConsistency(bool check)
void setDecodeInps(bool decodeinps)
void setDoLumi(bool lumi)
int decodeRawFatal(o2::framework::InputRecord &inputs, std::vector< o2::framework::InputSpec > &filter)
uint32_t getIRRejected() const
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void updateTimeDependentParams(framework::ProcessingContext &pc)
void computeLumiPerBC(const o2::pmr::vector< CTPDigit > &ctpdigits, uint32_t firstOrbit, uint32_t orbitsPerTF)
Compute per BC luminosity from the interaction counts from CTP digits.
void init(framework::InitContext &ctx) final
Initializing the RawDecoderSpec.
void writeMassiLinePerBC(int bc, int64_t unixTime, double lumi, double lumiErr, double correctedRate, double correctedLumi, double mu)
void writeMassiLineLumi(int64_t unixTime, double lumi, double lumiErr)
void integrateLumi(const std::array< double, o2::constants::lhc::LHCMaxBunches > &tfCounts1, const std::array< double, o2::constants::lhc::LHCMaxBunches > &tfCounts2, int64_t unixTime, uint32_t nOrbitsThisTF)
Integrate luminosity per BC over multiple time frames.
void fetchRunInfo(int runNumber)
void run(framework::ProcessingContext &ctx) final
Run conversion of raw data to cells.
int yearFromUnixTime(int64_t unixTime) const
int64_t unixTimeForOrbitStart(uint32_t orbit) const
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
const std::string & getInjectionScheme() const
GLuint const GLchar * name
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
constexpr int LHCMaxBunches
constexpr double LHCOrbitMUS
constexpr double LHCRevFreq
o2::framework::DataProcessorSpec getRawDecoderSpec(bool askSTFDist, bool digits, bool lumi)
Creating DataProcessorSpec for the CTP.
Lifetime
Possible Lifetime of objects being exchanged by the DPL.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
const track::TrackFitContext< NLayers > const TrackFollowContext< NLayers > & ctx
std::vector< T, fair::mq::pmr::polymorphic_allocator< T > > vector
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)
float getLumiFV0Error() const
float getLumiError() const
static o2::header::DataHeader::PayloadSizeType getPayloadSize(const DataRef &ref)
bool globalRunNumberChanged
static AggregatedRunInfo buildAggregatedRunInfo_DATA(o2::ccdb::CCDBManagerInstance &ccdb, int runnumber)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits