Project
Loading...
Searching...
No Matches
TPCVDriftTglCalibSpec.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#include "Framework/Task.h"
24
25using namespace o2::framework;
26
27namespace o2
28{
29namespace tpc
30{
32{
33 public:
34 TPCVDriftTglCalibSpec(int ntgl, float tglMax, int ndtgl, float dtglMax, size_t slotL, float offset, float maxDelay, size_t minEnt, std::shared_ptr<o2::base::GRPGeomRequest> req) : mCCDBRequest(req)
35 {
36 mCalibrator = std::make_unique<o2::tpc::TPCVDriftTglCalibration>(ntgl, tglMax, ndtgl, dtglMax, slotL, offset, maxDelay, minEnt);
37 }
38
39 void init(InitContext& ic) final
40 {
42 mCalibrator->setSaveHistosFile(ic.options().get<std::string>("vdtgl-histos-file-name"));
43 };
44
45 void run(ProcessingContext& pc) final
46 {
47 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
48 if (tinfo.globalRunNumberChanged) { // new run is starting
49 mRunStopRequested = false;
50 mCalibrator->reset();
51 }
52 if (mRunStopRequested) {
53 return;
54 }
56 mPTHelper.extractCCDBInputs(pc);
57 auto data = pc.inputs().get<gsl::span<o2::dataformats::Triplet<float, float, float>>>("input");
58 o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
59 if (data.size()) {
60 LOG(detail) << "Processing TF " << mCalibrator->getCurrentTFInfo().tfCounter << " with " << data.size() - 2 << " tracks"; // 1st entry is for VDrift, 2nd for the offset
61 }
62
63 // if no T/P scaling of the VDrift was performed get the current T/P
64 float tp = 0;
65 if (!data.empty()) {
66 // third value of first entry is the T/P ratio, if it is 0, we use the current T/P
67 if (data[0].third == 0) {
68 const auto timestamp = pc.services().get<o2::framework::TimingInfo>().creation;
69 tp = mPTHelper.getTP(timestamp);
70 }
71 }
72
73 mCalibrator->process(data, tp);
74 if (pc.transitionState() == TransitionHandlingState::Requested) {
75 LOG(info) << "Run stop requested, finalizing";
76 mRunStopRequested = true;
77 mCalibrator->checkSlotsToFinalize(o2::calibration::INFINITE_TF);
78 }
79 sendOutput(pc.outputs());
80 }
81
83 {
84 if (mRunStopRequested) {
85 return;
86 }
87 LOG(info) << "Finalizing calibration";
88 mCalibrator->checkSlotsToFinalize(o2::calibration::INFINITE_TF);
89 sendOutput(ec.outputs());
90 mRunStopRequested = true;
91 }
92
93 void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
94 {
96 mPTHelper.accountCCDBInputs(matcher, obj);
97 }
98
99 private:
100 void sendOutput(DataAllocator& output);
101 std::unique_ptr<o2::tpc::TPCVDriftTglCalibration> mCalibrator;
102 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
103 PressureTemperatureHelper mPTHelper; // helper to extract pressure and temperature from CCDB
104 bool mRunStopRequested = false; // flag that run was stopped (ant the last output is sent)
105};
106
107//_____________________________________________________________
108void TPCVDriftTglCalibSpec::sendOutput(DataAllocator& output)
109{
110 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
111 // TODO in principle, this routine is generic, can be moved to Utils.h
113 const auto& payloadVec = mCalibrator->getVDPerSlot();
114 auto& infoVec = mCalibrator->getCCDBInfoPerSlot(); // use non-const version as we update it
115 assert(payloadVec.size() == infoVec.size());
116
117 for (uint32_t i = 0; i < payloadVec.size(); i++) {
118 auto& w = infoVec[i];
119 auto image = o2::ccdb::CcdbApi::createObjectImage(&payloadVec[i], &w);
120 LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
121 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
122 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBPayload, "TPCVDTGL", i}, *image.get()); // vector<char>
123 output.snapshot(Output{o2::calibration::Utils::gDataOriginCDBWrapper, "TPCVDTGL", i}, w); // root-serialized
124 }
125 if (payloadVec.size()) {
126 mCalibrator->initOutput(); // reset the outputs once they are already sent
127 }
128}
129
130//_____________________________________________________________
131DataProcessorSpec getTPCVDriftTglCalibSpec(int ntgl, float tglMax, int ndtgl, float dtglMax, size_t slotL, float slot0frac, float maxDelay, size_t minEnt)
132{
133
134 using device = o2::tpc::TPCVDriftTglCalibSpec;
136
137 std::vector<InputSpec> inputs;
138 inputs.emplace_back("input", "GLO", "TPCITS_VDTGL", 0, Lifetime::Timeframe);
139 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
140 true, // GRPECS=true
141 false, // GRPLHCIF
142 false, // GRPMagField
143 false, // askMatLUT
145 inputs);
146
147 std::vector<OutputSpec> outputs;
148 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "TPCVDTGL"}, Lifetime::Sporadic);
149 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "TPCVDTGL"}, Lifetime::Sporadic);
150 slot0frac = 1. - slot0frac;
151
153
154 return DataProcessorSpec{
155 "tpc-vd-tgl-calib",
156 inputs,
157 outputs,
158 AlgorithmSpec{adaptFromTask<o2::tpc::TPCVDriftTglCalibSpec>(ntgl, tglMax, ndtgl, dtglMax, slotL, slot0frac, maxDelay, minEnt, ccdbRequest)},
159 Options{{"vdtgl-histos-file-name", VariantType::String, "", {"file to save histos (if name provided)"}}}};
160}
161
162} // namespace tpc
163} // 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
Helper class to extract pressure and temperature.
void checkUpdates(o2::framework::ProcessingContext &pc)
bool finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj)
static GRPGeomHelper & instance()
void setRequest(std::shared_ptr< GRPGeomRequest > req)
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
static void requestCCDBInputs(std::vector< o2::framework::InputSpec > &inputs)
void extractCCDBInputs(o2::framework::ProcessingContext &pc) const
trigger checking for CCDB objects
bool accountCCDBInputs(const o2::framework::ConcreteDataMatcher &matcher, void *obj)
check for new CCDB objects
void init(InitContext &ic) final
void endOfStream(EndOfStreamContext &ec) final
TPCVDriftTglCalibSpec(int ntgl, float tglMax, int ndtgl, float dtglMax, size_t slotL, float offset, float maxDelay, size_t minEnt, std::shared_ptr< o2::base::GRPGeomRequest > req)
void run(ProcessingContext &pc) final
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
GLeglImageOES image
Definition glcorearb.h:4021
GLboolean * data
Definition glcorearb.h:298
GLintptr offset
Definition glcorearb.h:660
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
std::vector< ConfigParamSpec > Options
o2::framework::DataProcessorSpec getTPCVDriftTglCalibSpec(int ntgl, float tglMax, int ndtgl, float dtglMax, size_t slotL, float offset, float maxDelay, size_t minEnt)
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"