mirror of
https://github.com/AngxiaoYue/ReQFlow.git
synced 2026-06-04 12:14:23 +08:00
56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
""" Metrics. """
|
|
import mdtraj as md
|
|
import numpy as np
|
|
from openfold.np import residue_constants
|
|
from tmtools import tm_align
|
|
from data import utils as du
|
|
|
|
|
|
def calc_tm_score(pos_1, pos_2, seq_1, seq_2):
|
|
tm_results = tm_align(pos_1, pos_2, seq_1, seq_2)
|
|
return tm_results.tm_norm_chain1, tm_results.tm_norm_chain2
|
|
|
|
def calc_mdtraj_metrics(pdb_path):
|
|
try:
|
|
traj = md.load(pdb_path)
|
|
pdb_ss = md.compute_dssp(traj, simplified=True)
|
|
pdb_coil_percent = np.mean(pdb_ss == 'C')
|
|
pdb_helix_percent = np.mean(pdb_ss == 'H')
|
|
pdb_strand_percent = np.mean(pdb_ss == 'E')
|
|
pdb_ss_percent = pdb_helix_percent + pdb_strand_percent
|
|
pdb_rg = md.compute_rg(traj)[0]
|
|
except IndexError as e:
|
|
print('Error in calc_mdtraj_metrics: {}'.format(e))
|
|
pdb_ss_percent = 0.0
|
|
pdb_coil_percent = 0.0
|
|
pdb_helix_percent = 0.0
|
|
pdb_strand_percent = 0.0
|
|
pdb_rg = 0.0
|
|
return {
|
|
'non_coil_percent': pdb_ss_percent,
|
|
'coil_percent': pdb_coil_percent,
|
|
'helix_percent': pdb_helix_percent,
|
|
'strand_percent': pdb_strand_percent,
|
|
'radius_of_gyration': pdb_rg,
|
|
}
|
|
|
|
def calc_ca_ca_metrics(ca_pos, bond_tol=0.1, clash_tol=1.0):
|
|
ca_bond_dists = np.linalg.norm(
|
|
ca_pos - np.roll(ca_pos, 1, axis=0), axis=-1)[1:]
|
|
ca_ca_dev = np.mean(np.abs(ca_bond_dists - residue_constants.ca_ca))
|
|
ca_ca_valid = np.mean(ca_bond_dists < (residue_constants.ca_ca + bond_tol))
|
|
|
|
ca_ca_dists2d = np.linalg.norm(
|
|
ca_pos[:, None, :] - ca_pos[None, :, :], axis=-1)
|
|
inter_dists = ca_ca_dists2d[np.where(np.triu(ca_ca_dists2d, k=0) > 0)]
|
|
clashes = inter_dists < clash_tol
|
|
return {
|
|
'ca_ca_deviation': ca_ca_dev,
|
|
'ca_ca_valid_percent': ca_ca_valid,
|
|
'num_ca_ca_clashes': np.sum(clashes),
|
|
}
|
|
|
|
def calc_aligned_rmsd(pos_1, pos_2):
|
|
aligned_pos_1 = du.rigid_transform_3D(pos_1, pos_2)[0]
|
|
return np.mean(np.linalg.norm(aligned_pos_1 - pos_2, axis=-1))
|