Project
Loading...
Searching...
No Matches
CTFCoder.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
15
16#ifndef O2_TPC_CTFCODER_H
17#define O2_TPC_CTFCODER_H
18
19#include <algorithm>
20#include <iterator>
21#include <string>
22#include <cassert>
23#include <tuple>
24#include <type_traits>
25#include <typeinfo>
26#include <vector>
27#include "DataFormatsTPC/CTF.h"
31#include "rANS/iterator.h"
32
33class TTree;
34
35namespace o2
36{
37namespace tpc
38{
39
40namespace detail
41{
42
44 uint32_t firstOrbit = -1;
45 std::vector<int32_t> deltaOrbit;
46 std::vector<int16_t> deltaBC;
47 std::vector<uint8_t> triggerType;
48 void clear()
49 {
50 firstOrbit = -1;
51 deltaOrbit.clear();
52 deltaBC.clear();
53 triggerType.clear();
54 }
55 void resize(size_t s)
56 {
57 deltaOrbit.resize(s);
58 deltaBC.resize(s);
59 triggerType.resize(s);
60 }
61};
62
63template <int A, int B>
65 using type = std::conditional_t<(A + B > 16), uint32_t, std::conditional_t<(A + B > 8), uint16_t, uint8_t>>;
66};
67
68template <int A, int B>
70
71template <typename value_T, size_t shift>
73{
74 public:
75 template <typename iterA_T, typename iterB_T>
76 inline value_T operator()(iterA_T iterA, iterB_T iterB) const
77 {
78 return *iterB + (static_cast<value_T>(*iterA) << shift);
79 };
80
81 template <typename iterA_T, typename iterB_T>
82 inline void operator()(iterA_T iterA, iterB_T iterB, value_T value) const
83 {
84 *iterA = value >> shift;
85 *iterB = value & ((0x1 << shift) - 0x1);
86 };
87};
88
89template <typename iterA_T, typename iterB_T, typename F>
90auto makeInputIterators(iterA_T iterA, iterB_T iterB, size_t nElements, F functor)
91{
92 using namespace o2::rans;
93
94 auto advanceIter = [](auto iter, size_t nElements) {
95 auto tmp = iter;
96 std::advance(tmp, nElements);
97 return tmp;
98 };
99
100 return std::make_tuple(CombinedInputIterator{iterA, iterB, functor},
101 CombinedInputIterator{advanceIter(iterA, nElements), advanceIter(iterB, nElements), functor});
102};
103
104template <int bits_A, int bits_B>
106
108
109 template <typename iterA_T, typename iterB_T, typename F>
110 static void decode(iterA_T iterA, iterB_T iterB, CTF::Slots slot, F decodingFunctor)
111 {
112 using namespace o2::rans;
115
116 decodingFunctor(iter, slot);
117 }
118};
119
120} // namespace detail
121
123{
124 public:
125 CTFCoder(o2::ctf::CTFCoderBase::OpType op) : o2::ctf::CTFCoderBase(op, CTF::getNBlocks(), o2::detectors::DetID::TPC) {}
126 ~CTFCoder() final = default;
127
129 template <typename VEC>
130 o2::ctf::CTFIOSize encode(VEC& buff, const CompressedClusters& ccl, const CompressedClusters& cclFiltered, const detail::TriggerInfo& trigComp, std::vector<bool>* rejectHits = nullptr, std::vector<bool>* rejectTracks = nullptr, std::vector<bool>* rejectTrackHits = nullptr, std::vector<bool>* rejectTrackHitsReduced = nullptr);
131
132 template <typename VEC, typename TRIGVEC>
133 o2::ctf::CTFIOSize decode(const CTF::base& ec, VEC& buff, TRIGVEC& buffTrig);
134
135 void createCoders(const std::vector<char>& bufVec, o2::ctf::CTFCoderBase::OpType op) final;
136
138
139 static size_t constexpr Alignment = 16;
140 static size_t estimateSize(CompressedClusters& c);
141 static void setCompClusAddresses(CompressedClusters& c, void*& buff);
142
143 template <size_t ALG = Alignment, typename T>
144 static size_t alignSize(T*& var, size_t n = 1)
145 {
146 auto sz = sizeof(T) * n;
147 auto res = sz % ALG;
148 return res ? sz + (ALG - res) : sz;
149 }
150
151 template <size_t ALG = Alignment, typename T>
152 static void setAlignedPtr(void*& ptr, T*& var, size_t n = 1)
153 {
154 auto sz = sizeof(T) * n;
155 auto res = sz % ALG;
156 var = reinterpret_cast<T*>(ptr);
157 auto& ptrR = reinterpret_cast<size_t&>(ptr);
158 ptrR += res ? sz + (ALG - res) : sz;
159 }
160
161 bool getCombineColumns() const { return mCombineColumns; }
162 void setCombineColumns(bool v) { mCombineColumns = v; }
163
164 private:
165 void checkDataDictionaryConsistency(const CTFHeader& h);
166
167 template <int NU, int NL, typename CU, typename CL>
168 static void splitColumns(const std::vector<detail::combinedType_t<NU, NL>>& vm, CU*& vu, CL*& vl);
169
170 template <typename source_T>
171 void buildCoder(ctf::CTFCoderBase::OpType coderType, const CTF::container_t& ctf, CTF::Slots slot);
172
173 bool mCombineColumns = false; // combine correlated columns
174};
175
176template <typename source_T>
177void CTFCoder::buildCoder(ctf::CTFCoderBase::OpType coderType, const CTF::container_t& ctf, CTF::Slots slot)
178{
179 this->createCoder(coderType, std::get<rans::RenormedDenseHistogram<source_T>>(ctf.getDictionary<source_T>(slot, mANSVersion)), static_cast<int>(slot));
180}
181
183template <typename VEC>
184o2::ctf::CTFIOSize CTFCoder::encode(VEC& buff, const CompressedClusters& ccl, const CompressedClusters& cclFiltered, const detail::TriggerInfo& trigComp, std::vector<bool>* rejectHits, std::vector<bool>* rejectTracks, std::vector<bool>* rejectTrackHits, std::vector<bool>* rejectTrackHitsReduced)
185{
187 using namespace detail;
188 // what to do which each field: see o2::ctf::Metadata explanation
189 constexpr MD optField[CTF::getNBlocks()] = {
190 MD::EENCODE_OR_PACK, // qTotA
191 MD::EENCODE_OR_PACK, // qMaxA
192 MD::EENCODE_OR_PACK, // flagsA
193 MD::EENCODE_OR_PACK, // rowDiffA
194 MD::EENCODE_OR_PACK, // sliceLegDiffA
195 MD::EENCODE_OR_PACK, // padResA
196 MD::EENCODE_OR_PACK, // timeResA
197 MD::EENCODE_OR_PACK, // sigmaPadA
198 MD::EENCODE_OR_PACK, // sigmaTimeA
199 MD::EENCODE_OR_PACK, // qPtA
200 MD::EENCODE_OR_PACK, // rowA
201 MD::EENCODE_OR_PACK, // sliceA
202 MD::EENCODE_OR_PACK, // timeA
203 MD::EENCODE_OR_PACK, // padA
204 MD::EENCODE_OR_PACK, // qTotU
205 MD::EENCODE_OR_PACK, // qMaxU
206 MD::EENCODE_OR_PACK, // flagsU
207 MD::EENCODE_OR_PACK, // padDiffU
208 MD::EENCODE_OR_PACK, // timeDiffU
209 MD::EENCODE_OR_PACK, // sigmaPadU
210 MD::EENCODE_OR_PACK, // sigmaTimeU
211 MD::EENCODE_OR_PACK, // nTrackClusters
212 MD::EENCODE_OR_PACK, // nSliceRowClusters
213 MD::EENCODE_OR_PACK, // TrigBCInc
214 MD::EENCODE_OR_PACK, // TrigOrbitInc
215 MD::EENCODE_OR_PACK // TrigType
216 };
217
218 // book output size with some margin
219 auto szIni = estimateCompressedSize(cclFiltered);
220 buff.resize(szIni);
221
222 auto ec = CTF::create(buff);
223 uint32_t flags = 0;
224 if (mCombineColumns) {
226 }
227 ec->setHeader(CTFHeader{o2::detectors::DetID::TPC, 0, 1, 0, // dummy timestamp, version 1.0
228 cclFiltered, flags, trigComp.firstOrbit, (uint16_t)trigComp.triggerType.size()});
229 assignDictVersion(static_cast<o2::ctf::CTFDictHeader&>(ec->getHeader()));
230 ec->setANSHeader(mANSVersion);
231
232 o2::ctf::CTFIOSize iosize;
233 auto encodeTPC = [&buff, &optField, &coders = mCoders, mfc = this->getMemMarginFactor(), &iosize](auto begin, auto end, CTF::Slots slot, size_t probabilityBits, std::vector<bool>* reject = nullptr) {
234 // at every encoding the buffer might be autoexpanded, so we don't work with fixed pointer ec
235 const auto slotVal = static_cast<int>(slot);
236 if (reject && begin != end) {
237 std::vector<std::decay_t<decltype(*begin)>> tmp;
238 tmp.reserve(std::distance(begin, end));
239 for (auto i = begin; i != end; i++) {
240 if (!(*reject)[std::distance(begin, i)]) {
241 tmp.emplace_back(*i);
242 }
243 }
244 iosize += CTF::get(buff.data())->encode(tmp.begin(), tmp.end(), slotVal, probabilityBits, optField[slotVal], &buff, coders[slotVal], mfc);
245 } else {
246 iosize += CTF::get(buff.data())->encode(begin, end, slotVal, probabilityBits, optField[slotVal], &buff, coders[slotVal], mfc);
247 }
248 };
249
250 if (mCombineColumns) {
251 const auto [begin, end] = makeInputIterators(ccl.qTotA, ccl.qMaxA, ccl.nAttachedClusters,
252 ShiftFunctor<combinedType_t<CTF::NBitsQTot, CTF::NBitsQMax>, CTF::NBitsQMax>{});
253 encodeTPC(begin, end, CTF::BLCqTotA, 0, rejectTrackHits);
254 } else {
255 encodeTPC(ccl.qTotA, ccl.qTotA + ccl.nAttachedClusters, CTF::BLCqTotA, 0, rejectTrackHits);
256 }
257 encodeTPC(ccl.qMaxA, ccl.qMaxA + (mCombineColumns ? 0 : ccl.nAttachedClusters), CTF::BLCqMaxA, 0, rejectTrackHits);
258
259 encodeTPC(ccl.flagsA, ccl.flagsA + ccl.nAttachedClusters, CTF::BLCflagsA, 0, rejectTrackHits);
260
261 if (mCombineColumns) {
263 ShiftFunctor<combinedType_t<CTF::NBitsRowDiff, CTF::NBitsSliceLegDiff>, CTF::NBitsSliceLegDiff>{});
264 encodeTPC(begin, end, CTF::BLCrowDiffA, 0, rejectTrackHitsReduced);
265 } else {
266 encodeTPC(ccl.rowDiffA, ccl.rowDiffA + ccl.nAttachedClustersReduced, CTF::BLCrowDiffA, 0, rejectTrackHitsReduced);
267 }
268 encodeTPC(ccl.sliceLegDiffA, ccl.sliceLegDiffA + (mCombineColumns ? 0 : ccl.nAttachedClustersReduced), CTF::BLCsliceLegDiffA, 0, rejectTrackHitsReduced);
269
270 encodeTPC(ccl.padResA, ccl.padResA + ccl.nAttachedClustersReduced, CTF::BLCpadResA, 0, rejectTrackHitsReduced);
271 encodeTPC(ccl.timeResA, ccl.timeResA + ccl.nAttachedClustersReduced, CTF::BLCtimeResA, 0, rejectTrackHitsReduced);
272
273 if (mCombineColumns) {
275 ShiftFunctor<combinedType_t<CTF::NBitsSigmaPad, CTF::NBitsSigmaTime>, CTF::NBitsSigmaTime>{});
276 encodeTPC(begin, end, CTF::BLCsigmaPadA, 0, rejectTrackHits);
277 } else {
278 encodeTPC(ccl.sigmaPadA, ccl.sigmaPadA + ccl.nAttachedClusters, CTF::BLCsigmaPadA, 0, rejectTrackHits);
279 }
280 encodeTPC(ccl.sigmaTimeA, ccl.sigmaTimeA + (mCombineColumns ? 0 : ccl.nAttachedClusters), CTF::BLCsigmaTimeA, 0, rejectTrackHits);
281
282 encodeTPC(ccl.qPtA, ccl.qPtA + ccl.nTracks, CTF::BLCqPtA, 0, rejectTracks);
283 encodeTPC(ccl.rowA, ccl.rowA + ccl.nTracks, CTF::BLCrowA, 0, rejectTracks);
284 encodeTPC(ccl.sliceA, ccl.sliceA + ccl.nTracks, CTF::BLCsliceA, 0, rejectTracks);
285 encodeTPC(ccl.timeA, ccl.timeA + ccl.nTracks, CTF::BLCtimeA, 0, rejectTracks);
286 encodeTPC(ccl.padA, ccl.padA + ccl.nTracks, CTF::BLCpadA, 0, rejectTracks);
287
288 if (mCombineColumns) {
289 const auto [begin, end] = makeInputIterators(ccl.qTotU, ccl.qMaxU, ccl.nUnattachedClusters,
290 ShiftFunctor<combinedType_t<CTF::NBitsQTot, CTF::NBitsQMax>, CTF::NBitsQMax>{});
291 encodeTPC(begin, end, CTF::BLCqTotU, 0, rejectHits);
292 } else {
293 encodeTPC(ccl.qTotU, ccl.qTotU + ccl.nUnattachedClusters, CTF::BLCqTotU, 0, rejectHits);
294 }
295 encodeTPC(ccl.qMaxU, ccl.qMaxU + (mCombineColumns ? 0 : ccl.nUnattachedClusters), CTF::BLCqMaxU, 0, rejectHits);
296
297 encodeTPC(ccl.flagsU, ccl.flagsU + ccl.nUnattachedClusters, CTF::BLCflagsU, 0, rejectHits);
298 encodeTPC(cclFiltered.padDiffU, cclFiltered.padDiffU + cclFiltered.nUnattachedClusters, CTF::BLCpadDiffU, 0);
299 encodeTPC(cclFiltered.timeDiffU, cclFiltered.timeDiffU + cclFiltered.nUnattachedClusters, CTF::BLCtimeDiffU, 0);
300
301 if (mCombineColumns) {
303 ShiftFunctor<combinedType_t<CTF::NBitsSigmaPad, CTF::NBitsSigmaTime>, CTF::NBitsSigmaTime>{});
304 encodeTPC(begin, end, CTF::BLCsigmaPadU, 0, rejectHits);
305 } else {
306 encodeTPC(ccl.sigmaPadU, ccl.sigmaPadU + ccl.nUnattachedClusters, CTF::BLCsigmaPadU, 0, rejectHits);
307 }
308 encodeTPC(ccl.sigmaTimeU, ccl.sigmaTimeU + (mCombineColumns ? 0 : ccl.nUnattachedClusters), CTF::BLCsigmaTimeU, 0, rejectHits);
309
310 encodeTPC(ccl.nTrackClusters, ccl.nTrackClusters + ccl.nTracks, CTF::BLCnTrackClusters, 0, rejectTracks);
312
313 encodeTPC(trigComp.deltaOrbit.begin(), trigComp.deltaOrbit.end(), CTF::BLCTrigOrbitInc, 0);
314 encodeTPC(trigComp.deltaBC.begin(), trigComp.deltaBC.end(), CTF::BLCTrigBCInc, 0);
315 encodeTPC(trigComp.triggerType.begin(), trigComp.triggerType.end(), CTF::BLCTrigType, 0);
316
317 CTF::get(buff.data())->print(getPrefix(), mVerbosity);
318 finaliseCTFOutput<CTF>(buff);
319 iosize.rawIn = iosize.ctfIn;
320 return iosize;
321}
322
324template <typename VEC, typename TRIGVEC>
325o2::ctf::CTFIOSize CTFCoder::decode(const CTF::base& ec, VEC& buffVec, TRIGVEC& buffTrig)
326{
327 using namespace detail;
330 auto& header = ec.getHeader();
331 checkDictVersion(static_cast<const o2::ctf::CTFDictHeader&>(header));
332 checkDataDictionaryConsistency(header);
333 ccCount = static_cast<const CompressedClustersCounters&>(header);
334 CompressedClustersFlat* ccFlat = nullptr;
335 size_t sizeCFlatBody = alignSize(ccFlat);
336 size_t sz = sizeCFlatBody + estimateSize(cc); // total size of the buffVec accounting for the alignment
337 size_t vsz = sizeof(typename std::remove_reference<decltype(buffVec)>::type::value_type); // size of the element of the buffer
338 buffVec.resize(sz / vsz);
339 ccFlat = reinterpret_cast<CompressedClustersFlat*>(buffVec.data()); // RS? do we need to align this pointer, or PMR vector will be already aligned?
340 auto buff = reinterpret_cast<void*>(reinterpret_cast<char*>(buffVec.data()) + sizeCFlatBody); // will be the start of the CompressedClustersFlat payload
341
343 ccFlat->set(sz, cc); // set offsets
345
346 // decode encoded data directly to destination buff
347 o2::ctf::CTFIOSize iosize;
348 auto decodeTPC = [&ec, &coders = mCoders, &iosize](auto begin, CTF::Slots slot) {
349 const auto slotVal = static_cast<int>(slot);
350 iosize += ec.decode(begin, slotVal, coders[slotVal]);
351 };
352
353 if (mCombineColumns) {
355 } else {
356 decodeTPC(cc.qTotA, CTF::BLCqTotA);
357 decodeTPC(cc.qMaxA, CTF::BLCqMaxA);
358 }
359
360 decodeTPC(cc.flagsA, CTF::BLCflagsA);
361
362 if (mCombineColumns) {
364 } else {
365 decodeTPC(cc.rowDiffA, CTF::BLCrowDiffA);
366 decodeTPC(cc.sliceLegDiffA, CTF::BLCsliceLegDiffA);
367 }
368
369 decodeTPC(cc.padResA, CTF::BLCpadResA);
370 decodeTPC(cc.timeResA, CTF::BLCtimeResA);
371
372 if (mCombineColumns) {
374 } else {
375 decodeTPC(cc.sigmaPadA, CTF::BLCsigmaPadA);
376 decodeTPC(cc.sigmaTimeA, CTF::BLCsigmaTimeA);
377 }
378
379 decodeTPC(cc.qPtA, CTF::BLCqPtA);
380 decodeTPC(cc.rowA, CTF::BLCrowA);
381 decodeTPC(cc.sliceA, CTF::BLCsliceA);
382 decodeTPC(cc.timeA, CTF::BLCtimeA);
383 decodeTPC(cc.padA, CTF::BLCpadA);
384
385 if (mCombineColumns) {
387 } else {
388 decodeTPC(cc.qTotU, CTF::BLCqTotU);
389 decodeTPC(cc.qMaxU, CTF::BLCqMaxU);
390 }
391
392 decodeTPC(cc.flagsU, CTF::BLCflagsU);
393 decodeTPC(cc.padDiffU, CTF::BLCpadDiffU);
394 decodeTPC(cc.timeDiffU, CTF::BLCtimeDiffU);
395
396 if (mCombineColumns) {
398 } else {
399 decodeTPC(cc.sigmaPadU, CTF::BLCsigmaPadU);
400 decodeTPC(cc.sigmaTimeU, CTF::BLCsigmaTimeU);
401 }
402
403 decodeTPC(cc.nTrackClusters, CTF::BLCnTrackClusters);
404 decodeTPC(cc.nSliceRowClusters, CTF::BLCnSliceRowClusters);
405
406 static TriggerInfo trigInfo;
407 trigInfo.resize(header.nTriggers);
408 decodeTPC(trigInfo.deltaOrbit.data(), CTF::BLCTrigOrbitInc);
409 decodeTPC(trigInfo.deltaBC.data(), CTF::BLCTrigBCInc);
410 decodeTPC(trigInfo.triggerType.data(), CTF::BLCTrigType);
411 // convert trigger info to output format
412 uint32_t prevOrbit = header.firstOrbitTrig;
413 uint16_t prevBC = 0;
414 int freeSlot = 0;
415 for (uint16_t it = 0; it < header.nTriggers; it++) {
416 if (trigInfo.deltaOrbit[it] || !it) { // start new HBF, deltaBC has absolute BC meaning
417 freeSlot = 0;
418 auto& t = buffTrig.emplace_back();
419 t.orbit = prevOrbit + trigInfo.deltaOrbit[it];
420 t.triggerWord.triggerEntries[freeSlot++] = (trigInfo.deltaBC[it] & 0xFFF) | ((trigInfo.triggerType[it] & 0x7) << 12) | 0x8000;
421 prevBC = trigInfo.deltaBC[it];
422 prevOrbit = t.orbit;
423 } else { // continue existing HBF
424 prevBC += trigInfo.deltaBC[it];
425 buffTrig.back().triggerWord.triggerEntries[freeSlot++] = (prevBC & 0xFFF) | ((trigInfo.triggerType[it] & 0x7) << 12) | 0x8000;
426 }
427 }
428 iosize.rawIn = iosize.ctfIn;
429 return iosize;
430}
431
432} // namespace tpc
433} // namespace o2
434
435#endif // O2_TPC_CTFCODER_H
Declarations for CTFCoderBase class (support of external dictionaries)
Container to store compressed TPC cluster data.
int32_t i
uint32_t op
uint32_t res
Definition RawData.h:0
uint32_t c
Definition RawData.h:2
Definitions for TPC CTF data.
TBranch * ptr
void encodeTPC(const std::string &name, const TPCCompressedClusters &compressedClusters, bool mergeColumns, rapidjson::Writer< rapidjson::OStreamWrapper > &writer)
Definition A.h:16
Definition B.h:16
Class for time synchronization of RawReader instances.
void createCoder(OpType op, const o2::rans::RenormedDenseHistogram< S > &renormedHistogram, int slot)
float getMemMarginFactor() const
std::vector< std::any > mCoders
void checkDictVersion(const CTFDictHeader &h) const
ctf::ANSHeader mANSVersion
std::string getPrefix() const
virtual void assignDictVersion(CTFDictHeader &h) const
static auto get(void *head)
cast arbitrary buffer head to container class. Head is supposed to respect the alignment
o2::ctf::CTFIOSize decode(container_T &dest, int slot, const std::any &decoderExt={}) const
decode block at provided slot to destination vector (will be resized as needed)
const H & getHeader() const
void print(const std::string &prefix="", int verbosity=1) const
print itself
static auto create(void *head, size_t sz)
create container from arbitrary buffer of predefined size (in bytes!!!). Head is supposed to respect ...
Static class with identifiers, bitmasks and names for ALICE detectors.
Definition DetID.h:58
static constexpr ID TPC
Definition DetID.h:64
o2::ctf::CTFIOSize encode(VEC &buff, const CompressedClusters &ccl, const CompressedClusters &cclFiltered, const detail::TriggerInfo &trigComp, std::vector< bool > *rejectHits=nullptr, std::vector< bool > *rejectTracks=nullptr, std::vector< bool > *rejectTrackHits=nullptr, std::vector< bool > *rejectTrackHitsReduced=nullptr)
entropy-encode compressed clusters to flat buffer
Definition CTFCoder.h:184
static void setAlignedPtr(void *&ptr, T *&var, size_t n=1)
Definition CTFCoder.h:152
o2::ctf::CTFIOSize decode(const CTF::base &ec, VEC &buff, TRIGVEC &buffTrig)
decode entropy-encoded bloks to TPC CompressedClusters into the externally provided vector (e....
Definition CTFCoder.h:325
void setCombineColumns(bool v)
Definition CTFCoder.h:162
size_t estimateCompressedSize(const CompressedClusters &ccl)
Definition CTFCoder.cxx:162
static size_t alignSize(T *&var, size_t n=1)
Definition CTFCoder.h:144
CTFCoder(o2::ctf::CTFCoderBase::OpType op)
Definition CTFCoder.h:125
void createCoders(const std::vector< char > &bufVec, o2::ctf::CTFCoderBase::OpType op) final
Definition CTFCoder.cxx:93
static size_t estimateSize(CompressedClusters &c)
estimate size needed to store in the flat buffer the payload of the CompressedClusters (here only the...
Definition CTFCoder.cxx:22
static size_t constexpr Alignment
Definition CTFCoder.h:139
bool getCombineColumns() const
Definition CTFCoder.h:161
~CTFCoder() final=default
static void setCompClusAddresses(CompressedClusters &c, void *&buff)
set addresses of the CompressedClusters fields to point on already reserved memory region
Definition CTFCoder.cxx:58
void operator()(iterA_T iterA, iterB_T iterB, value_T value) const
Definition CTFCoder.h:82
value_T operator()(iterA_T iterA, iterB_T iterB) const
Definition CTFCoder.h:76
GLdouble n
Definition glcorearb.h:1982
GLuint GLuint end
Definition glcorearb.h:469
const GLdouble * v
Definition glcorearb.h:832
GLdouble f
Definition glcorearb.h:310
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLbitfield flags
Definition glcorearb.h:1570
public interface for rANS iterators.
typename combinedType< A, B >::type combinedType_t
Definition CTFCoder.h:69
auto makeInputIterators(iterA_T iterA, iterB_T iterB, size_t nElements, F functor)
Definition CTFCoder.h:90
Enum< T >::Iterator begin(Enum< T >)
Definition Defs.h:173
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
Detector header base.
wrapper for the Entropy-encoded clusters of the TF
Definition CTF.h:36
static constexpr int NBitsSliceLegDiff
Definition CTF.h:46
@ BLCflagsU
Definition CTF.h:64
@ BLCpadDiffU
Definition CTF.h:65
@ BLCsigmaTimeU
Definition CTF.h:68
@ BLCflagsA
Definition CTF.h:50
@ BLCqMaxA
Definition CTF.h:49
@ BLCtimeDiffU
Definition CTF.h:66
@ BLCqTotA
Definition CTF.h:48
@ BLCnSliceRowClusters
Definition CTF.h:70
@ BLCqTotU
Definition CTF.h:62
@ BLCsigmaPadU
Definition CTF.h:67
@ BLCsliceLegDiffA
Definition CTF.h:52
@ BLCtimeResA
Definition CTF.h:54
@ BLCqMaxU
Definition CTF.h:63
@ BLCsliceA
Definition CTF.h:59
@ BLCtimeA
Definition CTF.h:60
@ BLCpadResA
Definition CTF.h:53
@ BLCsigmaPadA
Definition CTF.h:55
@ BLCTrigBCInc
Definition CTF.h:73
@ BLCTrigType
Definition CTF.h:74
@ BLCrowDiffA
Definition CTF.h:51
@ BLCqPtA
Definition CTF.h:57
@ BLCpadA
Definition CTF.h:61
@ BLCnTrackClusters
Definition CTF.h:69
@ BLCsigmaTimeA
Definition CTF.h:56
@ BLCrowA
Definition CTF.h:58
@ BLCTrigOrbitInc
Definition CTF.h:72
o2::ctf::EncodedBlocks< CTFHeader, 26, uint32_t > container_t
Definition CTF.h:38
static constexpr int NBitsQMax
Definition CTF.h:42
static constexpr int NBitsSigmaTime
Definition CTF.h:44
void set(size_t bufferSize, const CompressedClusters &v)
combinedType_t< bits_A, bits_B > combined_t
Definition CTFCoder.h:107
static void decode(iterA_T iterA, iterB_T iterB, CTF::Slots slot, F decodingFunctor)
Definition CTFCoder.h:110
std::vector< int32_t > deltaOrbit
Definition CTFCoder.h:45
std::vector< int16_t > deltaBC
Definition CTFCoder.h:46
std::vector< uint8_t > triggerType
Definition CTFCoder.h:47
std::conditional_t<(A+B > 16), uint32_t, std::conditional_t<(A+B > 8), uint16_t, uint8_t > > type
Definition CTFCoder.h:65
auto makeInputIterators(iterA_T iterA, iterB_T iterB, size_t nElements, F functor)
std::vector< o2::mch::ChannelCode > cc