Search

단백질 간 인접 부위 (interface)의 RMSD 계산하기 - Python

Introduction

단백질 구조를 다루다 보면, 두 개 이상의 단백질끼리 결합하거나, 가까운 거리에서 상호작용하는 경우가 있다. 이때 단백질끼리 인접한 부분의 residue를 interface 라고 부른다.
이번 포스팅에서는 크게 두 가지 함수를 소개한다.
1.
get_interface(): Interface 부분을 얻는 함수
2.
get_interface_rmsd(): Ground truth bound structure의 interface 부분과 rigid docking model이 예측한 bound structure의 interface 부분 간 RMSD 값을 얻는 함수

Implementation with Python

import scipy.spatial as spa import torch def get_interface(A, B, threshold=8.): """ @params - A, B: coordinates (torch.tensor, shape: (N x 3)) - threshold: threshold distance to define interface (float). usually 8 angstrom. """ a_b_distance = spa.distance.cdist(A, B) positive_tuple = np.where(a_b_distance < threshold) return positive_tuple
Python
복사
def get_interface_rmsd(lig_coords_pred, lig_coords_true, rec_coords, threshold): """ @params - lig_coords_pred, lig_coords_true, """ lig_inter, rec_inter = get_interface(lig_coords_true, rec_coords, threshold) lig_coords_pred = lig_coords_pred[lig_inter, :] lig_coords_true = lig_coords_true[lig_inter, :] rec_coords = rec_coords[rec_inter, :] complex_coords_pred = torch.concatenate([lig_coords_pred, rec_coords], dim=0) complex_coords_true = torch.concatenate([lig_coords_true, rec_coords], dim=0) R, t = Kabsch_align(complex_coords_pred, complex_coords_true) complex_coords_pred_aligned = (R @ complex_coords_pred.T + t).T interface_rmsd = compute_rmsd(complex_coords_pred_aligned, complex_coords_true) return interface_rmsd
Python
복사
Kabsch_align 함수와 compute_rmsd 함수는 RMSD 구하기 (Kabsch algorithm) - Python 참고
Code Reference: DiffDock-PP 의 src/evaluation/compute_rmsd.py 를 참고해서 작성했습니다.