From d72f0bbf45850af8cf66beadad0581cb3ff7a51a Mon Sep 17 00:00:00 2001 From: Adrien Matta <matta@lpccaen.in2p3.fr> Date: Tue, 18 May 2021 20:47:54 +0200 Subject: [PATCH] * Improving Linear Ransac3D track reconstruction algorithm: - before: taking the best couple inside the cluster - after: weigthed average of all couple possible in the cluster --- .../TrackReconstruction/NPLinearRansac3D.cxx | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/NPLib/TrackReconstruction/NPLinearRansac3D.cxx b/NPLib/TrackReconstruction/NPLinearRansac3D.cxx index b2e5b6da6..767e43ce0 100644 --- a/NPLib/TrackReconstruction/NPLinearRansac3D.cxx +++ b/NPLib/TrackReconstruction/NPLinearRansac3D.cxx @@ -19,18 +19,25 @@ #include"NPLinearRansac3D.h" using namespace std; using namespace NPL; - //////////////////////////////////////////////////////////////////////////////// void LinearCluster3D::LinearFit(){ unsigned int sizeI = m_index.size(); - vector<double>va,vb,vd; double min_distance = 1e20; unsigned int min_i = 0 ; unsigned int min_j = 0; + + double meanDX=0; + double meanDY=0; + double meanDZ=0; + double totalW=0; + double meanX=0; + double meanY=0; + double meanZ=0; + double w; + for(unsigned int i = 0 ; i < sizeI ; i++){ TVector3 Pi((*m_X)[m_index[i]],(*m_Y)[m_index[i]],(*m_Z)[m_index[i]]); for(unsigned int j = i+1 ; j < sizeI ; j++){ - double dij=0; TVector3 Pj((*m_X)[m_index[j]],(*m_Y)[m_index[j]],(*m_Z)[m_index[j]]); // compute the average distance of all point to this line @@ -38,16 +45,30 @@ void LinearCluster3D::LinearFit(){ TVector3 Pp((*m_X)[m_index[p]],(*m_Y)[m_index[p]],(*m_Z)[m_index[p]]); dij+=MinimumDistancePointLine(Pi,Pj,Pp); } - if(dij/sizeI < min_distance){ - min_distance = dij/sizeI; - min_i = i; - min_j = j; - } - } + + w = 1./dij; + totalW+=w; + + meanX+=w*((*m_X)[m_index[i]]); + meanY+=w*((*m_Y)[m_index[i]]); + meanZ+=w*((*m_Z)[m_index[i]]); + meanDX+=w*((*m_X)[m_index[i]]-(*m_X)[m_index[j]]); + meanDY+=w*((*m_Y)[m_index[i]]-(*m_Y)[m_index[j]]); + meanDZ+=w*((*m_Z)[m_index[i]]-(*m_Z)[m_index[j]]); + } } - m_P0 = TVector3((*m_X)[m_index[min_i]],(*m_Y)[m_index[min_i]],(*m_Z)[m_index[min_i]]); - m_Dir = (m_P0 - TVector3((*m_X)[m_index[min_j]],(*m_Y)[m_index[min_j]],(*m_Z)[m_index[min_j]])).Unit(); + + meanDX/=totalW; + meanDY/=totalW; + meanDZ/=totalW; + meanX/=totalW; + meanY/=totalW; + meanZ/=totalW; + + m_P0 = TVector3(meanX,meanY,meanZ); + m_Dir = (TVector3(meanDX,meanDY,meanDZ)).Unit(); + }; //////////////////////////////////////////////////////////////////////////////// -- GitLab