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