diff --git a/modules/mol/alg/pymod/ligand_scoring_base.py b/modules/mol/alg/pymod/ligand_scoring_base.py index 80cd38302696e044c43b9483810035f3c6095f15..f676463bdd3761e8579f9ebe50f48cd750a6417b 100644 --- a/modules/mol/alg/pymod/ligand_scoring_base.py +++ b/modules/mol/alg/pymod/ligand_scoring_base.py @@ -397,6 +397,13 @@ class LigandScorer: to target chains - see :class:`ost.mol.alg.chain_mapping.ChainMapper` :type mdl_map_nuc_seqid_thr: :class:`float` + :param seqres: Parameter that affects identification of identical chains in + target - see :class:`ost.mol.alg.chain_mapping.ChainMapper` + :type seqres: :class:`ost.seq.SequenceList` + :param trg_seqres_mapping: Parameter that affects identification of identical + chains in target - see + :class:`ost.mol.alg.chain_mapping.ChainMapper` + :type trg_seqres_mapping: :class:`dict` """ def __init__(self, model, target, model_ligands, target_ligands, @@ -406,7 +413,9 @@ class LigandScorer: min_nuc_length = 4, pep_seqid_thr = 95., nuc_seqid_thr = 95., mdl_map_pep_seqid_thr = 0., - mdl_map_nuc_seqid_thr = 0.): + mdl_map_nuc_seqid_thr = 0., + seqres = None, + trg_seqres_mapping = None): if isinstance(model, mol.EntityView): self._model = mol.CreateEntityFromView(model, False) @@ -485,6 +494,8 @@ class LigandScorer: self._nuc_seqid_thr = nuc_seqid_thr self._mdl_map_pep_seqid_thr = mdl_map_pep_seqid_thr self._mdl_map_nuc_seqid_thr = mdl_map_nuc_seqid_thr + self._seqres = seqres + self._trg_seqres_mapping = trg_seqres_mapping # lazily computed attributes self.__chain_mapper = None @@ -643,6 +654,18 @@ class LigandScorer: """ return self._mdl_map_nuc_seqid_thr + @property + def seqres(self): + """ Given at :class:`LigandScorer` construction + """ + return self._seqres + + @property + def trg_seqres_mapping(self): + """ Given at :class:`LigandScorer` construction + """ + return self._trg_seqres_mapping + @property def substructure_match(self): """ Given at :class:`LigandScorer` construction @@ -1133,7 +1156,9 @@ class LigandScorer: pep_seqid_thr=self.pep_seqid_thr, nuc_seqid_thr=self.nuc_seqid_thr, mdl_map_pep_seqid_thr=self.mdl_map_pep_seqid_thr, - mdl_map_nuc_seqid_thr=self.mdl_map_nuc_seqid_thr) + mdl_map_nuc_seqid_thr=self.mdl_map_nuc_seqid_thr, + seqres = self.seqres, + trg_seqres_mapping = self.trg_seqres_mapping) return self.__chain_mapper @property diff --git a/modules/mol/alg/pymod/ligand_scoring_lddtpli.py b/modules/mol/alg/pymod/ligand_scoring_lddtpli.py index 85e61f5779069ddd835a4e444dfded57a9e9a5d9..7e22be4aa87ce4815e82992383b1a2b773fa7ab6 100644 --- a/modules/mol/alg/pymod/ligand_scoring_lddtpli.py +++ b/modules/mol/alg/pymod/ligand_scoring_lddtpli.py @@ -120,7 +120,9 @@ class LDDTPLIScorer(ligand_scoring_base.LigandScorer): min_nuc_length = 4, pep_seqid_thr = 95., nuc_seqid_thr = 95., mdl_map_pep_seqid_thr = 0., - mdl_map_nuc_seqid_thr = 0.): + mdl_map_nuc_seqid_thr = 0., + seqres=None, + trg_seqres_mapping=None): super().__init__(model, target, model_ligands, target_ligands, resnum_alignments = resnum_alignments, @@ -133,7 +135,9 @@ class LDDTPLIScorer(ligand_scoring_base.LigandScorer): pep_seqid_thr = pep_seqid_thr, nuc_seqid_thr = nuc_seqid_thr, mdl_map_pep_seqid_thr = mdl_map_pep_seqid_thr, - mdl_map_nuc_seqid_thr = mdl_map_nuc_seqid_thr) + mdl_map_nuc_seqid_thr = mdl_map_nuc_seqid_thr, + seqres = seqres, + trg_seqres_mapping = trg_seqres_mapping) self.lddt_pli_radius = lddt_pli_radius self.add_mdl_contacts = add_mdl_contacts diff --git a/modules/mol/alg/pymod/ligand_scoring_scrmsd.py b/modules/mol/alg/pymod/ligand_scoring_scrmsd.py index 73aed8d00f2692edd713181b8e0c949ee9f6a18e..b14c68b7c6174fe8999d51c749937c8477012687 100644 --- a/modules/mol/alg/pymod/ligand_scoring_scrmsd.py +++ b/modules/mol/alg/pymod/ligand_scoring_scrmsd.py @@ -119,6 +119,10 @@ class SCRMSDScorer(ligand_scoring_base.LigandScorer): :type mdl_map_pep_seqid_thr: :class:`float` :param mdl_map_nuc_seqid_thr: See :class:`ost.mol.alg.ligand_scoring_base.LigandScorer` :type mdl_map_nuc_seqid_thr: :class:`float` + :param seqres: See :class:`ost.mol.alg.ligand_scoring_base.LigandScorer` + :type seqres: :class:`ost.seq.SequenceList` + :param trg_seqres_mapping: See :class:`ost.mol.alg.ligand_scoring_base.LigandScorer` + :type trg_seqres_mapping: :class:`dict` """ def __init__(self, model, target, model_ligands, target_ligands, resnum_alignments=False, rename_ligand_chain=False, @@ -129,7 +133,9 @@ class SCRMSDScorer(ligand_scoring_base.LigandScorer): min_nuc_length = 4, pep_seqid_thr = 95., nuc_seqid_thr = 95., mdl_map_pep_seqid_thr = 0., - mdl_map_nuc_seqid_thr = 0.): + mdl_map_nuc_seqid_thr = 0., + seqres=None, + trg_seqres_mapping=None): super().__init__(model, target, model_ligands, target_ligands, resnum_alignments = resnum_alignments, @@ -142,7 +148,9 @@ class SCRMSDScorer(ligand_scoring_base.LigandScorer): pep_seqid_thr = pep_seqid_thr, nuc_seqid_thr = nuc_seqid_thr, mdl_map_pep_seqid_thr = mdl_map_pep_seqid_thr, - mdl_map_nuc_seqid_thr = mdl_map_nuc_seqid_thr) + mdl_map_nuc_seqid_thr = mdl_map_nuc_seqid_thr, + seqres = seqres, + trg_seqres_mapping = trg_seqres_mapping) self.bs_radius = bs_radius self.lddt_lp_radius = lddt_lp_radius diff --git a/modules/mol/alg/pymod/scoring.py b/modules/mol/alg/pymod/scoring.py index f1d164a8eddc501ed9e368cdbb4ea784b0034bb5..62a0d92be481cd6d5d5b9017a5fe76a44c3ca799 100644 --- a/modules/mol/alg/pymod/scoring.py +++ b/modules/mol/alg/pymod/scoring.py @@ -263,6 +263,13 @@ class Scorer: to target chains - see :class:`ost.mol.alg.chain_mapping.ChainMapper` :type mdl_map_nuc_seqid_thr: :class:`float` + :param seqres: Parameter that affects identification of identical chains in + target - see :class:`ost.mol.alg.chain_mapping.ChainMapper` + :type seqres: :class:`ost.seq.SequenceList` + :param trg_seqres_mapping: Parameter that affects identification of identical + chains in target - see + :class:`ost.mol.alg.chain_mapping.ChainMapper` + :type trg_seqres_mapping: :class:`dict` """ def __init__(self, model, target, resnum_alignments=False, molck_settings = None, cad_score_exec = None, @@ -274,7 +281,9 @@ class Scorer: lddt_inclusion_radius = 15.0, pep_seqid_thr = 95., nuc_seqid_thr = 95., mdl_map_pep_seqid_thr = 0., - mdl_map_nuc_seqid_thr = 0.): + mdl_map_nuc_seqid_thr = 0., + seqres = None, + trg_seqres_mapping = None): self._target_orig = target self._model_orig = model @@ -388,6 +397,8 @@ class Scorer: self.nuc_seqid_thr = nuc_seqid_thr self.mdl_map_pep_seqid_thr = mdl_map_pep_seqid_thr self.mdl_map_nuc_seqid_thr = mdl_map_nuc_seqid_thr + self.seqres = seqres + self.trg_seqres_mapping = trg_seqres_mapping # lazily evaluated attributes self._stereochecked_model = None @@ -752,7 +763,9 @@ class Scorer: pep_seqid_thr=self.pep_seqid_thr, nuc_seqid_thr=self.nuc_seqid_thr, mdl_map_pep_seqid_thr=self.mdl_map_pep_seqid_thr, - mdl_map_nuc_seqid_thr=self.mdl_map_nuc_seqid_thr) + mdl_map_nuc_seqid_thr=self.mdl_map_nuc_seqid_thr, + seqres=self.seqres, + trg_seqres_mapping=self.trg_seqres_mapping) return self._chain_mapper @property diff --git a/modules/mol/alg/tests/test_ligand_scoring.py b/modules/mol/alg/tests/test_ligand_scoring.py index d0145f098aacca57b1f1c62195e748230142dd3d..6e09ebe70b749f54e66faf0c1a9aec657a82ab1a 100644 --- a/modules/mol/alg/tests/test_ligand_scoring.py +++ b/modules/mol/alg/tests/test_ligand_scoring.py @@ -4,7 +4,7 @@ from functools import lru_cache import numpy as np import ost -from ost import io, mol, geom, conop +from ost import io, mol, geom, conop, seq # check if we can import: fails if numpy or scipy not available try: from ost.mol.alg.ligand_scoring_base import * @@ -1004,6 +1004,70 @@ class TestLigandScoringFancy(unittest.TestCase): self.assertEqual(sc.model.GetResidueCount(), N_res) self.assertEqual(sc.model_cleanup_log["cleaned_atoms"]["unknown_atoms"], ["A.2..yolo"]) + def test_seqres(self): + # the tested structures are absolutely irrelevant for ligands + # we're simply checking if the seqres info gets propagated to + # the chain mapper + mdl = _LoadPDB("1eud_mdl_partial-dimer.pdb") + trg = _LoadPDB("1eud_ref.pdb") + mdl_lig = [] + trg_lig = [] + fake_lig = mol.CreateEntity() + ed = fake_lig.EditXCS() + ch=ed.InsertChain("A") + r=ed.AppendResidue(ch, "LIG") + a=ed.InsertAtom(r, "A", geom.Vec3()) + trg_lig.append(fake_lig) + sc = ligand_scoring_scrmsd.SCRMSDScorer(mdl, trg, mdl_lig, trg_lig) + self.assertTrue(sc._chain_mapper.seqres is None) + self.assertTrue(sc._chain_mapper.trg_seqres_mapping is None) + sc = ligand_scoring_lddtpli.LDDTPLIScorer(mdl, trg, mdl_lig, trg_lig) + self.assertTrue(sc._chain_mapper.seqres is None) + self.assertTrue(sc._chain_mapper.trg_seqres_mapping is None) + + + seqres = seq.CreateSequenceList() + seqres.AddSequence(seq.CreateSequence("1", "MAIRHCSYTASRKHLYVDKNTKVICQGFTGK" + "QGTFHSQQALEYGTNLVGGTTPGKGGKTHLGL" + "PVFNTVKEAKEQTGATASVIYVPPPFAAAAIN" + "EAIDAEVPLVVCITEGIPQQDMVRVKHRLLRQ" + "GKTRLIGPNCPGVINPGECKIGIMPGHIHKKG" + "RIGIVSRSGTLTYEAVHQTTQVGLGQSLCVGI" + "GGDPFNGTDFTDCLEIFLNDPATEGIILIGEI" + "GGNAEENAAEFLKQHNSGPKSKPVVSFIAGLT" + "APPGRRMGHAGAIIAGGKGGAKEKITALQSAG" + "VVVSMSPAQLGTTIYKEFEKRKML")) + seqres.AddSequence(seq.CreateSequence("2", "MVNLQEYQSKKLMSDNGVKVQRFFVADTANEA" + "LEAAKRLNAKEIVLKAQILAGGRGKGVFSSGL" + "KGGVHLTKDPEVVGQLAKQMIGYNLATKQTPK" + "EGVKVNKVMVAEALDISRETYLAILMDRSCNG" + "PVLVGSPQGGVDIEEVAASNPELIFKEQIDII" + "EGIKDSQAQRMAENLGFLGPLQNQAADQIKKL" + "YNLFLKIDATQVEVNPFGETPEGQVVCFDAKI" + "NFDDNAEFRQKDIFAMDDKSENEPIENEAAKY" + "DLKYIGLDGNIACFVNGAGLAMATCDIIFLNG" + "GKPANFLDLGGGVKESQVYQAFKLLTADPKVE" + "AILVNIFGGIVNCAIIANGITKACRELELKVP" + "LVVRLEGTNVHEAQNILTNSGLPITSAVDLED" + "AAKKAVASVTKK")) + + trg_seqres_mapping = {"A": "1", + "B": "2"} + + # we simply check if the parameters are propagated to the chain mapper + sc = ligand_scoring_scrmsd.SCRMSDScorer(mdl, trg, mdl_lig, trg_lig, + seqres=seqres, + trg_seqres_mapping=trg_seqres_mapping, + resnum_alignments=True) + self.assertFalse(sc._chain_mapper.seqres is None) + self.assertFalse(sc._chain_mapper.trg_seqres_mapping is None) + sc = ligand_scoring_lddtpli.LDDTPLIScorer(mdl, trg, mdl_lig, trg_lig, + seqres=seqres, + trg_seqres_mapping=trg_seqres_mapping, + resnum_alignments=True) + self.assertFalse(sc._chain_mapper.seqres is None) + self.assertFalse(sc._chain_mapper.trg_seqres_mapping is None) + if __name__ == "__main__": from ost import testutils diff --git a/modules/mol/alg/tests/test_scoring.py b/modules/mol/alg/tests/test_scoring.py index 162808afce53669e169df279c1a05e4efcd28ef1..27bf83231933b5c1e712465b3ab5d169448e8b5f 100644 --- a/modules/mol/alg/tests/test_scoring.py +++ b/modules/mol/alg/tests/test_scoring.py @@ -1,6 +1,6 @@ import unittest, os, sys import ost -from ost import io, mol, geom +from ost import io, mol, geom, seq # check if we can import: fails if numpy or scipy not available try: from ost.mol.alg.scoring import * @@ -234,6 +234,49 @@ class TestScorer(unittest.TestCase): scorer = Scorer(mdl, trg) self.assertAlmostEqual(scorer.tm_score, 0.711, 3) + def test_scorer_seqres(self): + mdl = _LoadFile("1eud_mdl_partial-dimer.pdb") + trg = _LoadFile("1eud_ref.pdb") + scorer = Scorer(mdl, trg) + self.assertTrue(scorer.chain_mapper.seqres is None) + self.assertTrue(scorer.chain_mapper.trg_seqres_mapping is None) + + seqres = seq.CreateSequenceList() + seqres.AddSequence(seq.CreateSequence("1", "MAIRHCSYTASRKHLYVDKNTKVICQGFTGK" + "QGTFHSQQALEYGTNLVGGTTPGKGGKTHLGL" + "PVFNTVKEAKEQTGATASVIYVPPPFAAAAIN" + "EAIDAEVPLVVCITEGIPQQDMVRVKHRLLRQ" + "GKTRLIGPNCPGVINPGECKIGIMPGHIHKKG" + "RIGIVSRSGTLTYEAVHQTTQVGLGQSLCVGI" + "GGDPFNGTDFTDCLEIFLNDPATEGIILIGEI" + "GGNAEENAAEFLKQHNSGPKSKPVVSFIAGLT" + "APPGRRMGHAGAIIAGGKGGAKEKITALQSAG" + "VVVSMSPAQLGTTIYKEFEKRKML")) + seqres.AddSequence(seq.CreateSequence("2", "MVNLQEYQSKKLMSDNGVKVQRFFVADTANEA" + "LEAAKRLNAKEIVLKAQILAGGRGKGVFSSGL" + "KGGVHLTKDPEVVGQLAKQMIGYNLATKQTPK" + "EGVKVNKVMVAEALDISRETYLAILMDRSCNG" + "PVLVGSPQGGVDIEEVAASNPELIFKEQIDII" + "EGIKDSQAQRMAENLGFLGPLQNQAADQIKKL" + "YNLFLKIDATQVEVNPFGETPEGQVVCFDAKI" + "NFDDNAEFRQKDIFAMDDKSENEPIENEAAKY" + "DLKYIGLDGNIACFVNGAGLAMATCDIIFLNG" + "GKPANFLDLGGGVKESQVYQAFKLLTADPKVE" + "AILVNIFGGIVNCAIIANGITKACRELELKVP" + "LVVRLEGTNVHEAQNILTNSGLPITSAVDLED" + "AAKKAVASVTKK")) + + trg_seqres_mapping = {"A": "1", + "B": "2"} + + # we simply check if the parameters are propagated to the chain mapper + scorer = Scorer(mdl, trg, seqres=seqres, + trg_seqres_mapping=trg_seqres_mapping, + resnum_alignments=True) + self.assertFalse(scorer.chain_mapper.seqres is None) + self.assertFalse(scorer.chain_mapper.trg_seqres_mapping is None) + + if __name__ == "__main__": from ost import testutils if testutils.DefaultCompoundLibIsSet():