Project
Loading...
Searching...
No Matches
BaselineCalibSpec.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
15
16#include <iostream>
17#include <vector>
18#include <string>
19#include <gsl/span>
20#include <filesystem>
23#include "CCDB/CcdbApi.h"
24#include "Framework/Logger.h"
40using namespace o2::framework;
41
42namespace o2
43{
44namespace zdc
45{
46
48{
49 mTimer.Stop();
50 mTimer.Reset();
51}
52
54{
55 mTimer.Stop();
56 mTimer.Reset();
57}
58
60{
61 mVerbosity = ic.options().get<int>("verbosity-level");
62 mWorker.setVerbosity(mVerbosity);
63 const auto& opt = CalibParamZDC::Instance();
64 mCTimeMod = opt.mCTimeMod;
65 LOG(info) << "BaselineCalibSpec::init: mVerbosity=" << mVerbosity << " mCTimeMod=" << mCTimeMod;
66 mProcessed = 0;
67}
68
70{
71 // we call these methods just to trigger finaliseCCDB callback
72 pc.inputs().get<o2::zdc::ModuleConfig*>("moduleconfig");
73 pc.inputs().get<o2::zdc::BaselineCalibConfig*>("calibconfig");
74}
75
77{
78 if (matcher == ConcreteDataMatcher("ZDC", "MODULECONFIG", 0)) {
79 mWorker.setModuleConfig((const o2::zdc::ModuleConfig*)obj);
80 }
81 if (matcher == ConcreteDataMatcher("ZDC", "BASECALIBCONFIG", 0)) {
82 mWorker.setConfig((const o2::zdc::BaselineCalibConfig*)obj);
83 }
84}
85
87{
88 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
89 const auto* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(pc.inputs().getFirstValid(true));
90
91#ifdef O2_ZDC_DEBUG
92 LOG(info) << "BaselineCalibSpec::run mInitialized=" << mInitialized << " run(ti:dh)=" << tinfo.runNumber << ":" << dh->runNumber << " mRunStartTime=" << mRunStartTime << " mProcessed " << mProcessed;
93#endif
94
95 // Close calibration if a new run has started or we are receiving data from another run
96 if (mInitialized && (tinfo.globalRunNumberChanged == true || mRunNumber != tinfo.runNumber)) {
97 if (mProcessed != 0) {
98 mProcessed = 0;
99 mWorker.endOfRun();
100 sendOutput(); // Send output and ask for a reset of the worker
101 }
102 reset();
103 mTimer.Stop();
104 LOGF(info, "ZDC Baseline calibration: run change. Timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
105 }
106
107 // Initialization at startup or after a reset
108 if (!mInitialized) {
109 mInitialized = true;
111 mOutput = &(pc.outputs());
112 mHistoFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
113 mHistoFileMetaData->setDataTakingContext(pc.services().get<o2::framework::DataTakingContext>());
114 mTimer.Stop();
115 mTimer.Reset();
116 mTimer.Start(false);
117 mRunStartTime = tinfo.creation; // approximate time in ms
118 mRunNumber = tinfo.runNumber; // new current run number
119 }
120
121 auto data = pc.inputs().get<o2::zdc::BaselineCalibSummaryData*>("basecalibdata");
122 mWorker.process(data.get());
123 mProcessed++;
124 // Send intermediate calibration data if enough statistics has been collected
125 if (mCTimeMod > 0) {
126 auto& outd = mWorker.getData();
127 auto reft = mCTimeEnd == 0 ? outd.mCTimeBeg : mCTimeEnd;
128 if ((reft + mCTimeMod) < outd.mCTimeEnd) {
129 // Send output to CCDB but don't reset structures
130 mProcessed = 0;
131 mWorker.endOfRun();
132 sendOutput();
133 mCTimeEnd = outd.mCTimeEnd;
134 }
135 }
136
137 if (mInitialized && pc.transitionState() == TransitionHandlingState::Requested) {
138 if (mProcessed != 0) {
139 mProcessed = 0;
140 mWorker.endOfRun();
141 sendOutput(); // Send output and ask for a reset of the worker
142 }
143 reset();
144 mTimer.Stop();
145 LOGF(info, "ZDC Baseline calibration: transition. Timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
146 }
147}
148
150{
151 if (mInitialized) {
152 if (mProcessed != 0) {
153 mProcessed = 0;
154 mWorker.endOfRun();
155 sendOutput(); // Send output and ask for a reset of the worker
156 }
157 reset();
158 mTimer.Stop();
159 LOGF(info, "ZDC Baseline calibration: end of stream. Timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
160 }
161}
162
163//________________________________________________________________
165{
166 mWorker.resetInitFlag();
167 mInitialized = false;
168}
169
170//________________________________________________________________
172{
173 std::string fn = "ZDC_BaselineCalib";
174
175 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
176 // TODO in principle, this routine is generic, can be moved to Utils.h
178 const auto& payload = mWorker.getParamUpd();
179 auto& info = mWorker.getCcdbObjectInfo();
180 const auto& opt = CalibParamZDC::Instance();
181 opt.updateCcdbObjectInfo(info);
182
183 auto image = o2::ccdb::CcdbApi::createObjectImage<BaselineParam>(&payload, &info);
184 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
185 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
186 if (mVerbosity > DbgMinimal) {
187 payload.print();
188 }
189
190 mOutput->snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "ZDCBaselinecalib", 0}, *image.get()); // vector<char>
191 mOutput->snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "ZDCBaselinecalib", 0}, info); // root-serialized
192
193 if (opt.rootOutput == true) {
194 mOutputDir = opt.outputDir;
195 if (mOutputDir.compare("/dev/null")) {
196 mHistoFileName = fmt::format("{}{}{}_{}.root", mOutputDir, mOutputDir.back() == '/' ? "" : "/", fn, mRunNumber);
197 int rval = mWorker.saveDebugHistos(mHistoFileName);
198 if (rval) {
199 LOG(error) << "Cannot create output file " << mHistoFileName;
200 return;
201 }
202 std::string metaFileDir = opt.metaFileDir;
203 if (metaFileDir.compare("/dev/null")) {
204 mHistoFileMetaData->fillFileData(mHistoFileName);
205 mHistoFileMetaData->type = "calib";
206 mHistoFileMetaData->priority = "high";
207 std::string metaFileNameTmp = metaFileDir + (metaFileDir.back() == '/' ? "" : "/") + fmt::format("{}_{}.tmp", fn, mRunNumber);
208 std::string metaFileName = metaFileDir + (metaFileDir.back() == '/' ? "" : "/") + fmt::format("{}_{}.done", fn, mRunNumber);
209 try {
210 std::ofstream metaFileOut(metaFileNameTmp);
211 metaFileOut << *mHistoFileMetaData.get();
212 metaFileOut.close();
213 std::filesystem::rename(metaFileNameTmp, metaFileName);
214 } catch (std::exception const& e) {
215 LOG(error) << "Failed to store ZDC meta data file " << metaFileName << ", reason: " << e.what();
216 }
217 LOG(info) << "Stored metadata file " << metaFileName << ".done";
218 } else {
219 LOG(info) << "Did not store metafile as meta-dir=" << metaFileDir;
220 }
221 } else {
222 LOG(warn) << "Do not create output file since output dir is " << mOutputDir;
223 }
224 }
225}
226
228{
229 using device = o2::zdc::BaselineCalibSpec;
231
232 std::vector<InputSpec> inputs;
233 inputs.emplace_back("basecalibdata", "ZDC", "BASECALIBDATA", 0, Lifetime::Sporadic);
234 inputs.emplace_back("calibconfig", "ZDC", "BASECALIBCONFIG", 0, Lifetime::Condition, o2::framework::ccdbParamSpec(o2::zdc::CCDBPathBaselineCalibConfig.data()));
235 inputs.emplace_back("moduleconfig", "ZDC", "MODULECONFIG", 0, Lifetime::Condition, o2::framework::ccdbParamSpec(o2::zdc::CCDBPathConfigModule.data()));
236
237 std::vector<OutputSpec> outputs;
238 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "ZDCBaselinecalib"}, Lifetime::Sporadic);
239 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "ZDCBaselinecalib"}, Lifetime::Sporadic);
240
241 return DataProcessorSpec{
242 "zdc-calib-baseline",
243 inputs,
244 outputs,
245 AlgorithmSpec{adaptFromTask<device>()},
246 Options{{"verbosity-level", o2::framework::VariantType::Int, 1, {"Verbosity level"}}}};
247}
248
249} // namespace zdc
250} // namespace o2
#define verbosity
Baseline calibration intermediate data.
ZDC calibration common parameters.
A helper class to iteratate over all parts of all input routes.
Definition of the Names Generator class.
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
Definition InitContext.h:33
decltype(auto) get(R binding, int part=0) const
DataRef getFirstValid(bool throwOnFailure=false) const
Get the ref of the first valid input. If requested, throw an error if none is found.
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
TransitionHandlingState transitionState() const
void updateTimeDependentParams(o2::framework::ProcessingContext &pc)
void run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
int process(const o2::zdc::BaselineCalibSummaryData *data)
CcdbObjectInfo & getCcdbObjectInfo()
BaselineCalibData & getData()
void setModuleConfig(const ModuleConfig *moduleConfig)
BaselineParam & getParamUpd()
int saveDebugHistos(const std::string fn="ZDCBaselineCalib.root")
void setConfig(const BaselineCalibConfig *param)
GLeglImageOES image
Definition glcorearb.h:4021
GLboolean * data
Definition glcorearb.h:298
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)
std::vector< ConfigParamSpec > Options
struct o2::upgrades_utils::@463 zdc
structure to keep FT0 information
const std::string CCDBPathBaselineCalibConfig
Definition Constants.h:230
framework::DataProcessorSpec getBaselineCalibSpec()
constexpr int DbgMinimal
Definition Constants.h:208
const std::string CCDBPathConfigModule
Definition Constants.h:219
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"