25void CTFCoder<N>::appendToTree(TTree&
tree, CTF& ec,
int id)
27 ec.appendToTree(
tree,
id >= 0 ? fmt::format(
"{}_{}", mDet.getName(),
id) : mDet.
getName());
33void CTFCoder<N>::readFromTree(TTree&
tree,
int entry,
int id, std::vector<ROFRecord>& rofRecVec,
38 ec.readFromTree(
tree,
id >= 0 ? fmt::format(
"{}_{}", mDet.getName(),
id) : mDet.
getName(),
entry);
44void CTFCoder<N>::compress(CompressedClusters&
cc,
45 const gsl::span<const ROFRecord>& rofRecVec,
46 const gsl::span<const CompClusterExt>&
cclusVec,
47 const gsl::span<const unsigned char>&
pattVec,
53 if (!rofRecVec.size()) {
56 uint32_t firstROF = rofRecVec.size(), nrofSel = rofRecVec.size(), nClusSel =
cclusVec.size();
57 std::vector<bool> reject(rofRecVec.size());
58 if (mIRFrameSelector.isSet()) {
59 for (
size_t ir = 0;
ir < rofRecVec.size();
ir++) {
60 auto irStart = rofRecVec[
ir].getBCData();
61 if (mIRFrameSelector.check({irStart, irStart + strobeLength - 1}) < 0) {
64 nClusSel -= rofRecVec[
ir].getNEntries();
65 }
else if (firstROF == rofRecVec.size()) {
77 const auto& rofRec0 = rofRecVec[firstROF];
78 cc.header.firstOrbit = rofRec0.getBCData().orbit;
79 cc.header.firstBC = rofRec0.getBCData().bc;
80 cc.header.nROFs = nrofSel;
81 cc.header.nClusters = nClusSel;
83 cc.firstChipROF.resize(nrofSel);
84 cc.bcIncROF.resize(nrofSel);
85 cc.orbitIncROF.resize(nrofSel);
86 cc.nclusROF.resize(nrofSel);
88 cc.row.resize(nClusSel);
89 cc.colInc.resize(nClusSel);
91 cc.chipInc.reserve(1000);
92 cc.chipMul.reserve(1000);
93 cc.pattID.resize(nClusSel);
95 bool selectPatterns = nrofSel < rofRecVec.size();
96 if (!selectPatterns) {
104 uint16_t prevBC =
cc.header.firstBC;
105 uint32_t prevOrbit =
cc.header.firstOrbit;
106 int irofOut = 0, iclOut = 0;
108 for (uint32_t irof = 0; irof < rofRecVec.size(); irof++) {
109 const auto& rofRec = rofRecVec[irof];
110 const auto& intRec = rofRec.getBCData();
113 if (selectPatterns && pattIt != pattIt0) {
114 cc.pattMap.insert(
cc.pattMap.end(), pattIt0, pattIt);
117 for (
int icl = rofRec.getFirstEntry(); icl < rofRec.getFirstEntry() + rofRec.getNEntries(); icl++) {
126 if (intRec.orbit == prevOrbit) {
127 cc.orbitIncROF[irofOut] = 0;
128#ifdef _CHECK_INCREMENTES_
129 if (intRec.bc < prevBC) {
130 LOG(warning) <<
"Negative BC increment " << intRec.bc <<
" -> " << prevBC;
133 cc.bcIncROF[irofOut] = int16_t(intRec.bc - prevBC);
135 cc.orbitIncROF[irofOut] = int32_t(intRec.orbit - prevOrbit);
136#ifdef _CHECK_INCREMENTES_
137 if (intRec.orbit < prevOrbit) {
138 LOG(warning) <<
"Negative Orbit increment " << intRec.orbit <<
" -> " << prevOrbit;
141 cc.bcIncROF[irofOut] = intRec.bc;
142 prevOrbit = intRec.orbit;
145 auto ncl = rofRec.getNEntries();
146 cc.nclusROF[irofOut] =
ncl;
148 cc.firstChipROF[irofOut] = 0;
152 cc.firstChipROF[irofOut] =
cclusVec[rofRec.getFirstEntry()].getChipID();
153 int icl = rofRec.getFirstEntry(), iclMax = icl +
ncl;
155 uint16_t prevChip =
cc.firstChipROF[irofOut], prevCol = 0;
157 cc.chipMul.push_back(0);
158 cc.chipInc.push_back(0);
160 for (; icl < iclMax; icl++) {
162 cc.row[iclOut] = cl.getRow();
163 cc.pattID[iclOut] = cl.getPatternID();
167 if (cl.getChipID() == prevChip) {
170 cc.colInc[iclOut] = int16_t(cl.getCol()) - prevCol;
171 prevCol = cl.getCol();
174 cc.chipInc.push_back(int16_t(cl.getChipID() - prevChip));
175#ifdef _CHECK_INCREMENTES_
176 if (cl.getChipID() < prevChip) {
177 LOG(warning) <<
"Negative Chip increment " << cl.getChipID() <<
" -> " << prevChip;
180 cc.chipMul.push_back(1);
181 prevCol =
cc.colInc[iclOut] = cl.getCol();
182 prevChip = cl.getChipID();
188 if (selectPatterns && pattIt != pattIt0) {
189 cc.pattMap.insert(
cc.pattMap.end(), pattIt0, pattIt);
192 cc.header.nPatternBytes =
cc.pattMap.size();
193 cc.header.nChips =
cc.chipMul.size();
202#define MAKECODER(part, slot) createCoder(op, std::get<rans::RenormedDenseHistogram<typename decltype(part)::value_type>>(ctf.getDictionary<typename decltype(part)::value_type>(slot, mANSVersion)), int(slot))
232 sz += estimateBufferSize(
static_cast<int>(
CTF::BLCrow),
cc.row);
237 LOG(
debug) <<
"Estimated output size is " << sz <<
" bytes";
245 CompressedClusters
cc;
246 cc.header = ec.getHeader();
248 ec.print(getPrefix(), mVerbosity);
249#define DECODEITSMFT(part, slot) ec.decode(part, int(slot), mCoders[int(slot)])
266template class CTFCoder<o2::detectors::DetID::ITS>;
267template class CTFCoder<o2::detectors::DetID::MFT>;
#define MAKECODER(part, slot)
std::string getName(const TDataMember *dm, int index, int size)
class for entropy encoding/decoding of ITS/MFT compressed clusters data
#define DECODEITSMFT(part, slot)
static auto getImage(const void *newHead)
get const image of the container wrapper, with pointers in the image relocated to new head
EncodedBlocks< CTFHeader, N, uint32_t > base
void createCoders(const std::vector< char > &bufVec, o2::ctf::CTFCoderBase::OpType op) final
static void skipPattern(iterator &pattIt)
static constexpr unsigned short InvalidPatternID
bool isGroup(int id) const
Compressed but not yet entropy-encoded clusters.
std::vector< o2::mch::ChannelCode > cc
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
coder decode(ctfImage, triggersD, clustersD)
o2::InteractionRecord ir(0, 0)
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))
std::vector< unsigned char > pattVec
std::vector< CompClusterExt > cclusVec