42 const gsl::span<const Cluster>& clustersNextLayer,
43 const gsl::span<const Cluster>& clustersCurrentLayer,
44 const gsl::span<uint8_t>& usedClustersNextLayer,
48 gsl::span<int> foundTracklets,
51 const short targetRof,
52 gsl::span<int> rofFoundTrackletsOffsets,
53 const int maxTrackletsPerCluster =
static_cast<int>(2e3))
55 const int PhiBins{
utils.getNphiBins()};
56 const int ZBins{
utils.getNzBins()};
58 for (
int iCurrentLayerClusterIndex = 0; iCurrentLayerClusterIndex < clustersCurrentLayer.size(); ++iCurrentLayerClusterIndex) {
59 int storedTracklets{0};
60 const Cluster& currentCluster{clustersCurrentLayer[iCurrentLayerClusterIndex]};
61 const int4 selectedBinsRect{VertexerTraits::getBinsRect(currentCluster, (
int)
Mode, 0.f, 50.f, phiCut / 2,
utils)};
62 if (selectedBinsRect.x != 0 || selectedBinsRect.y != 0 || selectedBinsRect.z != 0 || selectedBinsRect.w != 0) {
63 int phiBinsNum{selectedBinsRect.
w - selectedBinsRect.y + 1};
65 phiBinsNum += PhiBins;
68 for (
int iPhiBin{selectedBinsRect.y}, iPhiCount{0}; iPhiCount < phiBinsNum; iPhiBin = ++iPhiBin == PhiBins ? 0 : iPhiBin, iPhiCount++) {
69 const int firstBinIndex{
utils.getBinIndex(selectedBinsRect.x, iPhiBin)};
70 const int firstRowClusterIndex{indexTableNext[firstBinIndex]};
71 const int maxRowClusterIndex{indexTableNext[firstBinIndex + ZBins]};
73 for (
int iNextLayerClusterIndex{firstRowClusterIndex}; iNextLayerClusterIndex < maxRowClusterIndex && iNextLayerClusterIndex < static_cast<int>(clustersNextLayer.size()); ++iNextLayerClusterIndex) {
74 if (usedClustersNextLayer[iNextLayerClusterIndex]) {
77 const Cluster& nextCluster{clustersNextLayer[iNextLayerClusterIndex]};
79 if (storedTracklets < maxTrackletsPerCluster) {
80 if constexpr (!EvalRun) {
81 if constexpr (
Mode == TrackletMode::Layer0Layer1) {
82 tracklets[rofFoundTrackletsOffsets[iCurrentLayerClusterIndex] + storedTracklets] =
Tracklet{iNextLayerClusterIndex, iCurrentLayerClusterIndex, nextCluster, currentCluster, targetRof, pivotRof};
84 tracklets[rofFoundTrackletsOffsets[iCurrentLayerClusterIndex] + storedTracklets] =
Tracklet{iCurrentLayerClusterIndex, iNextLayerClusterIndex, currentCluster, nextCluster, pivotRof, targetRof};
93 if constexpr (EvalRun) {
94 foundTracklets[iCurrentLayerClusterIndex] += storedTracklets;
96 rofFoundTrackletsOffsets[iCurrentLayerClusterIndex] += storedTracklets;
102 const gsl::span<const Cluster> clusters0,
103 const gsl::span<const Cluster> clusters1,
104 gsl::span<unsigned char> usedClusters0,
105 gsl::span<unsigned char> usedClusters2,
106 const gsl::span<const Tracklet>& tracklets01,
107 const gsl::span<const Tracklet>& tracklets12,
109 const gsl::span<int> foundTracklets01,
110 const gsl::span<int> foundTracklets12,
112 const gsl::span<const o2::MCCompLabel>& trackletLabels,
114 const short pivotRofId,
115 const short targetRofId,
116 const float tanLambdaCut = 0.025f,
117 const float phiCut = 0.005f,
118 const int maxTracklets =
static_cast<int>(1e2))
120 int offset01{0}, offset12{0};
121 for (
unsigned int iCurrentLayerClusterIndex{0}; iCurrentLayerClusterIndex < clusters1.size(); ++iCurrentLayerClusterIndex) {
122 int validTracklets{0};
123 for (
int iTracklet12{offset12}; iTracklet12 < offset12 + foundTracklets12[iCurrentLayerClusterIndex]; ++iTracklet12) {
124 for (
int iTracklet01{offset01}; iTracklet01 < offset01 + foundTracklets01[iCurrentLayerClusterIndex]; ++iTracklet01) {
125 const auto& tracklet01{tracklets01[iTracklet01]};
126 const auto& tracklet12{tracklets12[iTracklet12]};
127 if (tracklet01.rof[0] != targetRofId || tracklet12.rof[1] != targetRofId) {
130 const float deltaTanLambda{o2::gpu::GPUCommonMath::Abs(tracklet01.tanLambda - tracklet12.tanLambda)};
132 if (!usedTracklets[iTracklet01] && deltaTanLambda < tanLambdaCut && deltaPhi < phiCut && validTracklets != maxTracklets) {
133 usedClusters0[tracklet01.firstClusterIndex] =
true;
134 usedClusters2[tracklet12.secondClusterIndex] =
true;
135 usedTracklets[iTracklet01] =
true;
136 lines.emplace_back(tracklet01, clusters0.data(), clusters1.data());
137 if (!trackletLabels.empty()) {
138 linesLabels.emplace_back(trackletLabels[iTracklet01]);
144 offset01 += foundTracklets01[iCurrentLayerClusterIndex];
145 offset12 += foundTracklets12[iCurrentLayerClusterIndex];
183 mTaskArena.execute([&] {
186 [&](
const tbb::blocked_range<short>& Rofs) {
187 for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
188 bool skipROF = iteration && (int)mTimeFrame->getPrimaryVertices(pivotRofId).size() > mVrtParams[iteration].vertPerRofThreshold;
189 short startROF{std::max((short)0, static_cast<short>(pivotRofId - mVrtParams[iteration].deltaRof))};
190 short endROF{std::min(static_cast<short>(mTimeFrame->getNrof()), static_cast<short>(pivotRofId + mVrtParams[iteration].deltaRof + 1))};
191 for (auto targetRofId = startROF; targetRofId < endROF; ++targetRofId) {
192 trackleterKernelHost<TrackletMode::Layer0Layer1, true>(
193 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(),
194 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
195 mTimeFrame->getUsedClustersROF(targetRofId, 0),
196 mTimeFrame->getIndexTable(targetRofId, 0).data(),
197 mVrtParams[iteration].phiCut,
198 mTimeFrame->getTracklets()[0],
199 mTimeFrame->getNTrackletsCluster(pivotRofId, 0),
204 mVrtParams[iteration].maxTrackletsPerCluster);
205 trackleterKernelHost<TrackletMode::Layer1Layer2, true>(
206 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
207 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
208 mTimeFrame->getUsedClustersROF(targetRofId, 2),
209 mTimeFrame->getIndexTable(targetRofId, 2).data(),
210 mVrtParams[iteration].phiCut,
211 mTimeFrame->getTracklets()[1],
212 mTimeFrame->getNTrackletsCluster(pivotRofId, 1),
217 mVrtParams[iteration].maxTrackletsPerCluster);
219 mTimeFrame->getNTrackletsROF(pivotRofId, 0) = std::accumulate(mTimeFrame->getNTrackletsCluster(pivotRofId, 0).begin(), mTimeFrame->getNTrackletsCluster(pivotRofId, 0).end(), 0);
220 mTimeFrame->getNTrackletsROF(pivotRofId, 1) = std::accumulate(mTimeFrame->getNTrackletsCluster(pivotRofId, 1).begin(), mTimeFrame->getNTrackletsCluster(pivotRofId, 1).end(), 0);
225 mTimeFrame->computeTrackletsPerROFScans();
226 mTimeFrame->getTracklets()[0].resize(mTimeFrame->getTotalTrackletsTF(0));
227 mTimeFrame->getTracklets()[1].resize(mTimeFrame->getTotalTrackletsTF(1));
229 mTaskArena.execute([&] {
231 tbb::blocked_range<short>(0, (
short)mTimeFrame->getNrof()),
232 [&](
const tbb::blocked_range<short>& Rofs) {
233 for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
234 bool skipROF = iteration && (int)mTimeFrame->getPrimaryVertices(pivotRofId).size() > mVrtParams[iteration].vertPerRofThreshold;
235 short startROF{std::max((short)0, static_cast<short>(pivotRofId - mVrtParams[iteration].deltaRof))};
236 short endROF{std::min(static_cast<short>(mTimeFrame->getNrof()), static_cast<short>(pivotRofId + mVrtParams[iteration].deltaRof + 1))};
237 auto mobileOffset0 = mTimeFrame->getNTrackletsROF(pivotRofId, 0);
238 auto mobileOffset1 = mTimeFrame->getNTrackletsROF(pivotRofId, 1);
239 for (auto targetRofId = startROF; targetRofId < endROF; ++targetRofId) {
240 trackleterKernelHost<TrackletMode::Layer0Layer1, false>(
241 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 0) : gsl::span<Cluster>(),
242 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
243 mTimeFrame->getUsedClustersROF(targetRofId, 0),
244 mTimeFrame->getIndexTable(targetRofId, 0).data(),
245 mVrtParams[iteration].phiCut,
246 mTimeFrame->getTracklets()[0],
247 mTimeFrame->getNTrackletsCluster(pivotRofId, 0),
251 mTimeFrame->getExclusiveNTrackletsCluster(pivotRofId, 0),
252 mVrtParams[iteration].maxTrackletsPerCluster);
253 trackleterKernelHost<TrackletMode::Layer1Layer2, false>(
254 !skipROF ? mTimeFrame->getClustersOnLayer(targetRofId, 2) : gsl::span<Cluster>(),
255 !skipROF ? mTimeFrame->getClustersOnLayer(pivotRofId, 1) : gsl::span<Cluster>(),
256 mTimeFrame->getUsedClustersROF(targetRofId, 2),
257 mTimeFrame->getIndexTable(targetRofId, 2).data(),
258 mVrtParams[iteration].phiCut,
259 mTimeFrame->getTracklets()[1],
260 mTimeFrame->getNTrackletsCluster(pivotRofId, 1),
264 mTimeFrame->getExclusiveNTrackletsCluster(pivotRofId, 1),
265 mVrtParams[iteration].maxTrackletsPerCluster);
272 if (mTimeFrame->hasMCinformation()) {
273 for (
auto& trk : mTimeFrame->getTracklets()[0]) {
275 int sortedId0{mTimeFrame->getSortedIndex(trk.rof[0], 0, trk.firstClusterIndex)};
276 int sortedId1{mTimeFrame->getSortedIndex(trk.rof[1], 1, trk.secondClusterIndex)};
277 for (
auto& lab0 : mTimeFrame->getClusterLabels(0, mTimeFrame->
getClusters()[0][sortedId0].clusterId)) {
278 for (
auto& lab1 : mTimeFrame->getClusterLabels(1, mTimeFrame->
getClusters()[1][sortedId1].clusterId)) {
279 if (lab0 == lab1 && lab0.isValid()) {
284 if (
label.isValid()) {
288 mTimeFrame->getTrackletsLabel(0).emplace_back(
label);
294 TFile* trackletFile = TFile::Open(
"artefacts_tf.root",
"recreate");
295 TTree* tr_tre =
new TTree(
"tracklets",
"tf");
296 std::vector<o2::its::Tracklet> trkl_vec_0(0);
297 std::vector<o2::its::Tracklet> trkl_vec_1(0);
298 std::vector<o2::its::Cluster> clus0(0);
299 std::vector<o2::its::Cluster> clus1(0);
300 std::vector<o2::its::Cluster> clus2(0);
301 tr_tre->Branch(
"Tracklets0", &trkl_vec_0);
302 tr_tre->Branch(
"Tracklets1", &trkl_vec_1);
303 for (
int rofId{0}; rofId < mTimeFrame->getNrof(); ++rofId) {
306 for (
auto& tr : mTimeFrame->getFoundTracklets(rofId, 0)) {
307 trkl_vec_0.push_back(tr);
309 for (
auto& tr : mTimeFrame->getFoundTracklets(rofId, 1)) {
310 trkl_vec_1.push_back(tr);
316 trackletFile->Close();
318 std::ofstream out01(
"NTC01_cpu.txt"), out12(
"NTC12_cpu.txt");
319 for (
int iRof{0}; iRof < mTimeFrame->getNrof(); ++iRof) {
320 out01 <<
"ROF: " << iRof << std::endl;
321 out12 <<
"ROF: " << iRof << std::endl;
322 std::copy(mTimeFrame->getNTrackletsCluster(iRof, 0).begin(), mTimeFrame->getNTrackletsCluster(iRof, 0).end(), std::ostream_iterator<double>(out01,
"\t"));
324 std::copy(mTimeFrame->getExclusiveNTrackletsCluster(iRof, 0).begin(), mTimeFrame->getExclusiveNTrackletsCluster(iRof, 0).end(), std::ostream_iterator<double>(out01,
"\t"));
325 std::copy(mTimeFrame->getNTrackletsCluster(iRof, 1).begin(), mTimeFrame->getNTrackletsCluster(iRof, 1).end(), std::ostream_iterator<double>(out12,
"\t"));
327 std::copy(mTimeFrame->getExclusiveNTrackletsCluster(iRof, 1).begin(), mTimeFrame->getExclusiveNTrackletsCluster(iRof, 1).end(), std::ostream_iterator<double>(out12,
"\t"));
338 mTaskArena.execute([&] {
341 [&](
const tbb::blocked_range<short>& Rofs) {
342 for (short pivotRofId = Rofs.begin(); pivotRofId < Rofs.end(); ++pivotRofId) {
343 if (iteration && (int)mTimeFrame->getPrimaryVertices(pivotRofId).size() > mVrtParams[iteration].vertPerRofThreshold) {
346 mTimeFrame->getLines(pivotRofId).reserve(mTimeFrame->getNTrackletsCluster(pivotRofId, 0).size());
347 bounded_vector<uint8_t> usedTracklets(mTimeFrame->getFoundTracklets(pivotRofId, 0).size(), false, mMemoryPool.get());
348 short startROF{std::max((short)0, static_cast<short>(pivotRofId - mVrtParams[iteration].deltaRof))};
349 short endROF{std::min(static_cast<short>(mTimeFrame->getNrof()), static_cast<short>(pivotRofId + mVrtParams[iteration].deltaRof + 1))};
350 for (short targetRofId = startROF; targetRofId < endROF; ++targetRofId) {
351 trackletSelectionKernelHost(
352 mTimeFrame->getClustersOnLayer(targetRofId, 0),
353 mTimeFrame->getClustersOnLayer(pivotRofId, 1),
354 mTimeFrame->getUsedClustersROF(targetRofId, 0),
355 mTimeFrame->getUsedClustersROF(targetRofId, 2),
356 mTimeFrame->getFoundTracklets(pivotRofId, 0),
357 mTimeFrame->getFoundTracklets(pivotRofId, 1),
359 mTimeFrame->getNTrackletsCluster(pivotRofId, 0),
360 mTimeFrame->getNTrackletsCluster(pivotRofId, 1),
361 mTimeFrame->getLines(pivotRofId),
362 mTimeFrame->getLabelsFoundTracklets(pivotRofId, 0),
363 mTimeFrame->getLinesLabel(pivotRofId),
366 mVrtParams[iteration].tanLambdaCut,
367 mVrtParams[iteration].phiCut);
374 TFile* trackletFile = TFile::Open(
"artefacts_tf.root",
"update");
375 TTree* ln_tre =
new TTree(
"lines",
"tf");
376 std::vector<o2::its::Line> lines_vec(0);
377 std::vector<int> nTrackl01(0);
378 std::vector<int> nTrackl12(0);
379 ln_tre->Branch(
"Lines", &lines_vec);
380 ln_tre->Branch(
"NTrackletCluster01", &nTrackl01);
381 ln_tre->Branch(
"NTrackletCluster12", &nTrackl12);
382 for (
int rofId{0}; rofId < mTimeFrame->getNrof(); ++rofId) {
386 for (
auto& ln : mTimeFrame->getLines(rofId)) {
387 lines_vec.push_back(ln);
389 for (
auto&
n : mTimeFrame->getNTrackletsCluster(rofId, 0)) {
390 nTrackl01.push_back(
n);
392 for (
auto&
n : mTimeFrame->getNTrackletsCluster(rofId, 1)) {
393 nTrackl12.push_back(
n);
400 trackletFile->Close();
420 for (
int line1{0}; line1 < numTracklets; ++line1) {
421 if (usedTracklets[line1]) {
424 for (
int line2{line1 + 1}; line2 < numTracklets; ++line2) {
425 if (usedTracklets[line2]) {
432 if (tmpVertex[0] * tmpVertex[0] + tmpVertex[1] * tmpVertex[1] > 4.f) {
436 usedTracklets[line1] =
true;
437 usedTracklets[line2] =
true;
438 for (
int tracklet3{0}; tracklet3 < numTracklets; ++tracklet3) {
439 if (usedTracklets[tracklet3]) {
444 usedTracklets[tracklet3] =
true;
452 if (
mVrtParams[iteration].allowSingleContribClusters) {
454 for (
size_t iLine{0}; iLine < numTracklets; ++iLine) {
455 if (!usedTracklets[iLine]) {
466 [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
468 for (
int iCluster1{0}; iCluster1 < noClustersVec[rofId]; ++iCluster1) {
470 std::array<float, 3> vertex2{};
471 for (
int iCluster2{iCluster1 + 1}; iCluster2 < noClustersVec[rofId]; ++iCluster2) {
473 if (o2::gpu::GPUCommonMath::Abs(vertex1[2] - vertex2[2]) <
mVrtParams[iteration].clusterCut) {
474 float distance{(vertex1[0] - vertex2[0]) * (vertex1[0] - vertex2[0]) +
475 (vertex1[1] - vertex2[1]) * (vertex1[1] - vertex2[1]) +
476 (vertex1[2] - vertex2[2]) * (vertex1[2] - vertex2[2])};
484 --noClustersVec[rofId];
493 [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
496 dbg_clusLines[rofId].push_back(cl);
499 bool atLeastOneFound{
false};
500 for (
int iCluster{0}; iCluster < noClustersVec[rofId]; ++iCluster) {
501 bool lowMultCandidate{
false};
505 lowMultCandidate &= (beamDistance2 <
mVrtParams[iteration].lowMultBeamDistCut *
mVrtParams[iteration].lowMultBeamDistCut);
506 if (!lowMultCandidate) {
508 noClustersVec[rofId]--;
514 atLeastOneFound =
true;
552 TFile* dbg_file = TFile::Open(
"artefacts_tf.root",
"update");
553 TTree* ln_clus_lines_tree =
new TTree(
"clusterlines",
"tf");
554 std::vector<o2::its::ClusterLines> cl_lines_vec_pre(0);
555 std::vector<o2::its::ClusterLines> cl_lines_vec_post(0);
556 ln_clus_lines_tree->Branch(
"cllines_pre", &cl_lines_vec_pre);
557 ln_clus_lines_tree->Branch(
"cllines_post", &cl_lines_vec_post);
559 cl_lines_vec_pre.clear();
560 cl_lines_vec_post.clear();
562 cl_lines_vec_post.push_back(clln);
564 for (
auto& cl : dbg_clusLines[rofId]) {
565 cl_lines_vec_pre.push_back(cl);
567 ln_clus_lines_tree->Fill();
570 ln_clus_lines_tree->Write();
576 gsl::span<const o2::its::Line>& lines,
579 std::array<float, 2>& beamPosXY,
586 int foundVertices{0};
588 const int numTracklets{
static_cast<int>(lines.size())};
589 for (
int line1{0}; line1 < numTracklets; ++line1) {
590 if (usedLines[line1]) {
593 for (
int line2{line1 + 1}; line2 < numTracklets; ++line2) {
594 if (usedLines[line2]) {
597 auto dca{Line::getDCA(lines[line1], lines[line2])};
599 clusterLines.emplace_back(line1, lines[line1], line2, lines[line2]);
600 std::array<float, 3> tmpVertex{clusterLines.back().getVertex()};
601 if (tmpVertex[0] * tmpVertex[0] + tmpVertex[1] * tmpVertex[1] > 4.f) {
602 clusterLines.pop_back();
605 usedLines[line1] =
true;
606 usedLines[line2] =
true;
607 for (
int tracklet3{0}; tracklet3 < numTracklets; ++tracklet3) {
608 if (usedLines[tracklet3]) {
612 clusterLines.back().add(tracklet3, lines[tracklet3]);
613 usedLines[tracklet3] =
true;
614 tmpVertex = clusterLines.back().getVertex();
622 if (
mVrtParams[iteration].allowSingleContribClusters) {
623 auto beamLine =
Line{{
tf->getBeamX(),
tf->getBeamY(), -50.f}, {
tf->getBeamX(),
tf->getBeamY(), 50.f}};
624 for (
size_t iLine{0}; iLine < numTracklets; ++iLine) {
625 if (!usedLines[iLine]) {
626 auto dca = Line::getDCA(lines[iLine], beamLine);
628 clusterLines.emplace_back(iLine, lines[iLine], -1, beamLine);
635 std::sort(clusterLines.begin(), clusterLines.end(), [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
637 for (
int iCluster1{0}; iCluster1 <
nClusters; ++iCluster1) {
638 std::array<float, 3> vertex1{clusterLines[iCluster1].getVertex()};
639 std::array<float, 3> vertex2{};
640 for (
int iCluster2{iCluster1 + 1}; iCluster2 <
nClusters; ++iCluster2) {
641 vertex2 = clusterLines[iCluster2].getVertex();
642 if (o2::gpu::GPUCommonMath::Abs(vertex1[2] - vertex2[2]) <
mVrtParams[iteration].clusterCut) {
643 float distance{(vertex1[0] - vertex2[0]) * (vertex1[0] - vertex2[0]) +
644 (vertex1[1] - vertex2[1]) * (vertex1[1] - vertex2[1]) +
645 (vertex1[2] - vertex2[2]) * (vertex1[2] - vertex2[2])};
647 for (
auto label : clusterLines[iCluster2].getLabels()) {
648 clusterLines[iCluster1].add(
label, lines[
label]);
649 vertex1 = clusterLines[iCluster1].getVertex();
651 clusterLines.erase(clusterLines.begin() + iCluster2);
659 std::sort(clusterLines.begin(), clusterLines.end(),
660 [](ClusterLines& cluster1, ClusterLines& cluster2) { return cluster1.getSize() > cluster2.getSize(); });
661 bool atLeastOneFound{
false};
662 for (
int iCluster{0}; iCluster <
nClusters; ++iCluster) {
663 bool lowMultCandidate{
false};
664 double beamDistance2{(
tf->getBeamX() - clusterLines[iCluster].getVertex()[0]) * (
tf->getBeamX() - clusterLines[iCluster].getVertex()[0]) +
665 (
tf->getBeamY() - clusterLines[iCluster].getVertex()[1]) * (
tf->getBeamY() - clusterLines[iCluster].getVertex()[1])};
667 if (atLeastOneFound && (lowMultCandidate = clusterLines[iCluster].getSize() <
mVrtParams[iteration].clusterContributorsCut)) {
668 lowMultCandidate &= (beamDistance2 <
mVrtParams[iteration].lowMultBeamDistCut *
mVrtParams[iteration].lowMultBeamDistCut);
669 if (!lowMultCandidate) {
670 clusterLines.erase(clusterLines.begin() + iCluster);
675 if (beamDistance2 < nsigmaCut && o2::gpu::GPUCommonMath::Abs(clusterLines[iCluster].getVertex()[2]) <
mVrtParams[iteration].maxZPositionAllowed) {
676 atLeastOneFound =
true;
679 clusterLines[iCluster].getVertex()[1],
680 clusterLines[iCluster].getVertex()[2]),
681 clusterLines[iCluster].getRMS2(),
683 clusterLines[iCluster].getSize(),
684 clusterLines[iCluster].getAvgDistance2());
685 vertices.back().setTimeStamp(clusterLines[iCluster].getROF());
687 for (
auto&
index : clusterLines[iCluster].getLabels()) {
688 labels->push_back(
tf->getLinesLabel(rofId)[
index]);
693 verticesInRof.push_back(foundVertices);