Project
Loading...
Searching...
No Matches
NoiseCalibSpec.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"
40
41using namespace o2::framework;
42
43namespace o2
44{
45namespace zdc
46{
47
49{
50 mTimer.Stop();
51 mTimer.Reset();
52}
53
55{
56 mTimer.Stop();
57 mTimer.Reset();
58}
59
61{
62 mVerbosity = ic.options().get<int>("verbosity-level");
63 mWorker.setVerbosity(mVerbosity);
64 mTimer.Start(false);
65}
66
68{
69 // we call these methods just to trigger finaliseCCDB callback
70 pc.inputs().get<o2::zdc::ModuleConfig*>("moduleconfig");
71}
72
74{
75 if (matcher == ConcreteDataMatcher("ZDC", "MODULECONFIG", 0)) {
76 auto* config = (const o2::zdc::ModuleConfig*)obj;
77 if (mVerbosity > DbgZero) {
78 config->print();
79 }
80 mWorker.setModuleConfig(config);
81 }
82}
83
85{
86 if (!mInitialized) {
87 mInitialized = true;
89 mOutput = &(pc.outputs());
90 mHistoFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
91 mHistoFileMetaData->setDataTakingContext(pc.services().get<o2::framework::DataTakingContext>());
92 mTimer.Stop();
93 mTimer.Reset();
94 mTimer.Start(false);
95 }
96 if (mRunStartTime == 0) {
97 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
98 mRunStartTime = tinfo.creation; // approximate time in ms
99 mRunNumber = tinfo.runNumber;
100 }
101 {
102 std::vector<InputSpec> filterHisto = {{"noise_1dh", ConcreteDataTypeMatcher{"ZDC", "NOISE_1DH"}, Lifetime::Sporadic}};
103 for (auto const& inputRef : InputRecordWalker(pc.inputs(), filterHisto)) {
104 auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
105 o2::dataformats::FlatHisto1D<double> histoView(pc.inputs().get<gsl::span<double>>(inputRef));
106 mWorker.add(dh->subSpecification, 0, histoView);
107 }
108 }
109 {
110 std::vector<InputSpec> filterHisto = {{"noise_1dh_s", ConcreteDataTypeMatcher{"ZDC", "NOISE_1DH_S"}, Lifetime::Sporadic}};
111 for (auto const& inputRef : InputRecordWalker(pc.inputs(), filterHisto)) {
112 auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
113 o2::dataformats::FlatHisto1D<double> histoView(pc.inputs().get<gsl::span<double>>(inputRef));
114 mWorker.add(dh->subSpecification, 1, histoView);
115 }
116 }
117 {
118 std::vector<InputSpec> filterHisto = {{"noise_1dh_d", ConcreteDataTypeMatcher{"ZDC", "NOISE_1DH_D"}, Lifetime::Sporadic}};
119 for (auto const& inputRef : InputRecordWalker(pc.inputs(), filterHisto)) {
120 auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
121 o2::dataformats::FlatHisto1D<double> histoView(pc.inputs().get<gsl::span<double>>(inputRef));
122 mWorker.add(dh->subSpecification, 2, histoView);
123 }
124 }
125 auto data = pc.inputs().get<o2::zdc::NoiseCalibSummaryData*>("noisecalibdata");
126 mWorker.process(data.get());
127}
128
130{
131 mWorker.endOfRun();
132 mTimer.Stop();
133 sendOutput(ec);
134 LOGF(info, "ZDC Noise calibration total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
135}
136
137//________________________________________________________________
139{
140 std::string fn = "ZDC_NoiseCalib";
142
143 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
144 // TODO in principle, this routine is generic, can be moved to Utils.h
146 const auto& payload = mWorker.getParam();
147 auto& info = mWorker.getCcdbObjectInfo();
148 const auto& opt = CalibParamZDC::Instance();
149 opt.updateCcdbObjectInfo(info);
150
151 auto image = o2::ccdb::CcdbApi::createObjectImage<NoiseParam>(&payload, &info);
152 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
153 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
154 if (mVerbosity > DbgMinimal) {
155 payload.print();
156 }
157 mOutput->snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "ZDCNoisecalib", 0}, *image.get()); // vector<char>
158 mOutput->snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "ZDCNoisecalib", 0}, info); // root-serialized
159 // TODO: reset the outputs once they are already sent (is it necessary?)
160 // mWorker.init();
161
162 if (opt.rootOutput == true) {
163 mOutputDir = opt.outputDir;
164 if (mOutputDir.compare("/dev/null")) {
165 mHistoFileName = fmt::format("{}{}{}_{}.root", mOutputDir, mOutputDir.back() == '/' ? "" : "/", fn, mRunNumber);
166 int rval = mWorker.saveDebugHistos(mHistoFileName);
167 if (rval) {
168 LOG(error) << "Cannot create output file " << mHistoFileName;
169 return;
170 }
171 std::string metaFileDir = opt.metaFileDir;
172 if (metaFileDir.compare("/dev/null")) {
173 mHistoFileMetaData->fillFileData(mHistoFileName);
174 mHistoFileMetaData->type = "calib";
175 mHistoFileMetaData->priority = "high";
176 std::string metaFileNameTmp = metaFileDir + (metaFileDir.back() == '/' ? "" : "/") + fmt::format("{}_{}.tmp", fn, mRunNumber);
177 std::string metaFileName = metaFileDir + (metaFileDir.back() == '/' ? "" : "/") + fmt::format("{}_{}.done", fn, mRunNumber);
178 try {
179 std::ofstream metaFileOut(metaFileNameTmp);
180 metaFileOut << *mHistoFileMetaData.get();
181 metaFileOut.close();
182 std::filesystem::rename(metaFileNameTmp, metaFileName);
183 } catch (std::exception const& e) {
184 LOG(error) << "Failed to store ZDC meta data file " << metaFileName << ", reason: " << e.what();
185 }
186 LOG(info) << "Stored metadata file " << metaFileName << ".done";
187 } else {
188 LOG(info) << "Did not store metafile as meta-dir=" << metaFileDir;
189 }
190 } else {
191 LOG(warn) << "Do not create output file since output dir is " << mOutputDir;
192 }
193 }
194}
195
197{
198 using device = o2::zdc::NoiseCalibSpec;
200
201 std::vector<InputSpec> inputs;
202 inputs.emplace_back("noisecalibdata", "ZDC", "NOISECALIBDATA", 0, Lifetime::Sporadic);
203 inputs.emplace_back("moduleconfig", "ZDC", "MODULECONFIG", 0, Lifetime::Condition, o2::framework::ccdbParamSpec(o2::zdc::CCDBPathConfigModule.data()));
204 inputs.emplace_back("noise_1dh", ConcreteDataTypeMatcher{"ZDC", "NOISE_1DH"}, Lifetime::Sporadic);
205 inputs.emplace_back("noise_1dh_s", ConcreteDataTypeMatcher{"ZDC", "NOISE_1DH_S"}, Lifetime::Sporadic);
206 inputs.emplace_back("noise_1dh_d", ConcreteDataTypeMatcher{"ZDC", "NOISE_1DH_D"}, Lifetime::Sporadic);
207
208 std::vector<OutputSpec> outputs;
209 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "ZDCNoisecalib"}, Lifetime::Sporadic);
210 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "ZDCNoisecalib"}, Lifetime::Sporadic);
211
212 return DataProcessorSpec{
213 "zdc-calib-noise",
214 inputs,
215 outputs,
216 AlgorithmSpec{adaptFromTask<device>()},
217 Options{{"verbosity-level", o2::framework::VariantType::Int, 1, {"Verbosity level"}}}};
218}
219
220} // namespace zdc
221} // namespace o2
#define verbosity
ZDC calibration common parameters.
A helper class to iteratate over all parts of all input routes.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
Definition of the Names Generator class.
Format of noise calibration intermediate data.
void snapshot(const Output &spec, T const &object)
ConfigParamRegistry const & options()
Definition InitContext.h:33
A helper class to iteratate over all parts of all input routes.
decltype(auto) get(R binding, int part=0) const
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.
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void init(o2::framework::InitContext &ic) final
void updateTimeDependentParams(o2::framework::ProcessingContext &pc)
void sendOutput(o2::framework::EndOfStreamContext &ec)
void run(o2::framework::ProcessingContext &pc) final
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void add(int ih, int iarr, o2::dataformats::FlatHisto1D< double > &h1)
void setVerbosity(int v)
Definition NoiseCalib.h:48
int process(const o2::zdc::NoiseCalibSummaryData *data)
CcdbObjectInfo & getCcdbObjectInfo()
Definition NoiseCalib.h:46
NoiseParam & getParam()
Definition NoiseCalib.h:52
int saveDebugHistos(const std::string fn="ZDCNoiseCalib.root")
void setModuleConfig(const ModuleConfig *moduleConfig)
Definition NoiseCalib.h:34
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
framework::DataProcessorSpec getNoiseCalibSpec()
constexpr int DbgMinimal
Definition Constants.h:208
constexpr int DbgZero
Definition Constants.h:207
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"