Project
Loading...
Searching...
No Matches
NoiseCalibratorSpec.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 CPVNoiseCalibratorSpec(std::shared_ptr<o2::base::GRPGeomRequest> req) : mCCDBRequest(req) {}
36
37 //_________________________________________________________________
39 {
41 auto slotL = ic.options().get<uint32_t>("tf-per-slot");
42 auto delay = ic.options().get<uint32_t>("max-delay");
43 auto updateInterval = ic.options().get<uint32_t>("updateInterval");
44 bool updateAtTheEndOfRunOnly = ic.options().get<bool>("updateAtTheEndOfRunOnly");
45 mCalibrator = std::make_unique<o2::cpv::NoiseCalibrator>();
46 mCalibrator->setSlotLength(slotL);
47 mCalibrator->setMaxSlotsDelay(delay);
48 if (updateAtTheEndOfRunOnly) {
49 mCalibrator->setUpdateAtTheEndOfRunOnly();
50 }
51 mCalibrator->setCheckIntervalInfiniteSlot(updateInterval);
52 LOG(info) << "CPVNoiseCalibratorSpec initialized";
53 LOG(info) << "tf-per-slot = " << slotL;
54 LOG(info) << "max-delay = " << delay;
55 LOG(info) << "updateInterval = " << updateInterval;
56 LOG(info) << "updateAtTheEndOfRunOnly = " << updateAtTheEndOfRunOnly;
57 }
58
59 void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
60 {
62 if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_PedEffs", 0)) {
63 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/PedestalRun/ChannelEfficiencies";
64 auto pedEffs = static_cast<std::vector<float>*>(obj);
65 mCalibrator->setPedEfficiencies(pedEffs);
66 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got pedestal efficiencies vetor of size " << pedEffs->size();
67 return;
68 }
69 if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_DeadChnls", 0)) {
70 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/PedestalRun/DeadChannels";
71 auto deadChs = static_cast<std::vector<int>*>(obj);
72 mCalibrator->setDeadChannels(deadChs);
73 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got dead channels vetor of size " << deadChs->size();
74 return;
75 }
76 if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_HighThrs", 0)) {
77 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/PedestalRun/HighPedChannels";
78 auto highPeds = static_cast<std::vector<int>*>(obj);
79 mCalibrator->setHighPedChannels(highPeds);
80 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got high pedestals vetor of size " << highPeds->size();
81 return;
82 }
83 if (matcher == framework::ConcreteDataMatcher("CPV", "CPV_PersiBads", 0)) {
84 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : accessing CPV/Config/PersistentBadChannels";
85 auto persBadChs = static_cast<std::vector<int>*>(obj);
86 mCalibrator->setPersistentBadChannels(persBadChs);
87 LOG(info) << "NoiseCalibratorSpec::finaliseCCDB() : I got persistent bad channels vector of size " << persBadChs->size();
88 return;
89 }
90 }
91
92 //_________________________________________________________________
94 {
96 o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
97 TFType tfcounter = mCalibrator->getCurrentTFInfo().startTime;
98
99 // fetch ccdb objects
100 static bool isConfigFetched = false;
101 if (!isConfigFetched) {
102 pc.inputs().get<std::vector<float>*>("pedeffs");
103 pc.inputs().get<std::vector<int>*>("persbadchs");
104 pc.inputs().get<std::vector<int>*>("deadchs");
105 pc.inputs().get<std::vector<int>*>("highpeds");
106
107 LOG(info) << "NoiseCalibratorSpec::run() : fetching o2::cpv::CPVCalibParams from CCDB";
108 pc.inputs().get<o2::cpv::CPVCalibParams*>("calibparams");
109 LOG(info) << "NoiseCalibratorSpec::run() : o2::cpv::CPVCalibParams::Instance() now is following:";
111 mCalibrator->configParameters();
112 isConfigFetched = true;
113 }
114
115 // process data
116 auto&& digits = pc.inputs().get<gsl::span<o2::cpv::Digit>>("digits");
117 auto&& trigrecs = pc.inputs().get<gsl::span<o2::cpv::TriggerRecord>>("trigrecs");
118
119 LOG(detail) << "Processing TF " << tfcounter << " with " << digits.size() << " digits in " << trigrecs.size() << " trigger records.";
120 auto& slotTF = mCalibrator->getSlotForTF(tfcounter);
121
122 for (auto trigrec = trigrecs.begin(); trigrec != trigrecs.end(); trigrec++) { // event loop
123 // here we're filling TimeSlot event by event
124 // and when last event is reached we call mCalibrator->process() to finalize the TimeSlot
125 auto&& digitsInOneEvent = digits.subspan((*trigrec).getFirstEntry(), (*trigrec).getNumberOfObjects());
126 if ((trigrec + 1) == trigrecs.end()) { // last event in current TF, let's process corresponding TimeSlot
127 // LOG(info) << "last event, I call mCalibrator->process()";
128 mCalibrator->process(digitsInOneEvent); // fill TimeSlot with digits from 1 event and check slots for finalization
129 } else {
130 slotTF.getContainer()->fill(digitsInOneEvent); // fill TimeSlot with digits from 1 event
131 }
132 }
133
134 auto infoVecSize = mCalibrator->getCcdbInfoBadChannelMapVector().size();
135 auto badMapVecSize = mCalibrator->getBadChannelMapVector().size();
136 if (infoVecSize > 0) {
137 LOG(detail) << "Created " << infoVecSize << " ccdb infos and " << badMapVecSize << " BadChannelMap objects for TF " << tfcounter;
138 }
139 sendOutput(pc.outputs());
140 }
141 //_________________________________________________________________
142 private:
143 std::unique_ptr<o2::cpv::NoiseCalibrator> mCalibrator;
144 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
145
146 void sendOutput(DataAllocator& output)
147 {
148 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
149 // TO NOT(!) DO in principle, this routine is non-generic(!), can be moved to Utils.h
150 // if there are more than 1 calibration objects to output
151
152 // send o2::cpv::BadChannelMap
153 const auto& payloadVec = mCalibrator->getBadChannelMapVector();
154 auto&& infoVec = mCalibrator->getCcdbInfoBadChannelMapVector(); // use non-const version as we update it
155
156 assert(payloadVec.size() == infoVec.size());
157 if (payloadVec.size() == 0) { // don't need to do anything if there is nothing to send
158 return;
159 }
160
161 for (uint32_t i = 0; i < payloadVec.size(); i++) {
162 auto& w = infoVec[i];
163 auto image = o2::ccdb::CcdbApi::createObjectImage(&(payloadVec[i]), &w);
164 LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
165 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
166 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_BadMap", i}, *image.get()); // vector<char>
167 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_BadMap", i}, w); // root-serialized
168 }
169 mCalibrator->initOutput(); // reset the outputs once they are already sent
170 }
171}; // class CPVNoiseCalibratorSpec
172} // namespace calibration
173
174namespace framework
175{
176DataProcessorSpec getCPVNoiseCalibratorSpec()
177{
179
180 std::vector<InputSpec> inputs;
181 inputs.emplace_back("digits", "CPV", "DIGITS", 0, Lifetime::Timeframe);
182 inputs.emplace_back("trigrecs", "CPV", "DIGITTRIGREC", 0, Lifetime::Timeframe);
183 inputs.emplace_back("pedeffs", "CPV", "CPV_PedEffs", 0, Lifetime::Condition, ccdbParamSpec("CPV/PedestalRun/ChannelEfficiencies"));
184 inputs.emplace_back("deadchs", "CPV", "CPV_DeadChnls", 0, Lifetime::Condition, ccdbParamSpec("CPV/PedestalRun/DeadChannels"));
185 inputs.emplace_back("highpeds", "CPV", "CPV_HighThrs", 0, Lifetime::Condition, ccdbParamSpec("CPV/PedestalRun/HighPedChannels"));
186 inputs.emplace_back("calibparams", "CPV", "CPV_CalibPars", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/CPVCalibParams"));
187 inputs.emplace_back("persbadchs", "CPV", "CPV_PersiBads", 0, Lifetime::Condition, ccdbParamSpec("CPV/Config/PersistentBadChannels"));
188
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 std::vector<OutputSpec> outputs;
197 // Length of data description ("CPV_Pedestals") must be < 16 characters.
198 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "CPV_BadMap", 0}, Lifetime::Sporadic);
199 outputs.emplace_back(ConcreteDataMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "CPV_BadMap", 0}, Lifetime::Sporadic);
200
201 return DataProcessorSpec{
202 "cpv-noise-calibration",
203 inputs,
204 outputs,
205 AlgorithmSpec{adaptFromTask<device>(ccdbRequest)},
206 Options{
207 {"tf-per-slot", VariantType::UInt32, o2::calibration::INFINITE_TF, {"number of TFs per calibration time slot, if 0: finalize once statistics is reached"}},
208 {"max-delay", VariantType::UInt32, 1000u, {"number of slots in past to consider"}},
209 {"updateAtTheEndOfRunOnly", VariantType::Bool, false, {"finalize the slots and prepare the CCDB entries only at the end of the run."}},
210 {"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"}}}};
211}
212} // namespace framework
213} // 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)
void run(o2::framework::ProcessingContext &pc) final
CPVNoiseCalibratorSpec(std::shared_ptr< o2::base::GRPGeomRequest > req)
void init(o2::framework::InitContext &ic) final
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) 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