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
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
122class CTFCoder final : public o2::ctf::CTFCoderBase
123{
124 public:
125 CTFCoder(o2::ctf::CTFCoderBase::OpType op, const std::string& ctfdictOpt = "none") : o2::ctf::CTFCoderBase(op, CTF::getNBlocks(), o2::detectors::DetID::TPC, 1.f, ctfdictOpt) {}
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.
unsigned short int uint16_t
std::vector< std::string > header
int32_t i
uint32_t op
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error s
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:60
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
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
CTFCoder(o2::ctf::CTFCoderBase::OpType op, const std::string &ctfdictOpt="none")
Definition CTFCoder.h:125
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:158
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
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