12#ifndef O2_TPC_LaserTracksCalibratorSpec_H
13#define O2_TPC_LaserTracksCalibratorSpec_H
41 const int minTFs = ic.options().get<
int>(
"min-tfs");
42 const auto slotL = ic.options().get<uint32_t>(
"tf-per-slot");
43 const auto delay = ic.options().get<uint32_t>(
"max-delay");
44 const bool debug = ic.options().get<
bool>(
"write-debug");
46 mCalibrator = std::make_unique<LaserTracksCalibrator>(minTFs);
47 mCalibrator->setSlotLength(slotL);
48 mCalibrator->setMaxSlotsDelay(delay);
49 mCalibrator->setWriteDebug(
debug);
55 const auto dph = o2::header::get<o2::framework::DataProcessingHeader*>(pc.inputs().get(
"laserTracks").header);
57 auto data = pc.inputs().get<gsl::span<TrackTPC>>(
"laserTracks");
58 LOGP(detail,
"Processing TF {} and {} tracks", mCalibrator->getCurrentTFInfo().tfCounter,
data.size());
60 mCalibrator->process(
data);
62 if (mCalibrator->hasCalibrationData()) {
63 sendOutput(pc.outputs());
74 LOGP(info,
"LaserTracksCalibratorDevice::endOfStream: Finalizing calibration");
76 sendOutput(ec.outputs());
80 std::unique_ptr<LaserTracksCalibrator> mCalibrator;
81 std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
87 const auto& calibrations = mCalibrator->getCalibPerSlot();
89 for (uint32_t iCalib = 0; iCalib < calibrations.size(); ++iCalib) {
90 const auto&
object = calibrations[iCalib];
91 if (!
object.isValid()) {
92 LOGP(error,
"Invalid Laser calibration (corrections: A-side={}, C-side={}, NTracks: A-side={} C-side={}), will NOT upload to CCDB",
object.dvCorrectionA,
object.dvCorrectionC,
object.nTracksA,
object.nTracksC);
98 w.setPath(
"TPC/Calib/LaserTracks");
99 w.setStartValidityTimestamp(
object.firstTime);
101 w.setEndValidityTimestamp(timeEnd);
103 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ",
w.getPath(),
w.getFileName(),
image->size(),
w.getStartValidityTimestamp(),
w.getEndValidityTimestamp());
107 mCalibrator->initOutput();
116 std::vector<OutputSpec> outputs;
119 std::vector<InputSpec> inputs{{
"laserTracks",
"TPC",
"LASERTRACKS"}};
120 auto ccdbRequest = std::make_shared<o2::base::GRPGeomRequest>(
true,
128 "tpc-laser-tracks-calibrator",
133 {
"tf-per-slot", VariantType::UInt32, 5000u, {
"number of TFs per calibration time slot"}},
134 {
"max-delay", VariantType::UInt32, 3u, {
"number of slots in past to consider"}},
135 {
"min-tfs", VariantType::Int, 100, {
"minimum number of TFs with enough laser tracks to finalize a slot"}},
136 {
"write-debug", VariantType::Bool,
false, {
"write a debug output tree."}},
Utils and constants for calibration and related workflows.
Helper for geometry and GRP related CCDB requests.
time slot calibration using laser tracks
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)
static constexpr long INFINITE_TIMESTAMP
LaserTracksCalibratorDevice(std::shared_ptr< o2::base::GRPGeomRequest > req)
void run(o2::framework::ProcessingContext &pc) final
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 init(o2::framework::InitContext &ic) final
GLubyte GLubyte GLubyte GLubyte w
constexpr TFType INFINITE_TF
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
Global TPC definitions and constants.
DataProcessorSpec getLaserTracksCalibrator()
static void fillTFIDInfo(o2::framework::ProcessingContext &pc, o2::dataformats::TFIDInfo &ti)
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
static constexpr o2::header::DataOrigin gDataOriginCDBPayload