From d45b2f376fc410ea974eb3ec4b21d5e8bb3ab84a Mon Sep 17 00:00:00 2001 From: Xavier Robin <xavier.robin@unibas.ch> Date: Fri, 21 Jul 2023 13:43:43 +0200 Subject: [PATCH] Merge branch 'develop' --- modules/io/pymod/export_omf_io.cc | 1 + modules/mol/alg/pymod/ligand_scoring.py | 47 +++++++++++--------- modules/mol/alg/tests/test_ligand_scoring.py | 1 - 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/modules/io/pymod/export_omf_io.cc b/modules/io/pymod/export_omf_io.cc index 43355a4a9..d2df0e475 100644 --- a/modules/io/pymod/export_omf_io.cc +++ b/modules/io/pymod/export_omf_io.cc @@ -61,6 +61,7 @@ void export_omf_io() { .value("ROUND_BFACTORS", OMF::ROUND_BFACTORS) .value("SKIP_SS", OMF::SKIP_SS) .value("INFER_PEP_BONDS", OMF::INFER_PEP_BONDS) + .value("INFER_AA_POS", OMF::INFER_AA_POS) ; class_<OMF, OMFPtr>("OMF",no_init) diff --git a/modules/mol/alg/pymod/ligand_scoring.py b/modules/mol/alg/pymod/ligand_scoring.py index cc54c2f5f..ac1e1fb1f 100644 --- a/modules/mol/alg/pymod/ligand_scoring.py +++ b/modules/mol/alg/pymod/ligand_scoring.py @@ -498,28 +498,29 @@ class LigandScorer: ref_res.qualified_name, ligand.qualified_name)) ignored_residue_hashes.add(h) + if ref_residues_hashes: + # reason for doing that separately is to guarantee same ordering of + # residues as in underlying entity. (Reorder by ResNum seems only + # available on ChainHandles) + ref_bs = self.target.CreateEmptyView() + for ch in self.target.chains: + for r in ch.residues: + if r.handle.GetHashCode() in ref_residues_hashes: + ref_bs.AddResidue(r, mol.ViewAddFlag.INCLUDE_ALL) + if len(ref_bs.residues) == 0: + LogWarning("No residue in proximity of target ligand " + "%s" % str(ligand)) + + # Find the representations + if self.global_chain_mapping: + self._binding_sites[ligand.hash_code] = self.chain_mapper.GetRepr( + ref_bs, self.model, inclusion_radius=self.lddt_lp_radius, + global_mapping=self._model_mapping) + else: + self._binding_sites[ligand.hash_code] = self.chain_mapper.GetRepr( + ref_bs, self.model, inclusion_radius=self.lddt_lp_radius, + topn=self.binding_sites_topn) - # reason for doing that separately is to guarantee same ordering of - # residues as in underlying entity. (Reorder by ResNum seems only - # available on ChainHandles) - ref_bs = self.target.CreateEmptyView() - for ch in self.target.chains: - for r in ch.residues: - if r.handle.GetHashCode() in ref_residues_hashes: - ref_bs.AddResidue(r, mol.ViewAddFlag.INCLUDE_ALL) - if len(ref_bs.residues) == 0: - LogWarning("No residue in proximity of target ligand " - "%s" % str(ligand)) - - # Find the representations - if self.global_chain_mapping: - self._binding_sites[ligand.hash_code] = self.chain_mapper.GetRepr( - ref_bs, self.model, inclusion_radius=self.lddt_lp_radius, - global_mapping = self._model_mapping) - else: - self._binding_sites[ligand.hash_code] = self.chain_mapper.GetRepr( - ref_bs, self.model, inclusion_radius=self.lddt_lp_radius, - topn=self.binding_sites_topn) return self._binding_sites[ligand.hash_code] @staticmethod @@ -825,6 +826,7 @@ class LigandScorer: trg_idx, mdl_idx][main_key] out_details[mdl_cname][mdl_resnum] = data[ trg_idx, mdl_idx] + return out_main, out_details def _assign_matrix(self, mat, data1, main_key1, data2, main_key2): @@ -985,7 +987,8 @@ class LigandScorer: """Get a dictionary of RMSD score details (dictionaries), keyed by model ligand (chain name, :class:`~ost.mol.ResNum`). - Each sub-dictionary contains the following information: + The value is a dictionary. For ligands that were assigned (mapped) to + the target, the dictionary contain the following information: * `rmsd`: the RMSD score value. * `lddt_lp`: the lDDT score of the ligand pocket (lDDT-LP). diff --git a/modules/mol/alg/tests/test_ligand_scoring.py b/modules/mol/alg/tests/test_ligand_scoring.py index 0ec50a4b6..948941c69 100644 --- a/modules/mol/alg/tests/test_ligand_scoring.py +++ b/modules/mol/alg/tests/test_ligand_scoring.py @@ -388,7 +388,6 @@ class TestLigandScoring(unittest.TestCase): assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'A': 'A'} assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'C': 'A'} - def test_rmsd_assignment(self): """Test that the RMSD-based assignment works. -- GitLab