Project
Loading...
Searching...
No Matches
GainCalibratorSpec.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"
17#include "CCDB/CcdbApi.h"
18#include "CCDB/CcdbObjectInfo.h"
25
26using namespace o2::framework;
27
28namespace o2
29{
30namespace calibration
31{
33{
34 public:
35 CPVGainCalibratorSpec(std::shared_ptr<o2::base::GRPGeomRequest> req) : mCCDBRequest(req) {}
36
37 //_________________________________________________________________
39 {
41 auto updateInterval = ic.options().get<uint32_t>("updateInterval"); // in TF
42 bool updateAtTheEndOfRunOnly = ic.options().get<bool>("updateAtTheEndOfRunOnly");
43 mCalibrator = std::make_unique<o2::cpv::GainCalibrator>();
44 mCalibrator->setSlotLength(0); // infinite TF slot
45 mCalibrator->setMaxSlotsDelay(10000);
46 if (updateAtTheEndOfRunOnly) {
47 mCalibrator->setUpdateAtTheEndOfRunOnly();
48 }
49 mCalibrator->setCheckIntervalInfiniteSlot(updateInterval);
50 LOG(info) << "CPVGainCalibratorSpec initialized";
51 LOG(info) << "tf-per-slot = 0 (inconfigurable, this calibrator works only in single infinite slot mode)";
52 LOG(info) << "max-delay = 10000 (inconfigurable for this calibrator)";
53 LOG(info) << "updateInterval = " << updateInterval;
54 LOG(info) << "updateAtTheEndOfRunOnly = " << updateAtTheEndOfRunOnly;
55 }
56
57 void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
58 {
60 }
61
62 //_________________________________________________________________
64 {
66 o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
67 TFType tfcounter = mCalibrator->getCurrentTFInfo().startTime;
68
69 // update config
70 static bool isConfigFetched = false;
71 if (!isConfigFetched) {
72 LOG(info) << "GainCalibratorSpec::run() : fetching o2::cpv::CPVCalibParams from CCDB";
73 pc.inputs().get<o2::cpv::CPVCalibParams*>("calibparams");
74 LOG(info) << "GainCalibratorSpec::run() : o2::cpv::CPVCalibParams::Instance() now is following:";
76 mCalibrator->configParameters();
77 isConfigFetched = true;
78 }
79
80 // previous gains
81 if (!mCalibrator->isSettedPreviousGains()) {
82 const auto previousGains = pc.inputs().get<o2::cpv::CalibParams*>("gains");
83 if (previousGains) {
84 mCalibrator->setPreviousGains(new o2::cpv::CalibParams(*previousGains));
85 LOG(info) << "GainCalibratorSpec()::run() : I got previous gains";
86 }
87 }
88
89 // previous calib data
90 if (!mCalibrator->isSettedPreviousGainCalibData()) {
91 // const auto previousGainCalibData = o2::framework::DataRefUtils::as<CCDBSerialized<o2::cpv::GainCalibData>>(pc.inputs().get("calibdata"));
92 const auto previousGainCalibData = pc.inputs().get<o2::cpv::GainCalibData*>("calibdata");
93 if (previousGainCalibData) {
94 mCalibrator->setPreviousGainCalibData(new o2::cpv::GainCalibData(*previousGainCalibData));
95 LOG(info) << "GainCalibratorSpec()::run() : I got previous GainCalibData: ";
96 previousGainCalibData->print();
97 }
98 }
99
100 // process calib input
101 auto&& digits = pc.inputs().get<gsl::span<o2::cpv::Digit>>("calibdigs");
102
103 // fill statistics
104 LOG(detail) << "Processing TF " << tfcounter << " with " << digits.size() << " digits";
105 mCalibrator->process(digits); // fill TimeSlot with digits from 1 event and check slots for finalization
106
107 // inform about results and send output to ccdb
108 auto gainsInfoVecSize = mCalibrator->getCcdbInfoGainsVector().size();
109 if (gainsInfoVecSize) {
110 LOG(info) << "Created " << gainsInfoVecSize << " o2::cpv::CalibParams objects.";
111 sendOutput(pc.outputs());
112 }
113
114 // and send results to CCDB (if any)
115 if (gainsInfoVecSize) {
116 sendOutput(pc.outputs());
117 }
118 }
120 {
121 // prepare GainCalibData outputs and send it to ccdb
122 mCalibrator->prepareForEnding();
123 auto gainCDInfoVecSize = mCalibrator->getCcdbInfoGainCalibDataVector().size();
124 if (gainCDInfoVecSize) {
125 LOG(info) << "Created " << gainCDInfoVecSize << " o2::cpv::GainCalibData objects.";
126 sendOutput(ec.outputs());
127 }
128 }
129 //_________________________________________________________________
130 private:
131 std::unique_ptr<o2::cpv::GainCalibrator> mCalibrator;
132 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
133 //_________________________________________________________________
134 void sendOutput(DataAllocator& output)
135 {
136 bool isSomethingSent = false;
137 isSomethingSent = sendOutputWhat<o2::cpv::CalibParams>(mCalibrator->getGainsVector(), mCalibrator->getCcdbInfoGainsVector(), "CPV_Gains", output);
138 isSomethingSent += sendOutputWhat<o2::cpv::GainCalibData>(mCalibrator->getGainCalibDataVector(), mCalibrator->getCcdbInfoGainCalibDataVector(), "CPV_GainCD", output);
139
140 if (isSomethingSent) {
141 mCalibrator->initOutput(); // reset the outputs once they are already sent
142 }
143 }
144
145 template <class Payload>
146 bool sendOutputWhat(const std::vector<Payload>& payloadVec, std::vector<o2::ccdb::CcdbObjectInfo>& infoVec, header::DataDescription what, DataAllocator& output)
147 {
148 assert(payloadVec.size() == infoVec.size());
149 if (!payloadVec.size()) {
150 return false;
151 }
152
153 for (uint32_t i = 0; i < payloadVec.size(); i++) {
154 auto& w = infoVec[i];
155 auto image = o2::ccdb::CcdbApi::createObjectImage(&payloadVec[i], &w);
156 LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
157 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
158 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, what, i}, *image.get()); // vector<char>
159 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, what, i}, w); // root-serialized
160 }
161
162 return true;
163 }
164 //_________________________________________________________________
165}; // class CPVGainCalibratorSpec
166} // namespace calibration
167
168namespace framework
169{
170DataProcessorSpec getCPVGainCalibratorSpec()
171{
173
174 std::vector<InputSpec> inputs;
175 inputs.emplace_back("calibdigs", "CPV", "CALIBDIGITS", 0, Lifetime::Timeframe);
176 inputs.emplace_back("calibdata", "CPV", "CPV_GainCD", 0, Lifetime::Condition, ccdbParamSpec("CPV/PhysicsRun/GainCalibData"));
177 inputs.emplace_back("gains", "CPV", "CPV_Gains", 0, Lifetime::Condition, ccdbParamSpec("CPV/Calib/Gains"));
178 inputs.emplace_back("calibparams", "CPV", "CPV_CalibPars", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/CPVCalibParams"));
179
180 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
181 true, // GRPECS=true
182 false, // GRPLHCIF
183 false, // GRPMagField
184 false, // askMatLUT
186 inputs);
187 std::vector<OutputSpec> outputs;
188 // Length of data description ("CPV_Pedestals") must be < 16 characters.
189 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_Gains", 0}, Lifetime::Sporadic);
190 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_Gains", 0}, Lifetime::Sporadic);
191 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_GainCD", 0}, Lifetime::Sporadic);
192 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_GainCD", 0}, Lifetime::Sporadic);
193
194 return DataProcessorSpec{
195 "cpv-gain-calibration",
196 inputs,
197 outputs,
198 AlgorithmSpec{adaptFromTask<device>(ccdbRequest)},
199 Options{
200 {"updateAtTheEndOfRunOnly", VariantType::Bool, false, {"finalize the slots and prepare the CCDB entries only at the end of the run."}},
201 {"updateInterval", VariantType::UInt32, 100u, {"try to finalize the slot (and produce calibration) when the updateInterval has passed."}}}};
202}
203} // namespace framework
204} // 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)
CPVGainCalibratorSpec(std::shared_ptr< o2::base::GRPGeomRequest > req)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void init(o2::framework::InitContext &ic) final
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void run(o2::framework::ProcessingContext &pc) 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
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