diff --git a/modules/mol/alg/tests/test_ligand_scoring.py b/modules/mol/alg/tests/test_ligand_scoring.py index c2b2a762f4001747d8c977dca9b4d521aa59fea3..e06e64cfbe59ffa1039ad5d3be26d4bc5bed6fbf 100644 --- a/modules/mol/alg/tests/test_ligand_scoring.py +++ b/modules/mol/alg/tests/test_ligand_scoring.py @@ -1,8 +1,8 @@ import unittest, os, sys +from functools import lru_cache import numpy as np -import ost from ost import io, mol, geom # check if we can import: fails if numpy or scipy not available try: @@ -13,22 +13,42 @@ except ImportError: "networkx is missing. Ignoring test_ligand_scoring.py tests.") sys.exit(0) -#ost.PushVerbosityLevel(ost.LogLevel.Debug) + +def _GetTestfilePath(filename): + """Get the path to the test file given filename""" + return os.path.join('testfiles', filename) + + +@lru_cache(maxsize=None) +def _LoadMMCIF(filename): + path = _GetTestfilePath(filename) + ent, seqres = io.LoadMMCIF(path, seqres=True) + return ent + + +@lru_cache(maxsize=None) +def _LoadPDB(filename): + path = _GetTestfilePath(filename) + ent = io.LoadPDB(path) + return ent + + +@lru_cache(maxsize=None) +def _LoadEntity(filename): + path = _GetTestfilePath(filename) + ent = io.LoadEntity(path) + return ent + class TestLigandScoring(unittest.TestCase): def test_extract_ligands_mmCIF(self): """Test that we can extract ligands from mmCIF files. """ - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - mdl, mdl_seqres = io.LoadMMCIF(os.path.join('testfiles', "P84080_model_02.cif.gz"), seqres=True) + trg = _LoadMMCIF("1r8q.cif.gz") + mdl = _LoadMMCIF("P84080_model_02.cif.gz") sc = LigandScorer(mdl, trg, None, None) - # import ipdb; ipdb.set_trace() - # import ost.mol.alg.scoring - # scr = ost.mol.alg.scoring.Scorer(sc.model, sc.target) - # scr.lddt - # scr.local_lddt assert len(sc.target_ligands) == 7 assert len(sc.model_ligands) == 1 @@ -39,8 +59,8 @@ class TestLigandScoring(unittest.TestCase): """Test that we can instantiate the scorer with ligands contained in the target and model entity and given in a list. """ - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - mdl, mdl_seqres = io.LoadMMCIF(os.path.join('testfiles', "P84080_model_02.cif.gz"), seqres=True) + trg = _LoadMMCIF("1r8q.cif.gz") + mdl = _LoadMMCIF("P84080_model_02.cif.gz") # Pass entity views trg_lig = [trg.Select("rname=MG"), trg.Select("rname=G3D")] @@ -87,10 +107,10 @@ class TestLigandScoring(unittest.TestCase): io.SaveEntity(lig_ent, "%s_ligand_%d.sdf" % (prefix, lig_num)) lig_num += 1 """ - mdl = io.LoadPDB(os.path.join('testfiles', "P84080_model_02_nolig.pdb")) - mdl_ligs = [io.LoadEntity(os.path.join('testfiles', "P84080_model_02_ligand_0.sdf"))] - trg = io.LoadPDB(os.path.join('testfiles', "1r8q_protein.pdb.gz")) - trg_ligs = [io.LoadEntity(os.path.join('testfiles', "1r8q_ligand_%d.sdf" % i)) for i in range(7)] + mdl = _LoadPDB("P84080_model_02_nolig.pdb") + mdl_ligs = [_LoadEntity("P84080_model_02_ligand_0.sdf")] + trg = _LoadPDB("1r8q_protein.pdb.gz") + trg_ligs = [_LoadEntity("1r8q_ligand_%d.sdf" % i) for i in range(7)] # Pass entities sc = LigandScorer(mdl, trg, mdl_ligs, trg_ligs) @@ -114,18 +134,18 @@ class TestLigandScoring(unittest.TestCase): """Test that we reject input if multiple ligands with the same chain name/residue number are given. """ - mdl = io.LoadPDB(os.path.join('testfiles', "P84080_model_02_nolig.pdb")) - mdl_ligs = [io.LoadEntity(os.path.join('testfiles', "P84080_model_02_ligand_0.sdf"))] - trg = io.LoadPDB(os.path.join('testfiles', "1r8q_protein.pdb.gz")) - trg_ligs = [io.LoadEntity(os.path.join('testfiles', "1r8q_ligand_%d.sdf" % i)) for i in range(7)] + mdl = _LoadPDB("P84080_model_02_nolig.pdb") + mdl_ligs = [_LoadEntity("P84080_model_02_ligand_0.sdf")] + trg = _LoadPDB("1r8q_protein.pdb.gz") + trg_ligs = [_LoadEntity("1r8q_ligand_%d.sdf" % i) for i in range(7)] # Reject identical model ligands with self.assertRaises(RuntimeError): sc = LigandScorer(mdl, trg, [mdl_ligs[0], mdl_ligs[0]], trg_ligs) # Reject identical target ligands - lig0 = trg_ligs[0] - lig1 = trg_ligs[1] + lig0 = trg_ligs[0].Copy() + lig1 = trg_ligs[1].Copy() ed1 = lig1.EditXCS() ed1.RenameChain(lig1.chains[0], lig0.chains[0].name) ed1.SetResidueNumber(lig1.residues[0], lig0.residues[0].number) @@ -135,7 +155,7 @@ class TestLigandScoring(unittest.TestCase): def test__ResidueToGraph(self): """Test that _ResidueToGraph works as expected """ - mdl_lig = io.LoadEntity(os.path.join('testfiles', "P84080_model_02_ligand_0.sdf")) + mdl_lig = _LoadEntity("P84080_model_02_ligand_0.sdf") graph = ligand_scoring._ResidueToGraph(mdl_lig.residues[0]) assert len(graph.edges) == 34 @@ -152,8 +172,8 @@ class TestLigandScoring(unittest.TestCase): def test__ComputeSymmetries(self): """Test that _ComputeSymmetries works. """ - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - mdl, mdl_seqres = io.LoadMMCIF(os.path.join('testfiles', "P84080_model_02.cif.gz"), seqres=True) + trg = _LoadMMCIF("1r8q.cif.gz") + mdl = _LoadMMCIF("P84080_model_02.cif.gz") trg_mg1 = trg.FindResidue("E", 1) trg_g3d1 = trg.FindResidue("F", 1) @@ -168,7 +188,7 @@ class TestLigandScoring(unittest.TestCase): assert len(sym) == 72 # Test that we can match ions read from SDF - sdf_lig = io.LoadEntity(os.path.join('testfiles', "1r8q_ligand_0.sdf")) + sdf_lig = _LoadEntity("1r8q_ligand_0.sdf") sym = ligand_scoring._ComputeSymmetries(trg_mg1, sdf_lig.residues[0], by_atom_index=True) assert len(sym) == 1 @@ -195,8 +215,8 @@ class TestLigandScoring(unittest.TestCase): def test_SCRMSD(self): """Test that SCRMSD works. """ - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - mdl, mdl_seqres = io.LoadMMCIF(os.path.join('testfiles', "P84080_model_02.cif.gz"), seqres=True) + trg = _LoadMMCIF("1r8q.cif.gz") + mdl = _LoadMMCIF("P84080_model_02.cif.gz") trg_mg1 = trg.FindResidue("E", 1) trg_g3d1 = trg.FindResidue("F", 1) @@ -240,8 +260,8 @@ class TestLigandScoring(unittest.TestCase): def test__compute_scores(self): """Test that _compute_scores works. """ - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - mdl, mdl_seqres = io.LoadMMCIF(os.path.join('testfiles', "P84080_model_02.cif.gz"), seqres=True) + trg = _LoadMMCIF("1r8q.cif.gz") + mdl = _LoadMMCIF("P84080_model_02.cif.gz") mdl_lig = io.LoadEntity(os.path.join('testfiles', "P84080_model_02_ligand_0.sdf")) sc = LigandScorer(mdl, trg, [mdl_lig], None) @@ -273,8 +293,8 @@ class TestLigandScoring(unittest.TestCase): """Test check_resname argument works """ # 4C0A has mismatching sequence and fails with check_resnames=True - mdl_1r8q, _ = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - trg_4c0a, _ = io.LoadMMCIF(os.path.join('testfiles', "4c0a.cif.gz"), seqres=True) + mdl_1r8q = _LoadMMCIF("1r8q.cif.gz") + trg_4c0a = _LoadMMCIF("4c0a.cif.gz") mdl = mdl_1r8q.Select("cname=D or cname=F") trg = trg_4c0a.Select("cname=C or cname=I") @@ -290,8 +310,8 @@ class TestLigandScoring(unittest.TestCase): """Test that the scores are computed correctly """ # 4C0A has more ligands - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - trg_4c0a, _ = io.LoadMMCIF(os.path.join('testfiles', "4c0a.cif.gz"), seqres=True) + trg = _LoadMMCIF("1r8q.cif.gz") + trg_4c0a = _LoadMMCIF("4c0a.cif.gz") sc = LigandScorer(trg, trg_4c0a, None, None, check_resnames=False) expected_keys = {"J", "F"} @@ -344,19 +364,18 @@ class TestLigandScoring(unittest.TestCase): For RMSD, A: A results in a better chain mapping. However, C: A is a better global chain mapping from an lDDT perspective (and lDDT-PLI). """ - trg, trg_seqres = io.LoadMMCIF(os.path.join('testfiles', "1r8q.cif.gz"), seqres=True) - mdl, mdl_seqres = io.LoadMMCIF(os.path.join('testfiles', "P84080_model_02.cif.gz"), seqres=True) - mdl_lig = io.LoadEntity(os.path.join('testfiles', "P84080_model_02_ligand_0.sdf")) + trg = _LoadMMCIF("1r8q.cif.gz") + mdl = _LoadMMCIF("P84080_model_02.cif.gz") # Local by default - sc = LigandScorer(mdl, trg, [mdl_lig], None) - assert sc.rmsd_details["00001_L_2"][1]["chain_mapping"] == {'A': 'A'} - assert sc.lddt_pli_details["00001_L_2"][1]["chain_mapping"] == {'C': 'A'} + sc = LigandScorer(mdl, trg, None, None) + assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'A': 'A'} + assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'C': 'A'} # Global - sc = LigandScorer(mdl, trg, [mdl_lig], None, global_chain_mapping=True) - assert sc.rmsd_details["00001_L_2"][1]["chain_mapping"] == {'C': 'A'} - assert sc.lddt_pli_details["00001_L_2"][1]["chain_mapping"] == {'C': 'A'} + sc = LigandScorer(mdl, trg, None, None, global_chain_mapping=True) + assert sc.rmsd_details["L_2"][1]["chain_mapping"] == {'C': 'A'} + assert sc.lddt_pli_details["L_2"][1]["chain_mapping"] == {'C': 'A'} if __name__ == "__main__":