37 const gsl::span<const Cluster>& clustersNextLayer,
38 const gsl::span<const Cluster>& clustersCurrentLayer,
39 const gsl::span<uint8_t>& usedClustersNextLayer,
43 gsl::span<int> foundTracklets,
46 const short targetRof,
47 gsl::span<int> rofFoundTrackletsOffsets,
48 const int maxTrackletsPerCluster =
static_cast<int>(2e3))
50 const int PhiBins{
utils.getNphiBins()};
51 const int ZBins{
utils.getNzBins()};
53 for (
int iCurrentLayerClusterIndex = 0; iCurrentLayerClusterIndex < clustersCurrentLayer.size(); ++iCurrentLayerClusterIndex) {
54 int storedTracklets{0};
55 const Cluster& currentCluster{clustersCurrentLayer[iCurrentLayerClusterIndex]};
56 const int4 selectedBinsRect{VertexerTraits::getBinsRect(currentCluster, (
int)
Mode, 0.f, 50.f, phiCut / 2,
utils)};
57 if (selectedBinsRect.x != 0 || selectedBinsRect.y != 0 || selectedBinsRect.z != 0 || selectedBinsRect.w != 0) {
58 int phiBinsNum{selectedBinsRect.
w - selectedBinsRect.y + 1};
60 phiBinsNum += PhiBins;
63 for (
int iPhiBin{selectedBinsRect.y}, iPhiCount{0}; iPhiCount < phiBinsNum; iPhiBin = ++iPhiBin == PhiBins ? 0 : iPhiBin, iPhiCount++) {
64 const int firstBinIndex{
utils.getBinIndex(selectedBinsRect.x, iPhiBin)};
65 const int firstRowClusterIndex{indexTableNext[firstBinIndex]};
66 const int maxRowClusterIndex{indexTableNext[firstBinIndex + ZBins]};
68 for (
int iNextLayerClusterIndex{firstRowClusterIndex}; iNextLayerClusterIndex < maxRowClusterIndex && iNextLayerClusterIndex < static_cast<int>(clustersNextLayer.size()); ++iNextLayerClusterIndex) {
69 if (usedClustersNextLayer[iNextLayerClusterIndex]) {
72 const Cluster& nextCluster{clustersNextLayer[iNextLayerClusterIndex]};
73 if (o2::gpu::GPUCommonMath::Abs(math_utils::smallestAngleDifference(currentCluster.phi, nextCluster.phi)) < phiCut) {
74 if (storedTracklets < maxTrackletsPerCluster) {
75 if constexpr (!EvalRun) {
76 if constexpr (
Mode == TrackletMode::Layer0Layer1) {
77 tracklets[rofFoundTrackletsOffsets[iCurrentLayerClusterIndex] + storedTracklets] =
Tracklet{iNextLayerClusterIndex, iCurrentLayerClusterIndex, nextCluster, currentCluster, targetRof, pivotRof};
79 tracklets[rofFoundTrackletsOffsets[iCurrentLayerClusterIndex] + storedTracklets] =
Tracklet{iCurrentLayerClusterIndex, iNextLayerClusterIndex, currentCluster, nextCluster, pivotRof, targetRof};
88 if constexpr (EvalRun) {
89 foundTracklets[iCurrentLayerClusterIndex] += storedTracklets;
91 rofFoundTrackletsOffsets[iCurrentLayerClusterIndex] += storedTracklets;
97 const gsl::span<const Cluster> clusters0,
98 const gsl::span<const Cluster> clusters1,
99 gsl::span<unsigned char> usedClusters0,
100 gsl::span<unsigned char> usedClusters2,
101 const gsl::span<const Tracklet>& tracklets01,
102 const gsl::span<const Tracklet>& tracklets12,
104 const gsl::span<int> foundTracklets01,
105 const gsl::span<int> foundTracklets12,
107 const gsl::span<const o2::MCCompLabel>& trackletLabels,
109 const short pivotRofId,
110 const short targetRofId,
111 const float tanLambdaCut = 0.025f,
112 const float phiCut = 0.005f,
113 const int maxTracklets =
static_cast<int>(1e2))
115 int offset01{0}, offset12{0};
116 for (
unsigned int iCurrentLayerClusterIndex{0}; iCurrentLayerClusterIndex < clusters1.size(); ++iCurrentLayerClusterIndex) {
117 int validTracklets{0};
118 for (
int iTracklet12{offset12}; iTracklet12 < offset12 + foundTracklets12[iCurrentLayerClusterIndex]; ++iTracklet12) {
119 for (
int iTracklet01{offset01}; iTracklet01 < offset01 + foundTracklets01[iCurrentLayerClusterIndex]; ++iTracklet01) {
120 const auto& tracklet01{tracklets01[iTracklet01]};
121 const auto& tracklet12{tracklets12[iTracklet12]};
122 if (tracklet01.rof[0] != targetRofId || tracklet12.rof[1] != targetRofId) {
125 const float deltaTanLambda{o2::gpu::GPUCommonMath::Abs(tracklet01.tanLambda - tracklet12.tanLambda)};
126 const float deltaPhi{o2::gpu::GPUCommonMath::Abs(math_utils::smallestAngleDifference(tracklet01.phi, tracklet12.phi))};
127 if (!usedTracklets[iTracklet01] && deltaTanLambda < tanLambdaCut && deltaPhi < phiCut && validTracklets != maxTracklets) {
128 usedClusters0[tracklet01.firstClusterIndex] =
true;
129 usedClusters2[tracklet12.secondClusterIndex] =
true;
130 usedTracklets[iTracklet01] =
true;
131 lines.emplace_back(tracklet01, clusters0.data(), clusters1.data());
132 if (!trackletLabels.empty()) {
133 linesLabels.emplace_back(trackletLabels[iTracklet01]);
139 offset01 += foundTracklets01[iCurrentLayerClusterIndex];
140 offset12 += foundTracklets12[iCurrentLayerClusterIndex];
177 mTaskArena->execute([&] {
180 [&](
const tbb::blocked_range<short>& Rofs) {
181 for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
182 bool skipROF = iteration && (int)mTimeFrame->getPrimaryVertices(pivotRofId).size() > mVrtParams[iteration].vertPerRofThreshold;
183 short startROF{std::max((short)0, static_cast<short>(pivotRofId - mVrtParams[iteration].deltaRof))};
184 short endROF{std::min(static_cast<short>(mTimeFrame->getNrof()), static_cast<short>(pivotRofId + mVrtParams[iteration].deltaRof + 1))};
185 for (auto targetRofId = startROF; targetRofId < endROF; ++targetRofId) {
186 trackleterKernelHost<TrackletMode::Layer0Layer1, true>(
187 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(),
188 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
189 mTimeFrame->getUsedClustersROF(targetRofId, 0),
190 mTimeFrame->getIndexTable(targetRofId, 0).data(),
191 mVrtParams[iteration].phiCut,
192 mTimeFrame->getTracklets()[0],
193 mTimeFrame->getNTrackletsCluster(pivotRofId, 0),
198 mVrtParams[iteration].maxTrackletsPerCluster);
199 trackleterKernelHost<TrackletMode::Layer1Layer2, true>(
200 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
201 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
202 mTimeFrame->getUsedClustersROF(targetRofId, 2),
203 mTimeFrame->getIndexTable(targetRofId, 2).data(),
204 mVrtParams[iteration].phiCut,
205 mTimeFrame->getTracklets()[1],
206 mTimeFrame->getNTrackletsCluster(pivotRofId, 1),
211 mVrtParams[iteration].maxTrackletsPerCluster);
213 mTimeFrame->getNTrackletsROF(pivotRofId, 0) = std::accumulate(mTimeFrame->getNTrackletsCluster(pivotRofId, 0).begin(), mTimeFrame->getNTrackletsCluster(pivotRofId, 0).end(), 0);
214 mTimeFrame->getNTrackletsROF(pivotRofId, 1) = std::accumulate(mTimeFrame->getNTrackletsCluster(pivotRofId, 1).begin(), mTimeFrame->getNTrackletsCluster(pivotRofId, 1).end(), 0);
219 mTimeFrame->computeTrackletsPerROFScans();
220 mTimeFrame->getTracklets()[0].resize(mTimeFrame->getTotalTrackletsTF(0));
221 mTimeFrame->getTracklets()[1].resize(mTimeFrame->getTotalTrackletsTF(1));
223 mTaskArena->execute([&] {
225 tbb::blocked_range<short>(0, (
short)mTimeFrame->getNrof()),
226 [&](
const tbb::blocked_range<short>& Rofs) {
227 for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
228 bool skipROF = iteration && (int)mTimeFrame->getPrimaryVertices(pivotRofId).size() > mVrtParams[iteration].vertPerRofThreshold;
229 short startROF{std::max((short)0, static_cast<short>(pivotRofId - mVrtParams[iteration].deltaRof))};
230 short endROF{std::min(static_cast<short>(mTimeFrame->getNrof()), static_cast<short>(pivotRofId + mVrtParams[iteration].deltaRof + 1))};
231 auto mobileOffset0 = mTimeFrame->getNTrackletsROF(pivotRofId, 0);
232 auto mobileOffset1 = mTimeFrame->getNTrackletsROF(pivotRofId, 1);
233 for (auto targetRofId = startROF; targetRofId < endROF; ++targetRofId) {
234 trackleterKernelHost<TrackletMode::Layer0Layer1, false>(
235 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(),
236 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
237 mTimeFrame->getUsedClustersROF(targetRofId, 0),
238 mTimeFrame->getIndexTable(targetRofId, 0).data(),
239 mVrtParams[iteration].phiCut,
240 mTimeFrame->getTracklets()[0],
241 mTimeFrame->getNTrackletsCluster(pivotRofId, 0),
245 mTimeFrame->getExclusiveNTrackletsCluster(pivotRofId, 0),
246 mVrtParams[iteration].maxTrackletsPerCluster);
247 trackleterKernelHost<TrackletMode::Layer1Layer2, false>(
248 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
249 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
250 mTimeFrame->getUsedClustersROF(targetRofId, 2),
251 mTimeFrame->getIndexTable(targetRofId, 2).data(),
252 mVrtParams[iteration].phiCut,
253 mTimeFrame->getTracklets()[1],
254 mTimeFrame->getNTrackletsCluster(pivotRofId, 1),
258 mTimeFrame->getExclusiveNTrackletsCluster(pivotRofId, 1),
259 mVrtParams[iteration].maxTrackletsPerCluster);
266 if (mTimeFrame->hasMCinformation()) {
267 for (
const auto& trk : mTimeFrame->getTracklets()[0]) {
269 int sortedId0{mTimeFrame->getSortedIndex(trk.rof[0], 0, trk.firstClusterIndex)};
270 int sortedId1{mTimeFrame->getSortedIndex(trk.rof[1], 1, trk.secondClusterIndex)};
271 for (
const auto& lab0 : mTimeFrame->getClusterLabels(0, mTimeFrame->
getClusters()[0][sortedId0].clusterId)) {
272 for (
const auto& lab1 : mTimeFrame->getClusterLabels(1, mTimeFrame->
getClusters()[1][sortedId1].clusterId)) {
273 if (lab0 == lab1 && lab0.isValid()) {
278 if (
label.isValid()) {
282 mTimeFrame->getTrackletsLabel(0).emplace_back(
label);
288 TFile* trackletFile = TFile::Open(
"artefacts_tf.root",
"recreate");
289 TTree* tr_tre =
new TTree(
"tracklets",
"tf");
290 std::vector<o2::its::Tracklet> trkl_vec_0(0);
291 std::vector<o2::its::Tracklet> trkl_vec_1(0);
292 std::vector<o2::its::Cluster> clus0(0);
293 std::vector<o2::its::Cluster> clus1(0);
294 std::vector<o2::its::Cluster> clus2(0);
295 tr_tre->Branch(
"Tracklets0", &trkl_vec_0);
296 tr_tre->Branch(
"Tracklets1", &trkl_vec_1);
297 for (
int rofId{0}; rofId < mTimeFrame->getNrof(); ++rofId) {
300 for (
auto& tr : mTimeFrame->getFoundTracklets(rofId, 0)) {
301 trkl_vec_0.push_back(tr);
303 for (
auto& tr : mTimeFrame->getFoundTracklets(rofId, 1)) {
304 trkl_vec_1.push_back(tr);
310 trackletFile->Close();
312 std::ofstream out01(
"NTC01_cpu.txt"), out12(
"NTC12_cpu.txt");
313 for (
int iRof{0}; iRof < mTimeFrame->getNrof(); ++iRof) {
314 out01 <<
"ROF: " << iRof << std::endl;
315 out12 <<
"ROF: " << iRof << std::endl;
316 std::copy(mTimeFrame->getNTrackletsCluster(iRof, 0).begin(), mTimeFrame->getNTrackletsCluster(iRof, 0).end(), std::ostream_iterator<double>(out01,
"\t"));
318 std::copy(mTimeFrame->getExclusiveNTrackletsCluster(iRof, 0).begin(), mTimeFrame->getExclusiveNTrackletsCluster(iRof, 0).end(), std::ostream_iterator<double>(out01,
"\t"));
319 std::copy(mTimeFrame->getNTrackletsCluster(iRof, 1).begin(), mTimeFrame->getNTrackletsCluster(iRof, 1).end(), std::ostream_iterator<double>(out12,
"\t"));
321 std::copy(mTimeFrame->getExclusiveNTrackletsCluster(iRof, 1).begin(), mTimeFrame->getExclusiveNTrackletsCluster(iRof, 1).end(), std::ostream_iterator<double>(out12,
"\t"));
332 mTaskArena->execute([&] {
335 [&](
const tbb::blocked_range<short>& Rofs) {
336 for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
337 if (iteration && (int)mTimeFrame->getPrimaryVertices(pivotRofId).size() > mVrtParams[iteration].vertPerRofThreshold) {
340 mTimeFrame->getLines(pivotRofId).reserve(mTimeFrame->getNTrackletsCluster(pivotRofId, 0).size());
341 bounded_vector<uint8_t> usedTracklets(mTimeFrame->getFoundTracklets(pivotRofId, 0).size(), false, mMemoryPool.get());
342 short startROF{std::max((short)0, static_cast<short>(pivotRofId - mVrtParams[iteration].deltaRof))};
343 short endROF{std::min(static_cast<short>(mTimeFrame->getNrof()), static_cast<short>(pivotRofId + mVrtParams[iteration].deltaRof + 1))};
344 for (short targetRofId = startROF; targetRofId < endROF; ++targetRofId) {
345 trackletSelectionKernelHost(
346 mTimeFrame->getClustersOnLayer(targetRofId, 0),
347 mTimeFrame->getClustersOnLayer(pivotRofId, 1),
348 mTimeFrame->getUsedClustersROF(targetRofId, 0),
349 mTimeFrame->getUsedClustersROF(targetRofId, 2),
350 mTimeFrame->getFoundTracklets(pivotRofId, 0),
351 mTimeFrame->getFoundTracklets(pivotRofId, 1),
353 mTimeFrame->getNTrackletsCluster(pivotRofId, 0),
354 mTimeFrame->getNTrackletsCluster(pivotRofId, 1),
355 mTimeFrame->getLines(pivotRofId),
356 mTimeFrame->getLabelsFoundTracklets(pivotRofId, 0),
357 mTimeFrame->getLinesLabel(pivotRofId),
360 mVrtParams[iteration].tanLambdaCut,
361 mVrtParams[iteration].phiCut);
368 TFile* trackletFile = TFile::Open(
"artefacts_tf.root",
"update");
369 TTree* ln_tre =
new TTree(
"lines",
"tf");
370 std::vector<o2::its::Line> lines_vec(0);
371 std::vector<int> nTrackl01(0);
372 std::vector<int> nTrackl12(0);
373 ln_tre->Branch(
"Lines", &lines_vec);
374 ln_tre->Branch(
"NTrackletCluster01", &nTrackl01);
375 ln_tre->Branch(
"NTrackletCluster12", &nTrackl12);
376 for (
int rofId{0}; rofId < mTimeFrame->getNrof(); ++rofId) {
380 for (
auto& ln : mTimeFrame->getLines(rofId)) {
381 lines_vec.push_back(ln);
383 for (
auto&
n : mTimeFrame->getNTrackletsCluster(rofId, 0)) {
384 nTrackl01.push_back(
n);
386 for (
auto&
n : mTimeFrame->getNTrackletsCluster(rofId, 1)) {
387 nTrackl12.push_back(
n);
394 trackletFile->Close();
414 for (
int line1{0}; line1 < numTracklets; ++line1) {
415 if (usedTracklets[line1]) {
418 for (
int line2{line1 + 1}; line2 < numTracklets; ++line2) {
419 if (usedTracklets[line2]) {
426 if (tmpVertex[0] * tmpVertex[0] + tmpVertex[1] * tmpVertex[1] > 4.f) {
430 usedTracklets[line1] =
true;
431 usedTracklets[line2] =
true;
432 for (
int tracklet3{0}; tracklet3 < numTracklets; ++tracklet3) {
433 if (usedTracklets[tracklet3]) {
438 usedTracklets[tracklet3] =
true;
446 if (
mVrtParams[iteration].allowSingleContribClusters) {
448 for (
size_t iLine{0}; iLine < numTracklets; ++iLine) {
449 if (!usedTracklets[iLine]) {
460 [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
462 for (
int iCluster1{0}; iCluster1 < noClustersVec[rofId]; ++iCluster1) {
464 std::array<float, 3> vertex2{};
465 for (
int iCluster2{iCluster1 + 1}; iCluster2 < noClustersVec[rofId]; ++iCluster2) {
467 if (o2::gpu::GPUCommonMath::Abs(vertex1[2] - vertex2[2]) <
mVrtParams[iteration].clusterCut) {
468 float distance{(vertex1[0] - vertex2[0]) * (vertex1[0] - vertex2[0]) +
469 (vertex1[1] - vertex2[1]) * (vertex1[1] - vertex2[1]) +
470 (vertex1[2] - vertex2[2]) * (vertex1[2] - vertex2[2])};
478 --noClustersVec[rofId];
487 [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
490 dbg_clusLines[rofId].push_back(cl);
493 bool atLeastOneFound{
false};
494 for (
int iCluster{0}; iCluster < noClustersVec[rofId]; ++iCluster) {
495 bool lowMultCandidate{
false};
499 lowMultCandidate &= (beamDistance2 <
mVrtParams[iteration].lowMultBeamDistCut *
mVrtParams[iteration].lowMultBeamDistCut);
500 if (!lowMultCandidate) {
502 noClustersVec[rofId]--;
508 atLeastOneFound =
true;
546 TFile* dbg_file = TFile::Open(
"artefacts_tf.root",
"update");
547 TTree* ln_clus_lines_tree =
new TTree(
"clusterlines",
"tf");
548 std::vector<o2::its::ClusterLines> cl_lines_vec_pre(0);
549 std::vector<o2::its::ClusterLines> cl_lines_vec_post(0);
550 ln_clus_lines_tree->Branch(
"cllines_pre", &cl_lines_vec_pre);
551 ln_clus_lines_tree->Branch(
"cllines_post", &cl_lines_vec_post);
553 cl_lines_vec_pre.clear();
554 cl_lines_vec_post.clear();
556 cl_lines_vec_post.push_back(clln);
558 for (
auto& cl : dbg_clusLines[rofId]) {
559 cl_lines_vec_pre.push_back(cl);
561 ln_clus_lines_tree->Fill();
564 ln_clus_lines_tree->Write();
570 gsl::span<const o2::its::Line>& lines,
573 std::array<float, 2>& beamPosXY,
580 int foundVertices{0};
582 const int numTracklets{
static_cast<int>(lines.size())};
583 for (
int line1{0}; line1 < numTracklets; ++line1) {
584 if (usedLines[line1]) {
587 for (
int line2{line1 + 1}; line2 < numTracklets; ++line2) {
588 if (usedLines[line2]) {
591 auto dca{Line::getDCA(lines[line1], lines[line2])};
593 clusterLines.emplace_back(line1, lines[line1], line2, lines[line2]);
594 std::array<float, 3> tmpVertex{clusterLines.back().getVertex()};
595 if (tmpVertex[0] * tmpVertex[0] + tmpVertex[1] * tmpVertex[1] > 4.f) {
596 clusterLines.pop_back();
599 usedLines[line1] =
true;
600 usedLines[line2] =
true;
601 for (
int tracklet3{0}; tracklet3 < numTracklets; ++tracklet3) {
602 if (usedLines[tracklet3]) {
606 clusterLines.back().add(tracklet3, lines[tracklet3]);
607 usedLines[tracklet3] =
true;
608 tmpVertex = clusterLines.back().getVertex();
616 if (
mVrtParams[iteration].allowSingleContribClusters) {
617 auto beamLine =
Line{{
tf->getBeamX(),
tf->getBeamY(), -50.f}, {
tf->getBeamX(),
tf->getBeamY(), 50.f}};
618 for (
size_t iLine{0}; iLine < numTracklets; ++iLine) {
619 if (!usedLines[iLine]) {
620 auto dca = Line::getDCA(lines[iLine], beamLine);
622 clusterLines.emplace_back(iLine, lines[iLine], -1, beamLine);
629 std::sort(clusterLines.begin(), clusterLines.end(), [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
631 for (
int iCluster1{0}; iCluster1 <
nClusters; ++iCluster1) {
632 std::array<float, 3> vertex1{clusterLines[iCluster1].getVertex()};
633 std::array<float, 3> vertex2{};
634 for (
int iCluster2{iCluster1 + 1}; iCluster2 <
nClusters; ++iCluster2) {
635 vertex2 = clusterLines[iCluster2].getVertex();
636 if (o2::gpu::GPUCommonMath::Abs(vertex1[2] - vertex2[2]) <
mVrtParams[iteration].clusterCut) {
637 float distance{(vertex1[0] - vertex2[0]) * (vertex1[0] - vertex2[0]) +
638 (vertex1[1] - vertex2[1]) * (vertex1[1] - vertex2[1]) +
639 (vertex1[2] - vertex2[2]) * (vertex1[2] - vertex2[2])};
641 for (
auto label : clusterLines[iCluster2].getLabels()) {
642 clusterLines[iCluster1].add(
label, lines[
label]);
643 vertex1 = clusterLines[iCluster1].getVertex();
645 clusterLines.erase(clusterLines.begin() + iCluster2);
653 std::sort(clusterLines.begin(), clusterLines.end(),
654 [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
655 bool atLeastOneFound{
false};
656 for (
int iCluster{0}; iCluster <
nClusters; ++iCluster) {
657 bool lowMultCandidate{
false};
658 double beamDistance2{(
tf->getBeamX() - clusterLines[iCluster].getVertex()[0]) * (
tf->getBeamX() - clusterLines[iCluster].getVertex()[0]) +
659 (
tf->getBeamY() - clusterLines[iCluster].getVertex()[1]) * (
tf->getBeamY() - clusterLines[iCluster].getVertex()[1])};
661 if (atLeastOneFound && (lowMultCandidate = clusterLines[iCluster].getSize() <
mVrtParams[iteration].clusterContributorsCut)) {
662 lowMultCandidate &= (beamDistance2 <
mVrtParams[iteration].lowMultBeamDistCut *
mVrtParams[iteration].lowMultBeamDistCut);
663 if (!lowMultCandidate) {
664 clusterLines.erase(clusterLines.begin() + iCluster);
669 if (beamDistance2 < nsigmaCut && o2::gpu::GPUCommonMath::Abs(clusterLines[iCluster].getVertex()[2]) <
mVrtParams[iteration].maxZPositionAllowed) {
670 atLeastOneFound =
true;
673 clusterLines[iCluster].getVertex()[1],
674 clusterLines[iCluster].getVertex()[2]),
675 clusterLines[iCluster].getRMS2(),
677 clusterLines[iCluster].getSize(),
678 clusterLines[iCluster].getAvgDistance2());
679 vertices.back().setTimeStamp(clusterLines[iCluster].getROF());
681 for (
auto&
index : clusterLines[iCluster].getLabels()) {
682 labels->push_back(
tf->getLinesLabel(rofId)[
index]);
687 verticesInRof.push_back(foundVertices);