Skip to content

Commit 2ce3bd1

Browse files
authored
Merge pull request #82 from DeepRank/fix_lrmsd
Fix lrmsd
2 parents adb8b21 + 75228e7 commit 2ce3bd1

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

pdb2sql/StructureSimilarity.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,14 @@ def __init__(self, decoy, ref, verbose=False, enforce_residue_matching=True):
6363
def __repr__(self):
6464
return f'{self.__module__}.{self.__class__.__name__}({self.decoy}, {self.ref}, {self.verbose})'
6565

66-
def check_residues(self):
66+
def check_residues(self, **kwargs):
6767
"""Check if the residue numbering matches."""
6868

69-
res_ref = pdb2sql(self.ref).get_residues()
70-
res_dec = pdb2sql(self.decoy).get_residues()
69+
sql_ref = pdb2sql(self.ref)
70+
sql_dec = pdb2sql(self.decoy)
71+
72+
res_ref = sql_ref.get_residues(**kwargs)
73+
res_dec = sql_dec.get_residues(**kwargs)
7174

7275
if res_ref != res_dec:
7376
print('Residues are different in the reference and decoy.')
@@ -86,6 +89,24 @@ def check_residues(self):
8689
else:
8790
warnings.warn('Residue numbering not identical in ref and decoy.')
8891

92+
return False
93+
94+
for r_dec, r_ref in zip(res_dec, res_ref):
95+
96+
at_ref = sql_ref.get('name', chainID=r_ref[0], resName=r_ref[1], resSeq=r_ref[2], **kwargs)
97+
at_dec = sql_dec.get('name', chainID=r_dec[0], resName=r_dec[1], resSeq=r_dec[2], **kwargs)
98+
99+
if at_ref != at_dec:
100+
if self.enforce_residue_matching == True:
101+
raise ValueError(
102+
'Atoms not identical in ref and decoy.\n Set enforce_residue_matching=False to bypass this error.')
103+
else:
104+
warnings.warn('Atoms not identical in ref and decoy.')
105+
106+
return False
107+
108+
109+
return True
89110
##########################################################################
90111
#
91112
# FAST ROUTINE TO COMPUTE THE L-RMSD
@@ -140,7 +161,7 @@ def compute_lrmsd_fast(self, lzone=None, method='svd', check=True, name=['C', 'C
140161
# here the in_zone defines the zone for fitting,
141162
# and not_in_zone defines the zone for rms calculation.
142163

143-
self.check_residues()
164+
self.check_residues(name=name)
144165

145166
data_decoy_long, data_decoy_short = self.get_data_zone_backbone(
146167
self.decoy, resData, return_not_in_zone=True, name=name)
@@ -165,6 +186,8 @@ def compute_lrmsd_fast(self, lzone=None, method='svd', check=True, name=['C', 'C
165186
xyz_ref_long, xyz_ref_short = self.get_xyz_zone_backbone(
166187
self.ref, resData, return_not_in_zone=True, name=name)
167188

189+
# print(xyz_decoy_long)
190+
168191
xyz_decoy_short = superpose_selection(
169192
xyz_decoy_short, xyz_decoy_long, xyz_ref_long, method)
170193

@@ -534,6 +557,7 @@ def compute_lrmsd_pdb2sql(self, exportpath=None, method='svd', **kwargs):
534557
See also:
535558
:meth:`compute_lrmsd_fast`
536559
"""
560+
537561
backbone = ['CA', 'C', 'N', 'O']
538562
if 'name' not in kwargs:
539563
kwargs['name'] = backbone
@@ -546,6 +570,7 @@ def compute_lrmsd_pdb2sql(self, exportpath=None, method='svd', **kwargs):
546570
sql_decoy = pdb2sql(self.decoy, sqlfile='decoy.db')
547571
sql_ref = pdb2sql(self.ref, sqlfile='ref.db')
548572

573+
549574
# get the chains
550575
chains_decoy = sql_decoy.get_chains()
551576
chains_ref = sql_ref.get_chains()
@@ -570,11 +595,10 @@ def compute_lrmsd_pdb2sql(self, exportpath=None, method='svd', **kwargs):
570595
'x,y,z', chainID=chain2, **kwargs))
571596

572597
# check the lengthes
573-
if len(xyz_decoy_A) != len(xyz_ref_A):
598+
if self.check_residues(**kwargs) is False:
574599
xyz_decoy_A, xyz_ref_A = self.get_identical_atoms(
575600
sql_decoy, sql_ref, chain1, **kwargs)
576601

577-
if len(xyz_decoy_B) != len(xyz_ref_B):
578602
xyz_decoy_B, xyz_ref_B = self.get_identical_atoms(
579603
sql_decoy, sql_ref, chain2, **kwargs)
580604

@@ -684,7 +708,7 @@ def get_identical_atoms(db1, db2, chain, **kwargs):
684708

685709
# get the intersection
686710
shared_data = list(set(data1).intersection(data2))
687-
711+
688712
# get the xyz
689713
xyz1, xyz2 = [], []
690714
for data in shared_data:

test/test_structureSimilarity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def setUp(self):
1313
self.ref = Path(pdb_folder, '1AK4', 'target.pdb')
1414
self.izone = Path(pdb_folder, '1AK4', 'target.izone')
1515
self.lzone = Path(pdb_folder, '1AK4', 'target.lzone')
16-
self.sim = StructureSimilarity(self.decoy, self.ref)
16+
self.sim = StructureSimilarity(self.decoy, self.ref, enforce_residue_matching=False)
1717
# target values are calcualted using scripts from
1818
# https://github.com/haddocking/BM5-clean
1919
self.irmsd = 1.135

0 commit comments

Comments
 (0)