Project
Loading...
Searching...
No Matches
TRDDCSDataProcessorSpec.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef O2_TRD_DATAPROCESSOR_H
13#define O2_TRD_DATAPROCESSOR_H
14
17
18#include <unistd.h>
19#include <TRandom.h>
20#include <TStopwatch.h>
28#include "CCDB/CcdbApi.h"
34#include "Framework/Task.h"
35#include "Framework/Logger.h"
36
37using namespace o2::framework;
38
39namespace o2
40{
41namespace trd
42{
43
47
49{
50 public:
52 {
53
54 std::vector<DPID> vect;
55 mGasDPsUpdateInterval = ic.options().get<int64_t>("DPs-update-interval-gas");
56 if (mGasDPsUpdateInterval == 0) {
57 LOG(error) << "TRD DPs update interval set to zero seconds --> changed to 900s";
58 mGasDPsUpdateInterval = 900;
59 }
60 mCurrentsDPsUpdateInterval = ic.options().get<int64_t>("DPs-update-interval-currents");
61 if (mCurrentsDPsUpdateInterval == 0) {
62 LOG(error) << "TRD DPs update interval set to zero seconds --> changed to 120s";
63 mCurrentsDPsUpdateInterval = 120;
64 }
65 mVoltagesDPsUpdateInterval = ic.options().get<int64_t>("DPs-update-interval-voltages");
66 if (mVoltagesDPsUpdateInterval == 0) {
67 LOG(error) << "TRD DPs update interval set to zero seconds --> changed to 600s";
68 mVoltagesDPsUpdateInterval = 600;
69 }
70 mMinUpdateIntervalU = ic.options().get<int64_t>("DPs-min-update-interval-voltages");
71 // LB: Env DPs, only update every 30 min
72 mEnvDPsUpdateInterval = ic.options().get<int64_t>("DPs-update-interval-env");
73 if (mEnvDPsUpdateInterval == 0) {
74 LOG(error) << "TRD DPs update interval set to zero seconds --> changed to 1800s";
75 mEnvDPsUpdateInterval = 1800;
76 }
77 bool useCCDBtoConfigure = ic.options().get<bool>("use-ccdb-to-configure");
78 if (useCCDBtoConfigure) {
79 LOG(info) << "Configuring via CCDB";
80 std::string ccdbpath = ic.options().get<std::string>("ccdb-path");
82 mgr.setURL(ccdbpath);
83 long ts = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
84 std::unordered_map<DPID, std::string>* dpid2DataDesc = mgr.getForTimeStamp<std::unordered_map<DPID, std::string>>("TRD/Config/DCSDPconfig", ts);
85 for (auto& i : *dpid2DataDesc) {
86 vect.push_back(i.first);
87 }
88 } else {
89 LOG(info) << "Configuring via hardcoded strings";
90 std::vector<std::string> aliasesFloat;
91 std::vector<std::string> aliasesInt;
92 std::vector<std::string> aliasesString;
93 aliasesFloat.insert(aliasesFloat.end(), {"trd_gasCO2", "trd_gasH2O", "trd_gasO2"});
94 aliasesFloat.insert(aliasesFloat.end(), {"trd_gaschromatographCO2", "trd_gaschromatographN2", "trd_gaschromatographXe"});
95 aliasesFloat.insert(aliasesFloat.end(), {"trd_hvAnodeImon[00..539]", "trd_hvAnodeUmon[00..539]", "trd_hvDriftImon[00..539]", "trd_hvDriftUmon[00..539]"});
96 aliasesFloat.insert(aliasesFloat.end(), {"CavernTemperature", "temperature_P2_external"});
97 aliasesFloat.insert(aliasesFloat.end(), {"CavernAtmosPressure", "SurfaceAtmosPressure", "CavernAtmosPressure2"});
98 aliasesFloat.insert(aliasesFloat.end(), {"UXC2Humidity"});
99 aliasesInt.insert(aliasesInt.end(), {"trd_fed_runNo"});
100 aliasesInt.insert(aliasesInt.end(), {"trd_chamberStatus[00..539]"});
101 aliasesString.insert(aliasesString.end(), {"trd_CFGtag[00..539]"});
102
103 for (const auto& i : o2::dcs::expandAliases(aliasesFloat)) {
104 vect.emplace_back(i, o2::dcs::DPVAL_DOUBLE);
105 }
106 for (const auto& i : o2::dcs::expandAliases(aliasesInt)) {
107 vect.emplace_back(i, o2::dcs::DPVAL_INT);
108 }
109 for (const auto& i : o2::dcs::expandAliases(aliasesString)) {
110 vect.emplace_back(i, o2::dcs::DPVAL_STRING);
111 }
112 }
113
114 LOG(info) << "Listing Data Points for TRD:";
115 for (auto& i : vect) {
116 LOG(info) << i;
117 }
118
119 mProcessor = std::make_unique<o2::trd::DCSProcessor>();
120 int verbosity = ic.options().get<int>("processor-verbosity");
121 if (verbosity > 0) {
122 LOG(info) << "Using verbose mode for TRD DCS processor";
123 mProcessor->setVerbosity(verbosity);
124 }
125
126 // LB: set maximum number of alarms in change in FedChamberStatus and FedCFGtag
127 int alarmfed = ic.options().get<int>("DPs-max-counter-alarm-fed");
128 if (alarmfed >= 0) {
129 LOG(info) << "Setting max number of alarms in FED objects changes to " << alarmfed;
130 mProcessor->setMaxCounterAlarmFed(alarmfed);
131 } else {
132 LOG(info) << "Invalid max number of alarms in FED objects changes " << alarmfed << ", using default value of 1";
133 }
134
135 // LB: set minimum number of DPs in DCS Processor to update ChamberStatus/CFGtag
136 int minupdatefed = ic.options().get<int>("DPs-min-counter-update-fed");
137 if (minupdatefed >= 0 && minupdatefed <= 540) {
138 LOG(info) << "Setting min number of DPs to update ChamberStatus/CFGtag to " << minupdatefed;
139 mProcessor->setFedMinimunDPsForUpdate(minupdatefed);
140 } else {
141 LOG(info) << "Invalid min number of DPs to update ChamberStatus/CFGtag " << alarmfed << ", using default value of 522";
142 }
143
144 // LB: set minimum voltage variation to update Anode/DriftUmon
145 int utrigger = ic.options().get<int>("DPs-voltage-variation-trigger");
146 if (utrigger > 0) {
147 LOG(info) << "Setting voltage variation trigger of DPs to update Anode/DriftUMon to " << utrigger;
148 mProcessor->setUVariationTriggerForUpdate(utrigger);
149 } else {
150 LOG(info) << "Invalid voltage variation trigger of DPs to update Anode/DriftUMon to " << utrigger << ", using default value of 1 V";
151 }
152
153 mUploadAtEoS = ic.options().get<bool>("enable-uploadAtEoS");
154 LOG(info) << "Setting upload of CCDB objects at end of stream to " << mUploadAtEoS;
155
156 mProcessor->init(vect);
157 mTimerGas = std::chrono::high_resolution_clock::now();
158 mTimerVoltages = mTimerGas;
159 mTimerCurrents = mTimerGas;
160 mTimerEnv = mTimerGas;
161 mTimerFedChamberStatus = mTimerGas;
162 mTimerFedCFGtag = mTimerGas;
163
164 mReportTiming = ic.options().get<bool>("report-timing") || verbosity > 0;
165 }
166
168 {
169 TStopwatch sw;
170 auto currentTimeStamp = pc.services().get<o2::framework::TimingInfo>().creation;
171 auto dps = pc.inputs().get<gsl::span<DPCOM>>("input");
172 auto timeNow = std::chrono::high_resolution_clock::now();
173 if (currentTimeStamp < 1577833200000UL || currentTimeStamp > 2208985200000UL) {
174 LOG(warning) << "The creation time of this TF is set to " << currentTimeStamp << ". Overwriting this with current time";
175 // in case it is not set
176 currentTimeStamp = std::chrono::duration_cast<std::chrono::milliseconds>(timeNow.time_since_epoch()).count(); // in ms
177 }
178 mProcessor->setCurrentTS(currentTimeStamp);
179 mProcessor->process(dps);
180
181 auto elapsedTimeGas = timeNow - mTimerGas; // in ns
182 if (elapsedTimeGas.count() * 1e-9 >= mGasDPsUpdateInterval) {
183 sendDPsoutputGas(pc.outputs());
184 mTimerGas = timeNow;
185 }
186
187 auto elapsedTimeVoltages = timeNow - mTimerVoltages; // in ns
188 if ((elapsedTimeVoltages.count() * 1e-9 >= mVoltagesDPsUpdateInterval) ||
189 (mProcessor->shouldUpdateVoltages() && (elapsedTimeVoltages.count() * 1e-9 >= mMinUpdateIntervalU))) {
190 sendDPsoutputVoltages(pc.outputs());
191 mTimerVoltages = timeNow;
192 }
193
194 auto elapsedTimeCurrents = timeNow - mTimerCurrents; // in ns
195 if (elapsedTimeCurrents.count() * 1e-9 >= mCurrentsDPsUpdateInterval) {
196 sendDPsoutputCurrents(pc.outputs());
197 mTimerCurrents = timeNow;
198 }
199
200 auto elapsedTimeEnv = timeNow - mTimerEnv; // in ns
201 if (elapsedTimeEnv.count() * 1e-9 >= mEnvDPsUpdateInterval) {
202 sendDPsoutputEnv(pc.outputs());
203 mTimerEnv = timeNow;
204 }
205
206 if (mProcessor->shouldUpdateFedChamberStatus()) {
207 sendDPsoutputFedChamberStatus(pc.outputs());
208 }
209
210 if (mProcessor->shouldUpdateFedCFGtag()) {
211 sendDPsoutputFedCFGtag(pc.outputs());
212 }
213
214 sw.Stop();
215
216 if (mReportTiming) {
217 LOGP(info, "Timing CPU:{:.3e} Real:{:.3e} at slice {}", sw.CpuTime(), sw.RealTime(), pc.services().get<o2::framework::TimingInfo>().timeslice);
218 }
219 }
220
222 {
223 // LB: no objects should be uploaded at end of stream, unless stated otherwise
224 if (mUploadAtEoS) {
225 LOG(info) << "End of stream upload of CCDB objects";
226 sendDPsoutputGas(ec.outputs());
227 sendDPsoutputVoltages(ec.outputs());
228 sendDPsoutputCurrents(ec.outputs());
229 sendDPsoutputEnv(ec.outputs());
230 } else {
231 LOG(info) << "No CCDB object upload done at the end of stream";
232 }
233 }
234
235 private:
236 bool mUploadAtEoS = false;
237 bool mReportTiming = false;
238 std::unique_ptr<DCSProcessor> mProcessor;
239 std::chrono::high_resolution_clock::time_point mTimerGas;
240 std::chrono::high_resolution_clock::time_point mTimerVoltages;
241 std::chrono::high_resolution_clock::time_point mTimerCurrents;
242 std::chrono::high_resolution_clock::time_point mTimerEnv;
243 std::chrono::high_resolution_clock::time_point mTimerFedChamberStatus;
244 std::chrono::high_resolution_clock::time_point mTimerFedCFGtag;
245
246 int64_t mGasDPsUpdateInterval;
247 int64_t mVoltagesDPsUpdateInterval;
248 int64_t mCurrentsDPsUpdateInterval;
249 int64_t mMinUpdateIntervalU;
250 int64_t mEnvDPsUpdateInterval;
251 int64_t mFedChamberStatusDPsUpdateInterval;
252 int64_t mFedCFGtagDPsUpdateInterval;
253
254 void sendDPsoutputVoltages(DataAllocator& output)
255 {
256 // extract CCDB infos and calibration object for DPs
257 if (mProcessor->updateVoltagesDPsCCDB()) {
258 const auto& payload = mProcessor->getTRDVoltagesDPsInfo();
259 auto& info = mProcessor->getccdbVoltagesDPsInfo();
260 auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info);
261 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
262 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
263 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSUDPs", 0}, *image.get());
264 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSUDPs", 0}, info);
265 mProcessor->clearVoltagesDPsInfo();
266 } else {
267 auto& info = mProcessor->getccdbVoltagesDPsInfo();
268 LOG(info) << "Not sending object " << info.getPath() << "/" << info.getFileName() << " since no DPs were processed for it";
269 }
270 }
271
272 void sendDPsoutputCurrents(DataAllocator& output)
273 {
274 // extract CCDB infos and calibration object for DPs
275 if (mProcessor->updateCurrentsDPsCCDB()) {
276 const auto& payload = mProcessor->getTRDCurrentsDPsInfo();
277 auto& info = mProcessor->getccdbCurrentsDPsInfo();
278 auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info);
279 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
280 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
281 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSIDPs", 0}, *image.get());
282 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSIDPs", 0}, info);
283 mProcessor->clearCurrentsDPsInfo();
284 } else {
285 auto& info = mProcessor->getccdbCurrentsDPsInfo();
286 LOG(info) << "Not sending object " << info.getPath() << "/" << info.getFileName() << " since no DPs were processed for it";
287 }
288 }
289
290 //________________________________________________________________
291 void sendDPsoutputGas(DataAllocator& output)
292 {
293 // extract CCDB infos and calibration object for DPs
294 if (mProcessor->updateGasDPsCCDB()) {
295 const auto& payload = mProcessor->getTRDGasDPsInfo();
296 auto& info = mProcessor->getccdbGasDPsInfo();
297 auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info);
298 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
299 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
300 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSGasDPs", 0}, *image.get());
301 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSGasDPs", 0}, info);
302 mProcessor->clearGasDPsInfo();
303 } else {
304 auto& info = mProcessor->getccdbGasDPsInfo();
305 LOG(info) << "Not sending object " << info.getPath() << "/" << info.getFileName() << " since no DPs were processed for it";
306 }
307 }
308
309 //________________________________________________________________
310 void sendDPsoutputEnv(DataAllocator& output)
311 {
312 // extract CCDB infos and calibration object for DPs
313 if (mProcessor->updateEnvDPsCCDB()) {
314 const auto& payload = mProcessor->getTRDEnvDPsInfo();
315 auto& info = mProcessor->getccdbEnvDPsInfo();
316 auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info);
317 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
318 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
319 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSEnvDPs", 0}, *image.get());
320 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSEnvDPs", 0}, info);
321 mProcessor->clearEnvDPsInfo();
322 } else {
323 auto& info = mProcessor->getccdbEnvDPsInfo();
324 LOG(info) << "Not sending object " << info.getPath() << "/" << info.getFileName() << " since no DPs were processed for it";
325 }
326 }
327
328 //________________________________________________________________
329 void sendDPsoutputFedChamberStatus(DataAllocator& output)
330 {
331 // extract CCDB infos and calibration object for DPs
332 if (mProcessor->updateFedChamberStatusDPsCCDB()) {
333 const auto& payload = mProcessor->getTRDFedChamberStatusDPsInfo();
334 auto& info = mProcessor->getccdbFedChamberStatusDPsInfo();
335 auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info);
336 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
337 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
338 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_ChamberStat", 0}, *image.get());
339 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_ChamberStat", 0}, info);
340 mProcessor->clearFedChamberStatusDPsInfo();
341 } else {
342 auto& info = mProcessor->getccdbFedChamberStatusDPsInfo();
343 LOG(info) << "Not sending object " << info.getPath() << "/" << info.getFileName() << " since no DPs were processed for it";
344 }
345 }
346
347 //________________________________________________________________
348 void sendDPsoutputFedCFGtag(DataAllocator& output)
349 {
350 // extract CCDB infos and calibration object for DPs
351 if (mProcessor->updateFedCFGtagDPsCCDB()) {
352 const auto& payload = mProcessor->getTRDFedCFGtagDPsInfo();
353 auto& info = mProcessor->getccdbFedCFGtagDPsInfo();
354 auto image = o2::ccdb::CcdbApi::createObjectImage(&payload, &info);
355 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
356 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
357 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_CFGtag", 0}, *image.get());
358 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_CFGtag", 0}, info);
359 mProcessor->clearFedCFGtagDPsInfo();
360 } else {
361 auto& info = mProcessor->getccdbFedCFGtagDPsInfo();
362 LOG(info) << "Not sending object " << info.getPath() << "/" << info.getFileName() << " since no DPs were processed for it";
363 }
364 }
365
366}; // end class
367} // namespace trd
368
369namespace framework
370{
371
372DataProcessorSpec getTRDDCSDataProcessorSpec()
373{
374
375 std::vector<OutputSpec> outputs;
376 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSGasDPs"}, Lifetime::Sporadic);
377 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSGasDPs"}, Lifetime::Sporadic);
378 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSUDPs"}, Lifetime::Sporadic);
379 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSUDPs"}, Lifetime::Sporadic);
380 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSIDPs"}, Lifetime::Sporadic);
381 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSIDPs"}, Lifetime::Sporadic);
382 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_DCSEnvDPs"}, Lifetime::Sporadic);
383 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_DCSEnvDPs"}, Lifetime::Sporadic);
384 // Must use reduced names due to initializer string cannot exceed descriptor size in Data Format
385 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_ChamberStat"}, Lifetime::Sporadic);
386 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_ChamberStat"}, Lifetime::Sporadic);
387 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TRD_CFGtag"}, Lifetime::Sporadic);
388 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TRD_CFGtag"}, Lifetime::Sporadic);
389
390 return DataProcessorSpec{
391 "trd-dcs-data-processor",
392 Inputs{{"input", "DCS", "TRDDATAPOINTS"}},
393 outputs,
394 AlgorithmSpec{adaptFromTask<o2::trd::TRDDCSDataProcessor>()},
395 Options{{"ccdb-path", VariantType::String, "http://localhost:8080", {"Path to CCDB"}},
396 {"use-ccdb-to-configure", VariantType::Bool, false, {"Use CCDB to configure"}},
397 {"report-timing", VariantType::Bool, false, {"Report timing for every slice"}},
398 {"processor-verbosity", VariantType::Int, 0, {"Increase for more verbose output (max 3)"}},
399 {"DPs-update-interval-currents", VariantType::Int64, 120ll, {"Interval (in s) after which to update the DPs CCDB entry for current parameters"}},
400 {"DPs-update-interval-voltages", VariantType::Int64, 600ll, {"Interval (in s) after which to update the DPs CCDB entry for voltage parameters"}},
401 {"DPs-update-interval-env", VariantType::Int64, 1800ll, {"Interval (in s) after which to update the DPs CCDB entry for environment parameters"}},
402 {"DPs-min-update-interval-voltages", VariantType::Int64, 120ll, {"Minimum range to be covered by voltage CCDB object"}},
403 {"DPs-voltage-variation-trigger", VariantType::Int64, 1ll, {"Voltage variation trigger for upload of CCDB object"}},
404 {"DPs-update-interval-gas", VariantType::Int64, 900ll, {"Interval (in s) after which to update the DPs CCDB entry for gas parameters"}},
405 {"DPs-max-counter-alarm-fed", VariantType::Int, 1, {"Maximum number of alarms after FedChamberStatus and FedCFGtag changes, following changes are logged as warnings"}},
406 {"DPs-min-counter-update-fed", VariantType::Int, 522, {"Minimum number of DPs to update FedChamberStatus and FedCFGtag objects"}},
407 {"enable-uploadAtEoS", VariantType::Bool, false, {"Upload CCDB objects at end of stream"}}}};
408}
409
410} // namespace framework
411} // namespace o2
412
413#endif
#define verbosity
Utils and constants for calibration and related workflows.
int32_t i
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
static BasicCCDBManager & instance()
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(o2::framework::InitContext &ic) final
void run(o2::framework::ProcessingContext &pc) final
GLeglImageOES image
Definition glcorearb.h:4021
std::vector< std::string > expandAliases(const std::vector< std::string > &patternedAliases)
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< InputSpec > Inputs
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
Definition Utils.h:44
static constexpr o2::header::DataOrigin gDataOriginCDBPayload
Definition Utils.h:43
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
TStopwatch sw