diff --git a/modules/mol/alg/pymod/lddt.py b/modules/mol/alg/pymod/lddt.py index a4f85c385130b22d11a9116a793543b89617f915..e59ca07e183e0c7d8b800ffe1fcf60c6528a99b9 100644 --- a/modules/mol/alg/pymod/lddt.py +++ b/modules/mol/alg/pymod/lddt.py @@ -739,7 +739,7 @@ class lDDTScorer: no_intrachain=False, residue_mapping=None, check_resnames=True, add_mdl_contacts=False, interaction_data=None): - """ EXPERIMENTAL DRMSD of *model* - globally and per-residue + """ DRMSD of *model* - globally and per-residue Very similar to LDDT as we operate on distance differences for all interatomic distances within the same inclusion radius as in LDDT. diff --git a/modules/mol/alg/tests/test_lddt.py b/modules/mol/alg/tests/test_lddt.py index a4781a3bdc41bbdbf2827f61512429a5ec5abf94..1f0bc542f75d13e7a29074fd5400848b43a51ef4 100644 --- a/modules/mol/alg/tests/test_lddt.py +++ b/modules/mol/alg/tests/test_lddt.py @@ -237,15 +237,49 @@ class TestlDDT(unittest.TestCase): self.assertAlmostEqual(lDDT, 0.6171511842396518, places=5) def test_drmsd(self): + + # do 7SGN model = _LoadFile("7SGN_C_model.pdb") target = _LoadFile("7SGN_C_target.pdb") lddt_scorer = lDDTScorer(target) drmsd, per_res_drmsd = lddt_scorer.DRMSD(model) - # this value is just blindly copied in without checking whether it makes - # any sense... it's sole purpose is to trigger DRMSD computation - self.assertAlmostEqual(drmsd, 1.9765632785024412, places=5) + dl = mol.alg.CreateDistanceList(target.CreateFullView(), 15.0) + classic_score = mol.alg.DRMSD(model.CreateFullView(), dl) + classic_per_res_scores = list() + for r in model.residues: + if r.HasProp("localdrmsd"): + classic_per_res_scores.append(r.GetFloatProp("localdrmsd")) + else: + classic_per_res_scores.append(None) + + self.assertAlmostEqual(drmsd, classic_score, 5) + for a,b in zip(per_res_drmsd, classic_per_res_scores): + self.assertAlmostEqual(a,b,5) + + # do 7W1F_B + model = _LoadFile("7W1F_B_model.pdb") + target = _LoadFile("7W1F_B_target.pdb") + + # do awesome implementation + scorer = lDDTScorer(target) + drmsd, per_res_drmsd = scorer.DRMSD(model) + + # do reference implementation + dl = mol.alg.CreateDistanceList(target.CreateFullView(), 15.0) + classic_score = mol.alg.DRMSD(model.CreateFullView(), dl) + classic_per_res_scores = list() + for r in model.residues: + if r.HasProp("localdrmsd"): + classic_per_res_scores.append(r.GetFloatProp("localdrmsd")) + else: + classic_per_res_scores.append(None) + + self.assertAlmostEqual(drmsd, classic_score, 5) + for a,b in zip(per_res_drmsd, classic_per_res_scores): + self.assertAlmostEqual(a,b,5) + class TestlDDTBS(unittest.TestCase):