| """ 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_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)) | |
| 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), | |
| } | |