16#ifndef O2_FV0_CTFCODER_H
17#define O2_FV0_CTFCODER_H
40 template <typename VEC>
44 template <typename VDIG, typename VCHAN>
45 o2::ctf::CTFIOSize
decode(const
CTF::base& ec, VDIG& digitVec, VCHAN& channelVec);
51 template <
int MAJOR_VERSION,
int MINOR_VERSION>
56 template <
int MAJOR_VERSION,
int MINOR_VERSION, typename VDIG, typename VCHAN>
57 void decompress(const
CompressedDigits& cd, VDIG& digitVec, VCHAN& channelVec);
59 void appendToTree(TTree&
tree,
CTF& ec);
61 void assignDictVersion(
o2::ctf::CTFDictHeader&
h) const final;
65template <typename VEC>
84 compress<1, 0>(cd, digitVec, channelVec);
86 compress<1, 1>(cd, digitVec, channelVec);
89 compress<1, 1>(cd, digitVec, channelVec);
92 auto szIni = estimateCompressedSize(cd);
98 ec->setHeader(cd.header);
103#define ENCODEFV0(part, slot, bits) CTF::get(buff.data())->encode(part, int(slot), bits, optField[int(slot)], &buff, mCoders[int(slot)], getMemMarginFactor());
116 finaliseCTFOutput<CTF>(buff);
122template <
typename VDIG,
typename VCHAN>
131#define DECODEFV0(part, slot) ec.decode(part, int(slot), mCoders[int(slot)])
151 if (hd.minorVersion == 0 && hd.majorVersion == 1) {
152 decompress<1, 0>(cd, digitVec, channelVec);
154 decompress<1, 1>(cd, digitVec, channelVec);
161template <
int MAJOR_VERSION,
int MINOR_VERSION,
typename VDIG,
typename VCHAN>
162void CTFCoder::decompress(
const CompressedDigits& cd, VDIG& digitVec, VCHAN& channelVec)
167 channelVec.reserve(cd.
idChan.size());
169 uint32_t firstEntry = 0, clCount = 0, chipCount = 0;
183 int triggerGate =
params.mTime_trg_gate;
184 firstEntry = channelVec.size();
189 for (uint8_t ic = 0; ic < cd.
nChan[idig]; ic++) {
190 auto icc = channelVec.size();
191 if constexpr (MINOR_VERSION == 0 && MAJOR_VERSION == 1) {
199 if (std::abs(chan.CFDTime) < triggerGate) {
200 amplA += chan.QTCAmpl;
201 timeA += chan.CFDTime;
214 digitVec.emplace_back(firstEntry, cd.
nChan[idig],
ir, trig, idig);
218template <
int MAJOR_VERSION,
int MINOR_VERSION>
219void CTFCoder::compress(CompressedDigits& cd,
const gsl::span<const Digit>& digitVec,
const gsl::span<const ChannelData>& channelVec)
223 cd.header.det =
mDet;
224 if (!digitVec.size()) {
227 uint32_t firstDig = digitVec.size(), nDigSel = digitVec.size(), nChanSel = channelVec.size();
228 std::vector<bool> reject(digitVec.size());
230 for (
size_t id = 0;
id < digitVec.size();
id++) {
234 nChanSel -= digitVec[
id].ref.getEntries();
235 }
else if (firstDig == digitVec.size()) {
245 const auto& dig0 = digitVec[firstDig];
246 cd.header.nTriggers = nDigSel;
247 cd.header.firstOrbit = dig0.getOrbit();
248 cd.header.firstBC = dig0.getBC();
251 cd.trigger.resize(cd.header.nTriggers);
252 cd.bcInc.resize(cd.header.nTriggers);
253 cd.orbitInc.resize(cd.header.nTriggers);
254 cd.nChan.resize(cd.header.nTriggers);
256 cd.idChan.resize(nChanSel);
257 cd.qtcChain.resize(nChanSel);
258 cd.cfdTime.resize(nChanSel);
259 cd.qtcAmpl.resize(nChanSel);
261 uint16_t prevBC = cd.header.firstBC;
262 uint32_t prevOrbit = cd.header.firstOrbit;
263 uint32_t ccount = 0, dcount = 0;
264 for (uint32_t idig = 0; idig < digitVec.size(); idig++) {
268 const auto& digit = digitVec[idig];
269 const auto chanels = digit.getBunchChannelData(channelVec);
272 cd.trigger[dcount] = digit.getTriggers().getTriggersignals();
273 if (prevOrbit == digit.getOrbit()) {
274 cd.bcInc[dcount] = digit.getBC() - prevBC;
275 cd.orbitInc[dcount] = 0;
277 cd.bcInc[dcount] = digit.getBC();
278 cd.orbitInc[dcount] = digit.getOrbit() - prevOrbit;
280 prevBC = digit.getBC();
281 prevOrbit = digit.getOrbit();
283 cd.nChan[dcount] = chanels.size();
284 if (!cd.nChan[dcount]) {
285 LOG(
debug) <<
"Digits with no channels";
290 for (uint8_t ic = 0; ic < cd.nChan[dcount]; ic++) {
291 if constexpr (MINOR_VERSION == 0 && MAJOR_VERSION == 1) {
292 cd.idChan[ccount] = chanels[ic].ChId - prevChan;
294 cd.idChan[ccount] = chanels[ic].ChId;
296 cd.qtcChain[ccount] = chanels[ic].ChainQTC;
297 cd.cfdTime[ccount] = chanels[ic].CFDTime;
298 cd.qtcAmpl[ccount] = chanels[ic].QTCAmpl;
299 prevChan = chanels[ic].ChId;
Declarations for CTFCoderBase class (support of external dictionaries)
#define ENCODEFV0(part, slot, bits)
#define DECODEFV0(part, slot)
Configurable digitization parameters.
Class for time synchronization of RawReader instances.
static const FV0DigParam & Instance()
void checkDictVersion(const CTFDictHeader &h) const
ctf::ANSHeader mANSVersion
std::string getPrefix() const
o2::utils::IRFrameSelector mIRFrameSelector
<<======================== 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
static constexpr int getNBlocks()
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.
static const int16_t DEFAULT_AMP
static const int16_t DEFAULT_TIME
void setTriggers(uint8_t trgsig, uint8_t chanA, uint8_t chanC, int32_t aamplA, int32_t aamplC, int16_t atimeA, int16_t atimeC)
o2::ctf::CTFIOSize encode(VEC &buff, const gsl::span< const Digit > &digitVec, const gsl::span< const ChannelData > &channelVec)
entropy-encode digits to buffer with CTF
o2::ctf::CTFIOSize decode(const CTF::base &ec, VDIG &digitVec, VCHAN &channelVec)
entropy decode clusters from buffer with CTF
CTFCoder(o2::ctf::CTFCoderBase::OpType op, const std::string &ctfdictOpt="none")
void createCoders(const std::vector< char > &bufVec, o2::ctf::CTFCoderBase::OpType op) final
~CTFCoder() final=default
long check(o2::dataformats::IRFrame fr, size_t bwd=0, size_t fwd=0)
GLenum const GLfloat * params
uint8_t itsSharedClusterMap uint8_t
o2::fit::Triggers Triggers
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
uint16_t bc
bunch crossing ID of interaction
wrapper for the Entropy-encoded clusters of the TF
Intermediate, compressed but not yet entropy-encoded digits.
std::vector< uint8_t > qtcChain
std::vector< int16_t > qtcAmpl
std::vector< int16_t > bcInc
std::vector< uint8_t > nChan
std::vector< uint8_t > idChan
std::vector< int16_t > cfdTime
std::vector< uint8_t > trigger
std::vector< int32_t > orbitInc
std::vector< o2::mch::ChannelCode > cc
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))