def cal_transformation_kabsch(src_points, dst_points): ''' Calculates the optimal rigid transformation from src_points to dst_points. (Regarding the least squares error) Args: ------ src_points: array, (N, 3) matrix. dst_points: array, (N, 3) matrix. Returns: ------ R: rotaion matrix, array. T: translation vector, array. rmsd_value: float. ''' assert src_points.shape == dst_points.shape if src_points.shape[1] != 3: raise Exception( "The input data matrix had to be transposed in order to compute transformation." ) #src_points = src_points.transpose() #dst_points = dst_points.transpose() src_points_centered = src_points - rmsd.centroid(src_points) dst_points_centered = dst_points - rmsd.centroid(dst_points) R = rmsd.kabsch(src_points_centered, dst_points_centered) rmsd_value = rmsd.kabsch_rmsd(src_points_centered, dst_points_centered) T = rmsd.centroid(dst_points) - np.matmul(rmsd.centroid(src_points), R) return R.transpose(), T.transpose(), rmsd_value
def rmsd_dist(A, B): #REMOVE CENTER OF MASS A -= rmsd.centroid(A) B -= rmsd.centroid(B) #FIND ROTATION MATRIX U = rmsd.kabsch(A, B) # ROTATE TOWARDS B A = np.dot(A, U) #RETURN ROOT MEAN SQUARE DEVIATION return rmsd.rmsd(A, B)
def rmsd_VEC(A, B): #REMOVE CENTER OF MASS A -= rmsd.centroid(A) B -= rmsd.centroid(B) #FIND ROTATION MATRIX U = rmsd.kabsch(A, B) # ROTATE TOWARDS B A = np.dot(A, U) #RETURN ROTATED ARRAY return A
def write_rmsd(fp, fp2, A, B): A -= rmsd.centroid(A) B -= rmsd.centroid(B) fp2.write('%d\n' % (len(A))) fp2.write('\n') for i in range(len(A)): fp2.write('A %f %f %f\n' % (A[i, 0], A[i, 1], A[i, 2])) #FIND ROTATION MATRIX U = rmsd.kabsch(A, B) # ROTATE TOWARDS B A = np.dot(A, U) fp.write('%d\n' % (len(A))) fp.write('\n') for i in range(len(A)): fp.write('A %f %f %f\n' % (A[i, 0], A[i, 1], A[i, 2])) return fp
def arrange(ref, to): ref -= rmsd.centroid(ref) to -= rmsd.centroid(to) U = rmsd.kabsch(to[:3, :], ref[:3, :]) to = np.dot(to, U) dist = [] ref_CT_taken = [] to_CT_taken = [] unordered_results = [] for i in range(3, len(ref)): for j in range(3, len(to)): ref_CT = ref[i, :] to_CT = to[j, :] dist.append([i - 3, j - 3, abs(np.linalg.norm(ref_CT - to_CT))]) while len(ref_CT_taken) != len(ref) - 3: min_index = min_dist_index(dist) unordered_results.append([dist[min_index][0], dist[min_index][1]]) ref_lmo = dist[min_index][0] to_lmo = dist[min_index][1] ref_CT_taken.append(ref_lmo) to_CT_taken.append(to_lmo) to_be_deleted = [] for i in range(len(dist)): if dist[i][0] == ref_lmo: if i not in to_be_deleted: to_be_deleted.append(dist[i]) continue if dist[i][1] == to_lmo: if i not in to_be_deleted: to_be_deleted.append(dist[i]) for i in range(len(to_be_deleted)): dist.remove(to_be_deleted[i]) return order(unordered_results, len(ref) - 3)