Project
Loading...
Searching...
No Matches
MeanVertexCalibratorSpec.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
13
16#include "Framework/Logger.h"
20#include "CCDB/CcdbApi.h"
21#include "CCDB/CcdbObjectInfo.h"
22
23using namespace o2::framework;
24
25namespace o2
26{
27namespace calibration
28{
30{
32 const auto& params = MeanVertexParams::Instance();
33 mCalibrator = std::make_unique<o2::calibration::MeanVertexCalibrator>();
34 mCalibrator->setSlotLength(params.tfPerSlot);
35 mCalibrator->setMaxSlotsDelay(float(params.maxTFdelay) / params.tfPerSlot);
36 bool useVerboseMode = ic.options().get<bool>("use-verbose-mode");
37 LOG(info) << " ************************* Verbose? " << useVerboseMode;
38 if (useVerboseMode) {
39 mCalibrator->useVerboseMode(true);
40 }
41}
42
43//_____________________________________________________________
44
46{
48 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
49 if (tinfo.globalRunNumberChanged) { // new run is starting
50 mRunNumber = (tinfo.runNumber != -1 && tinfo.runNumber > 0) ? tinfo.runNumber : o2::base::GRPGeomHelper::instance().getGRPECS()->getRun();
51 mFillNumber = o2::base::GRPGeomHelper::instance().getGRPLHCIF()->getFillNumber();
52 }
53
54 auto data = pc.inputs().get<gsl::span<o2::dataformats::PrimaryVertex>>("input");
55 o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
56 LOG(debug) << "Processing TF " << mCalibrator->getCurrentTFInfo().tfCounter << " with " << data.size() << " vertices";
57 mCalibrator->process(data);
58 sendOutput(pc.outputs());
59 const auto& infoVec = mCalibrator->getMeanVertexObjectInfoVector();
60 LOG(detail) << "Processed TF " << mCalibrator->getCurrentTFInfo().tfCounter << " with " << data.size() << " vertices, for which we created " << infoVec.size() << " objects for TF " << mCalibrator->getCurrentTFInfo().tfCounter;
61}
62
63//_________________________________________________________________
68
69//_____________________________________________________________
70
72{
73
74 LOG(info) << "Finalizing calibration";
75 mCalibrator->checkSlotsToFinalize(o2::calibration::INFINITE_TF);
76 sendOutput(ec.outputs());
77}
78
79//_____________________________________________________________
80
81void MeanVertexCalibDevice::sendOutput(DataAllocator& output)
82{
83
84 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
85 // TODO in principle, this routine is generic, can be moved to Utils.h
87 const auto& payloadVec = mCalibrator->getMeanVertexObjectVector();
88 auto& infoVec = mCalibrator->getMeanVertexObjectInfoVector(); // use non-const version as we update it
89 assert(payloadVec.size() == infoVec.size());
90
91 if (mDCSSubSpec && mDCSSubSpec < payloadVec.size()) {
92 LOGP(alarm, "Minimum subspec {} of messages for DCS CCDB is below the maximum subspec {} for production CCDB, increase the former", mDCSSubSpec, payloadVec.size());
93 }
94 static std::vector<char> dcsMVObj;
95 for (uint32_t i = 0; i < payloadVec.size(); i++) {
96 auto w = infoVec[i];
97 auto& mv = payloadVec[i];
99 LOG(info) << (MeanVertexParams::Instance().skipObjectSending ? "Skip " : "") << "sending object "
100 << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
101 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
102 if (!MeanVertexParams::Instance().skipObjectSending) {
103 if (mDCSSubSpec) { // create message for DCS CCDB
104 auto ts = (w.getStartValidityTimestamp() + w.getEndValidityTimestamp()) / 2;
105 o2::ccdb::CcdbObjectInfo dcsw("GLO/Calib/MeanVertexCSV", "csv", fmt::format("meanvertex_{}.csv", ts), {}, w.getStartValidityTimestamp(), w.getEndValidityTimestamp());
106
107 std::string csvMeanVertex = fmt::format("timestamp={},fillNumber={},runNumber={},x={:+.4e},y={:+.4e},z={:+.4e},sigmax={:+.4e},sigmay={:+.4e},sigmaz={:+.4e}",
108 ts, mFillNumber, mRunNumber, mv.getX(), mv.getY(), mv.getZ(), mv.getSigmaX(), mv.getSigmaY(), mv.getSigmaZ());
109 dcsMVObj.clear();
110 std::copy(csvMeanVertex.begin(), csvMeanVertex.end(), std::back_inserter(dcsMVObj));
111 output.snapshot(Output{clbUtils::gDataOriginCDBPayload, "MEANVERTEX_DCS", mDCSSubSpec + i}, dcsMVObj);
112 output.snapshot(Output{clbUtils::gDataOriginCDBWrapper, "MEANVERTEX_DCS", mDCSSubSpec + i}, dcsw);
113 }
114 w.setEndValidityTimestamp(w.getEndValidityTimestamp() + o2::ccdb::CcdbObjectInfo::MONTH);
115 output.snapshot(Output{clbUtils::gDataOriginCDBPayload, "MEANVERTEX", i}, *image.get()); // vector<char>
116 output.snapshot(Output{clbUtils::gDataOriginCDBWrapper, "MEANVERTEX", i}, w); // root-serialized
117 }
118 }
119 if (payloadVec.size()) {
120 mCalibrator->initOutput(); // reset the outputs once they are already sent
121 }
122}
123} // namespace calibration
124
125namespace framework
126{
127
128DataProcessorSpec getMeanVertexCalibDeviceSpec(uint32_t dcsMVsubspec)
129{
130
133 std::vector<InputSpec> inputs;
134 inputs.emplace_back("input", "GLO", "PVTX");
135 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
136 true, // GRPECS=true
137 true, // GRPLHCIF
138 false, // GRPMagField
139 false, // askMatLUT
141 inputs);
142
143 std::vector<OutputSpec> outputs;
144 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "MEANVERTEX"}, Lifetime::Sporadic);
145 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "MEANVERTEX"}, Lifetime::Sporadic);
146 if (dcsMVsubspec) {
147 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "MEANVERTEX_DCS"}, Lifetime::Sporadic);
148 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "MEANVERTEX_DCS"}, Lifetime::Sporadic);
149 }
150
151 return DataProcessorSpec{
152 "mean-vertex-calibration",
153 inputs,
154 outputs,
155 AlgorithmSpec{adaptFromTask<device>(ccdbRequest, dcsMVsubspec)},
156 Options{{"use-verbose-mode", VariantType::Bool, false, {"Use verbose mode"}}}};
157}
158
159} // namespace framework
160} // namespace o2
Utils and constants for calibration and related workflows.
int32_t i
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
Device to calibrate MeanVertex.
std::ostringstream debug
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 finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void run(o2::framework::ProcessingContext &pc) final
void init(o2::framework::InitContext &ic) final
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
static constexpr long MONTH
ConfigParamRegistry const & options()
Definition InitContext.h:33
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.
GLeglImageOES image
Definition glcorearb.h:4021
GLenum const GLfloat * params
Definition glcorearb.h:272
GLboolean * data
Definition glcorearb.h:298
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
constexpr TFType INFINITE_TF
Definition TimeSlot.h:30
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
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"