12#ifndef O2_ZDC_DATAPROCESSOR_H
13#define O2_ZDC_DATAPROCESSOR_H
20#include <TStopwatch.h>
51using Duration = std::chrono::duration<double, std::ratio<1, 1>>;
59 std::vector<DPID> vect;
60 mDPsUpdateInterval = ic.options().get<int64_t>(
"DPs-update-interval");
61 if (mDPsUpdateInterval == 0) {
62 LOG(error) <<
"ZDC DPs update interval was set to 0 seconds --> changed to 240";
63 mDPsUpdateInterval = 240;
65 bool useCCDBtoConfigure = ic.options().get<
bool>(
"use-ccdb-to-configure");
66 if (useCCDBtoConfigure) {
67 LOG(info) <<
"Configuring via CCDB";
68 std::string ccdbpath = ic.options().get<std::string>(
"ccdb-path");
72 api.
init(mgr.getURL());
73 long ts = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
74 std::unordered_map<DPID, std::string>* dpid2Data = mgr.getForTimeStamp<std::unordered_map<DPID, std::string>>(
"ZDC/Calib/DCSconfig", ts);
75 for (
auto&
i : *dpid2Data) {
76 vect.push_back(
i.first);
79 LOG(info) <<
"Configuring via hardcoded strings";
80 std::vector<std::string> aliases = {
"ZDC_ZNA_POS.actual.position",
81 "ZDC_ZPA_POS.actual.position",
82 "ZDC_ZNC_POS.actual.position",
83 "ZDC_ZPC_POS.actual.position",
84 "ZDC_ZNA_HV0.actual.vMon",
85 "ZDC_ZNA_HV1.actual.vMon",
86 "ZDC_ZNA_HV2.actual.vMon",
87 "ZDC_ZNA_HV3.actual.vMon",
88 "ZDC_ZNA_HV4.actual.vMon",
89 "ZDC_ZPA_HV0.actual.vMon",
90 "ZDC_ZPA_HV1.actual.vMon",
91 "ZDC_ZPA_HV2.actual.vMon",
92 "ZDC_ZPA_HV3.actual.vMon",
93 "ZDC_ZPA_HV4.actual.vMon",
94 "ZDC_ZNC_HV0.actual.vMon",
95 "ZDC_ZNC_HV1.actual.vMon",
96 "ZDC_ZNC_HV2.actual.vMon",
97 "ZDC_ZNC_HV3.actual.vMon",
98 "ZDC_ZNC_HV4.actual.vMon",
99 "ZDC_ZPC_HV0.actual.vMon",
100 "ZDC_ZPC_HV1.actual.vMon",
101 "ZDC_ZPC_HV2.actual.vMon",
102 "ZDC_ZPC_HV3.actual.vMon",
103 "ZDC_ZPC_HV4.actual.vMon",
104 "ZDC_ZEM_HV0.actual.vMon",
105 "ZDC_ZEM_HV1.actual.vMon",
106 "ZDC_ZNA_HV0_D[1..2]",
107 "ZDC_ZNC_HV0_D[1..2]",
108 "ZDC_ZPA_HV0_D[1..2]",
109 "ZDC_ZPC_HV0_D[1..2]"};
110 std::vector<std::string> aliasesInt = {
"ZDC_CONFIG_[00..32]"};
113 for (
const auto&
i : expaliases) {
118 LOG(info) <<
"Listing Data Points for ZDC:";
119 for (
auto&
i : vect) {
123 mProcessor = std::make_unique<o2::zdc::ZDCDCSProcessor>();
124 bool useVerboseMode = ic.options().get<
bool>(
"use-verbose-mode");
125 LOG(info) <<
" ************************* Verbose?" << useVerboseMode;
126 if (useVerboseMode) {
127 mProcessor->useVerboseMode();
129 mProcessor->init(vect);
130 mTimer = HighResClock::now();
135 auto startValidity = DataRefUtils::getHeader<DataProcessingHeader*>(pc.inputs().getFirstValid(
true))->creation;
136 auto dps = pc.inputs().get<gsl::span<DPCOM>>(
"input");
137 auto timeNow = HighResClock::now();
138 if (startValidity == 0xffffffffffffffff) {
139 startValidity = std::chrono::duration_cast<std::chrono::milliseconds>(timeNow.time_since_epoch()).count();
141 mProcessor->setStartValidity(startValidity);
142 mProcessor->process(dps);
143 Duration elapsedTime = timeNow - mTimer;
146 if (elapsedTime.count() >= mDPsUpdateInterval) {
147 sendDPsoutput(pc.outputs());
155 sendDPsoutput(ec.outputs());
160 std::unique_ptr<ZDCDCSProcessor> mProcessor;
161 HighResClock::time_point mTimer;
162 int64_t mDPsUpdateInterval;
168 mProcessor->updateDPsCCDB();
169 const auto& payload = mProcessor->getZDCDPsInfo();
170 auto& info = mProcessor->getccdbDPsInfo();
172 LOG(info) <<
"Sending object " << info.getPath() <<
"/" << info.getFileName() <<
" of size " <<
image->size()
173 <<
" bytes, valid for " << info.getStartValidityTimestamp() <<
" : " << info.getEndValidityTimestamp();
176 mProcessor->clearDPsinfo();
184 if (mProcessor->isHVUpdated()) {
185 const auto& payload = mProcessor->getHVStatus();
186 auto& info = mProcessor->getccdbHVInfo();
188 LOG(info) <<
"Sending object " << info.getPath() <<
"/" << info.getFileName() <<
" of size " <<
image->size()
189 <<
" bytes, valid for " << info.getStartValidityTimestamp() <<
" : " << info.getEndValidityTimestamp();
206 std::vector<OutputSpec> outputs;
211 "zdc-dcs-data-processor",
212 Inputs{{
"input",
"DCS",
"ZDCDATAPOINTS"}},
214 AlgorithmSpec{adaptFromTask<o2::zdc::ZDCDCSDataProcessor>()},
218 {
"DPs-update-interval",
VariantType::Int64, 600ll, {
"Interval (in s) after which to update the DPs CCDB entry"}}}};
Utils and constants for calibration and related workflows.
static BasicCCDBManager & instance()
void init(std::string const &hosts)
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
void run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
information complementary to a CCDB object (path, metadata, startTimeValidity, endTimeValidity etc)
std::vector< std::string > expandAliases(const std::vector< std::string > &patternedAliases)
Defining PrimaryVertex explicitly as messageable.
std::vector< InputSpec > Inputs
struct o2::upgrades_utils::@463 zdc
structure to keep FT0 information
std::chrono::high_resolution_clock HighResClock
std::chrono::duration< double, std::ratio< 1, 1 > > Duration
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
static constexpr o2::header::DataOrigin gDataOriginCDBPayload
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"