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;
181 int triggerGate =
params.mTime_trg_gate;
182 firstEntry = channelVec.size();
187 for (uint8_t ic = 0; ic < cd.
nChan[idig]; ic++) {
188 auto icc = channelVec.size();
189 if constexpr (MINOR_VERSION == 0 && MAJOR_VERSION == 1) {
197 if (std::abs(chan.CFDTime) < triggerGate) {
198 amplA += chan.QTCAmpl;
199 timeA += chan.CFDTime;
212 digitVec.emplace_back(firstEntry, cd.
nChan[idig],
ir, trig, idig);
216template <
int MAJOR_VERSION,
int MINOR_VERSION>
217void CTFCoder::compress(CompressedDigits& cd,
const gsl::span<const Digit>& digitVec,
const gsl::span<const ChannelData>& channelVec)
221 cd.header.det =
mDet;
222 if (!digitVec.size()) {
225 uint32_t firstDig = digitVec.size(), nDigSel = digitVec.size(), nChanSel = channelVec.size();
226 std::vector<bool> reject(digitVec.size());
228 for (
size_t id = 0;
id < digitVec.size();
id++) {
232 nChanSel -= digitVec[
id].ref.getEntries();
233 }
else if (firstDig == digitVec.size()) {
243 const auto& dig0 = digitVec[firstDig];
244 cd.header.nTriggers = nDigSel;
245 cd.header.firstOrbit = dig0.getOrbit();
246 cd.header.firstBC = dig0.getBC();
249 cd.trigger.resize(cd.header.nTriggers);
250 cd.bcInc.resize(cd.header.nTriggers);
251 cd.orbitInc.resize(cd.header.nTriggers);
252 cd.nChan.resize(cd.header.nTriggers);
254 cd.idChan.resize(nChanSel);
255 cd.qtcChain.resize(nChanSel);
256 cd.cfdTime.resize(nChanSel);
257 cd.qtcAmpl.resize(nChanSel);
259 uint16_t prevBC = cd.header.firstBC;
260 uint32_t prevOrbit = cd.header.firstOrbit;
261 uint32_t ccount = 0, dcount = 0;
262 for (uint32_t idig = 0; idig < digitVec.size(); idig++) {
266 const auto& digit = digitVec[idig];
267 const auto chanels = digit.getBunchChannelData(channelVec);
270 cd.trigger[dcount] = digit.getTriggers().getTriggersignals();
271 if (prevOrbit == digit.getOrbit()) {
272 cd.bcInc[dcount] = digit.getBC() - prevBC;
273 cd.orbitInc[dcount] = 0;
275 cd.bcInc[dcount] = digit.getBC();
276 cd.orbitInc[dcount] = digit.getOrbit() - prevOrbit;
278 prevBC = digit.getBC();
279 prevOrbit = digit.getOrbit();
281 cd.nChan[dcount] = chanels.size();
282 if (!cd.nChan[dcount]) {
283 LOG(
debug) <<
"Digits with no channels";
288 for (uint8_t ic = 0; ic < cd.nChan[dcount]; ic++) {
289 if constexpr (MINOR_VERSION == 0 && MAJOR_VERSION == 1) {
290 cd.idChan[ccount] = chanels[ic].ChId - prevChan;
292 cd.idChan[ccount] = chanels[ic].ChId;
294 cd.qtcChain[ccount] = chanels[ic].ChainQTC;
295 cd.cfdTime[ccount] = chanels[ic].CFDTime;
296 cd.qtcAmpl[ccount] = chanels[ic].QTCAmpl;
297 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
void createCoders(const std::vector< char > &bufVec, o2::ctf::CTFCoderBase::OpType op) final
~CTFCoder() final=default
CTFCoder(o2::ctf::CTFCoderBase::OpType op)
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 ...
Defining DataPointCompositeObject explicitly as copiable.
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()))