Project
Loading...
Searching...
No Matches
TPCFactorizeSACSpec.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
16
17#ifndef O2_TPCFACTORIZESACSPEC_H
18#define O2_TPCFACTORIZESACSPEC_H
19
20#include <vector>
21#include <fmt/format.h>
22#include "Framework/Task.h"
24#include "Framework/Logger.h"
27#include "Headers/DataHeader.h"
29#include "CCDB/CcdbApi.h"
35
36using namespace o2::framework;
38using namespace o2::tpc;
39
40namespace o2::tpc
41{
42
44{
45 public:
46 TPCFactorizeSACSpec(const unsigned int timeframes, const SACFactorization::SACDeltaCompression compression, const bool debug, const int lane) : mSACFactorization{timeframes}, mCompressionDeltaSAC{compression}, mDebug{debug}, mLaneId{lane} {};
47
49 {
50 int countStacks = 0;
51 mCCDBTimeStamp = pc.inputs().get<uint64_t>("sacccdb");
52 for (auto& ref : InputRecordWalker(pc.inputs(), mFilter)) {
53 auto const* tpcStackHeader = o2::framework::DataRefUtils::getHeader<o2::header::DataHeader*>(ref);
54 const int stack = tpcStackHeader->subSpecification;
55 mSACFactorization.setSACs(pc.inputs().get<std::vector<int32_t>>(ref), stack);
56 ++countStacks;
57 }
58
59 if (countStacks != GEMSTACKS) {
60 LOGP(warning, "Received only {} out of {}", countStacks, GEMSTACKS);
61 }
62
63 mSACFactorization.factorizeSACs();
64
65 if (mDebug) {
66 LOGP(info, "dumping aggregated and factorized SACs to file");
67 const auto currTF = processing_helpers::getCurrentTF(pc);
68 mSACFactorization.dumpToFile(fmt::format("SACFactorized_{:02}.root", currTF).data());
69 }
70
71 // storing to CCDB
72 sendOutput(pc.outputs());
73 }
74
76 {
77 ec.services().get<ControlService>().readyToQuit(QuitRequest::Me);
78 }
79
83
84 // for CCDB
85 static constexpr header::DataDescription getDataDescriptionCCDBSAC0() { return header::DataDescription{"TPC_CalibSAC0"}; }
86 static constexpr header::DataDescription getDataDescriptionCCDBSAC1() { return header::DataDescription{"TPC_CalibSAC1"}; }
88
89 private:
90 SACFactorization mSACFactorization;
91 const SACFactorization::SACDeltaCompression mCompressionDeltaSAC{};
92 const bool mDebug{false};
93 const int mLaneId{0};
94 uint64_t mCCDBTimeStamp{0};
95 const std::vector<InputSpec> mFilter = {{"sac", ConcreteDataTypeMatcher{gDataOriginTPC, TPCDistributeSACSpec::getDataDescriptionSACVec(mLaneId)}, Lifetime::Sporadic}};
96
97 void sendOutput(DataAllocator& output)
98 {
99 const uint64_t timeStampStart = mCCDBTimeStamp;
100 const uint64_t timeStampEnd = timeStampStart + o2::ccdb::CcdbObjectInfo::DAY;
101
102 // do check if received data is empty
103 if (timeStampStart != 0) {
106 output.snapshot(Output{gDataOriginTPC, getDataDescriptionTimeStamp()}, std::vector<uint64_t>{timeStampStart, timeStampEnd});
107 output.snapshot(Output{gDataOriginTPC, getDataDescriptionLane()}, mLaneId);
108
109 o2::ccdb::CcdbObjectInfo ccdbInfoSAC0(CDBTypeMap.at(CDBType::CalSAC0), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
110 auto imageSAC0 = o2::ccdb::CcdbApi::createObjectImage(&mSACFactorization.getSACZero(), &ccdbInfoSAC0);
111 LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSAC0.getPath(), ccdbInfoSAC0.getFileName(), imageSAC0->size(), ccdbInfoSAC0.getStartValidityTimestamp(), ccdbInfoSAC0.getEndValidityTimestamp());
114
115 o2::ccdb::CcdbObjectInfo ccdbInfoSAC1(CDBTypeMap.at(CDBType::CalSAC1), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
116 auto imageSAC1 = o2::ccdb::CcdbApi::createObjectImage(&mSACFactorization.getSACOne(), &ccdbInfoSAC1);
117 LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSAC1.getPath(), ccdbInfoSAC1.getFileName(), imageSAC1->size(), ccdbInfoSAC1.getStartValidityTimestamp(), ccdbInfoSAC1.getEndValidityTimestamp());
120
121 o2::ccdb::CcdbObjectInfo ccdbInfoSACDelta(CDBTypeMap.at(CDBType::CalSACDelta), std::string{}, std::string{}, std::map<std::string, std::string>{}, timeStampStart, timeStampEnd);
122
123 std::unique_ptr<std::vector<char>> imageSACDelta{};
124 switch (mCompressionDeltaSAC) {
125 case SACFactorization::SACDeltaCompression::MEDIUM:
126 default: {
127 const SACDelta<unsigned short> sacDelta = mSACFactorization.getSACDeltaMediumCompressed();
128 imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacDelta, &ccdbInfoSACDelta);
129 break;
130 }
131 case SACFactorization::SACDeltaCompression::HIGH: {
132 const SACDelta<unsigned char> sacDelta = mSACFactorization.getSACDeltaHighCompressed();
133 imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacDelta, &ccdbInfoSACDelta);
134 break;
135 }
136 case SACFactorization::SACDeltaCompression::NO:
137 SACDelta<float> sacDelta = std::move(mSACFactorization).getSACDeltaUncompressed();
138 imageSACDelta = o2::ccdb::CcdbApi::createObjectImage(&sacDelta, &ccdbInfoSACDelta);
139 break;
140 }
141
142 LOGP(info, "Sending object {} / {} of size {} bytes, valid for {} : {} ", ccdbInfoSACDelta.getPath(), ccdbInfoSACDelta.getFileName(), imageSACDelta->size(), ccdbInfoSACDelta.getStartValidityTimestamp(), ccdbInfoSACDelta.getEndValidityTimestamp());
145 } else {
146 LOGP(warning, "Received empty data for SACs! SACs will not be stored for the current aggregation interval!");
147 }
148
149 mSACFactorization.reset();
150 }
151};
152
153DataProcessorSpec getTPCFactorizeSACSpec(const int lane, const unsigned int timeframes, const SACFactorization::SACFactorization::SACDeltaCompression compression, const bool debug)
154{
155 std::vector<OutputSpec> outputSpecs;
162
163 outputSpecs.emplace_back(ConcreteDataMatcher{gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionSAC1(), header::DataHeader::SubSpecificationType{Side::A}}, Lifetime::Sporadic);
164 outputSpecs.emplace_back(ConcreteDataMatcher{gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionSAC1(), header::DataHeader::SubSpecificationType{Side::C}}, Lifetime::Sporadic);
165 outputSpecs.emplace_back(ConcreteDataMatcher{gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionTimeStamp(), header::DataHeader::SubSpecificationType{0}}, Lifetime::Sporadic);
166 outputSpecs.emplace_back(ConcreteDataMatcher{gDataOriginTPC, TPCFactorizeSACSpec::getDataDescriptionLane(), header::DataHeader::SubSpecificationType{0}}, Lifetime::Sporadic);
167
168 std::vector<InputSpec> inputSpecs;
169 inputSpecs.emplace_back(InputSpec{"sac", ConcreteDataTypeMatcher{gDataOriginTPC, TPCDistributeSACSpec::getDataDescriptionSACVec(lane)}, Lifetime::Sporadic});
170 inputSpecs.emplace_back(InputSpec{"sacccdb", ConcreteDataTypeMatcher{gDataOriginTPC, TPCDistributeSACSpec::getDataDescriptionSACCCDB()}, Lifetime::Sporadic});
171
173 fmt::format("tpc-factorize-sac-{:02}", lane).data(),
174 inputSpecs,
175 outputSpecs,
176 AlgorithmSpec{adaptFromTask<TPCFactorizeSACSpec>(timeframes, compression, debug, lane)}};
177 spec.rank = lane;
178 return spec;
179}
180
181} // namespace o2::tpc
182
183#endif
Simple interface to the CDB manager.
Utils and constants for calibration and related workflows.
A helper class to iteratate over all parts of all input routes.
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
uint32_t stack
Definition RawData.h:1
TPC factorization of SACs.
std::ostringstream debug
static std::unique_ptr< std::vector< char > > createObjectImage(const T *obj, CcdbObjectInfo *info=nullptr)
Definition CcdbApi.h:103
static constexpr long DAY
A helper class to iteratate over all parts of all input routes.
const std::vector< float > & getSACZero(const o2::tpc::Side side) const
void reset()
resetting aggregated SACs
void setSACs(std::vector< int32_t > &&SACs, const unsigned int stack)
auto getSACDeltaMediumCompressed() const
const std::vector< float > & getSACOne(const o2::tpc::Side side) const
void dumpToFile(const char *outFileName="SACFactorized.root", const char *outName="SACFactorized") const
static header::DataDescription getDataDescriptionSACVec(const int lane)
return data description for aggregated SACs for given lane
static constexpr header::DataDescription getDataDescriptionSACCCDB()
static constexpr header::DataDescription getDataDescriptionSAC1()
static constexpr header::DataDescription getDataDescriptionLane()
static constexpr header::DataDescription getDataDescriptionTimeStamp()
static constexpr header::DataDescription getDataDescriptionCCDBSAC0()
TPCFactorizeSACSpec(const unsigned int timeframes, const SACFactorization::SACDeltaCompression compression, const bool debug, const int lane)
void endOfStream(o2::framework::EndOfStreamContext &ec) final
This is invoked whenever we have an EndOfStream event.
void run(o2::framework::ProcessingContext &pc) final
static constexpr header::DataDescription getDataDescriptionCCDBSAC1()
static constexpr header::DataDescription getDataDescriptionCCDBSACDelta()
GLboolean * data
Definition glcorearb.h:298
constexpr o2::header::DataOrigin gDataOriginTPC
Definition DataHeader.h:576
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
Global TPC definitions and constants.
Definition SimTraits.h:167
DataProcessorSpec getTPCFactorizeSACSpec(const int lane, const unsigned int timeframes, const SACFactorization::SACFactorization::SACDeltaCompression compression, const bool debug)
const std::unordered_map< CDBType, const std::string > CDBTypeMap
Storage name in CCDB for each calibration and parameter type.
Definition CDBTypes.h:94
constexpr unsigned short GEMSTACKS
Definition Defs.h:60
@ A
Definition Defs.h:35
@ C
Definition Defs.h:36
IDCDeltaCompression
IDC Delta IDC Compression types.
@ CalSAC0
I_0(r,\phi) = <I(r,\phi,t)>_t.
@ CalSACDelta
\Delta I(r,\phi,t) = I(r,\phi,t) / ( I_0(r,\phi) * I_1(t) )
@ CalSAC1
I_1(t) = <I(r,\phi,t) / I_0(r,\phi)>_{r,\phi}.
static constexpr o2::header::DataOrigin gDataOriginCDBWrapper
Definition Utils.h:44
static constexpr o2::header::DataOrigin gDataOriginCDBPayload
Definition Utils.h:43
uint32_t SubSpecificationType
Definition DataHeader.h:620