Project
Loading...
Searching...
No Matches
PedestalCalibratorSpec.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#include "Framework/Task.h"
16#include "CCDB/CcdbApi.h"
17#include "CCDB/CcdbObjectInfo.h"
25
26using namespace o2::framework;
27
28namespace o2
29{
30namespace calibration
31{
33{
34 public:
35 CPVPedestalCalibratorSpec(std::shared_ptr<o2::base::GRPGeomRequest> req) : mCCDBRequest(req) {}
36 //_________________________________________________________________
38 {
40 uint64_t slotL = ic.options().get<uint64_t>("tf-per-slot");
41 uint64_t delay = ic.options().get<uint64_t>("max-delay");
42 uint64_t updateInterval = ic.options().get<uint64_t>("updateInterval");
43 bool updateAtTheEndOfRunOnly = ic.options().get<bool>("updateAtTheEndOfRunOnly");
44 mCalibrator = std::make_unique<o2::cpv::PedestalCalibrator>();
45 mCalibrator->setSlotLength(slotL);
46 mCalibrator->setMaxSlotsDelay(delay);
47 if (updateAtTheEndOfRunOnly) {
48 mCalibrator->setUpdateAtTheEndOfRunOnly();
49 }
50 mCalibrator->setCheckIntervalInfiniteSlot(updateInterval);
51 LOG(info) << "CPVPedestalCalibratorSpec initialized";
52 LOG(info) << "tf-per-slot = " << slotL;
53 LOG(info) << "max-delay = " << delay;
54 LOG(info) << "updateInterval = " << updateInterval;
55 LOG(info) << "updateAtTheEndOfRunOnly = " << updateAtTheEndOfRunOnly;
56 }
57
58 //_________________________________________________________________
59 void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
60 {
62 }
63
64 //_________________________________________________________________
66 {
68 o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
69 TFType tfcounter = mCalibrator->getCurrentTFInfo().startTime;
70
71 // update config
72 static bool isConfigFetched = false;
73 if (!isConfigFetched) {
74 LOG(info) << "PedestalCalibratorSpec::run() : fetching o2::cpv::CPVCalibParams from CCDB";
75 pc.inputs().get<o2::cpv::CPVCalibParams*>("calibparams");
76 LOG(info) << "PedestalCalibratorSpec::run() : o2::cpv::CPVCalibParams::Instance() now is following:";
78 mCalibrator->configParameters();
79 isConfigFetched = true;
80 }
81
82 auto&& digits = pc.inputs().get<gsl::span<o2::cpv::Digit>>("digits");
83 auto&& trigrecs = pc.inputs().get<gsl::span<o2::cpv::TriggerRecord>>("trigrecs");
84 LOG(detail) << "Processing TF " << tfcounter << " with " << digits.size() << " digits in " << trigrecs.size() << " trigger records.";
85 auto& slotTF = mCalibrator->getSlotForTF(tfcounter);
86
87 for (auto trigrec = trigrecs.begin(); trigrec != trigrecs.end(); trigrec++) { // event loop
88 // here we're filling TimeSlot event by event
89 // and when last event is reached we call mCalibrator->process() to finalize the TimeSlot
90 auto&& digitsInOneEvent = digits.subspan((*trigrec).getFirstEntry(), (*trigrec).getNumberOfObjects());
91 if ((trigrec + 1) == trigrecs.end()) { // last event in current TF, let's process corresponding TimeSlot
92 // LOG(info) << "last event, I call mCalibrator->process()";
93 mCalibrator->process(digitsInOneEvent); // fill TimeSlot with digits from 1 event and check slots for finalization
94 } else {
95 slotTF.getContainer()->fill(digitsInOneEvent); // fill TimeSlot with digits from 1 event
96 }
97 }
98
99 auto infoVecSize = mCalibrator->getCcdbInfoPedestalsVector().size();
100 auto pedsVecSize = mCalibrator->getPedestalsVector().size();
101 if (infoVecSize > 0) {
102 LOG(detail) << "Created " << infoVecSize << " ccdb infos and " << pedsVecSize << " pedestal objects for TF " << tfcounter;
103 }
104 sendOutput(pc.outputs());
105 }
106 //_________________________________________________________________
107
108 private:
109 std::unique_ptr<o2::cpv::PedestalCalibrator> mCalibrator;
110 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
111
112 void sendOutput(DataAllocator& output)
113 {
114 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
115 // TO NOT(!) DO in principle, this routine is non-generic(!), can be moved to Utils.h
116 // if there are more than 1 calibration objects to output
117
118 // send o2::cpv::Pedestals
119 /*const auto& payloadVec = mCalibrator->getPedestalsVector();
120 auto&& infoVec = mCalibrator->getCcdbInfoPedestalsVector(); // use non-const version as we update it
121
122 assert(payloadVec.size() == infoVec.size());
123
124 for (uint32_t i = 0; i < payloadVec.size(); i++) {
125 auto& w = infoVec[i];
126 auto image = o2::ccdb::CcdbApi::createObjectImage(&payloadVec[i], &w);
127 LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
128 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
129 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Pedestals", i}, *image.get()); // vector<char>
130 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Pedestals", i}, w); // root-serialized
131 }*/
132 bool isSomethingSent = false;
133 isSomethingSent = sendOutputWhat<o2::cpv::Pedestals>(mCalibrator->getPedestalsVector(), mCalibrator->getCcdbInfoPedestalsVector(), "CPV_Pedestals", output);
134 isSomethingSent += sendOutputWhat<std::vector<int>>(mCalibrator->getThresholdsFEEVector(), mCalibrator->getCcdbInfoThresholdsFEEVector(), "CPV_FEEThrs", output);
135 isSomethingSent += sendOutputWhat<std::vector<int>>(mCalibrator->getDeadChannelsVector(), mCalibrator->getCcdbInfoDeadChannelsVector(), "CPV_DeadChnls", output);
136 isSomethingSent += sendOutputWhat<std::vector<int>>(mCalibrator->getHighPedChannelsVector(), mCalibrator->getCcdbInfoHighPedChannelsVector(), "CPV_HighThrs", output);
137 isSomethingSent += sendOutputWhat<std::vector<float>>(mCalibrator->getEfficienciesVector(), mCalibrator->getCcdbInfoEfficienciesVector(), "CPV_PedEffs", output);
138
139 if (isSomethingSent) {
140 mCalibrator->initOutput(); // reset the outputs once they are already sent
141 }
142 }
143
144 template <class Payload>
145 bool sendOutputWhat(const std::vector<Payload>& payloadVec, std::vector<o2::ccdb::CcdbObjectInfo>& infoVec, header::DataDescription what, DataAllocator& output)
146 {
147 assert(payloadVec.size() == infoVec.size());
148 if (!payloadVec.size()) {
149 return false;
150 }
151
152 for (uint32_t i = 0; i < payloadVec.size(); i++) {
153 auto& w = infoVec[i];
154 auto image = o2::ccdb::CcdbApi::createObjectImage(&payloadVec[i], &w);
155 LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
156 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
157 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, what, i}, *image.get()); // vector<char>
158 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, what, i}, w); // root-serialized
159 }
160
161 return true;
162 }
163}; // class CPVPedestalCalibratorSpec
164} // namespace calibration
165
166namespace framework
167{
168DataProcessorSpec getCPVPedestalCalibratorSpec()
169{
171
172 std::vector<OutputSpec> outputs;
173 // Length of data description ("CPV_Pedestals") must be < 16 characters.
174 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Pedestals", 0}, Lifetime::Sporadic);
175 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Pedestals", 0}, Lifetime::Sporadic);
176 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_FEEThrs", 0}, Lifetime::Sporadic);
177 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_FEEThrs", 0}, Lifetime::Sporadic);
178 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_FEEThrs", 1}, Lifetime::Sporadic);
179 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_FEEThrs", 1}, Lifetime::Sporadic);
180 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_PedEffs", 0}, Lifetime::Sporadic);
181 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_PedEffs", 0}, Lifetime::Sporadic);
182 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_DeadChnls", 0}, Lifetime::Sporadic);
183 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_DeadChnls", 0}, Lifetime::Sporadic);
184 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_HighThrs", 0}, Lifetime::Sporadic);
185 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_HighThrs", 0}, Lifetime::Sporadic);
186 std::vector<InputSpec> inputs{{"digits", "CPV", "DIGITS"},
187 {"trigrecs", "CPV", "DIGITTRIGREC"}};
188 inputs.emplace_back("calibparams", "CPV", "CPV_CalibPars", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/CPVCalibParams"));
189 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
190 true, // GRPECS=true
191 false, // GRPLHCIF
192 false, // GRPMagField
193 false, // askMatLUT
195 inputs);
196 return DataProcessorSpec{
197 "cpv-pedestal-calibration",
198 inputs,
199 outputs,
200 AlgorithmSpec{adaptFromTask<device>(ccdbRequest)},
201 Options{
202 {"tf-per-slot", VariantType::UInt32, o2::calibration::INFINITE_TF, {"number of TFs per calibration time slot, if 0: finalize once statistics is reached"}},
203 {"max-delay", VariantType::UInt32, 1000u, {"number of slots in past to consider"}},
204 {"updateAtTheEndOfRunOnly", VariantType::Bool, false, {"finalize the slots and prepare the CCDB entries only at the end of the run."}},
205 {"updateInterval", VariantType::UInt32, 10u, {"try to finalize the slot (and produce calibration) when the updateInterval has passed.\n To be used together with tf-per-slot = 0"}}}};
206}
207} // namespace framework
208} // namespace o2
Utils and constants for calibration and related workflows.
int32_t i
Helper for geometry and GRP related CCDB requests.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
void checkUpdates(o2::framework::ProcessingContext &pc)
bool finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
CPVPedestalCalibratorSpec(std::shared_ptr< o2::base::GRPGeomRequest > req)
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
void printKeyValues(bool showProv=true, bool useLogger=false) const final
GLeglImageOES image
Definition glcorearb.h:4021
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
uint32_t TFType
Definition TimeSlot.h:29
constexpr TFType INFINITE_TF
Definition TimeSlot.h:30
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static void fillTFIDInfo(o2::framework::ProcessingContext &pc, o2::dataformats::TFIDInfo &ti)
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"
std::vector< Digit > digits