119 clusterOutputSectorHeader.sectorBits = (1ul <<
i);
125 memset(outIndex, 0,
sizeof(*outIndex));
135 for (
const auto&
label : labels) {
151 gsl::span<const o2::MCCompLabel> tpcTrkLabels;
154 mTPCTrkLabelsFiltered.clear();
156 const unsigned int DISCARD = -1U;
158 mTracksFiltered.clear();
159 mTrackClusIdxFiltered.clear();
160 mClustersLinearFiltered.clear();
161 mTrackStatus.clear();
162 mTrackStatus.resize(tpcTracks.size());
163 mClustersLinearStatus.clear();
164 mClustersLinearStatus.resize(tpcClusterIdxStruct->nClustersTotal, DISCARD);
166 size_t nSelTracks = 0;
167 auto selTPCTrack = [
this, tpcTracks, tpcTrackClusIdx, tpcClusterIdxStruct, &nSelTracks](
int itpc,
char stat) {
168 this->mTrackStatus[itpc] = stat;
173 const auto& trc = tpcTracks[itpc];
174 int count = trc.getNClusters();
176 for (
int ic =
count; ic--;) {
177 const auto cl = &trc.getCluster(tpcTrackClusIdx, ic, *tpcClusterIdxStruct);
178 size_t offs = std::distance(tpcClusterIdxStruct->clustersLinear, cl);
179 this->mClustersLinearStatus[offs] = 0;
185 int nv = vtxRefs.size();
186 for (
int iv = 0; iv < nv; iv++) {
187 const auto& vtref = vtxRefs[iv];
189 auto dmask = GTrackID::getSourceDetectorsMask(is);
193 char decisionSource = mAccTrackSources[is] ?
KEEP : mRemMode;
194 int idMin = vtxRefs[iv].getFirstEntryOfSource(is), idMax = idMin + vtxRefs[iv].getEntriesOfSource(is);
195 for (
int i = idMin;
i < idMax;
i++) {
196 auto decision = decisionSource;
197 auto vid = trackIndex[
i];
202 if (decisionSource ==
KEEP) {
203 const auto& tpcTr = tpcTracks[tpcID.getIndex()];
204 if (std::abs(tpcTr.getTgl()) < mMinAbsTgl || tpcTr.getNClusters() < mMinTPCClusters) {
208 selTPCTrack(tpcID, decision);
218 for (
unsigned int ic = 0; ic < tpcClusterIdxStruct->nClusters[
i][
j]; ic++) {
219 if (mClustersLinearStatus[
offset] != DISCARD) {
220 mClustersLinearStatus[
offset] = mClustersLinearFiltered.size();
221 mClustersLinearFiltered.push_back(tpcClusterIdxStruct->clustersLinear[
offset]);
231 LOGP(info,
"Accepted {} tracks out of {} and {} clusters out of {}", nSelTracks, tpcTracks.size(), mClusFiltered.
nClustersTotal, tpcClusterIdxStruct->nClustersTotal);
234 for (
size_t itr = 0; itr < tpcTracks.size(); itr++) {
235 if (mTrackStatus[itr] ==
REMOVE) {
237 }
else if (mTrackStatus[itr] ==
REDUCE) {
238 auto& t = mTracksFiltered.emplace_back();
241 mTPCTrkLabelsFiltered.emplace_back();
244 const auto& tor = tpcTracks[itr];
245 const auto& cref = tor.getClusterRef();
246 mTracksFiltered.push_back(tor);
247 mTracksFiltered.back().shiftFirstClusterRef(
int(mTrackClusIdxFiltered.size()) - tor.getClusterRef().getFirstEntry());
248 size_t idx0 = mTrackClusIdxFiltered.size();
249 int nclTrack = cref.getEntries();
250 mTrackClusIdxFiltered.resize(mTrackClusIdxFiltered.size() + nclTrack + (nclTrack + 1) / 2);
253 uint32_t* clIndArr =
reinterpret_cast<uint32_t*
>(&mTrackClusIdxFiltered[idx0]);
254 uint8_t* srIndArr =
reinterpret_cast<uint8_t*
>(clIndArr + nclTrack);
255 for (
int ic = 0; ic < nclTrack; ic++) {
256 uint8_t sectorIndex, rowIndex;
257 const auto cl = &tor.getCluster(tpcTrackClusIdx, ic, *tpcClusterIdxStruct, sectorIndex, rowIndex);
258 unsigned int oldLinear = std::distance(tpcClusterIdxStruct->clustersLinear, cl);
259 unsigned int newLinear = mClustersLinearStatus[oldLinear];
260 if (newLinear == DISCARD) {
261 LOGP(fatal,
"discarded cluster {} is selected", oldLinear);
263 clIndArr[ic] = newLinear - mClusFiltered.
clusterOffset[sectorIndex][rowIndex];
264 srIndArr[ic] = sectorIndex;
265 srIndArr[ic + nclTrack] = rowIndex;
268 mTPCTrkLabelsFiltered.emplace_back(tpcTrkLabels[itr]);
283 std::vector<OutputSpec> outputs;
290 outputs.emplace_back(
"TPC",
"TRACKSF", 0, Lifetime::Timeframe);
291 outputs.emplace_back(
"TPC",
"CLUSREFSF", 0, Lifetime::Timeframe);
293 outputs.emplace_back(
"TPC",
"TRACKSMCLBLF", 0, Lifetime::Timeframe);
296 auto dataRequest = std::make_shared<DataRequest>();
298 dataRequest->requestTracks(srcTracks, useMC);
299 dataRequest->requestClusters(srcClusters, useMC);
300 dataRequest->requestPrimaryVertices(useMC);
306 AlgorithmSpec{adaptFromTask<TPCDataFilter>(dataRequest, srcTracks, useMC)},
308 {
"suppress-rejected", VariantType::Bool,
false, {
"Remove suppressed tracks instead of reducing them"}},
309 {
"min-abs-tgl", VariantType::Float, 0.0f, {
"suppress tracks with abs tgL less that this threshold (e.g. noise tracks)"}},
310 {
"min-tpc-clusters", VariantType::Int, 0, {
"suppress tracks less clusters that this threshold (e.g. noise tracks)"}},
311 {
"accept-track-sources", VariantType::String, std::string{
GTrackID::ALL}, {
"comma-separated list of track sources to accept"}}}};
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.