@@ -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 :
0 commit comments