Skip to content

Commit a11edad

Browse files
committed
TPC: Support for CTF skimming (only removal part, check which hits to removed still missing)
1 parent 7ecef28 commit a11edad

5 files changed

Lines changed: 151 additions & 51 deletions

File tree

Detectors/TPC/reconstruction/include/TPCReconstruction/CTFCoder.h

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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
163163
template <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);

Detectors/TPC/workflow/include/TPCWorkflow/EntropyEncoderSpec.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,35 @@
2323

2424
namespace o2
2525
{
26+
27+
namespace gpu
28+
{
29+
struct GPUO2InterfaceConfiguration;
30+
class TPCFastTransform;
31+
struct GPUSettingsO2;
32+
struct GPUParam;
33+
} // end namespace gpu
34+
2635
namespace tpc
2736
{
2837

2938
class EntropyEncoderSpec : public o2::framework::Task
3039
{
3140
public:
32-
EntropyEncoderSpec(bool fromFile, bool selIR = false) : mCTFCoder(o2::ctf::CTFCoderBase::OpType::Encoder), mFromFile(fromFile), mSelIR(selIR)
33-
{
34-
mTimer.Stop();
35-
mTimer.Reset();
36-
}
37-
~EntropyEncoderSpec() override = default;
41+
EntropyEncoderSpec(bool fromFile, bool selIR = false);
42+
~EntropyEncoderSpec() override;
3843
void run(o2::framework::ProcessingContext& pc) final;
3944
void init(o2::framework::InitContext& ic) final;
4045
void endOfStream(o2::framework::EndOfStreamContext& ec) final;
4146
void finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj) final;
4247

4348
private:
4449
o2::tpc::CTFCoder mCTFCoder;
50+
std::unique_ptr<o2::gpu::GPUO2InterfaceConfiguration> mConfig;
51+
std::unique_ptr<o2::gpu::GPUSettingsO2> mConfParam;
52+
std::unique_ptr<o2::gpu::TPCFastTransform> mFastTransform;
53+
std::unique_ptr<o2::gpu::GPUParam> mParam;
54+
4555
bool mFromFile = false;
4656
bool mSelIR = false;
4757
TStopwatch mTimer;

Detectors/TPC/workflow/src/EntropyEncoderSpec.cxx

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
#include "Framework/ConfigParamRegistry.h"
2020
#include "Framework/CCDBParamSpec.h"
2121
#include "Headers/DataHeader.h"
22+
#include "TPCReconstruction/TPCFastTransformHelperO2.h"
23+
#include "GPUO2InterfaceConfiguration.h"
24+
#include "GPUParam.h"
25+
#include "DataFormatsTPC/ClusterNative.h"
26+
#include "TPCClusterDecompressor.inc"
2227

2328
using namespace o2::framework;
2429
using namespace o2::header;
@@ -28,6 +33,14 @@ namespace o2
2833
namespace tpc
2934
{
3035

36+
EntropyEncoderSpec::~EntropyEncoderSpec() = default;
37+
38+
EntropyEncoderSpec::EntropyEncoderSpec(bool fromFile, bool selIR) : mCTFCoder(o2::ctf::CTFCoderBase::OpType::Encoder), mFromFile(fromFile), mSelIR(selIR)
39+
{
40+
mTimer.Stop();
41+
mTimer.Reset();
42+
}
43+
3144
void EntropyEncoderSpec::finaliseCCDB(o2::framework::ConcreteDataMatcher& matcher, void* obj)
3245
{
3346
if (mCTFCoder.finaliseCCDB<CTF>(matcher, obj)) {
@@ -39,6 +52,15 @@ void EntropyEncoderSpec::init(o2::framework::InitContext& ic)
3952
{
4053
mCTFCoder.init<CTF>(ic);
4154
mCTFCoder.setCombineColumns(!ic.options().get<bool>("no-ctf-columns-combining"));
55+
56+
mConfig.reset(new o2::gpu::GPUO2InterfaceConfiguration);
57+
mConfig->configGRP.solenoidBz = 0;
58+
mConfParam.reset(new o2::gpu::GPUSettingsO2(mConfig->ReadConfigurableParam()));
59+
60+
mFastTransform = std::move(TPCFastTransformHelperO2::instance()->create(0));
61+
62+
mParam.reset(new o2::gpu::GPUParam);
63+
mParam->SetDefaults(&mConfig->configGRP, &mConfig->configReconstruction, &mConfig->configProcessing, nullptr);
4264
}
4365

4466
void EntropyEncoderSpec::run(ProcessingContext& pc)
@@ -64,10 +86,59 @@ void EntropyEncoderSpec::run(ProcessingContext& pc)
6486
auto cput = mTimer.CpuTime();
6587
mTimer.Start(false);
6688
auto& buffer = pc.outputs().make<std::vector<o2::ctf::BufferType>>(Output{"TPC", "CTFDATA", 0, Lifetime::Timeframe});
89+
std::vector<bool> rejectHits, rejectTracks, rejectTrackHits, rejectTrackHitsReduced;
6790
if (mSelIR) {
91+
CompressedClusters clustersFiltered = clusters;
6892
mCTFCoder.setSelectedIRFrames(pc.inputs().get<gsl::span<o2::dataformats::IRFrame>>("selIRFrames"));
93+
rejectHits.resize(clusters.nUnattachedClusters);
94+
rejectTracks.resize(clusters.nTracks);
95+
rejectTrackHits.resize(clusters.nAttachedClusters);
96+
rejectTrackHitsReduced.resize(clusters.nAttachedClustersReduced);
97+
98+
unsigned int offset = 0, lasti = 0;
99+
const unsigned int maxTime = (mParam->par.continuousMaxTimeBin + 1) * o2::tpc::ClusterNative::scaleTimePacked - 1;
100+
for (unsigned int i = 0; i < clusters.nTracks; i++) {
101+
unsigned int tMin = maxTime, tMax = 0;
102+
auto checker = [&tMin, &tMax](const o2::tpc::ClusterNative& cl, unsigned int offset) {
103+
if (cl.getTimePacked() > tMax) {
104+
tMax = cl.getTimePacked();
105+
}
106+
if (cl.getTimePacked() < tMin) {
107+
tMin = cl.getTimePacked();
108+
}
109+
};
110+
o2::gpu::TPCClusterDecompressor::decompressTrack(&clusters, *mParam, maxTime, i, offset, checker);
111+
if (false) {
112+
for (unsigned int k = offset - clusters.nTrackClusters[i]; k < offset; k++) {
113+
rejectTrackHits[k] = true;
114+
}
115+
for (unsigned int k = offset - clusters.nTrackClusters[i] - i; k < offset - i - 1; k++) {
116+
rejectTrackHitsReduced[k] = true;
117+
}
118+
rejectTracks[i] = true;
119+
clustersFiltered.nTracks--;
120+
}
121+
}
122+
offset = 0;
123+
for (unsigned int i = 0; i < GPUCA_NSLICES; i++) {
124+
for (unsigned int j = 0; j < GPUCA_ROW_COUNT; j++) {
125+
if (i * GPUCA_ROW_COUNT + j >= clusters.nSliceRows) {
126+
break;
127+
}
128+
offset += (i * GPUCA_ROW_COUNT + j >= clusters.nSliceRows) ? 0 : clusters.nSliceRowClusters[i * GPUCA_ROW_COUNT + j];
129+
auto checker = [i, j, &rejectHits, &clustersFiltered](const o2::tpc::ClusterNative& cl, unsigned int k) {
130+
if (false) {
131+
rejectHits[k] = true;
132+
clustersFiltered.nSliceRowClusters[i * GPUCA_ROW_COUNT + j]--;
133+
}
134+
};
135+
unsigned int end = offset + clusters.nSliceRowClusters[i * GPUCA_ROW_COUNT + j];
136+
o2::gpu::TPCClusterDecompressor::decompressHits(&clusters, offset, end, checker);
137+
}
138+
}
139+
clusters = clustersFiltered;
69140
}
70-
auto iosize = mCTFCoder.encode(buffer, clusters);
141+
auto iosize = mCTFCoder.encode(buffer, clusters, mSelIR ? &rejectHits : nullptr, mSelIR ? &rejectTracks : nullptr, mSelIR ? &rejectTrackHits : nullptr, mSelIR ? &rejectTrackHitsReduced : nullptr);
71142
pc.outputs().snapshot({"ctfrep", 0}, iosize);
72143
mTimer.Stop();
73144
if (mSelIR) {

GPU/GPUTracking/DataCompression/TPCClusterDecompressor.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,11 @@ class TPCClusterDecompressor
3737
int decompress(const o2::tpc::CompressedClusters* clustersCompressed, o2::tpc::ClusterNativeAccess& clustersNative, std::function<o2::tpc::ClusterNative*(size_t)> allocator, const GPUParam& param);
3838

3939
template <typename... Args>
40-
void decompressTrack(const o2::tpc::CompressedClusters* clustersCompressed, const GPUParam& param, const unsigned int maxTime, const unsigned int i, unsigned int& offset, Args&... args);
40+
static void decompressTrack(const o2::tpc::CompressedClusters* clustersCompressed, const GPUParam& param, const unsigned int maxTime, const unsigned int i, unsigned int& offset, Args&... args);
4141
template <typename... Args>
42-
void decompressHits(const o2::tpc::CompressedClusters* clustersCompressed, const unsigned int start, const unsigned int end, Args&... args);
42+
static void decompressHits(const o2::tpc::CompressedClusters* clustersCompressed, const unsigned int start, const unsigned int end, Args&... args);
4343

4444
protected:
45-
template <typename... Args>
46-
auto& decompressTrackStore(const o2::tpc::CompressedClusters* clustersCompressed, const unsigned int offset, unsigned int slice, unsigned int row, unsigned int pad, unsigned int time, Args&... args);
47-
template <typename... Args>
48-
auto& decompressHitsStore(const o2::tpc::CompressedClusters* clustersCompressed, unsigned int k, unsigned int time, unsigned short pad, Args&... args);
4945
};
5046
} // namespace GPUCA_NAMESPACE::gpu
5147

0 commit comments

Comments
 (0)