@@ -107,7 +107,7 @@ class CTFCoder : public o2::ctf::CTFCoderBase
107107
108108 // / entropy-encode compressed clusters to flat buffer
109109 template <typename VEC >
110- o2::ctf::CTFIOSize encode (VEC & buff, const CompressedClusters& ccl);
110+ o2::ctf::CTFIOSize encode (VEC & buff, const CompressedClusters& ccl, std::vector< bool >* rejectHits = nullptr , std::vector< bool >* rejectTracks = nullptr , std::vector< bool >* rejectTrackHits = nullptr , std::vector< bool >* rejectTrackHitsReduced = nullptr );
111111
112112 template <typename VEC >
113113 o2::ctf::CTFIOSize decode (const CTF ::base& ec, VEC & buff);
@@ -161,7 +161,7 @@ void CTFCoder::buildCoder(ctf::CTFCoderBase::OpType coderType, const CTF::contai
161161
162162// / entropy-encode clusters to buffer with CTF
163163template <typename VEC >
164- o2::ctf::CTFIOSize CTFCoder::encode (VEC & buff, const CompressedClusters& ccl)
164+ o2::ctf::CTFIOSize CTFCoder::encode (VEC & buff, const CompressedClusters& ccl, std::vector< bool >* rejectHits, std::vector< bool >* rejectTracks, std::vector< bool >* rejectTrackHits, std::vector< bool >* rejectTrackHitsReduced )
165165{
166166 using MD = o2::ctf::Metadata::OptStore;
167167 using namespace detail ;
@@ -208,73 +208,84 @@ o2::ctf::CTFIOSize CTFCoder::encode(VEC& buff, const CompressedClusters& ccl)
208208 ec->getANSHeader ().minorVersion = 1 ;
209209
210210 o2::ctf::CTFIOSize iosize;
211- auto encodeTPC = [&buff, &optField, &coders = mCoders , mfc = this ->getMemMarginFactor (), &iosize](auto begin, auto end, CTF ::Slots slot, size_t probabilityBits) {
211+ 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 ) {
212212 // at every encoding the buffer might be autoexpanded, so we don't work with fixed pointer ec
213213 const auto slotVal = static_cast <int >(slot);
214- iosize += CTF::get (buff.data ())->encode (begin, end, slotVal, probabilityBits, optField[slotVal], &buff, coders[slotVal].get (), mfc);
214+ if (reject && begin != end) {
215+ std::vector<std::decay_t <decltype (*begin)>> tmp;
216+ tmp.reserve (std::distance (end, begin));
217+ for (auto i = begin; i != end; i++) {
218+ if (!(*reject)[std::distance (i, begin)]) {
219+ tmp.emplace_back (*i);
220+ }
221+ }
222+ iosize += CTF::get (buff.data ())->encode (tmp.begin (), tmp.end (), slotVal, probabilityBits, optField[slotVal], &buff, coders[slotVal].get (), mfc);
223+ } else {
224+ iosize += CTF::get (buff.data ())->encode (begin, end, slotVal, probabilityBits, optField[slotVal], &buff, coders[slotVal].get (), mfc);
225+ }
215226 };
216227
217228 if (mCombineColumns ) {
218229 const auto [begin, end] = makeInputIterators (ccl.qTotA , ccl.qMaxA , ccl.nAttachedClusters ,
219230 ShiftFunctor<combinedType_t<CTF ::NBitsQTot, CTF ::NBitsQMax>, CTF ::NBitsQMax>{});
220- encodeTPC (begin, end, CTF ::BLCqTotA, 0 );
231+ encodeTPC (begin, end, CTF ::BLCqTotA, 0 , rejectTrackHits );
221232 } else {
222- encodeTPC (ccl.qTotA , ccl.qTotA + ccl.nAttachedClusters , CTF ::BLCqTotA, 0 );
233+ encodeTPC (ccl.qTotA , ccl.qTotA + ccl.nAttachedClusters , CTF ::BLCqTotA, 0 , rejectTrackHits );
223234 }
224- encodeTPC (ccl.qMaxA , ccl.qMaxA + (mCombineColumns ? 0 : ccl.nAttachedClusters ), CTF ::BLCqMaxA, 0 );
235+ encodeTPC (ccl.qMaxA , ccl.qMaxA + (mCombineColumns ? 0 : ccl.nAttachedClusters ), CTF ::BLCqMaxA, 0 , rejectTrackHits );
225236
226- encodeTPC (ccl.flagsA , ccl.flagsA + ccl.nAttachedClusters , CTF ::BLCflagsA, 0 );
237+ encodeTPC (ccl.flagsA , ccl.flagsA + ccl.nAttachedClusters , CTF ::BLCflagsA, 0 , rejectTrackHits );
227238
228239 if (mCombineColumns ) {
229240 const auto [begin, end] = makeInputIterators (ccl.rowDiffA , ccl.sliceLegDiffA , ccl.nAttachedClustersReduced ,
230241 ShiftFunctor<combinedType_t<CTF ::NBitsRowDiff, CTF ::NBitsSliceLegDiff>, CTF ::NBitsSliceLegDiff>{});
231- encodeTPC (begin, end, CTF ::BLCrowDiffA, 0 );
242+ encodeTPC (begin, end, CTF ::BLCrowDiffA, 0 , rejectTrackHitsReduced );
232243 } else {
233- encodeTPC (ccl.rowDiffA , ccl.rowDiffA + ccl.nAttachedClustersReduced , CTF ::BLCrowDiffA, 0 );
244+ encodeTPC (ccl.rowDiffA , ccl.rowDiffA + ccl.nAttachedClustersReduced , CTF ::BLCrowDiffA, 0 , rejectTrackHitsReduced );
234245 }
235- encodeTPC (ccl.sliceLegDiffA , ccl.sliceLegDiffA + (mCombineColumns ? 0 : ccl.nAttachedClustersReduced ), CTF ::BLCsliceLegDiffA, 0 );
246+ encodeTPC (ccl.sliceLegDiffA , ccl.sliceLegDiffA + (mCombineColumns ? 0 : ccl.nAttachedClustersReduced ), CTF ::BLCsliceLegDiffA, 0 , rejectTrackHitsReduced );
236247
237- encodeTPC (ccl.padResA , ccl.padResA + ccl.nAttachedClustersReduced , CTF ::BLCpadResA, 0 );
238- encodeTPC (ccl.timeResA , ccl.timeResA + ccl.nAttachedClustersReduced , CTF ::BLCtimeResA, 0 );
248+ encodeTPC (ccl.padResA , ccl.padResA + ccl.nAttachedClustersReduced , CTF ::BLCpadResA, 0 , rejectTrackHitsReduced );
249+ encodeTPC (ccl.timeResA , ccl.timeResA + ccl.nAttachedClustersReduced , CTF ::BLCtimeResA, 0 , rejectTrackHitsReduced );
239250
240251 if (mCombineColumns ) {
241252 const auto [begin, end] = makeInputIterators (ccl.sigmaPadA , ccl.sigmaTimeA , ccl.nAttachedClusters ,
242253 ShiftFunctor<combinedType_t<CTF ::NBitsSigmaPad, CTF ::NBitsSigmaTime>, CTF ::NBitsSigmaTime>{});
243- encodeTPC (begin, end, CTF ::BLCsigmaPadA, 0 );
254+ encodeTPC (begin, end, CTF ::BLCsigmaPadA, 0 , rejectTrackHits );
244255 } else {
245- encodeTPC (ccl.sigmaPadA , ccl.sigmaPadA + ccl.nAttachedClusters , CTF ::BLCsigmaPadA, 0 );
256+ encodeTPC (ccl.sigmaPadA , ccl.sigmaPadA + ccl.nAttachedClusters , CTF ::BLCsigmaPadA, 0 , rejectTrackHits );
246257 }
247- encodeTPC (ccl.sigmaTimeA , ccl.sigmaTimeA + (mCombineColumns ? 0 : ccl.nAttachedClusters ), CTF ::BLCsigmaTimeA, 0 );
258+ encodeTPC (ccl.sigmaTimeA , ccl.sigmaTimeA + (mCombineColumns ? 0 : ccl.nAttachedClusters ), CTF ::BLCsigmaTimeA, 0 , rejectTrackHits );
248259
249- encodeTPC (ccl.qPtA , ccl.qPtA + ccl.nTracks , CTF ::BLCqPtA, 0 );
250- encodeTPC (ccl.rowA , ccl.rowA + ccl.nTracks , CTF ::BLCrowA, 0 );
251- encodeTPC (ccl.sliceA , ccl.sliceA + ccl.nTracks , CTF ::BLCsliceA, 0 );
252- encodeTPC (ccl.timeA , ccl.timeA + ccl.nTracks , CTF ::BLCtimeA, 0 );
253- encodeTPC (ccl.padA , ccl.padA + ccl.nTracks , CTF ::BLCpadA, 0 );
260+ encodeTPC (ccl.qPtA , ccl.qPtA + ccl.nTracks , CTF ::BLCqPtA, 0 , rejectTracks );
261+ encodeTPC (ccl.rowA , ccl.rowA + ccl.nTracks , CTF ::BLCrowA, 0 , rejectTracks );
262+ encodeTPC (ccl.sliceA , ccl.sliceA + ccl.nTracks , CTF ::BLCsliceA, 0 , rejectTracks );
263+ encodeTPC (ccl.timeA , ccl.timeA + ccl.nTracks , CTF ::BLCtimeA, 0 , rejectTracks );
264+ encodeTPC (ccl.padA , ccl.padA + ccl.nTracks , CTF ::BLCpadA, 0 , rejectTracks );
254265
255266 if (mCombineColumns ) {
256267 const auto [begin, end] = makeInputIterators (ccl.qTotU , ccl.qMaxU , ccl.nUnattachedClusters ,
257268 ShiftFunctor<combinedType_t<CTF ::NBitsQTot, CTF ::NBitsQMax>, CTF ::NBitsQMax>{});
258- encodeTPC (begin, end, CTF ::BLCqTotU, 0 );
269+ encodeTPC (begin, end, CTF ::BLCqTotU, 0 , rejectHits );
259270 } else {
260- encodeTPC (ccl.qTotU , ccl.qTotU + ccl.nUnattachedClusters , CTF ::BLCqTotU, 0 );
271+ encodeTPC (ccl.qTotU , ccl.qTotU + ccl.nUnattachedClusters , CTF ::BLCqTotU, 0 , rejectHits );
261272 }
262- encodeTPC (ccl.qMaxU , ccl.qMaxU + (mCombineColumns ? 0 : ccl.nUnattachedClusters ), CTF ::BLCqMaxU, 0 );
273+ encodeTPC (ccl.qMaxU , ccl.qMaxU + (mCombineColumns ? 0 : ccl.nUnattachedClusters ), CTF ::BLCqMaxU, 0 , rejectHits );
263274
264- encodeTPC (ccl.flagsU , ccl.flagsU + ccl.nUnattachedClusters , CTF ::BLCflagsU, 0 );
265- encodeTPC (ccl.padDiffU , ccl.padDiffU + ccl.nUnattachedClusters , CTF ::BLCpadDiffU, 0 );
266- encodeTPC (ccl.timeDiffU , ccl.timeDiffU + ccl.nUnattachedClusters , CTF ::BLCtimeDiffU, 0 );
275+ encodeTPC (ccl.flagsU , ccl.flagsU + ccl.nUnattachedClusters , CTF ::BLCflagsU, 0 , rejectHits );
276+ encodeTPC (ccl.padDiffU , ccl.padDiffU + ccl.nUnattachedClusters , CTF ::BLCpadDiffU, 0 , rejectHits );
277+ encodeTPC (ccl.timeDiffU , ccl.timeDiffU + ccl.nUnattachedClusters , CTF ::BLCtimeDiffU, 0 , rejectHits );
267278
268279 if (mCombineColumns ) {
269280 const auto [begin, end] = makeInputIterators (ccl.sigmaPadU , ccl.sigmaTimeU , ccl.nUnattachedClusters ,
270281 ShiftFunctor<combinedType_t<CTF ::NBitsSigmaPad, CTF ::NBitsSigmaTime>, CTF ::NBitsSigmaTime>{});
271- encodeTPC (begin, end, CTF ::BLCsigmaPadU, 0 );
282+ encodeTPC (begin, end, CTF ::BLCsigmaPadU, 0 , rejectHits );
272283 } else {
273- encodeTPC (ccl.sigmaPadU , ccl.sigmaPadU + ccl.nUnattachedClusters , CTF ::BLCsigmaPadU, 0 );
284+ encodeTPC (ccl.sigmaPadU , ccl.sigmaPadU + ccl.nUnattachedClusters , CTF ::BLCsigmaPadU, 0 , rejectHits );
274285 }
275- encodeTPC (ccl.sigmaTimeU , ccl.sigmaTimeU + (mCombineColumns ? 0 : ccl.nUnattachedClusters ), CTF ::BLCsigmaTimeU, 0 );
286+ encodeTPC (ccl.sigmaTimeU , ccl.sigmaTimeU + (mCombineColumns ? 0 : ccl.nUnattachedClusters ), CTF ::BLCsigmaTimeU, 0 , rejectHits );
276287
277- encodeTPC (ccl.nTrackClusters , ccl.nTrackClusters + ccl.nTracks , CTF ::BLCnTrackClusters, 0 );
288+ encodeTPC (ccl.nTrackClusters , ccl.nTrackClusters + ccl.nTracks , CTF ::BLCnTrackClusters, 0 , rejectTracks );
278289 encodeTPC (ccl.nSliceRowClusters , ccl.nSliceRowClusters + ccl.nSliceRows , CTF ::BLCnSliceRowClusters, 0 );
279290 CTF::get (buff.data ())->print (getPrefix (), mVerbosity );
280291 finaliseCTFOutput<CTF >(buff);
0 commit comments