Project
Loading...
Searching...
No Matches
DeadMapBuilderSpec.cxx
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
13
22#include <TFile.h>
23
24namespace o2
25{
26namespace itsmft
27{
28
30// Default constructor
31ITSMFTDeadMapBuilder::ITSMFTDeadMapBuilder(std::string datasource, bool doMFT)
32 : mDataSource(datasource), mRunMFT(doMFT)
33{
34 std::string detector = doMFT ? "MFT" : "ITS";
35 mSelfName = o2::utils::Str::concat_string("ITSMFTDeadMapBuilder_", detector);
36}
37
39// Default deconstructor
44
47{
48 LOG(info) << "ITSMFTDeadMapBuilder init... " << mSelfName;
49
50 mTFSampling = ic.options().get<int>("tf-sampling");
51 mTFSamplingTolerance = ic.options().get<int>("tf-sampling-tolerance");
52 if (mTFSamplingTolerance > mTFSampling) {
53 LOG(warning) << "Invalid request tf-sampling-tolerance larger or equal than tf-sampling. Setting tolerance to " << mTFSampling - 1;
54 mTFSamplingTolerance = mTFSampling - 1;
55 }
56 mSampledSlidingWindowSize = ic.options().get<int>("tf-sampling-history-size");
57 mTFLength = ic.options().get<int>("tf-length");
58 mDoLocalOutput = ic.options().get<bool>("local-output");
59 mObjectName = ic.options().get<std::string>("outfile");
60 mCCDBUrl = ic.options().get<std::string>("ccdb-url");
61 if (mCCDBUrl == "none") {
62 mCCDBUrl = "";
63 }
64
65 mLocalOutputDir = ic.options().get<std::string>("output-dir");
66 mSkipStaticMap = ic.options().get<bool>("skip-static-map");
67 mNoGroupITSLanes = ic.options().get<bool>("no-group-its-lanes");
68
69 isEnded = false;
70 mTimeStart = o2::ccdb::getCurrentTimestamp();
71
72 if (mRunMFT) {
74 } else {
76 }
77
78 mSampledTFs.clear();
79 mSampledHistory.clear();
80 mDeadMapTF.clear();
81 mStaticChipStatus.clear();
82 mMapObject.clear();
83 mMapObject.setMapVersion(MAP_VERSION);
84
85 if (!mSkipStaticMap) {
86 mStaticChipStatus.resize(N_CHIPS, false);
87 }
88
89 LOG(info) << "Sampling one TF every " << mTFSampling << " with " << mTFSamplingTolerance << " TF tolerance";
90
91 // ------------------------------------------------------------------
92 // Stuck-pixel setup
93 // Disabled for MFT (ITS-specific feature) or when option is not set.
94 // ------------------------------------------------------------------
95 mStuckPixelFileName = ic.options().get<std::string>("save-stuck-pixels");
96 mDoStuckPixels = (!mRunMFT && !mStuckPixelFileName.empty());
97
98 if (mDoStuckPixels) {
99 LOG(info) << "Stuck pixel saving ENABLED. CCDB object name: " << mStuckPixelFileName;
100 mStuckPixelData.clear();
101 } else {
102 LOG(info) << "Stuck pixel saving DISABLED.";
103 }
104
105 return;
106}
107
109std::vector<uint16_t> ITSMFTDeadMapBuilder::getChipIDsOnSameCable(uint16_t chip)
110{
111 if (mRunMFT || chip < N_CHIPS_ITSIB) {
112 return std::vector<uint16_t>{chip};
113 } else {
114 uint16_t firstchipcable = 7 * (uint16_t)((chip - N_CHIPS_ITSIB) / 7) + N_CHIPS_ITSIB;
115 std::vector<uint16_t> chipList(7);
116 std::generate(chipList.begin(), chipList.end(), [&firstchipcable]() { return firstchipcable++; });
117 return chipList;
118 }
119}
120
122bool ITSMFTDeadMapBuilder::acceptTF(long orbit)
123{
124 if (mTFSamplingTolerance < 1) {
125 return ((orbit / mTFLength) % mTFSampling == 0);
126 }
127
128 if ((orbit / mTFLength) % mTFSampling > mTFSamplingTolerance) {
129 return false;
130 }
131
132 long sampling_index = orbit / mTFLength / mTFSampling;
133
134 if (mSampledTFs.find(sampling_index) == mSampledTFs.end()) {
135 mSampledTFs.insert(sampling_index);
136 mSampledHistory.push_back(sampling_index);
137
138 if (mSampledHistory.size() > mSampledSlidingWindowSize) {
139 long oldIndex = mSampledHistory.front();
140 mSampledHistory.pop_front();
141 mSampledTFs.erase(oldIndex);
142 }
143
144 return true;
145 }
146
147 return false;
148}
149
151void ITSMFTDeadMapBuilder::finalizeOutput()
152{
153 // ---- static dead map ----
154 if (!mSkipStaticMap) {
155 std::vector<uint16_t> staticmap{};
156 int staticmap_chipcounter = 0;
157 for (uint16_t el = 0; el < mStaticChipStatus.size(); el++) {
158 if (mStaticChipStatus[el]) {
159 continue;
160 }
161 staticmap_chipcounter++;
162 bool previous_dead = (el > 0 && !mStaticChipStatus[el - 1]);
163 bool next_dead = (el < mStaticChipStatus.size() - 1 && !mStaticChipStatus[el + 1]);
164 if (!previous_dead && next_dead) {
165 staticmap.push_back(el | (uint16_t)(0x8000));
166 } else if (previous_dead && next_dead) {
167 continue;
168 } else {
169 staticmap.push_back(el);
170 }
171 }
172
173 LOG(info) << "Filling static part of the map with " << staticmap_chipcounter
174 << " dead chips, saved into " << staticmap.size() << " words";
175 mMapObject.fillMap(staticmap);
176 }
177
178 // ---- local ROOT output: TimeDeadMap ----
179 if (mDoLocalOutput) {
180 std::string localoutfilename = mLocalOutputDir + "/" + mObjectName;
181 TFile outfile(localoutfilename.c_str(), "RECREATE");
182 outfile.WriteObjectAny(&mMapObject, "o2::itsmft::TimeDeadMap", "ccdb_object");
183 outfile.Close();
184 }
185
186 // ---- local ROOT output: StuckPixelData as TTree ----
187 // For local analysis convenience the same data is written as a TTree.
188 // The CCDB payload itself is the StuckPixelData object, not this TTree.
189 if (mDoStuckPixels && mDoLocalOutput) {
190 std::string stuckOutFileName = mLocalOutputDir + "/" + mStuckPixelFileName;
191 TFile stuckOutFile(stuckOutFileName.c_str(), "RECREATE");
192
193 if (!stuckOutFile.IsZombie()) {
194 stuckOutFile.cd();
195
196 TTree localTree("ErrorTree", "Stuck Pixel Errors");
197 localTree.SetDirectory(&stuckOutFile);
198 localTree.Branch("orbit", &mErrOrbit, "orbit/L");
199 localTree.Branch("chipid", &mErrChipID, "chipid/s");
200 localTree.Branch("row", &mErrRow, "row/s");
201 localTree.Branch("col", &mErrCol, "col/s");
202
203 for (const auto& entry : mStuckPixelData.getEntries()) {
204 mErrOrbit = entry.orbit;
205 mErrChipID = entry.chipID;
206 mErrRow = entry.row;
207 mErrCol = entry.col;
208 localTree.Fill();
209 }
210
211 stuckOutFile.Write();
212 stuckOutFile.Close();
213
214 LOG(info) << "StuckPixel TTree saved locally to " << stuckOutFileName
215 << " (" << mStuckPixelData.size() << " entries)";
216 } else {
217 LOG(error) << "Failed to open " << stuckOutFileName << " for StuckPixel TTree.";
218 }
219 }
220
221 return;
222}
223
225// Main running function
227{
228 // Skip everything in case of garbage (potentially at EoS)
230 LOG(info) << "Skipping the processing of inputs for timeslice "
231 << pc.services().get<o2::framework::TimingInfo>().timeslice
232 << " (firstTForbit is "
233 << pc.services().get<o2::framework::TimingInfo>().firstTForbit << ")";
234 return;
235 }
236
237 auto start = std::chrono::high_resolution_clock::now();
238
239 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
240
241 if (tinfo.globalRunNumberChanged || mFirstOrbitRun == 0x0) { // new run is starting
242 mRunNumber = tinfo.runNumber;
243 mFirstOrbitRun = mFirstOrbitTF;
244 mTFCounter = 0;
245 isEnded = false;
246 }
247
248 if (isEnded) {
249 return;
250 }
251
252 mFirstOrbitTF = tinfo.firstTForbit;
253 mTFCounter++;
254
255 long sampled_orbit = mFirstOrbitTF - mFirstOrbitRun;
256
257 if (!acceptTF(sampled_orbit)) {
258 return;
259 }
260
261 mStepCounter++;
262
263 // ---- collect stuck pixel (RepeatingPixel) errors ----
264 // ErrorInfo input is declared only for ITS. Entries are stored only when
265 // save-stuck-pixels is set.
266 if (mDoStuckPixels) {
267 const auto repErrors = pc.inputs().get<gsl::span<o2::itsmft::ErrorMessage>>("repErr");
268 for (const auto& err : repErrors) {
269 if (err.errType == o2::itsmft::ChipStat::RepeatingPixel) {
270 mStuckPixelData.addEntry(
271 static_cast<Long64_t>(mFirstOrbitTF),
272 static_cast<uint16_t>(err.id),
273 static_cast<uint16_t>(err.errInfo0),
274 static_cast<uint16_t>(err.errInfo1));
275 }
276 }
277 }
278
279 LOG(info) << "Processing step #" << mStepCounter << " out of " << mTFCounter
280 << " good TF received. First orbit " << mFirstOrbitTF;
281
282 mDeadMapTF.clear();
283
284 std::vector<bool> ChipStatus(N_CHIPS, false);
285
286 if (mDataSource == "digits") {
287 const auto elements = pc.inputs().get<gsl::span<o2::itsmft::Digit>>("elements");
288 const auto ROFs = pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("ROFs");
289 for (const auto& rof : ROFs) {
290 auto elementsInTF = rof.getROFData(elements);
291 for (const auto& el : elementsInTF) {
292 ChipStatus.at((int)el.getChipIndex()) = true;
293 }
294 }
295 } else if (mDataSource == "clusters") {
296 const auto elements = pc.inputs().get<gsl::span<o2::itsmft::CompClusterExt>>("elements");
297 const auto ROFs = pc.inputs().get<gsl::span<o2::itsmft::ROFRecord>>("ROFs");
298 for (const auto& rof : ROFs) {
299 auto elementsInTF = rof.getROFData(elements);
300 for (const auto& el : elementsInTF) {
301 ChipStatus.at((int)el.getSensorID()) = true;
302 }
303 }
304 } else if (mDataSource == "chipsstatus") {
305 const auto elements = pc.inputs().get<gsl::span<char>>("elements");
306 for (uint16_t chipID = 0; chipID < elements.size(); chipID++) {
307 if (elements[chipID]) {
308 ChipStatus.at(chipID) = true;
309 }
310 }
311 }
312
313 // Save status of single chips in static map before unmasking the full ITS lane
314 if (!mSkipStaticMap) {
315 for (size_t el = 0; el < mStaticChipStatus.size(); el++) {
316 mStaticChipStatus[el] = mStaticChipStatus[el] || ChipStatus[el];
317 }
318 }
319
320 // for ITS, if requested: declaring dead only chips belonging to lanes with no alive chips
321 if (!mRunMFT && !mNoGroupITSLanes) {
322 for (uint16_t el = N_CHIPS_ITSIB; el < ChipStatus.size(); el++) {
323 if (ChipStatus.at(el)) {
324 std::vector<uint16_t> chipincable = getChipIDsOnSameCable(el);
325 for (uint16_t el2 : chipincable) {
326 ChipStatus.at(el2) = true;
327 el = el2;
328 }
329 }
330 }
331 }
332
333 int CountDead = 0;
334
335 for (uint16_t el = 0; el < ChipStatus.size(); el++) {
336 if (ChipStatus.at(el)) {
337 continue;
338 }
339 CountDead++;
340 bool previous_dead = (el > 0 && !ChipStatus.at(el - 1));
341 bool next_dead = (el < ChipStatus.size() - 1 && !ChipStatus.at(el + 1));
342 if (!previous_dead && next_dead) {
343 mDeadMapTF.push_back(el | (uint16_t)(0x8000));
344 } else if (previous_dead && next_dead) {
345 continue;
346 } else {
347 mDeadMapTF.push_back(el);
348 }
349 }
350
351 LOG(info) << "TF contains " << CountDead << " dead chips, saved into "
352 << mDeadMapTF.size() << " words.";
353
354 // filling the map
355 mMapObject.fillMap(mFirstOrbitTF, mDeadMapTF);
356
357 auto end = std::chrono::high_resolution_clock::now();
358 int difference = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
359
360 LOG(info) << "Elapsed time in TF processing: " << difference / 1000. << " ms";
361
362 if (pc.transitionState() == TransitionHandlingState::Requested && !isEnded) {
363 std::string detname = mRunMFT ? "MFT" : "ITS";
364 LOG(warning) << "Transition state requested for " << detname
365 << " process, calling stop() and stopping the process of new data.";
366 stop();
367 }
368
369 return;
370}
371
373void ITSMFTDeadMapBuilder::PrepareOutputCcdb(EndOfStreamContext* ec, std::string ccdburl)
374{
375 long tend = o2::ccdb::getCurrentTimestamp();
376 std::map<std::string, std::string> md = {
377 {"map_version", MAP_VERSION},
378 {"runNumber", std::to_string(mRunNumber)}};
379
380 std::string path = mRunMFT ? "MFT/Calib/" : "ITS/Calib/";
381
382 // ---- TimeDeadMap ----
383 {
384 std::string name_str = "TimeDeadMap";
385
387 (path + name_str),
388 name_str,
389 mObjectName,
390 md,
391 mTimeStart - 120 * 1000,
392 tend + 60 * 1000);
393
394 auto image = o2::ccdb::CcdbApi::createObjectImage(&mMapObject, &info);
395 info.setFileName(mObjectName);
396 info.setAdjustableEOV();
397
398 if (mMapObject.getEvolvingMapSize() > 0) {
399 if (ec != nullptr) {
400 LOG(important) << "Sending object " << info.getPath() << "/" << info.getFileName()
401 << " to ccdb-populator, of size " << image->size()
402 << " bytes, valid for "
403 << info.getStartValidityTimestamp() << " : "
404 << info.getEndValidityTimestamp();
405
406 if (mRunMFT) {
409 } else {
412 }
413 } else if (!ccdburl.empty()) {
414 LOG(important) << mSelfName << " sending object " << ccdburl << "/browse/"
415 << info.getPath() << "/" << info.getFileName()
416 << " of size " << image->size() << " bytes, valid for "
417 << info.getStartValidityTimestamp() << " : "
418 << info.getEndValidityTimestamp();
419
421 mApi.init(ccdburl);
423 &image->at(0), image->size(), info.getFileName(), info.getObjectType(),
424 info.getPath(), info.getMetaData(),
425 info.getStartValidityTimestamp(), info.getEndValidityTimestamp());
427 } else {
428 LOG(warning) << "PrepareOutputCcdb called with empty arguments for TimeDeadMap. Doing nothing.";
429 }
430 } else {
431 LOG(warning) << "Time-dependent dead map is empty and will not be forwarded as output";
432 }
433 }
434
435 // ---- StuckPixelData ----
436 // ITS-only CCDB payload. Empty objects are intentionally allowed when
437 // the feature is enabled, since this object is meant to record the result
438 // of the checked data sample rather than a mandatory calibration for all runs.
439 if (mDoStuckPixels) {
440 std::string name_sp = "StuckPixels";
441
443 (path + name_sp),
444 name_sp,
445 mStuckPixelFileName,
446 md,
447 mTimeStart - 120 * 1000,
448 tend + 60 * 1000);
449
450 auto image_sp = o2::ccdb::CcdbApi::createObjectImage(&mStuckPixelData, &info_sp);
451 info_sp.setFileName(mStuckPixelFileName);
452 info_sp.setAdjustableEOV();
453
454 LOG(info) << "StuckPixelData contains " << mStuckPixelData.size()
455 << " entries (" << image_sp->size()
456 << " bytes), publishing to " << path + name_sp;
457
458 if (ec != nullptr) {
459 ec->outputs().snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "StuckPixels", 0}, *image_sp.get());
460 ec->outputs().snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "StuckPixels", 0}, info_sp);
461 } else if (!ccdburl.empty()) {
462 LOG(important) << mSelfName << " sending StuckPixelData to "
463 << ccdburl << "/browse/" << info_sp.getPath();
464
465 o2::ccdb::CcdbApi mApi_sp;
466 mApi_sp.init(ccdburl);
467 mApi_sp.storeAsBinaryFile(
468 &image_sp->at(0), image_sp->size(), info_sp.getFileName(), info_sp.getObjectType(),
469 info_sp.getPath(), info_sp.getMetaData(),
470 info_sp.getStartValidityTimestamp(), info_sp.getEndValidityTimestamp());
471 o2::ccdb::adjustOverriddenEOV(mApi_sp, info_sp);
472 } else {
473 LOG(warning) << "PrepareOutputCcdb called with empty arguments for StuckPixels. Doing nothing.";
474 }
475 }
476
477 return;
478}
479
482{
483 if (!isEnded) {
484 LOG(info) << "endOfStream report: " << mSelfName;
485 finalizeOutput();
486 PrepareOutputCcdb(&ec, "");
487 LOG(info) << "Stop process of new data because of endOfStream";
488 isEnded = true;
489 }
490 return;
491}
492
495{
496 if (!isEnded) {
497 LOG(info) << "stop() report: " << mSelfName;
498 finalizeOutput();
499 if (!mCCDBUrl.empty()) {
500 std::string detname = mRunMFT ? "MFT" : "ITS";
501 LOG(warning) << "endOfStream not processed. Sending output to ccdb from the "
502 << detname << " deadmap builder workflow.";
503 PrepareOutputCcdb(nullptr, mCCDBUrl);
504 } else {
505 LOG(alarm) << "endOfStream not processed. Nothing forwarded as output.";
506 }
507 LOG(info) << "Stop process of new data because of stop() call.";
508 isEnded = true;
509 }
510 return;
511}
512
514DataProcessorSpec getITSMFTDeadMapBuilderSpec(std::string datasource, bool doMFT)
515{
517 if (doMFT) {
519 } else {
521 }
522
523 std::vector<InputSpec> inputs;
524
525 if (datasource == "digits") {
526 inputs.emplace_back("elements", detOrig, "DIGITS", 0, Lifetime::Timeframe);
527 inputs.emplace_back("ROFs", detOrig, "DIGITSROF", 0, Lifetime::Timeframe);
528 } else if (datasource == "clusters") {
529 inputs.emplace_back("elements", detOrig, "COMPCLUSTERS", 0, Lifetime::Timeframe);
530 inputs.emplace_back("ROFs", detOrig, "CLUSTERSROF", 0, Lifetime::Timeframe);
531 } else if (datasource == "chipsstatus") {
532 inputs.emplace_back("elements", detOrig, "CHIPSSTATUS", 0, Lifetime::Timeframe);
533 } else {
534 return DataProcessorSpec{0x0};
535 }
536
537 // ITS-only input for stuck-pixel collection.
538 // MFT is left unchanged and does not declare the StuckPixels-related input.
539 if (!doMFT) {
540 inputs.emplace_back("repErr", detOrig, "ErrorInfo", 0, Lifetime::Timeframe);
541 }
542
543 std::vector<OutputSpec> outputs;
544 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TimeDeadMap"}, Lifetime::Sporadic);
545 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TimeDeadMap"}, Lifetime::Sporadic);
546
547 // ITS-only output for the new StuckPixels CCDB object.
548 if (!doMFT) {
549 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "StuckPixels"}, Lifetime::Sporadic);
550 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "StuckPixels"}, Lifetime::Sporadic);
551 }
552
553 std::string detector = doMFT ? "mft" : "its";
554 std::string objectname_default = detector + "_time_deadmap.root";
555
556 return DataProcessorSpec{
557 "itsmft-deadmap-builder_" + detector,
558 inputs,
559 outputs,
560 AlgorithmSpec{adaptFromTask<ITSMFTDeadMapBuilder>(datasource, doMFT)},
561 Options{
562 {"tf-sampling", VariantType::Int, 350, {"Process every Nth TF. Selection according to first TF orbit."}},
563 {"tf-sampling-tolerance", VariantType::Int, 20, {"Tolerance on the tf-sampling value (sliding window size)."}},
564 {"tf-sampling-history-size", VariantType::Int, 1000, {"Do not check if new TF is contained in a window that is older than N steps."}},
565 {"tf-length", VariantType::Int, 32, {"Orbits per TF."}},
566 {"skip-static-map", VariantType::Bool, false, {"Do not fill static part of the map."}},
567 {"no-group-its-lanes", VariantType::Bool, false, {"Do not group ITS OB chips into lanes."}},
568 {"ccdb-url", VariantType::String, std::string(""), {"CCDB url. Ignored if endOfStream is processed."}},
569 {"outfile", VariantType::String, objectname_default, {"ROOT object file name."}},
570 {"local-output", VariantType::Bool, false, {"Save ROOT file locally."}},
571 {"output-dir", VariantType::String, std::string("./"), {"Local output directory."}},
572 {"save-stuck-pixels", VariantType::String, std::string(""), {"Enable ITS stuck-pixel collection and set the CCDB/local ROOT filename. Empty = disabled."}},
573 }};
574}
575
576} // namespace itsmft
577} // namespace o2
Definition of the ITSMFT compact cluster.
Definition of the ITSMFT digit.
Alpide Chip and GBT link decoding statistics.
uint64_t orbit
Definition RawEventData.h:6
CCDB-serializable container for stuck (repeating) pixel error records.
Definition of the ITSMFT time-dependend dead map.
void init(std::string const &hosts)
Definition CcdbApi.cxx:160
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
int storeAsBinaryFile(const char *buffer, size_t size, const std::string &fileName, const std::string &objectType, const std::string &path, const std::map< std::string, std::string > &metadata, long startValidityTimestamp, long endValidityTimestamp, std::vector< char >::size_type maxSize=0) const
Definition CcdbApi.cxx:349
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
Definition InitContext.h:33
decltype(auto) get(R binding, int part=0) const
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
TransitionHandlingState transitionState() const
static constexpr int getNChips()
number of chips per barrel
static constexpr Int_t getNChips()
void endOfStream(EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void stop() final
This is invoked on stop.
void init(InitContext &ic) final
void run(ProcessingContext &pc) final
ITSMFTDeadMapBuilder(std::string datasource, bool doMFT)
void addEntry(Long64_t orbit, uint16_t chipID, uint16_t row, uint16_t col)
std::size_t size() const
void fillMap(unsigned long firstOrbit, const std::vector< uint16_t > &deadVect)
Definition TimeDeadMap.h:46
void setMapVersion(std::string version)
Definition TimeDeadMap.h:70
unsigned long getEvolvingMapSize() const
Definition TimeDeadMap.h:66
GLeglImageOES image
Definition glcorearb.h:4021
GLuint entry
Definition glcorearb.h:5735
GLuint GLuint end
Definition glcorearb.h:469
GLsizei const GLchar *const * path
Definition glcorearb.h:3591
GLuint start
Definition glcorearb.h:469
constexpr o2::header::DataOrigin gDataOriginMFT
Definition DataHeader.h:572
constexpr o2::header::DataOrigin gDataOriginITS
Definition DataHeader.h:570
long getCurrentTimestamp()
returns the timestamp in long corresponding to "now"
int adjustOverriddenEOV(CcdbApi &api, const CcdbObjectInfo &infoNew)
set EOV of overriden objects to SOV-1 of overriding one if it is allowed
std::vector< ConfigParamSpec > Options
o2::framework::DataProcessorSpec getITSMFTDeadMapBuilderSpec(std::string datasource, bool doMFT)
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)
Definition common.h:52
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
Definition Utils.h:44
static constexpr o2::header::DataOrigin gDataOriginCDBPayload
Definition Utils.h:43
static std::string concat_string(Ts const &... ts)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"