Project
Loading...
Searching...
No Matches
VdAndExBCalibSpec.h
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
12#ifndef O2_TRD_VDANDEXBCALIBSPEC_H
13#define O2_TRD_VDANDEXBCALIBSPEC_H
14
18
23#include "Framework/Task.h"
27#include "CCDB/CcdbApi.h"
28#include "CCDB/CcdbObjectInfo.h"
31#include <chrono>
32
33using namespace o2::framework;
34
35namespace o2
36{
37namespace calibration
38{
39
41{
42 public:
43 VdAndExBCalibDevice(std::shared_ptr<o2::base::GRPGeomRequest> req) : mCCDBRequest(req) {}
45 {
47 auto slotL = ic.options().get<uint32_t>("sec-per-slot");
48 auto delay = ic.options().get<uint32_t>("max-delay");
49 mCalibrator = std::make_unique<o2::trd::CalibratorVdExB>();
50 mCalibrator->setSlotLengthInSeconds(slotL);
51 mCalibrator->setMaxSlotsDelay(delay);
52 if (ic.options().get<bool>("enable-root-output")) {
53 mCalibrator->createOutputFile();
54 }
55 }
56
57 void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final
58 {
60 }
61
63 {
64 const auto& tinfo = pc.services().get<o2::framework::TimingInfo>();
65 if (tinfo.globalRunNumberChanged) { // new run is starting
66 mRunStopRequested = false;
67 mCalibrator->retrievePrev(pc); // SOR initialization is performed here
68 }
69 if (mRunStopRequested) {
70 return;
71 }
73 auto dataAngRes = pc.inputs().get<o2::trd::AngularResidHistos>("input");
74 o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mCalibrator->getCurrentTFInfo());
75 LOG(detail) << "Processing TF " << mCalibrator->getCurrentTFInfo().tfCounter << " with " << dataAngRes.getNEntries() << " AngularResidHistos entries";
76 mCalibrator->process(dataAngRes);
77 if (pc.transitionState() == TransitionHandlingState::Requested) {
78 LOG(info) << "Run stop requested, finalizing";
79 mRunStopRequested = true;
80 mCalibrator->checkSlotsToFinalize(o2::calibration::INFINITE_TF);
81 mCalibrator->closeOutputFile();
82 }
83 sendOutput(pc.outputs());
84 }
85
87 {
88 if (mRunStopRequested) {
89 return;
90 }
91 mCalibrator->checkSlotsToFinalize(o2::calibration::INFINITE_TF);
92 mCalibrator->closeOutputFile();
93 sendOutput(ec.outputs());
94 }
95
96 void stop() final
97 {
98 mCalibrator->closeOutputFile();
99 }
100
101 private:
102 std::unique_ptr<o2::trd::CalibratorVdExB> mCalibrator;
103 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
104 bool mRunStopRequested = false; // flag that run was stopped (and the last output is sent)
105 //________________________________________________________________
106 void sendOutput(DataAllocator& output)
107 {
108 // extract CCDB infos and calibration objects, convert it to TMemFile and send them to the output
109 // TODO in principle, this routine is generic, can be moved to Utils.h
110
112 const auto& payloadVec = mCalibrator->getCcdbObjectVector();
113 auto& infoVec = mCalibrator->getCcdbObjectInfoVector(); // use non-const version as we update it
114 assert(payloadVec.size() == infoVec.size());
115
116 for (uint32_t i = 0; i < payloadVec.size(); i++) {
117 auto& w = infoVec[i];
118 auto image = o2::ccdb::CcdbApi::createObjectImage(&payloadVec[i], &w);
119 LOG(info) << "Sending object " << w.getPath() << "/" << w.getFileName() << " of size " << image->size()
120 << " bytes, valid for " << w.getStartValidityTimestamp() << " : " << w.getEndValidityTimestamp();
121
122 output.snapshot(Output{clbUtils::gDataOriginCDBPayload, "VDRIFTEXB", i}, *image.get()); // vector<char>
123 output.snapshot(Output{clbUtils::gDataOriginCDBWrapper, "VDRIFTEXB", i}, w); // root-serialized
124 }
125 if (payloadVec.size()) {
126 mCalibrator->initOutput(); // reset the outputs once they are already sent
127 }
128 }
129};
130
131} // namespace calibration
132
133namespace framework
134{
135
136DataProcessorSpec getTRDVdAndExBCalibSpec()
137{
140
141 std::vector<OutputSpec> outputs;
142 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBPayload, "VDRIFTEXB"}, Lifetime::Sporadic);
143 outputs.emplace_back(ConcreteDataTypeMatcher{o2::calibration::Utils::gDataOriginCDBWrapper, "VDRIFTEXB"}, Lifetime::Sporadic);
144 std::vector<InputSpec> inputs;
145 inputs.emplace_back("input", "TRD", "ANGRESHISTS");
146 inputs.emplace_back("calvdexb", "TRD", "CALVDRIFTEXB", 0, Lifetime::Condition, ccdbParamSpec("TRD/Calib/CalVdriftExB"));
147 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(true, // orbitResetTime
148 true, // GRPECS=true
149 false, // GRPLHCIF
150 false, // GRPMagField
151 false, // askMatLUT
153 inputs);
154 return DataProcessorSpec{
155 "calib-vdexb-calibration",
156 inputs,
157 outputs,
158 AlgorithmSpec{adaptFromTask<device>(ccdbRequest)},
159 Options{
160 {"sec-per-slot", VariantType::UInt32, 900u, {"number of seconds per calibration time slot"}},
161 {"max-delay", VariantType::UInt32, 2u, {"number of slots in past to consider"}},
162 {"enable-root-output", VariantType::Bool, false, {"output tprofiles and fits to root file"}},
163 }};
164}
165} // namespace framework
166} // namespace o2
167
168#endif // O2_TRD_VDANDEXBCALIBSPEC_H
Class to store the angular residuals of TRD tracklets wrt TPC tracks for each TRD chamber.
TimeSlot-based calibration of vDrift and ExB.
Utils and constants for calibration and related workflows.
int32_t i
Helper for geometry and GRP related CCDB requests.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
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 init(o2::framework::InitContext &ic) final
VdAndExBCalibDevice(std::shared_ptr< o2::base::GRPGeomRequest > req)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void finaliseCCDB(o2::framework::ConcreteDataMatcher &matcher, void *obj) final
void run(o2::framework::ProcessingContext &pc) final
void stop() final
This is invoked on stop.
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
GLeglImageOES image
Definition glcorearb.h:4021
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 > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
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"