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_MID_CTFCODER_H
17#define O2_MID_CTFCODER_H
18
19#include <algorithm>
20#include <iterator>
21#include <string>
22#include <array>
23#include "DataFormatsMID/CTF.h"
28#include "MIDCTF/CTFHelper.h"
29
30class TTree;
31
32namespace o2
33{
34namespace mid
35{
36
38{
39 public:
40 CTFCoder(o2::ctf::CTFCoderBase::OpType op) : o2::ctf::CTFCoderBase(op, CTF::getNBlocks(), o2::detectors::DetID::MID) {}
41 ~CTFCoder() final = default;
42
44 template <typename VEC>
45 o2::ctf::CTFIOSize encode(VEC& buff, const CTFHelper::TFData& tfData);
46
48 template <typename VROF, typename VCOL>
49 o2::ctf::CTFIOSize decode(const CTF::base& ec, std::array<VROF, NEvTypes>& rofVec, std::array<VCOL, NEvTypes>& colVec);
50
51 void createCoders(const std::vector<char>& bufVec, o2::ctf::CTFCoderBase::OpType op) final;
52
53 private:
54 void appendToTree(TTree& tree, CTF& ec);
55 void readFromTree(TTree& tree, int entry, std::array<std::vector<ROFRecord>, NEvTypes>& rofVec, std::array<std::vector<ColumnData>, NEvTypes>& colVec);
56};
57
59template <typename VEC>
60o2::ctf::CTFIOSize CTFCoder::encode(VEC& buff, const CTFHelper::TFData& tfData)
61{
63 // what to do which each field: see o2::ctd::Metadata explanation
64 constexpr MD optField[CTF::getNBlocks()] = {
65 MD::EENCODE_OR_PACK, // BLC_bcIncROF
66 MD::EENCODE_OR_PACK, // BLC_orbitIncROF
67 MD::EENCODE_OR_PACK, // BLC_entriesROF
68 MD::EENCODE_OR_PACK, // BLC_evtypeROF
69 MD::EENCODE_OR_PACK, // BLC_pattern
70 MD::EENCODE_OR_PACK, // BLC_deId
71 MD::EENCODE_OR_PACK // BLC_colId
72 };
73 CTFHelper helper(tfData);
74
75 // book output size with some margin
76 auto szIni = sizeof(CTFHeader) + helper.getSize() * 2. / 3; // will be autoexpanded if needed
77 buff.resize(szIni);
78
79 auto ec = CTF::create(buff);
80 using ECB = CTF::base;
81
82 ec->setHeader(helper.createHeader());
83 assignDictVersion(static_cast<o2::ctf::CTFDictHeader&>(ec->getHeader()));
84 ec->setANSHeader(mANSVersion);
85 // at every encoding the buffer might be autoexpanded, so we don't work with fixed pointer ec
86 o2::ctf::CTFIOSize iosize;
87#define ENCODEMID(beg, end, slot, bits) CTF::get(buff.data())->encode(beg, end, int(slot), bits, optField[int(slot)], &buff, mCoders[int(slot)], getMemMarginFactor());
88 // clang-format off
89 iosize += ENCODEMID(helper.begin_bcIncROF(), helper.end_bcIncROF(), CTF::BLC_bcIncROF, 0);
90 iosize += ENCODEMID(helper.begin_orbitIncROF(), helper.end_orbitIncROF(), CTF::BLC_orbitIncROF, 0);
91 iosize += ENCODEMID(helper.begin_entriesROF(), helper.end_entriesROF(), CTF::BLC_entriesROF, 0);
92 iosize += ENCODEMID(helper.begin_evtypeROF(), helper.end_evtypeROF(), CTF::BLC_evtypeROF, 0);
93
94 iosize += ENCODEMID(helper.begin_pattern(), helper.end_pattern(), CTF::BLC_pattern, 0);
95 iosize += ENCODEMID(helper.begin_deId(), helper.end_deId(), CTF::BLC_deId, 0);
96 iosize += ENCODEMID(helper.begin_colId(), helper.end_colId(), CTF::BLC_colId, 0);
97 // clang-format on
98 CTF::get(buff.data())->print(getPrefix(), mVerbosity);
99 finaliseCTFOutput<CTF>(buff);
100 iosize.rawIn = iosize.ctfIn;
101 return iosize;
102}
103
105template <typename VROF, typename VCOL>
106o2::ctf::CTFIOSize CTFCoder::decode(const CTF::base& ec, std::array<VROF, NEvTypes>& rofVec, std::array<VCOL, NEvTypes>& colVec)
107{
108 auto header = ec.getHeader();
109 checkDictVersion(static_cast<const o2::ctf::CTFDictHeader&>(header));
111 std::vector<int16_t> bcInc;
112 std::vector<int32_t> orbitInc;
113 std::vector<uint16_t> entries, pattern;
114 std::vector<uint8_t> evType, deId, colId;
115
116 o2::ctf::CTFIOSize iosize;
117#define DECODEMID(part, slot) ec.decode(part, int(slot), mCoders[int(slot)])
118 // clang-format off
119 iosize += DECODEMID(bcInc, CTF::BLC_bcIncROF);
120 iosize += DECODEMID(orbitInc, CTF::BLC_orbitIncROF);
121 iosize += DECODEMID(entries, CTF::BLC_entriesROF);
122 iosize += DECODEMID(evType, CTF::BLC_evtypeROF);
123
125 iosize += DECODEMID(deId, CTF::BLC_deId);
126 iosize += DECODEMID(colId, CTF::BLC_colId);
127 // clang-format on
128 //
129 for (uint32_t i = 0; i < NEvTypes; i++) {
130 rofVec[i].clear();
131 colVec[i].clear();
132 rofVec[i].reserve(header.nROFs);
133 colVec[i].reserve(header.nColumns);
134 }
135
136 uint32_t firstEntry = 0, rofCount = 0, colCount = 0, pCount = 0;
137 o2::InteractionRecord ir(header.firstBC, header.firstOrbit);
138
139 for (uint32_t irof = 0; irof < header.nROFs; irof++) {
140 // restore ROFRecord
141 if (orbitInc[irof]) { // non-0 increment => new orbit
142 ir.bc = bcInc[irof]; // bcInc has absolute meaning
143 ir.orbit += orbitInc[irof];
144 } else {
145 ir.bc += bcInc[irof];
146 }
147 auto& cv = colVec[evType[irof]];
148 firstEntry = cv.size();
149 for (uint16_t ic = 0; ic < entries[irof]; ic++) {
150 cv.emplace_back(ColumnData{deId[colCount], colId[colCount], std::array{pattern[pCount], pattern[pCount + 1], pattern[pCount + 2], pattern[pCount + 3], pattern[pCount + 4]}});
151 pCount += 5;
152 colCount++;
153 }
154 rofVec[evType[irof]].emplace_back(ROFRecord{ir, EventType(evType[irof]), firstEntry, entries[irof]});
155 }
156 assert(colCount == header.nColumns);
157 iosize.rawIn = iosize.ctfIn;
158 return iosize;
159}
160
161} // namespace mid
162} // namespace o2
163
164#endif // O2_MID_CTFCODER_H
Declarations for CTFCoderBase class (support of external dictionaries)
Strip pattern (aka digits)
int32_t i
uint32_t op
#define ENCODEMID(beg, end, slot, bits)
#define DECODEMID(part, slot)
Helper for MID CTF creation.
Definitions for MID CTF data.
Definition of the MID event record.
void checkDictVersion(const CTFDictHeader &h) const
ctf::ANSHeader mANSVersion
std::string getPrefix() const
virtual void assignDictVersion(CTFDictHeader &h) const
<<======================== Auxiliary classes =======================<<
static auto get(void *head)
cast arbitrary buffer head to container class. Head is supposed to respect the alignment
const H & getHeader() const
void print(const std::string &prefix="", int verbosity=1) const
print itself
EncodedBlocks< CTFHeader, N, uint32_t > base
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
o2::ctf::CTFIOSize encode(VEC &buff, const CTFHelper::TFData &tfData)
entropy-encode data to buffer with CTF
Definition CTFCoder.h:60
void createCoders(const std::vector< char > &bufVec, o2::ctf::CTFCoderBase::OpType op) final
Definition CTFCoder.cxx:41
CTFCoder(o2::ctf::CTFCoderBase::OpType op)
Definition CTFCoder.h:40
~CTFCoder() final=default
o2::ctf::CTFIOSize decode(const CTF::base &ec, std::array< VROF, NEvTypes > &rofVec, std::array< VCOL, NEvTypes > &colVec)
entropy decode data from buffer with CTF
Definition CTFCoder.h:106
Iter_orbitIncROF begin_orbitIncROF() const
Definition CTFHelper.h:295
size_t getSize() const
Definition CTFHelper.h:63
Iter_pattern end_pattern() const
Definition CTFHelper.h:305
Iter_deId end_deId() const
Definition CTFHelper.h:308
Iter_evtypeROF end_evtypeROF() const
Definition CTFHelper.h:302
Iter_deId begin_deId() const
Definition CTFHelper.h:307
Iter_pattern begin_pattern() const
Definition CTFHelper.h:304
Iter_evtypeROF begin_evtypeROF() const
Definition CTFHelper.h:301
Iter_orbitIncROF end_orbitIncROF() const
Definition CTFHelper.h:296
Iter_entriesROF end_entriesROF() const
Definition CTFHelper.h:299
Iter_bcIncROF begin_bcIncROF() const
Definition CTFHelper.h:292
Iter_bcIncROF end_bcIncROF() const
Definition CTFHelper.h:293
CTFHeader createHeader()
Definition CTFHelper.h:50
Iter_entriesROF begin_entriesROF() const
Definition CTFHelper.h:298
Iter_colId end_colId() const
Definition CTFHelper.h:311
Iter_colId begin_colId() const
Definition CTFHelper.h:310
GLuint entry
Definition glcorearb.h:5735
GLenum array
Definition glcorearb.h:4274
constexpr uint32_t NEvTypes
Definition ROFRecord.h:37
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
uint32_t orbit
LHC orbit.
uint16_t bc
bunch crossing ID of interaction
Detector header base.
Header for a single CTF.
Definition CTF.h:31
wrapper for the Entropy-encoded clusters of the TF
Definition CTF.h:41
@ BLC_colId
Definition CTF.h:50
@ BLC_bcIncROF
Definition CTF.h:44
@ BLC_entriesROF
Definition CTF.h:46
@ BLC_pattern
Definition CTF.h:48
@ BLC_deId
Definition CTF.h:49
@ BLC_orbitIncROF
Definition CTF.h:45
@ BLC_evtypeROF
Definition CTF.h:47
Column data structure for MID.
Definition ColumnData.h:29
o2::InteractionRecord ir(0, 0)
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))
CTFHelper::TFData tfData
std::array< uint16_t, 5 > pattern