diff --git a/modules/mol/alg/pymod/ligand_scoring.py b/modules/mol/alg/pymod/ligand_scoring.py index c0743d1964374afb9012b354ed42bb570571c9b6..c06a999593860be2ceb1ef95c1c15be7b954cb81 100644 --- a/modules/mol/alg/pymod/ligand_scoring.py +++ b/modules/mol/alg/pymod/ligand_scoring.py @@ -265,7 +265,7 @@ class LigandScorer: target_ligands, rename_ligand_chain) if len(self.target_ligands) == 0: - raise ValueError("No ligands in the target") + LogWarning("No ligands in the target") # Extract ligands from model if model_ligands is None: @@ -275,7 +275,9 @@ class LigandScorer: model_ligands, rename_ligand_chain) if len(self.model_ligands) == 0: - raise ValueError("No ligands in the model") + LogWarning("No ligands in the model") + if len(self.target_ligands) == 0: + raise ValueError("No ligand in the model and in the target") self._chain_mapper = chain_mapper self.resnum_alignments = resnum_alignments @@ -764,6 +766,10 @@ class LigandScorer: else: mat2 = np.copy(mat2) assignments = [] + if 0 in mat1.shape: + # No model or target ligand + LogDebug("No model or target ligand, returning no assignment.") + return assignments min_mat1 = LigandScorer._nanmin_nowarn(mat1) while not np.isnan(min_mat1): best_mat1 = np.argwhere(mat1 == min_mat1) @@ -1252,6 +1258,7 @@ class LigandScorer: Currently, the following reasons are reported: + * `no_ligand`: No ligand in the model. * `binding_site`: no residue in proximity of the target ligand. * `model_representation`: no representation of the reference binding site was found in the model @@ -1284,6 +1291,7 @@ class LigandScorer: Currently, the following reasons are reported: + * `no_ligand`: No ligand in the target. * `binding_site`: no residue in proximity of the target ligand. * `model_representation`: no representation of the reference binding site was found in the model @@ -1413,6 +1421,10 @@ class LigandScorer: if not ("unassigned" in ligand_details and ligand_details["unassigned"]): raise RuntimeError("Ligand %s is mapped to %s" % (ligand, ligand_details["target_ligand"])) + # Were there any ligands in the target? + if len(self.target_ligands) == 0: + return ("no_ligand", "No ligand in the target") + # Do we have isomorphisms with the target? for trg_lig_idx, assigned in enumerate(self._assignment_isomorphisms[:, ligand_idx]): if np.isnan(assigned): @@ -1465,6 +1477,10 @@ class LigandScorer: raise RuntimeError("Ligand %s is mapped to %s.%s" % ( ligand, cname, rnum)) + # Were there any ligands in the model? + if len(self.model_ligands) == 0: + return ("no_ligand", "No ligand in the model") + # Is it because there was no valid binding site or no representation? if ligand in self._unassigned_target_ligands_reason: return self._unassigned_target_ligands_reason[ligand] diff --git a/modules/mol/alg/tests/test_ligand_scoring.py b/modules/mol/alg/tests/test_ligand_scoring.py index 961a2809343c301fc816ba2c12b3e8d305bae55b..35de1ffb3d7fb0f272db95e6a2a9f0eaadd995f3 100644 --- a/modules/mol/alg/tests/test_ligand_scoring.py +++ b/modules/mol/alg/tests/test_ligand_scoring.py @@ -568,6 +568,30 @@ class TestLigandScoring(unittest.TestCase): } assert sc.lddt_pli["L_OXY"][1] is None + # With missing ligands + sc = LigandScorer(mdl.Select("cname=A"), trg, None, None) + assert sc.unassigned_target_ligands["E"][1] == ('no_ligand', 'No ligand in the model') + + sc = LigandScorer(mdl, trg.Select("cname=A"), None, None) + assert sc.unassigned_model_ligands["L_2"][1] == ('no_ligand', 'No ligand in the target') + + sc = LigandScorer(mdl.Select("cname=A"), trg, None, None, + unassigned=True, rmsd_assignment=True) + assert sc.unassigned_target_ligands["E"][1] == ('no_ligand', 'No ligand in the model') + + sc = LigandScorer(mdl, trg.Select("cname=A"), None, None, + unassigned=True, rmsd_assignment=True) + assert sc.unassigned_model_ligands["L_2"][1] == ('no_ligand', 'No ligand in the target') + + # However not everything must be missing + with self.assertRaises(ValueError): + sc = LigandScorer(mdl.Select("cname=A"), trg.Select("cname=A"), None, None, + unassigned=True, rmsd_assignment=True) + + + + + if __name__ == "__main__": from ost import testutils