Project
Loading...
Searching...
No Matches
InterCalibSpec.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 <filesystem>
21#include "CCDB/CcdbApi.h"
22#include "Framework/Logger.h"
43
44using namespace o2::framework;
45
46namespace o2::zdc
47{
48
50{
51 mTimer.Stop();
52 mTimer.Reset();
53}
54
56{
57 mTimer.Stop();
58 mTimer.Reset();
59}
60
62{
63 mVerbosity = ic.options().get<int>("verbosity-level");
64 mWorker.setVerbosity(mVerbosity);
65 mTimer.Start(false);
66}
67
69{
70 // we call these methods just to trigger finaliseCCDB callback
71 pc.inputs().get<o2::zdc::InterCalibConfig*>("intercalibconfig");
72 pc.inputs().get<o2::zdc::ZDCEnergyParam*>("energycalib");
73 pc.inputs().get<o2::zdc::ZDCTowerParam*>("towercalib");
74}
75
77{
78 if (matcher == ConcreteDataMatcher("ZDC", "INTERCALIBCONFIG", 0)) {
79 // InterCalib configuration
80 auto* config = (const o2::zdc::InterCalibConfig*)obj;
81 if (mVerbosity > DbgZero) {
82 config->print();
83 }
84 mWorker.setInterCalibConfig(config);
85 }
86 if (matcher == ConcreteDataMatcher("ZDC", "ENERGYCALIB", 0)) {
87 // Current energy calibration
88 auto* config = (const o2::zdc::ZDCEnergyParam*)obj;
89 if (mVerbosity > DbgZero) {
90 config->print();
91 }
92 mWorker.setEnergyParam(config);
93 }
94 if (matcher == ConcreteDataMatcher("ZDC", "TOWERCALIB", 0)) {
95 // Tower intercalibration
96 auto* config = (const o2::zdc::ZDCTowerParam*)obj;
97 if (mVerbosity > DbgZero) {
98 config->print();
99 }
100 mWorker.setTowerParam(config);
101 }
102}
103
105{
106 if (!mInitialized) {
107 mInitialized = true;
109 mOutput = &(pc.outputs());
110 mHistoFileMetaData = std::make_unique<o2::dataformats::FileMetaData>();
111 mHistoFileMetaData->setDataTakingContext(pc.services().get<o2::framework::DataTakingContext>());
112 mTimer.Stop();
113 mTimer.Reset();
114 mTimer.Start(false);
115 }
116 if (mRunStartTime == 0) {
117 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
118 mRunStartTime = tinfo.creation; // approximate time in ms
119 mRunNumber = tinfo.runNumber;
120 }
121 {
122 std::vector<InputSpec> filterHisto = {{"inter_1dh", ConcreteDataTypeMatcher{"ZDC", "INTER_1DH"}, Lifetime::Timeframe}};
123 for (auto const& inputRef : InputRecordWalker(pc.inputs(), filterHisto)) {
124 auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
125 o2::dataformats::FlatHisto1D<float> histoView(pc.inputs().get<gsl::span<float>>(inputRef));
126 mWorker.add(dh->subSpecification, histoView);
127 }
128 }
129 {
130 std::vector<InputSpec> filterHisto = {{"inter_2dh", ConcreteDataTypeMatcher{"ZDC", "INTER_2DH"}, Lifetime::Timeframe}};
131 for (auto const& inputRef : InputRecordWalker(pc.inputs(), filterHisto)) {
132 auto const* dh = framework::DataRefUtils::getHeader<o2::header::DataHeader*>(inputRef);
133 o2::dataformats::FlatHisto2D<float> histoView(pc.inputs().get<gsl::span<float>>(inputRef));
134 mWorker.add(dh->subSpecification, histoView);
135 }
136 }
137 auto data = pc.inputs().get<InterCalibData>("intercalibdata");
138 mWorker.process(data);
139}
140
142{
143 mWorker.endOfRun();
144 mTimer.Stop();
145 sendOutput(ec);
146 LOGF(info, "ZDC Intercalibration total timing: Cpu: %.3e Real: %.3e s in %d slots", mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
147}
148
149//________________________________________________________________
151{
152 std::string fn = "ZDC_interCalib";
154
155 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
156 // TODO in principle, this routine is generic, can be moved to Utils.h
158 const auto& payload = mWorker.getTowerParamUpd();
159 auto& info = mWorker.getCcdbObjectInfo();
160 const auto& opt = CalibParamZDC::Instance();
161 opt.updateCcdbObjectInfo(info);
162
163 auto image = o2::ccdb::CcdbApi::createObjectImage<ZDCTowerParam>(&payload, &info);
164 LOG(info) << "Sending object " << info.getPath() << "/" << info.getFileName() << " of size " << image->size()
165 << " bytes, valid for " << info.getStartValidityTimestamp() << " : " << info.getEndValidityTimestamp();
166 if (mVerbosity > DbgMinimal) {
167 payload.print();
168 }
169 mOutput->snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "ZDC_Intercalib", 0}, *image.get()); // vector<char>
170 mOutput->snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "ZDC_Intercalib", 0}, info); // root-serialized
171 // TODO: reset the outputs once they are already sent (is it necessary?)
172 // mWorker.init();
173
174 if (opt.rootOutput == true) {
175 mOutputDir = opt.outputDir;
176 if (mOutputDir.compare("/dev/null")) {
177 mHistoFileName = fmt::format("{}{}{}_{}.root", mOutputDir, mOutputDir.back() == '/' ? "" : "/", fn, mRunNumber);
178 int rval = mWorker.saveDebugHistos(mHistoFileName);
179 if (rval) {
180 LOG(error) << "Cannot create output file " << mHistoFileName;
181 return;
182 }
183 std::string metaFileDir = opt.metaFileDir;
184 if (metaFileDir.compare("/dev/null")) {
185 mHistoFileMetaData->fillFileData(mHistoFileName);
186 mHistoFileMetaData->type = "calib";
187 mHistoFileMetaData->priority = "high";
188 std::string metaFileNameTmp = metaFileDir + (metaFileDir.back() == '/' ? "" : "/") + fmt::format("{}_{}.tmp", fn, mRunNumber);
189 std::string metaFileName = metaFileDir + (metaFileDir.back() == '/' ? "" : "/") + fmt::format("{}_{}.done", fn, mRunNumber);
190 try {
191 std::ofstream metaFileOut(metaFileNameTmp);
192 metaFileOut << *mHistoFileMetaData.get();
193 metaFileOut.close();
194 std::filesystem::rename(metaFileNameTmp, metaFileName);
195 } catch (std::exception const& e) {
196 LOG(error) << "Failed to store ZDC meta data file " << metaFileName << ", reason: " << e.what();
197 }
198 LOG(info) << "Stored metadata file " << metaFileName << ".done";
199 } else {
200 LOG(info) << "Did not store metafile as meta-dir=" << metaFileDir;
201 }
202 } else {
203 LOG(warn) << "Do not create output file since output dir is " << mOutputDir;
204 }
205 }
206}
207
209{
210 using device = o2::zdc::InterCalibSpec;
212
213 std::vector<InputSpec> inputs;
214 inputs.emplace_back("intercalibconfig", "ZDC", "INTERCALIBCONFIG", 0, Lifetime::Condition, o2::framework::ccdbParamSpec(o2::zdc::CCDBPathInterCalibConfig.data()));
215 inputs.emplace_back("energycalib", "ZDC", "ENERGYCALIB", 0, Lifetime::Condition, o2::framework::ccdbParamSpec(o2::zdc::CCDBPathEnergyCalib.data()));
216 inputs.emplace_back("towercalib", "ZDC", "TOWERCALIB", 0, Lifetime::Condition, o2::framework::ccdbParamSpec(o2::zdc::CCDBPathTowerCalib.data()));
217 inputs.emplace_back("intercalibdata", "ZDC", "INTERCALIBDATA", 0, Lifetime::Timeframe);
218 inputs.emplace_back("inter_1dh", ConcreteDataTypeMatcher{"ZDC", "INTER_1DH"}, Lifetime::Timeframe);
219 inputs.emplace_back("inter_2dh", ConcreteDataTypeMatcher{"ZDC", "INTER_2DH"}, Lifetime::Timeframe);
220
221 std::vector<OutputSpec> outputs;
222 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "ZDC_Intercalib"}, Lifetime::Sporadic);
223 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "ZDC_Intercalib"}, Lifetime::Sporadic);
224
225 return DataProcessorSpec{
226 "zdc-calib-towers",
227 inputs,
228 outputs,
229 AlgorithmSpec{adaptFromTask<device>()},
230 Options{{"verbosity-level", o2::framework::VariantType::Int, 1, {"Verbosity level"}}}};
231}
232
233} // namespace o2
#define verbosity
Class to describe fired triggered and/or stored channels for the BC and to refer to channel data.
ZDC calibration common parameters.
A helper class to iteratate over all parts of all input routes.
ZDC baseline calibration.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
Definition of the Names Generator class.
Class to describe pedestal data accumulated over the orbit.
Class to describe reconstructed ZDC event (single BC with signal in one of detectors)
ZDC reconstruction parameters.
ZDC Energy calibration.
ZDC Tower calibration.
Container class to store NTimeBinsPerBC ADC values of single ZDC channel.
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 sendOutput(o2::framework::EndOfStreamContext &ec)
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void init(o2::framework::InitContext &ic) final
void updateTimeDependentParams(o2::framework::ProcessingContext &pc)
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, o2::dataformats::FlatHisto1D< float > &h1)
CcdbObjectInfo & getCcdbObjectInfo()
Definition InterCalib.h:74
void setVerbosity(int v)
Definition InterCalib.h:85
int saveDebugHistos(const std::string fn="ZDCInterCalib.root")
void setInterCalibConfig(const InterCalibConfig *param)
Definition InterCalib.h:80
void setTowerParam(const ZDCTowerParam *param)
Definition InterCalib.h:78
int process(const gsl::span< const o2::zdc::BCRecData > &bcrec, const gsl::span< const o2::zdc::ZDCEnergy > &energy, const gsl::span< const o2::zdc::ZDCTDCData > &tdc, const gsl::span< const uint16_t > &info)
void setEnergyParam(const ZDCEnergyParam *param)
Definition InterCalib.h:76
const ZDCTowerParam & getTowerParamUpd() const
Definition InterCalib.h:72
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
framework::DataProcessorSpec getInterCalibSpec()
const std::string CCDBPathEnergyCalib
Definition Constants.h:224
constexpr int DbgMinimal
Definition Constants.h:208
constexpr int DbgZero
Definition Constants.h:207
const std::string CCDBPathTowerCalib
Definition Constants.h:225
const std::string CCDBPathInterCalibConfig
Definition Constants.h:226
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"